From 657ff5073b5425cfd86598f4b7b3da406bc1bd61 Mon Sep 17 00:00:00 2001 From: Chris DeBellis Date: Fri, 15 Apr 2016 14:08:15 -0400 Subject: [PATCH] Initial public release of report-creator AKA Quick Reports The initial public release of the report-creator tool (also known as Quick Reports) commisioned by PINES and coded by Emerald Data Networks. Additional credits for testing and documentation include the following: Andrew Witter Darrell Rodgers Joshua Lamos Michael Peters Terran McCanna Chris Sharp Signed-off-by: Michael Peters --- .htaccess | 1 + AUTHORS | 4 + COPYING | 17 + LICENSE.txt | 340 + README | 1 + config/app.config.php | 51 + config/production.config.php | 73 + controllers/admin.controller.php | 23 + controllers/homePage.controller.php | 13 + controllers/login.controller.php | 79 + controllers/logout.controller.php | 22 + controllers/page.controller.php | 240 + controllers/report.controller.php | 324 + controllers/schedule.controller.php | 428 + controllers/template.controller.php | 179 + css/site_v1.6.css | 260 + docs/Admin Instructions.docx | Bin 0 -> 76517 bytes docs/CSS Customization Quick Start Guide.docx | Bin 0 -> 28499 bytes docs/End-user Instructions.docx | Bin 0 -> 94975 bytes docs/Installation Instructions.docx | Bin 0 -> 27885 bytes images/calendar.gif | Bin 0 -> 127 bytes images/icon-draft.png | Bin 0 -> 3368 bytes images/icon-exit.png | Bin 0 -> 6521 bytes images/icon-folder.png | Bin 0 -> 1487 bytes images/icon-new.png | Bin 0 -> 2128 bytes images/icon-snapshot.png | Bin 0 -> 3370 bytes images/icon_16_add.png | Bin 0 -> 702 bytes images/icon_16_cancel.png | Bin 0 -> 689 bytes images/icon_16_delete.png | Bin 0 -> 812 bytes images/icon_16_left_green.png | Bin 0 -> 489 bytes images/icon_16_pencil.png | Bin 0 -> 733 bytes images/icon_16_redo.png | Bin 0 -> 881 bytes images/icon_16_right_green.png | Bin 0 -> 499 bytes images/table-tdborder.gif | Bin 0 -> 809 bytes index.php | 4 + jquery/jquery-1.10.2.js | 9789 +++++++++++ jquery/ui/1.11.3/jquery-ui.js | 16608 +++++++++++++++++++ .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 247 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 374 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 301 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 301 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 319 bytes .../smoothness/images/ui-icons_222222_256x240.png | Bin 0 -> 7006 bytes jquery/ui/1.11.3/themes/smoothness/jquery-ui.css | 1225 ++ lib/site_v1.4.js | 328 + models/db.class.php | 66 + models/openilsConfig.class.php | 38 + models/report.class.php | 251 + models/schedule.class.php | 167 + models/security.class.php | 32 + models/session.class.php | 108 + models/template.class.php | 130 + models/templateDecoder.class.php | 133 + models/user.class.php | 147 + sql/quick_reports_setup.sql | 103 + tools/phpinfo.php | 3 + tools/testdb.php | 34 + tools/testmemcache.php | 37 + tools/testmemcache2.php | 21 + tools/testphp.php | 3 + views/admin.view.php | 21 + views/baseReport.view.php | 95 + views/displayMessage.view.php | 15 + views/homePage.view.php | 57 + views/login.view.php | 46 + views/logout.view.php | 9 + views/page.view.php | 112 + views/report.view.php | 494 + views/schedule.view.php | 98 + views/template.view.php | 128 + 70 files changed, 32357 insertions(+) create mode 100644 .htaccess create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 LICENSE.txt create mode 100644 README create mode 100644 config/app.config.php create mode 100644 config/production.config.php create mode 100644 controllers/admin.controller.php create mode 100644 controllers/homePage.controller.php create mode 100644 controllers/login.controller.php create mode 100644 controllers/logout.controller.php create mode 100644 controllers/page.controller.php create mode 100644 controllers/report.controller.php create mode 100644 controllers/schedule.controller.php create mode 100644 controllers/template.controller.php create mode 100644 css/site_v1.6.css create mode 100644 docs/Admin Instructions.docx create mode 100644 docs/CSS Customization Quick Start Guide.docx create mode 100644 docs/End-user Instructions.docx create mode 100644 docs/Installation Instructions.docx create mode 100644 images/calendar.gif create mode 100644 images/icon-draft.png create mode 100644 images/icon-exit.png create mode 100644 images/icon-folder.png create mode 100644 images/icon-new.png create mode 100644 images/icon-snapshot.png create mode 100644 images/icon_16_add.png create mode 100644 images/icon_16_cancel.png create mode 100644 images/icon_16_delete.png create mode 100644 images/icon_16_left_green.png create mode 100644 images/icon_16_pencil.png create mode 100644 images/icon_16_redo.png create mode 100644 images/icon_16_right_green.png create mode 100644 images/table-tdborder.gif create mode 100644 index.php create mode 100644 jquery/jquery-1.10.2.js create mode 100644 jquery/ui/1.11.3/jquery-ui.js create mode 100644 jquery/ui/1.11.3/themes/smoothness/images/ui-bg_flat_75_ffffff_40x100.png create mode 100644 jquery/ui/1.11.3/themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 jquery/ui/1.11.3/themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png create mode 100644 jquery/ui/1.11.3/themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 jquery/ui/1.11.3/themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 jquery/ui/1.11.3/themes/smoothness/images/ui-icons_222222_256x240.png create mode 100644 jquery/ui/1.11.3/themes/smoothness/jquery-ui.css create mode 100644 lib/site_v1.4.js create mode 100644 models/db.class.php create mode 100644 models/openilsConfig.class.php create mode 100644 models/report.class.php create mode 100644 models/schedule.class.php create mode 100644 models/security.class.php create mode 100644 models/session.class.php create mode 100644 models/template.class.php create mode 100644 models/templateDecoder.class.php create mode 100644 models/user.class.php create mode 100644 sql/quick_reports_setup.sql create mode 100644 tools/phpinfo.php create mode 100644 tools/testdb.php create mode 100644 tools/testmemcache.php create mode 100644 tools/testmemcache2.php create mode 100644 tools/testphp.php create mode 100644 views/admin.view.php create mode 100644 views/baseReport.view.php create mode 100644 views/displayMessage.view.php create mode 100644 views/homePage.view.php create mode 100644 views/login.view.php create mode 100644 views/logout.view.php create mode 100644 views/page.view.php create mode 100644 views/report.view.php create mode 100644 views/schedule.view.php create mode 100644 views/template.view.php diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..1d67776 --- /dev/null +++ b/.htaccess @@ -0,0 +1 @@ +DirectoryIndex index.php diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..6fbb8ad --- /dev/null +++ b/AUTHORS @@ -0,0 +1,4 @@ +Author information regarding Report Creator are kept in the git log, which +should be viewable if you cloned this repository. Otherwise, see: + http://git.evergreen-ils.org/?p=contrib/pines/report-creator.git;a=shortlog + diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..dc9b9f0 --- /dev/null +++ b/COPYING @@ -0,0 +1,17 @@ + Copyright (C) 2005 Georgia Public Library Service + + 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., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301 USA + diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..1f963da --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser 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. + + + Copyright (C) + + 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., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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. + + , 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 Lesser General +Public License instead of this License. + diff --git a/README b/README new file mode 100644 index 0000000..509a567 --- /dev/null +++ b/README @@ -0,0 +1 @@ +docs/Installation Instructions.docx diff --git a/config/app.config.php b/config/app.config.php new file mode 100644 index 0000000..da8f77f --- /dev/null +++ b/config/app.config.php @@ -0,0 +1,51 @@ + \ No newline at end of file diff --git a/config/production.config.php b/config/production.config.php new file mode 100644 index 0000000..9744bf8 --- /dev/null +++ b/config/production.config.php @@ -0,0 +1,73 @@ + diff --git a/controllers/admin.controller.php b/controllers/admin.controller.php new file mode 100644 index 0000000..0656e73 --- /dev/null +++ b/controllers/admin.controller.php @@ -0,0 +1,23 @@ +adminMenu(); + } + + public function adminMenu() { + $adminView = new adminView(); + $adminView->showAdminMenu(); + } + +} +?> diff --git a/controllers/homePage.controller.php b/controllers/homePage.controller.php new file mode 100644 index 0000000..c711e92 --- /dev/null +++ b/controllers/homePage.controller.php @@ -0,0 +1,13 @@ +showHomePage(); + } + +} +?> diff --git a/controllers/login.controller.php b/controllers/login.controller.php new file mode 100644 index 0000000..ab52e9a --- /dev/null +++ b/controllers/login.controller.php @@ -0,0 +1,79 @@ +validateUserCredentials($_POST['username'], $_POST['password']) && $user->validateUserPermissions($user->userID, $user->profile)) { + //user is authenticated - establish a new session object and update the PHP $_SESSION vars + $user->isLoggedIn=true; + $session = (isset($params['session'])) ? $params['session'] : NULL; + if (NULL == $session) die('Invalid user session'); + session_regenerate_id(true); + $session->createUserSession($user); + header('Location: '.QR_HOME_PAGE); + exit; + } + else { + $user->isLoggedIn=false; + } + } + + if (isset($user) && !$user->isLoggedIn) + $messageNumber = $user->loginFailureCode; + else + $messageNumber = (isset($params['messageNumber'])) ? $params['messageNumber'] : NULL; + + switch ($messageNumber) { + case PINS_LOGOUT_EXPLICIT: + $message = 'You have successfully logged out.'; + $successMessage = true; + break; + + case QR_LOGOUT_DUE_TO_INACTIVITY: + $message = 'Your session has expired due to inactivity. Please login again.'; + $successMessage = false; + break; + + case QR_INVALID_LOGIN_ATTEMPT: + $message = 'Invalid Login. Please try again.'; + $successMessage = false; + break; + + case QR_MAX_LOGIN_ATTEMPTS_REACHED: + $message = 'Invalid Login. Please contact an administrator for assistance.'; + $successMessage = false; + break; + + case QR_INSUFFICIENT_PERMISSIONS: + $message = 'You do not have sufficient permissions. Please contact an administrator for assistance.'; + $successMessage = false; + break; + + case QR_NOT_LOGGED_IN: + $message = 'Please log in.'; + $successMessage = true; + break; + + default: + $message = NULL; + $successMessage = NULL; + unset($_SESSION['failedLoginAttempts']); + break; + } + + //Display the login screen and any messages. + $loginView = new loginView(); + $login = $loginView->displayLoginForm($message, $successMessage); + } + +} +?> diff --git a/controllers/logout.controller.php b/controllers/logout.controller.php new file mode 100644 index 0000000..cbcc5ed --- /dev/null +++ b/controllers/logout.controller.php @@ -0,0 +1,22 @@ +logoutUser(); + else { //ensure this session is destroyed + if (isset($_SESSION)) unset($_SESSION); + if (isset($_SESSION)) session_destroy(); + session_regenerate_id(true); + } + + if (isset($session->redirectPage)) + header('Location: '.$session->redirectPage); + else + header('Location: '.QR_HOME_PAGE); + exit; + } +} +?> \ No newline at end of file diff --git a/controllers/page.controller.php b/controllers/page.controller.php new file mode 100644 index 0000000..b0765cc --- /dev/null +++ b/controllers/page.controller.php @@ -0,0 +1,240 @@ +sanitizeServerQueryString(); + if (count($_POST)) $security->sanitizePostVars(); + + //url format will be ?/param1/param2/... or ?param1/param2/... + //strip leading / if present, add trailing / if missing, and use explode to generate an array of strings + if (substr($_SERVER['QUERY_STRING'], 0, 1) == '/') $_SERVER['QUERY_STRING']=substr($_SERVER['QUERY_STRING'], 1); + if (substr($_SERVER['QUERY_STRING'],strlen($_SERVER['QUERY_STRING'])-1,1) != '/') $_SERVER['QUERY_STRING'] .= '/'; + $qsParamsArray = explode('/', $_SERVER['QUERY_STRING']); + + //set flag if destination page requires user to be logged in. User gets rdirected if they cannot be there. + $allowNotLoggedIn=(isset($qsParamsArray[0]) && $qsParamsArray[0]=='login') ? true:false; + $session = new session($allowNotLoggedIn, $qsParamsArray[0]); + + //redirect if user session is expired. If user was logging out after session expired allow logout to continue + if (!(isset($qsParamsArray[0]) && $qsParamsArray[0]=='logout')) { + if ((isset($session->isNotLoggedIn) && $session->isNotLoggedIn) || isset($session->isSessionExpired) && $session->isSessionExpired) { + if (isset($session->redirectPage)) + header('Location: '.$session->redirectPage); + else + header('Location: '.QR_HOME_PAGE); + exit; + } + } + + //clear session variable so we don't display welcome message after user has logged out (logout is handled below) + if (isset($qsParamsArray[0]) && $qsParamsArray[0]=='logout') $_SESSION['isLoggedIn']=false; + $page->displayWelcomeMessage(); + + if (count($qsParamsArray) > 0 ) { + switch ($qsParamsArray[0]) { + case 'report': + $params = array('action' => $qsParamsArray[1]); + switch ($qsParamsArray[1]) { + case 'create': //create from template + $controllerName = 'report.controller.php'; + $className = 'reportController'; + if (isset($qsParamsArray[2])) $params['templateID']=$qsParamsArray[2]; //template + break; + case 'draft': //edit or delete a saved draft report + $controllerName = 'report.controller.php'; + $className = 'reportController'; + if (isset($qsParamsArray[2])) { + if ($qsParamsArray[2] == 'delete') { // format for delete is /report/draft/delete/c/ID - c is for confirmed + $params['action'] = 'deleteDraft'; + $params['confirmed'] = (isset($qsParamsArray[3]) && $qsParamsArray[3] == 'c'); + if (isset($qsParamsArray[4])) $params['draftID']=$qsParamsArray[4]; //draft ID to delete + } + else { + $params['draftID']=$qsParamsArray[2]; //draft ID to edit + } + } + break; + case 'saved': //list user draft reports + $controllerName = 'report.controller.php'; + $className = 'reportController'; + $menuItemSelected = QR_MENU_DRAFT_REPORTS; + break; + case 'save': //save as a draft report + $controllerName = 'report.controller.php'; + $className = 'reportController'; + break; + //these actions use the reporter.schedule table + case '': //list user reports + $controllerName = 'schedule.controller.php'; + $className = 'scheduleController'; + $params = array('action'=>'list', 'adminView'=>false); + $menuItemSelected = QR_MENU_REPORTS; + break; + case 'queue': //admin list of queued reports + $controllerName = 'schedule.controller.php'; + $className = 'scheduleController'; + $params = array('action'=>'list', 'adminView'=>true); + break; + case 'run': //run a report / submit to scheduler + $controllerName = 'schedule.controller.php'; + $className = 'scheduleController'; + break; + case 'cancel': + $controllerName = 'schedule.controller.php'; + $className = 'scheduleController'; + if (isset($qsParamsArray[2])) { // format is /report/cancel/c/id/a/ where /c/ is for confirmed; /a/ is for admin view + $params['confirmed'] = (isset($qsParamsArray[2]) && $qsParamsArray[2] == 'c'); + if (isset($qsParamsArray[3])) $params['id']=$qsParamsArray[3]; //schedule.id to delete + } + $params['adminView'] = (isset($qsParamsArray[4]) && $qsParamsArray[4] == 'a'); + break; + case 'admin': + case 'edit': + $controllerName = 'schedule.controller.php'; + $className = 'scheduleController'; + if (isset($qsParamsArray[2])) $params['id']=$qsParamsArray[2]; //schedule ID + } + break; + + case 'login': + $allowExecutiveReportsOnlyUsers = true; + $controllerName = 'login.controller.php'; + $className = 'login'; + $params = array(); + if (isset($qsParamsArray[1])) $params['messageNumber'] = $qsParamsArray[1]; + if (isset($session)) $params['session'] = $session; + break; + + case 'logout': + $allowExecutiveReportsOnlyUsers = true; + $controllerName = 'logout.controller.php'; + $className = 'logout'; + if (isset($session)) $params = $session; + break; + + case 'template': + switch ($qsParamsArray[1]) { + case '': //list user templates + case 'select': //list and ask user to select a template + $params = array('action'=>'list', 'adminView'=>false, 'showSelectMessage'=>false); + if (isset($qsParamsArray[1]) && $qsParamsArray[1]=='select') { + $params['showSelectMessage']=true; + } + $controllerName = 'template.controller.php'; + $className = 'templateController'; + if ($qsParamsArray[1] == 'select') + $menuItemSelected = QR_MENU_TEMPLATES; + else + $menuItemSelected = QR_MENU_TEMPLATES; + break; + + case 'admin': //list templates for admin + $controllerName = 'template.controller.php'; + $className = 'templateController'; + $params = array('action'=>'list', 'adminView'=>true);; + break; + + case 'link': + $controllerName = 'template.controller.php'; + $className='templateController'; + $params = array('action'=>'link'); + break; + + case 'edit': + $controllerName = 'template.controller.php'; + $className='templateController'; + $params = array('action'=>'edit'); + if (isset($qsParamsArray[2])) $params['id'] = $qsParamsArray[2]; //template ID + break; + } + break; + + case '': //home page + $allowExecutiveReportsOnlyUsers = true; + $controllerName = 'homePage.controller.php'; + $className = 'homePage'; + $menuItemSelected = QR_MENU_HOME; + break; + + case 'admin': + $controllerName = 'admin.controller.php'; + $className = 'adminMenu'; + $menuItemSelected = QR_MENU_ADMIN; + break; + + case 'executive': + if (defined('QR_EXECUTIVE_REPORTS_ENABLED') && QR_EXECUTIVE_REPORTS_ENABLED) { + $allowExecutiveReportsOnlyUsers = true; + switch ($qsParamsArray[1]) { + case '': break; //show executive reports menu + case 'reports': + $params = array('action'=>'reports'); + break; + } + + $controllerName = 'executiveReportsMenu.controller.php'; + $className = 'executiveReportsMenuController'; + $menuItemSelected = QR_MENU_EXECUTIVE; break; + } + + default: + //invalid page - handled below + break; + } + + $page->displayMenu($menuItemSelected); + + //check for valid page and user has permissions + if (NULL == $controllerName || (isset($_SESSION['executiveReportsOnly']) && $_SESSION['executiveReportsOnly'] && !$allowExecutiveReportsOnlyUsers)) { + new displayMessageView('Invalid parameter.'); + exit; + } + else { + include "controllers/$controllerName"; + if (NULL != $className) $controller = new $className($params); + } + + } + else { //no querystring parameters - no page to load + $page->displayMenu($menuItemSelected); + } + + $page->displayFooter(); + + } + +} +?> diff --git a/controllers/report.controller.php b/controllers/report.controller.php new file mode 100644 index 0000000..e457084 --- /dev/null +++ b/controllers/report.controller.php @@ -0,0 +1,324 @@ +security = new security(); + + switch ($params['action']) { + case 'create': $this->createReport($params['templateID'], NULL); break; + case 'save': $this->saveReport(); break; + case 'saved': $this->displaySavedReportsList(); break; + case 'draft': $this->editSavedReport($params['draftID']); break; + case 'deleteDraft': $this->deleteSavedReport($params); break; + } + } + + function displaySavedReportsList() { + //Generate the My Drat Reports page + + $reportObj = new report(); + $queryParams = array('owner'=>$_SESSION['userID']); + $reportList = $reportObj->getDraftReportsList($queryParams); + + $reportView = new reportView(); + $reportView->displaySavedReportsList($reportList); + + } + + function saveReport() { + //save as a draft + + $reportObj = new report(); + $queryParams = new stdClass(); + $queryParams->name=$_POST['name']; + $queryParams->draftID=$_POST['draftID']; + $queryParams->templateID=$_POST['templateID']; + $queryParams->description=$_POST['description']; + + unset($_POST['draftID']); + unset($_POST['templateID']); + unset($_POST['name']); + unset($_POST['description']); + + $queryParams->params=json_encode($_POST); + if (NULL == $queryParams->params) { + new displayMessageView('JSON format error encoding report data.'); + exit; + } + + if ($this->security->validateInteger($queryParams->draftID)) { + unset($queryParams->templateID); + $result = $reportObj->updateDraftReport($queryParams); + } + else { + unset($queryParams->draftID); + $queryParams->owner=$_SESSION['userID']; + $queryParams->create_time='NOW()'; + $result = $reportObj->createDraftReport($queryParams); + } + + if (isset($result->id)) { + new displayMessageView(' The report was saved.', true); + $this->editSavedReport($result->id); + exit; + } + else { + new displayMessageView('There was an error saving the report.'); + exit; + } + } + + public function deleteSavedReport($params) { + + if (!isset($params['confirmed']) || !$params['confirmed']) + new displayMessageView('Delete draft action was not confirmed. The report was not deleted.'); + else { + + if (!$this->security->validateInteger($params['draftID'])) { + $error = new displayMessageView('Invalid report #'); + exit; + } + + $reportObj = new report(); + $report = $reportObj->deleteDraftReport($params['draftID']); + + if (NULL == $report) { + new displayMessageView('The report was not deleted.'); + //exit; + } + } + + $this->displaySavedReportsList(); + } + + public function editSavedReport($draftID) { + //edit a saved draft report + + if (!$this->security->validateInteger($draftID)) { + $error = new displayMessageView('Invalid report #'); + exit; + } + + $queryParams = new stdClass(); + $queryParams->id=$draftID; + $queryParams->owner=$_SESSION['userID']; + + //get the saved parameters already entered by the user + $reportObj = new report(); + $report = $reportObj->getDraftReport($queryParams); + + if (NULL == $report) { + new displayMessageView('Report could not be found.'); + exit; + } + + $report->paramsDecoded = json_decode($report->params); + if (NULL == $report->paramsDecoded) { + new displayMessageView('JSON format error decoding report data.'); + exit; + } + + $this->createReport($report->template, $report); //pass in saved values + } + + public function editQueuedReport($params) { + //edit a queued report using data from reporter.schedule and reporter.report + + $defaultValues = new stdClass(); + + if (NULL == $params) { + new displayMessageView('Missing report parameters.'); + exit; + } + + //set submit button value + if (NULL == $params->complete_time) { + $defaultValues->submitButtonText = 'Update '; + $updateReport = true; + + } + else { + $defaultValues->submitButtonText = 'Run'; + $updateReport = false; + } + + if (!isset($params->srtid)) { + new displayMessageView('Missing template ID.'); + exit; + } + $templateID = (int)$params->srtid; + $defaultValues->template = $templateID; + + if (!isset($params->name)) { + new displayMessageView('Missing report name.'); + exit; + } + $defaultValues->name = $params->name; + if (!$updateReport) $defaultValues->name .= ' (copy)'; + + if (!isset($params->description)) { + new displayMessageView('Missing report name.'); + exit; + } + $defaultValues->description = $params->description; + + if (!isset($params->data)) { + new displayMessageView('Missing report data.'); + exit; + } + + $defaultValues->paramsDecoded = json_decode($params->data); + if (NULL == $defaultValues->paramsDecoded) { + new displayMessageView('JSON format error decoding report data.'); + exit; + } + + //set run date - always set as scheduled, not asap + if (!isset($params->run_time)) { + new displayMessageView('Missing run time.'); + exit; + } + $defaultValues->paramsDecoded->runTimeRadio = 'scheduledTime'; + $defaultValues->paramsDecoded->runDate = substr($params->run_time,5,2).'/'.substr($params->run_time,8,2).'/'.substr($params->run_time,0,4); + + //set the run time - hour only + $defaultValues->paramsDecoded->runTimeHour = substr($params->run_time,11,2); + if (substr($defaultValues->paramsDecoded->runTimeHour,0,1)=='0' || $defaultValues->paramsDecoded->runTimeHour=='10' || $defaultValues->paramsDecoded->runTimeHour=='11') { + $defaultValues->paramsDecoded->runTimeAMPM = 'AM'; + if ($defaultValues->paramsDecoded->runTimeHour=='00') $defaultValues->paramsDecoded->runTimeHour=='midnight'; + } + else { + $defaultValues->paramsDecoded->runTimeAMPM = 'PM'; + switch ($defaultValues->paramsDecoded->runTimeHour) { + case '12': $defaultValues->paramsDecoded->runTimeHour=='noon'; break; + case '13': $defaultValues->paramsDecoded->runTimeHour = '01'; break; + case '14': $defaultValues->paramsDecoded->runTimeHour = '02'; break; + case '15': $defaultValues->paramsDecoded->runTimeHour = '03'; break; + case '16': $defaultValues->paramsDecoded->runTimeHour = '04'; break; + case '17': $defaultValues->paramsDecoded->runTimeHour = '05'; break; + case '18': $defaultValues->paramsDecoded->runTimeHour = '06'; break; + case '19': $defaultValues->paramsDecoded->runTimeHour = '07'; break; + case '20': $defaultValues->paramsDecoded->runTimeHour = '08'; break; + case '21': $defaultValues->paramsDecoded->runTimeHour = '09'; break; + case '22': $defaultValues->paramsDecoded->runTimeHour = '10'; break; + case '23': $defaultValues->paramsDecoded->runTimeHour = '11'; break; + } + } + + //set recurrence + if ($params->recur == 1) { + $recurValues = explode(' ', $params->recurrence); + $defaultValues->paramsDecoded->intervalRadio = 'recur'; + $defaultValues->paramsDecoded->interval = $recurValues[0]; + $defaultValues->paramsDecoded->intervalPeriod = $recurValues[1]; + } + else { + $defaultValues->paramsDecoded->intervalRadio = 'runOnce'; + } + + //email notification + $defaultValues->paramsDecoded->notifyEmail = (isset($params->email) ? $params->email : ''); + + //output options + if ($params->csv_format == 1) $defaultValues->paramsDecoded->csvOutput = 'on'; + if ($params->html_format == 1) $defaultValues->paramsDecoded->htmlOutput = 'on'; + if ($params->excel_format == 1) $defaultValues->paramsDecoded->excelOutput = 'on'; + if ($params->chart_bar == 1) $defaultValues->paramsDecoded->barChartOutput = 'on'; + if ($params->chart_line == 1) $defaultValues->paramsDecoded->lineChartOutput = 'on'; + + //set table primary keys for editing + $defaultValues->rid = $params->rid; + $defaultValues->sid = $params->sid; + + $reportObj = new report(); + $report = $this->createReportObjectFromTemplate($templateID, $reportObj); + $report->dataDecoded=json_decode($report->data); + + if (count(get_object_vars($report->dataDecoded->userParams)) > 0) { + foreach ($report->dataDecoded->userParams as $param) { + + $passes = 0; //generate 2 sets of inputs (range) when op is 'between' + $paramName = substr($param->param, 2); + $unsetName = $paramName; + $newParamName = $paramName; + + do { + + if (strtolower($param->dataType) == 'timestamp') { + $dateField=$defaultValues->paramsDecoded->$paramName; + if (isset($dateField[$passes]->transform)) { + $field = $newParamName.'_type'; + $defaultValues->paramsDecoded->$field = 'relative'; + $field = $newParamName.'_relative_value'; + $defaultValues->paramsDecoded->$field = $dateField[$passes]->params[0]; + } + else { + $field = $newParamName.'_type'; + $defaultValues->paramsDecoded->$field = 'real'; + $field = $newParamName.'_date'; + $defaultValues->paramsDecoded->$field = $dateField[$passes]; + } + } + + if (strtolower($param->op) != 'between') break; //op is not 'between' so no second pass needed + + //set up the range. + $newParamName.='_end'; + + } + while (++$passes < 2); + + if (strtolower($param->dataType) == 'timestamp') unset($defaultValues->paramsDecoded->$unsetName); + } + } + + $this->createReport($templateID, $defaultValues); //pass in saved values + } + + + public function createReport($templateID, $defaultValues=NULL) { + //generate the report form page that allows users to edit or run reports + //if $defaultValues is NULL create a new report, else prepopulate the input fields + + //get the template that the report is built from + $reportObj = new report(); + $report = $this->createReportObjectFromTemplate($templateID, $reportObj); + + if (NULL == $report) { + new displayMessageView('Invalid template #'.$templateID); + exit; + } + else { + $report->dataDecoded=json_decode($report->data); + if (NULL == $report->dataDecoded) { + new displayMessageView('JSON format error decoding report data.'); + exit; + } + + $reportView = new reportView($reportObj); + $reportView->showReport($report, $defaultValues); + } + } + + public function createReportObjectFromTemplate($templateID, $reportObj){ + + if ($this->security->validateInteger($templateID)) { + //get the template that the report is built from + $report = $reportObj->getTemplate($templateID); + } + else { + $report = NULL; + } + + return $report; + } +} +?> diff --git a/controllers/schedule.controller.php b/controllers/schedule.controller.php new file mode 100644 index 0000000..bd284b6 --- /dev/null +++ b/controllers/schedule.controller.php @@ -0,0 +1,428 @@ +security = new security(); + + switch ($params['action']) { + case 'run': $this->scheduleReport(); break; + case 'cancel': $this->deleteScheduledReport($params); break; + case 'list': $this->displayUserReportList($params['adminView']); break; + case 'admin': + case 'edit': + $this->editScheduledReport($params); + break; + } + } + + function displayUserReportList($adminView) { + //Generate the My Reports page + + $adminView = ($adminView && isset($_SESSION['isAdmin']) && $_SESSION['isAdmin']); + + $scheduleObj = new schedule(); + $scheduledReportsList = $scheduleObj->getScheduledReportsList($_SESSION['userID'], $adminView); + + $scheduleView = new scheduleView(); + $scheduleView->showScheduledReportsList($scheduledReportsList, $adminView); + + } + + public function deleteScheduledReport($params) { + + $adminView = ($params['adminView'] && isset($_SESSION['isAdmin']) && $_SESSION['isAdmin']); + + if (!isset($params['confirmed']) || !$params['confirmed']) + new displayMessageView('Delete action was not confirmed. The report was not deleted.'); + else { + if (!$this->security->validateInteger($params['id'])) { + $error = new displayMessageView('Invalid report #'.$params['id']); + exit; + } + + $scheduleObj = new schedule(); + $schedule = $scheduleObj->deleteScheduledReport($params['id'], $adminView); + + if (NULL == $schedule) { + new displayMessageView('The report was not deleted.'); + exit; + } + } + + $this->displayUserReportList($adminView); + } + + function scheduleReport() { + + //get the template that the report is built from + include 'controllers/report.controller.php'; + + $templateID = $_POST['templateID']; + $reportObj = new report(); + $reportController = new reportController(); + + $report = $reportController->createReportObjectFromTemplate($templateID, $reportObj); + if (NULL == $report) { + new displayMessageView('Invalid template #'.$templateID); + exit; + } + + $paramsOK = true; + $paramsErrorMessage = NULL; + + $updateIDs = NULL; + if (isset($_POST['reportAction']) && strtolower(trim($_POST['reportAction']))=='update') { + if (!$this->security->validateInteger($_POST['rid']) || !$this->security->validateInteger($_POST['sid'])) { + $paramsOK = false; + $paramsErrorMessage = 'Primary keys must be integers.'; + } + else { + $updateIDs=array('rid'=>$_POST['rid'], 'sid'=>$_POST['sid']); + } + } + + if (!isset($_POST['name'])) { + $paramsOK = false; + $paramsErrorMessage = 'Report name is missing.'; + } + elseif (!isset($_POST['description'])) { + $paramsOK = false; + $paramsErrorMessage = 'Report description is missing'; + } + elseif (!isset($_POST['templateID'])) { + $paramsOK = false; + $paramsErrorMessage = 'Template ID is missing.'; + } + elseif (!isset($_POST['notifyEmail'])) { + $paramsOK = false; + $paramsErrorMessage = 'Notification email is missing.'; + } + elseif (!isset($_POST['excelOutput']) && !isset($_POST['csvOutput']) && !isset($_POST['htmlOutput'])) { + $paramsOK = false; + $paramsErrorMessage = 'No output format is selected.'; + } + elseif (!isset($_POST['intervalRadio']) ||($_POST['intervalRadio']!='runOnce' && $_POST['intervalRadio']!='recur')) { + $paramsOK = false; + $paramsErrorMessage = 'Recurrence interval is not selected.'; + } + elseif (!isset($_POST['runTimeRadio']) ||($_POST['runTimeRadio']!='asap' && $_POST['runTimeRadio']!='scheduledTime')) { + $paramsOK = false; + $paramsErrorMessage = 'Run time is not selected.'; + } + elseif ($_POST['runTimeRadio']=='scheduledTime') { + if (!isset($_POST['runDate']) || !isset($_POST['runDate']) || !isset($_POST['runTimeHour']) || !isset($_POST['runTimeAMPM'])) { + $paramsOK = false; + $paramsErrorMessage = 'Scheduled run time is not specified.'; + } + if (($_POST['runTimeHour']!='noon' && $_POST['runTimeHour']!='midnight' && ((int)$_POST['runTimeHour']<0 || (int)$_POST['runTimeHour']>12)) || ($_POST['runTimeAMPM']!='AM' && $_POST['runTimeAMPM']!='PM')) { + $paramsOK = false; + $paramsErrorMessage = 'Scheduled run time is not valid.'; + } + $convertedRunDate = $this->convertDateFormat($_POST['runDate']); + if (NULL == $convertedRunDate) { + $paramsOK = false; + $paramsErrorMessage = 'Scheduled run date is not valid.'; + } + } + + if (! $paramsOK) { + new displayMessageView('Invalid parameters. '.$paramsErrorMessage); + exit; + } + + $reportFolderID = $reportObj->checkFolders(QR_REPORT_FOLDER_NAME, $report->group_name); + $outputFolderID = $reportObj->checkFolders(QR_OUTPUT_FOLDER_NAME, $report->group_name); + if (NULL ==$reportFolderID || NULL == $outputFolderID) { + new displayMessageView('Error validating user\'s folder structure. Aborting.'); + exit; + } + + //If not updating a future report, ensure report name is unique in its folder + if ((NULL == $updateIDs) & $reportObj->checkUniqueReportName($_POST['name'], $reportFolderID)->cnt > 0) { + new displayMessageView('Error: Report name must be unique.'); + exit; + } + + $queryParams = new stdClass(); + $queryParams->name = $_POST['name']; + $queryParams->description = $_POST['description']; + $queryParams->templateID = $report->reporter_template_id; + $queryParams->recur = $_POST['intervalRadio']; + $queryParams->interval = $_POST['interval']; + $queryParams->intervalPeriod = $_POST['intervalPeriod']; + $queryParams->notifyEmail = $_POST['notifyEmail']; + + if ($_POST['runTimeRadio'] != 'asap') { + $queryParams->runTime = $convertedRunDate; + if ($_POST['runTimeHour'] == 'noon') + $queryParams->runTime .= ' 12:'; + elseif ($_POST['runTimeHour'] == 'midnight') + $queryParams->runTime .= ' 00:'; + else + $queryParams->runTime .= ' '.$_POST['runTimeHour'].':'; + $queryParams->runTime .= '00:00'; //always schedue for top of the hour + } + else { + $queryParams->runTime = 'now()'; + } + + $queryParams->csvOutput = (isset($_POST['csvOutput']) && $_POST['csvOutput']=='on') ? 't' : 'f'; + $queryParams->excelOutput = (isset($_POST['excelOutput']) && $_POST['excelOutput']=='on') ? 't' : 'f'; + $queryParams->htmlOutput = (isset($_POST['htmlOutput']) && $_POST['htmlOutput']=='on') ? 't' : 'f'; + $queryParams->barChartOutput = (isset($_POST['barChartOutput']) && $_POST['barChartOutput']=='on') ? 't' : 'f'; + $queryParams->lineChartOutput = (isset($_POST['lineChartOutput']) && $_POST['lineChartOutput']=='on') ? 't' : 'f'; + + //loop through all of the user filter params (P0, P1, ...) + $userParams = array(); + $dateParam = array(); + $dateEndParam = array(); + + $report->dataDecoded=json_decode($report->data); + if (NULL == $report->dataDecoded) { + new displayMessageView('JSON format error decoding report data.'); + exit; + } + + if (count(get_object_vars($report->dataDecoded->userParams)) > 0) { + foreach ($report->dataDecoded->userParams as $userParam) { + + $paramName = substr($userParam->param,2); + $lowerOp = strtolower($userParam->op); + $lowerDataType = strtolower($userParam->dataType); + $lowerTransform = strtolower($userParam->transform); + + if ($lowerTransform == 'date') { + //process date field + + $range=false; + $paramsOK = true; + $paramsErrorMessage = NULL; + $dateParamString=NULL; + $dateEndParamString=NULL; + + if (!isset($_POST[$paramName.'_type'])) { + $paramsOK = false; + $paramsErrorMessage = "Missing date type parameter $paramName"; + break; + } + if ($_POST[$paramName.'_type'] == 'relative') { + if (!isset($_POST[$paramName.'_relative_value'])) { + $paramsOK = false; + $paramsErrorMessage = "Missing date parameter $paramName"; + break; + } + $dateParam['transform'] = 'relative_'.$lowerTransform; + $dateParam['params'] = (array)$_POST[$paramName.'_relative_value']; + } + else { + if (!isset($_POST[$paramName.'_date'])) { + $paramsOK = false; + $paramsErrorMessage = "Missing date parameter $paramName"; + break; + } + $dateParamString = $this->convertDateFormat($_POST[$paramName.'_date']); + if (NULL == $dateParamString) { + $paramsOK = false; + $paramsErrorMessage = 'Date is not valid.'; + } + } + + if ($lowerOp == 'between') { + //process between range + + $range = true; + if (!isset($_POST[$paramName.'_end_type'])) { + $paramsOK = false; + $paramsErrorMessage = "Missing date range type parameter $paramName"; + break; + } + if ($_POST[$paramName.'_end_type'] == 'relative') { + if (!isset($_POST[$paramName.'_end_relative_value'])) { + $paramsOK = false; + $paramsErrorMessage = "Missing date range parameter $paramName"; + break; + } + $dateEndParam['transform'] = 'relative_'.$userParam->transform; + $dateEndParam['params'] = (array)$_POST[$paramName.'_end_relative_value']; + } + else { + if (!isset($_POST[$paramName.'_end_date'])) { + $paramsOK = false; + $paramsErrorMessage = "Missing date parameter $paramName"; + break; + } + $dateEndParamString = $this->convertDateFormat($_POST[$paramName.'_end_date']); + if (NULL == $dateEndParamString) { + $paramsOK = false; + $paramsErrorMessage = 'End date is not valid.'; + } + } + } + + if (NULL != $dateParamString) + $startDate = $dateParamString; //real date string + else + $startDate = $dateParam; //relative date array + + if ($range) { //date range + if (NULL != $dateEndParamString) + $endDate = $dateEndParamString; //real date string + else + $endDate = $dateEndParam; //relative date array + $userParams[$paramName] = array($startDate, $endDate); + } + else { //single date (not a range) + $userParams[$paramName] = array($startDate); + } + } + else { //not a date field + if (!isset($_POST[$paramName])) { + $paramsOK = false; + $paramsErrorMessage = "Missing parameter $paramName"; + break; + } + if ($lowerOp == 'between') { + if (!isset($_POST[$paramName.'_end'])) { + $paramsOK = false; + $paramsErrorMessage = "Missing range parameter $paramName"; + break; + } + $userParams[$paramName] = array($_POST[$paramName], $_POST[$paramName.'_end']); + } + else { + if ($lowerOp == 'in' && $lowerDataType == 'text') { + $userParams[$paramName] = explode(',', $_POST[$paramName][0]); + } + else { + $userParams[$paramName] = $_POST[$paramName]; + } + } + } + + } + } + + if (isset($_POST['pivotLabelColumn']) && isset($_POST['pivotDataColumn'])) { + $userParams['__pivot_label'] = $_POST['pivotLabelColumn']; + $userParams['__pivot_data'] = $_POST['pivotDataColumn']; + } + + if ($paramsOK) { + $reportParams = new stdClass(); + $reportParams->data = json_encode($userParams); + if (NULL == $reportParams->data) { + new displayMessageView('JSON format error encoding report data.'); + exit; + } + + $reportParams->owner = $_SESSION['userID']; + $reportParams->name = $queryParams->name; + $reportParams->description = $queryParams->description; + $reportParams->template = $queryParams->templateID; + $reportParams->folder = $reportFolderID; + $reportParams->recur = ($queryParams->recur == 'runOnce') ? 'f' : 't'; + $reportParams->recurrence = ($queryParams->recur == 'runOnce') ? NULL : $queryParams->interval.' '.$queryParams->intervalPeriod; + + $scheduleParams = new stdClass(); + $scheduleParams->folder = $outputFolderID; + $scheduleParams->runner = $_SESSION['userID']; + $scheduleParams->email = $queryParams->notifyEmail; + $scheduleParams->runTime = $queryParams->runTime; + $scheduleParams->csvFormat = $queryParams->csvOutput; + $scheduleParams->excelFormat = $queryParams->excelOutput; + $scheduleParams->htmlFormat = $queryParams->htmlOutput; + $scheduleParams->barChart = $queryParams->barChartOutput; + $scheduleParams->lineChart = $queryParams->lineChartOutput; + + $scheduleObj = new schedule(); + $result = $scheduleObj->submitReport($reportParams, $scheduleParams, $updateIDs); + + if ($result->success) { + if (NULL == $updateIDs) + new displayMessageView('The report was sent to the scheduler.', true); + else + new displayMessageView('The scheduled report has been updated.', true); + + //delete the draft copy + $draftID = (isset($_POST['draftID']) && $this->security->validateInteger($_POST['draftID'])) ? $_POST['draftID'] : NULL; + if (NULL != $draftID) { + $result = $reportObj->deleteDraftReport($draftID); + if (NULL == $result) { + new displayMessageView('The draft report could not be deleted.', true); + } + } + exit; + } + else { + new displayMessageView('There was an error scheduling the report. ' . $result->errorMessage); + exit; + } + } + else { + new displayMessageView('Invalid parameters. '.$paramsErrorMessage); + exit; + } + } + + public function editScheduledReport($params) { + + $adminView = (isset($params['action']) && $params['action']=='admin' && isset($_SESSION['isAdmin']) && $_SESSION['isAdmin']); + + if (!$this->security->validateInteger($params['id'])) { + new displayMessageView('Invalid report id specified.'); + exit; + } + + $scheduleObj = new schedule(); + $scheduledReport = $scheduleObj->getScheduledReportByID($params['id'], $adminView); + + if (NULL == $scheduledReport) { + new displayMessageView('Report not found in schedule table.'); + exit; + } + + include 'controllers/report.controller.php'; + $reportObj = new report(); + $reportController = new reportController(); + $report = $reportController->editQueuedReport($scheduledReport); + } + + private function convertDateFormat($theDate) { + //convert mm-dd-yyyy to yyyy-mm-dd + + if (strlen($theDate)!=10 || (substr($theDate,2,1)!='/' && substr($theDate,2,1)!='-' ) || (substr($theDate,5,1)!='/' && substr($theDate,5,1)!='-' )) return NULL; + + $yyyy = substr($theDate,6,4); + $mm = substr($theDate,0,2); + $dd = substr($theDate,3,2); + + //validateInteger method returns the parameter and drops the leading 0 so use a temp var to pass by reference + $y=$yyyy; + $m=$mm; + $d=$dd; + + if (!$this->security->validateInteger($y) || !$this->security->validateInteger($m) || !$this->security->validateInteger($d)) return NULL; + if ($m < 1 || $m > 12) return NULL; + if ($d < 1 || $d > 31) return NULL; + if (($m == 4 || $m == 6 || $m == 9 || $m == 11) && ($d > 30)) return NULL; + if ($m ==2) { + if (($y % 400) == 0 || (($y % 4) == 0 && ($y % 100) != 0)) { //leap year + if ($d > 29) return NULL; + } + else { //not leap year + if ($d > 28) return NULL; + } + } + return $yyyy.'-'.$mm.'-'.$dd; + } + +} +?> diff --git a/controllers/template.controller.php b/controllers/template.controller.php new file mode 100644 index 0000000..f66a5d3 --- /dev/null +++ b/controllers/template.controller.php @@ -0,0 +1,179 @@ +security = new security(); + + switch ($params['action']) { + case 'list': + $showSelectMsg = (isset($params['showSelectMessage']) && $params['showSelectMessage']==true); + $this->displayTemplateList($params['adminView'], $showSelectMsg); + break; + case 'link': $this->linkTemplate(); break; + case 'edit': $this->editTemplate($params['id']); break; + } + } + + public function displayTemplateList($adminView, $showSelectMessage=false) { + + $adminView = ($adminView && isset($_SESSION['isAdmin']) && $_SESSION['isAdmin']); + $activeOnly = !$adminView; + + $templateObj = new template(); + $templateList = $templateObj->getAllTemplates($activeOnly); + + $templateView = new templateView(); + $templateView->showTemplateList($templateList, $adminView, $showSelectMessage); + } + + public function editTemplate($templateID=NULL) { + + if (!isset($_SESSION['isAdmin']) || !$_SESSION['isAdmin']) { + new displayMessageView(QR_ADMIN_PERMISSION_REQUIRED_MESSAGE); + exit; + } + + if (isset($_POST['tid'])) { + $doUpdate = true; + $templateID = $_POST['tid']; + } + else { //use templateID tat was passed in + $doUpdate = false; + } + + + if (!$this->security->validateInteger($templateID)) { + $error = new displayMessageView('Invalid template ID.'); + exit; + } + + $templateObj = new template(); + + if ($doUpdate) { + $queryParams = new stdClass(); + $queryParams->id=$templateID; + $queryParams->name=$_POST['templateName']; + $queryParams->description=$_POST['description']; + $queryParams->group_id=$_POST['groupList']; + $queryParams->active=($_POST['active']==1) ? 'true' : 'false'; + $queryParams->type_id=$_POST['typeList']; + $queryParams->doc_url=$_POST['docURL']; + $result = $templateObj->editTemplate($queryParams); + + if (isset($result->id)) { + new displayMessageView('The template was updated.', true); + } + else { + new displayMessageView('There was an error updating the template.'); + exit; + } + } + + $template = $templateObj->getTemplateInfoForList($templateID); + + if (NULL == $template) { + $error = new displayMessageView('Unable to locate template.'); + exit; + } + + $typeListData = $templateObj->getTemplateTypesList(); + $groupListData = $templateObj->getTemplategroupsList(); + + $templateView = new templateView(); + $templateView->displayTemplateInfoForm($template, $typeListData, $groupListData, 'edit'); + } + + public function linkTemplate() { + + if (!isset($_SESSION['isAdmin']) || !$_SESSION['isAdmin']) { + $error = new displayMessageView(QR_ADMIN_PERMISSION_REQUIRED_MESSAGE); + exit; + } + + $templateView = new templateView(); + + if (isset($_POST['tid'])) { // create the template + + $templateID = $_POST['tid']; + if ($this->security->validateInteger($templateID)) { + + $templateObj = new template(); + $template = $templateObj->getReporterTemplate($templateID); + if (NULL == $template) { + new displayMessageView('Uable to locate template #'.$templateID); + $templateView->displayLinkTemplateIDForm(); + exit; + } + + //check if this template has already been linked + $templateExists = $templateObj->getTemplateByReporterTemplateID($templateID); + if (NULL != $templateExists) { + new displayMessageView('Template #'.$templateID. ' has already been linked.'); + $templateView->displayLinkTemplateIDForm(); + exit; + } + + include 'models/templateDecoder.class.php'; + $decoder = new templateDecoder(); + $template->dataDecoded = json_encode($decoder->decodeTemplateData($template->data)); + if (NULL == $template->dataDecoded) { + new displayMessageView('JSON format error encoding template data.'); + exit; + } + + if (isset($_POST['templateName'])) { //step 3 - create the new template + $queryParams = new stdClass(); + $queryParams->name=$_POST['templateName']; + $queryParams->description=$_POST['description']; + $queryParams->doc_url=$_POST['docURL']; + $queryParams->active=($_POST['active']==1) ? 'true' : 'false'; + $queryParams->creator=$_SESSION['userID']; + $queryParams->create_time='NOW()'; + $queryParams->type_id=$_POST['typeList']; + $queryParams->group_id=$_POST['groupList']; + $queryParams->reporter_template_id=$templateID; + $queryParams->reporter_template_data=$template->data; + $queryParams->data=$template->dataDecoded; + $result = $templateObj->createNewTemplate($queryParams); + + if (isset($result->id)) + new displayMessageView('The template was successully linked.', true); + else + new displayMessageView('There was an error linking the template.', false); + + $templateView->displayLinkTemplateIDForm(); + } + else { //step 2 - get the template info and display it in a form + if ($template == NULL) { + new displayMessageView('Uable to locate template #'.$templateID); + $templateView->displayLinkTemplateIDForm(); + } + else { //display the template form + $typeListData = $templateObj->getTemplateTypesList(); + $groupListData = $templateObj->getTemplategroupsList(); + $template->doc_url=json_decode($template->dataDecoded)->docURL; + $templateView->displayTemplateInfoForm($template, $typeListData, $groupListData); + } + } + } + else { + new displayMessageView('Invalid template specified #'.$_POST['tid']); + $templateView->displayLinkTemplateIDForm(); + } + + } + else { //step 1 - get the template ID to import + $templateView->displayLinkTemplateIDForm(); + } + + } + +} +?> diff --git a/css/site_v1.6.css b/css/site_v1.6.css new file mode 100644 index 0000000..8b4ec88 --- /dev/null +++ b/css/site_v1.6.css @@ -0,0 +1,260 @@ +* {} +html, +body { + height: 100%; + font-size: 1.0em; + font-family: Arial, Helvetica, Verdana, sans-serif; + background: linear-gradient(#00593d, #007a54); + background: -moz-linear-gradient(#00593d, #007a54); + background: -o-linear-gradient(#00593d, #007a54); + background: -webkit-linear-gradient(#00593d, #007a54); + background-color: #007a54; +} +#page { + padding: 0 10px 0 10px; +} +#header { + height: 100px; +} +#logo { + padding-left: 5px; + padding-top: 4px; +} +#logoImage { + background: url(../../opac/images/small_logo.png) no-repeat; + border: none; + height: 60px; + width: 200px; + margin: 20px 0 0 0; + position: absolute +} +#logoText { + position: absolute; + margin: 35px 0 0 210px; + color: #fff; + font-style: italic; + font-family: Georgia, serif; + font-size: 16pt; +} +#welcome { + position: absolute; + top: 30px; + right: 20px; + color: #fff; + font-family: Arial; + font-size: 10pt; + font-weight: bold; +} +#logoutLink { + color: #339966; + position: absolute; + right: 0px; +} +#headerRight { + position: absolute; + right: 15px +} +#headerRight img { + margin: 0 1px 0 0; +} +#footer { + font-family: arial; + font-size: 9pt; + color: #fff; + padding-left: 10px +} +#menu { + font-size: 11pt; + color: #339966; + height: 30px; +} +.menuItem { + color: #339966; + font-weight: bold; +} +.menuItemSelected { + color: #fff; + font-weight: bold; + background-color: #339966; +} +.rightMenuItem { + position: absolute; + right: 18px +} +.menuItemLink:link, +.menuItemLink:visited, +.menuItemLink:hover, +.menuItemLink:active { + text-decoration: none +} +.adminMenuItem:link, +.adminMenuItem:visited, +.adminMenuItem:hover, +.adminMenuItem:active { + font-weight: bold; + color: #0066ff; + text-decoration: none +} +#content { + padding: 3px 0 0 10px; + min-height: 500px; + background-color: #fff +} +#content table { + border-spacing: 3px; + border-collapse: separate; +} +#content td { + padding: 4px; + font-size: 0.9em; + font-family: Verdana, Arial, Helvetica, sans-serif; + vertical-align: top +} +#content input { + font-size: 1.0em; + font-family: Verdana, Arial, Helvetica, sans-serif; +} +#content textarea { + font-size: 1.0em; + font-family: Verdana, Arial, Helvetica, sans-serif; + width: 98%; + min-width: 500px; + height: 60px; +} +#content select { + font-size: 1.0em; + font-family: Verdana, Arial, Helvetica, sans-serif; +} +.submitButton { + color: #fff; + background-color: #15513d; + height: 30px; + border: none; + font-family: arial; + font-size: 11pt; +} +.noPadding { + padding: 0px !important; +} +.noSpacing { + border-spacing: 0px !important; +} +.inputName { + width: 98%; + min-width: 500px; +} +.descriptionTextArea { + height: 180px !important; + width: 900px !important +} +.accessibility { + color: #fff; +} +.defaultTD { + background: url(../images/table-tdborder.gif) repeat-x scroll center bottom #fff; +} +.defaultLink:link, +.defaultLink:visited, +.defaultLink:hover, +.defaultLink:active { + color: #0066ff; + text-decoration: none +} +.groupLink:link, +.groupLink:visited, +.groupLink:hover, +.groupLink:active { + font-size: 11pt; + font-weight: bold; + color: #0066ff; + text-decoration: none +} +.homePageLink:link, +.homePageLink:visited, +.homePageLink:hover, +.homePageLink:active { + color: #15513d; + font-weight: bold; + text-decoration: none +} +#homePageTitle { + color: #15513d; + font-weight: bold; + font-size: 18pt; +} +#adminPageTitle { + font-weight: bold; +} +.orgunitSelect, +.userMultiSelect { + min-width: 200px; + height: 100px; +} +.orgunitSelectedDiv, +.userMultiSelectedDiv { + width: 200px; + height: 100px; + overflow-y: auto; + overflow-x: no +} +.selectAllLink:link, +.selectAllLink:visited, +.selectAllLink:hover, +.selectAllLink:active { + color: #00f; + text-decoration: none +} +.hideRow { + display: none; +} +.userText { + width: 200px; + border: 1px solid #888; +} +.userInteger { + width: 90px; + border: 1px solid #888; +} +.userDate { + width: 80px; +} +#runDate { + width: 80px; +} +.reportRunning { + background-color: #339966; + color: #fff +} +.reportStatusBar { + padding: 0px !important; + text-align: center; + font-weight: bold; + color: #000; + background-color: #bbdd99; +} +.errorText { + color: #f00; +} +.successText { + color: #339966; +} +.fieldDoc { + text-decoration: underline; + font-weight: bold; +} +.ui-datepicker-trigger { + margin-left: 2px; + vertical-align: text-bottom; +} +.imageBottom { + vertical-align: text-bottom; +} +.nowrap { + white-space: nowrap; +} +.maxWidth300 { + max-width: 300px; +} +.maxWidth500 { + max-width: 500px; +} \ No newline at end of file diff --git a/docs/Admin Instructions.docx b/docs/Admin Instructions.docx new file mode 100644 index 0000000000000000000000000000000000000000..add2f5fb516b528a1ff36fce0361919d4c5047ae GIT binary patch literal 76517 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%0D<77AfL`5Z|Iqku-qm=f%DHc049}*kM z&Ba64*1WO|F-HfuZK2J*%GuY}kdwEp8;yf~U+i-BZQ=W`v@72|UqRGd>~vIK%c~Q3 zt=H`5X#T*d`0Ypv{OV7@pK zS+yh8Q=iNgJh{4_P95l}TP@pT!I5Snjd??c7YWT#d5p{DHvO6bYk?GMDu)GjlUJOM zs$1HOH>ETs7JUvS7)ffQuhMwYXb09zp7+yrZG`HY> ztrR$5uLj^0GwUu%?j z;VgJK9ZrwgNHAGI=V>sM#)awE*0=5ch4yMR$@~ZgbK%wrnB#vHI_`&hZT3iGkd^_P zF&uS2COgt|+mZlfTl=RhWumy3XZ0JTt+{FcDc;rRS z`HhM~7P~{7;#4JSZ7W19pYNRCvD4nP!6qJpjqjT$+ceGHym4BLxFDyyk+iPPkzf-y zmfl82B~Q6kGxTf4N2%#3vuqZY2O?!%rPy_IGO22Z6)^Wwm97Ec{JrW}9%tLQ1n7u3 z0HpB$3MpFvRgSlyYE@IPTcp8jC>g#nv{$mxd^w_R?>_!n-LAm<5)@(|b{`vs!tUDZ zu881-aL6zF@lY<#!<7b7Genh7oP6c9@SR%vb5T0XF>ID}0kE4}W3paMt6M%R%hN;n zRyAE!L8w7b@#j1B7z28Kk0yyyUx6*_1*DRMN8d=z=wh0+Jl$T!R=e-a_DD&jRNXys zS?k6e!ns3%aj9^O5H9;i$Yg|ZHm@(VeVyhyxtz&H#Wc!(<NYqIu_=oLgq_;AtOnxLls&h{| zGZ@G(gu}&E{VTF55ep!}cOubYR&P`sIwe2vrsq>XJlsl2@RCAl?VRT!ybdQ#WMVnG zci1pY!APRBz_@!c`^;KeSo#us`)N}+ES;yR8B(_)vI|SPz;DiSP9w7tlqF=P;wOW6 z#dUt}A(3^BHgV=CUOnPcVN47c;@XN1!ns)4($TiZfZF!=m>@q+QNP8+JpdE`TZc2XHTh?d0A$w& z+%+FgCnXb-r-P*S?y&C}Rp~R{zAQaRWm!UcA^qzsCLeHt|0n7XdJrfr^&Fj4@$R)n z+*aTrzWmcNQ#t%sg0Vwe_YW?{t`-pVVw|en=+cBsG@>zK_hKuYe2ZHY^r03IckKpdyfIO zJ!ve0+Mr>~K#Jxw?a9or0RR#1S>;XiMkON_W0N*~p#rkrN)IX{DqtaWKe2b@xw~g& z3&e1djUD-oQoTb^qxT`tgMz<#FkO;6nq(yM67;UBI40?C1(nqA-n|>1x&}MvD}Qk) z{Hm?}67=OLXR}__@>&w~Wz?%Uk%)d!)MuLX&6d>TOnx2kK9CLC!{}dA;Sh5)l=dP) z5kI3LSY@5UBB44I(#xt(hn$>~y_yCxq+H60h^*BFYl1sZazjI_!WMg^bil@9#hQZM zzxq@O)=L>c>B)Sly6#QUGCqOkgP$&NPlrK!;P4LkM+AKGTbg}sYGV0{!}9ejb5kDnH@4=%%8D-@ z+$Xzz>w&Dya}^K>jT;0)vAlPCkpEpJ&DjI+9=MM{MpZIBlH z5-#-;4HLV#1(a~{)hn6;j)A_0f~sA9FN8RIc#C?MV&>}Y=|!WX^T1S^($)Pyw>hzo zVzX{(yHiR{Kfdn;8)(WgXUD3@ZPuP_I zJQLNI*}c1M8mp53GtLX^_iM2#=p|b^pZ+|vxSGzP{OL}urC@&Uy7o_VIa95FzjGsM zO5k2Z!d)Xw5GaZZi3S37CcuF8Gm(b?8^g_j0G5)J015*6hV{LI2u+pk#!ydG?L=#$ zL^e3Aee_DZ>}OF}4>!ss#RpPrW*a7*ny5-AIUIhJ7O~K^x;S{s(ne7V~ zbDKG)F(iF@-xpO?YL{PX!Cs}b=0D35srv#&Ok^*t7)k=y=Z<5L^sjIs*QjU`8C?RI zM%71?&IHtH12?3cmJ8(t!>h2;&_^SM zpS$_TiYLW(Y7za;@1#Gzo;dCD5I&t#?Rn>jp_nu?s9P9HWl#X|DIz3J_(f(B@R{__Gf9Ps6x%{V}Wy=x#}*ywl)`%iSF8 zMl1~TlFJ=fO)mb}ip3YY)u($MovJO74Y>#{F)z0s>sjY_V0reYa@-!pi8D&Ens!A0 z_wjU=p*Ot+w2iOSDSyPaf6(N8(lQ)z-@qin#&LlZU;A0Mrt^r`^b6@zrINM4D{8=Y z#Gqsh$4r-{J|-_@($N`%A?;o0T2vcFNuGkvX(#JQO7n%zLjP*MCfUqLjfez@zWVoG zk3Ko*odVx5h@|R@hBn z#=f`R_hQmokAJIf7rV&g+0mr~NpvMo_B2oR)UXex%q#iehEGT+Yib(@!@fI1&5bMDbl_p2su2o?=`HPr+m3$lBRk(_Q4DXpI{x zwTiHmTO^3IEA=6^b!=-_n|qy~9(mFCqLJGkRwsfwQ!!MFa)WzQoVfHiyN8TqhjPIE z`inHhZJxfMAR2jANdjFFKg zY=|u0!X)FQp|gZTzUue|BUw4)jI=F{T9KOfVmoT9&Igm$YgzZ3zV;08ni~$0CQM0c z0R0|d#HTfX2?d94g6`lk9;m1MXhLK*We|wj6y=8!oyUDV>augTi;bJJS9u@JF$7cb zZeyGeQP&oz9rb|TIuHvQ*9VdoEYA1E&!bBUp^X>f!(m+nyrqmkDxZ8n(!W86TqS6b zLKixkV=IKNu=Dar)S=Wam$v{0oDvDn48bLuuxClnlgtm=3v};zILn}@=07t8P15fg z`&{IvH1pIid%dKh0U4>0<*A!O^1ip_v*4>;NNar)QT%8ud+GZwKxve~j#FmWEnwtY zK{tKSVg7ekU#r4~3qCyU0SArLRFV|*3f-`rU&GXXspGzn(Ior`-olNhJ; zv%F9D)-5=g`ZMJCq`vo&`ry6IApwzf%PhQ%h{1;%iSYa&K1!};nLf~eb<^G_HdSZX zp?b~qVu`M|8dt=>k2S6EGIQr>kkZ~jD9ORxYPqhRb#{PktRlZub5YzaT+4$EN$*yN zGIq!4MfGgjzeQp&k9v|}C9D7!;HAL1cv+yW_pe`e}zqj1e>*L(`@ zWCeJ?{3la(E6UGx05qQw+$T_AG(yiSvbxJ7yiXNdc zKD@t3>TyYUT3@2-PTt zsqu5cARMg>PYN2)=jRZuEn??1I-rY89&;;K`3BD&Dpu;dgO8!HzuzBrz73wlsQ+d- z4F-ci678)(5kzDBABetxZSF`4Ew;H*{`R3#U&~jcLvSxxtMFI%C@vrUdF#6x8?$rw z0?U)QBI=|Iv*-N6LlIir19H~M6YcVB8J;JoX)@D5F;DzXI2e3ajLUpxP)JuzYGfP9 zsw2+3y1v%TNIP?}hw4~Qa65*fo9Sk;H!0FF5J933WMZL`&miaGH}-Dox(Jv`L9bEQ zJEd3-uIhQmI)ZL~M}||mpmI0joKGB9C3Q;BFb?F8WqWe4 zP8t0reNe8(fgy+Yf{O?Syw)Un^iVvaC3MXhro<6F4MuH|mDHs2`yo|n z{HtU9Eyf2%1$OSnCwwy7H61&L8*iUh6v>7f$7vY2f$bBqK)$-k12C1@Dx7QBubWn< z7NzxX4ZGh_zCk08A{Xll=BZqXBt0`iS?p9SG8q_Bx8(2oq@3Nfwk!3jS5meJEliPm zvml>TB-q#v70#zBzanY1)y{AI8Rgko&~y*J&ZY)^`!vi8-myYR-#-+OF7m|~? ze%h*Oh2d{!YV1tECy6V|+2fbur{^@_6@Ff6>@H4U!Lxp|uA?uzLAl$Ktyd># zp6E3A&}X4CICT5l@;%01sLNsnEm%&t70=ma#>eWHiHv;xnY#LxQJ%mA@VJ?4t1ubseERmLMN0K?JM-gSTpA zmoor^Pdm+FV}nYAmLDTxXLPuorRcY3;rT|gTWsVN(>f}ZKU?Xe$)FhmhG?~usscmw zl|0pqDwC=W0aV_GSSn2r!Fnuwem2{AzR2DDlUX;f%tuGo;*;i9!^$#S&vq0eR(7tp1c4y*NR!zS`?-b)fd?SpKzc-Po$yZG*nZ9(P-#?I#H|;Y|0}uw z1HJ&<3immU>|ynK+VlV*+wb3#zTBqroIL+#m(URK zO;&xGEei;woMwa?bo&Z~;=k&;ZXNHHICBZQ-4x8jSkm}nJZyE>!pg#8BjFoHU$;#a zQ0s4K*nkpyfc+yc$&VCMLS|*=J#MMbdCyX5R@h*#?>G$eSRAfYEMY7YHzLCuE8f#h zH)rJleAhGX5b)uX&9gICK20d`!F}m=WEP?90?&(|gAq9ao%o4gGMV=}fpHD}hS5<# z5@A~gyOsOo8y&oh4oe8#KV8_L>FH*0sEBoJUM>oQf4 zw{jaojM7t347Hlpbf2@EhIl^6Mg`Ht9{}hPDQ@XPy}@-UkbE-Jj2qp5+FOjEhlqMs zqz|ukY59K%0Q&IFQ@{y~`;PH}Jf%FFFaKA*vZrTW^}^D!X4(fpP%ZUrg-bN?!KKKi zIx_U8*6?$M4+m!t<&9()zJ61pzai9HA9j@0JC!L6Nfnq((01nKbQ zZ`B~sXQo}GN&XA!njyTgfz*Phy6OQRH;lW62UH29az1kgSu469nNB5AK~?OkFvWFi z+^+SpfU=z}1jbFZj`HHyH`O^Aax%`?v+!ynviQ=y#5TA@=)w!fz}+a0%^SwomVIB1 z^S<`o-+FiUP>T!5Q`R*2e%pv13|>BcF-!qvAR)XQ%1&fM-RmaG~3Z_OB2B zIQ~MI5tly>x@+@*#$EueZW&biW<>yjcJtF^-Oe}u#_i2q4lqk}fg4R|`y@Fdt?ao{ z3>WwexJ{|diHXcwPeY7hk3~^I+dH5>?>OHKniMv?RK5f9MG1aDgGB+AduqZG9|W*p z8B!AjUZhm;1KuP={I0zrBuIMEAfR_9glH@Nm>dZ7={w*lxD4>N5H7c$o`-{ZemRER zT1D7%X}|_#8#3U(lA@U%AV1&Z>Z|zX-`CZZj0a`CCi>LAC-@ft>f< zuG4UOM9%y7IT6}v-G+L`+u;www~ZagQ_u$oc?B-s6eCbUQ8fI%LEvM{!Up7Hi=EmD zpb^hzWeAuEJyQDlEhiLZSKrU1Yusc+mS9nastR+?ox9NRvha4^WWZ}Jt9Xr-ldjM#3}0l`l03ewm?eqQm3MkmX|g=F;%+Wv+|ga;{mBg5yI?uq=wJan7Ku_ocCB%RW(ppXE_bV$o6=J;3O6X9}cllle>%+ zx71@+YO^!`v>9J+nP<&$5g^LEAG_`UeTYDV#Kkv;<9(Y?Qd&8fnPkL|tt2P!OBi_M zqX&@&o=^<_K>LQVtU^!TNrFcG8ut@pr|#fIZs#Srma?yQcR-yb&lMF2)QTn$U~`q-!1|xqcM4k zXGk>P6awh|Popq=7XjxrZpkfJl7)b{Ev6~ut(RGf;-nJyGI>Xo^sp*i^-I=vN_hpN zzFnd-BzW8QZI+j_#t;S97kYL^ceYnK$SfPbCFXpQ(*;E0aOwAtyB7H=^7u*GJr4Pe z+A3~qrbFmS-+MCi@+^PR-2n!sAb^H^I-n`uD0@~tmT(a4JXswJFgZp%YbHqS8w_3= zo(@xKd+`g47;400o?YxdEpJbbc+1SRlKjz(61uW5T~OV+e%B~1pE;q|P-vtBUOqsO zAutk9Jk)9cBLr|J1mFx`EO5udj+#7@x>fzvu*OnHHQ;_9yv~1&XninlCx78yNcvzw zZnFLR-R~nya3RuG_4AXp@kX;Yj@o_d2r$;#^-hvF8p6D0Y|-peR5|c^cbJB_;fppdt2P>Mre*0p!pr0)eZZn8Z*? zpx+oEGxzx@+D;vrRj;I8DTRc}z%&X1CA8|ljwV^f1vBJZp% z{hhPG4hZ9`QLCh+Jww+hn8QE~!m(uIy;OfwXL}pAD%8U2b&u?8rM7QsjRM`&Vd89n z&v5`y9o6~zVGFyX%^bfs#mz9?a?RuV>2YuXm934PQj<15j|5osXOF}R zw^#n79=qlD7k}L3m`SjY2Uglgz_!tI^Q1tl3I*ir{uX!|Ft`~FGbe#=%!Ma&n9l%; z?nWBy85xk!`J&SxqNIV+)bLL43&?rVLDIy1;Uu!#pCsWNDpG4Z8w(riWc!%BXdnzV zqa^4-f-z|vDWGJ@Nq$d(s@L!~;9$|5BD1^-GcAAl$#Np(b)kuz&a&COvKPZK0I%Q4 zqH5|tgWfYsMV_={%;%asHkRF!=zuC_$E~7+XgY|WLNMP-e*^M~4`kT*Kn!?y_EL_j zg`U9EET4}2*HcI$aTs`>0w(9EpulxuRoKAAMjsoYEU85=A4aVDLJzS1vufyL1e$Pa z@YT?|t)(kGD=hQLjBg;h{{!a-(=%%6AY5c0<_dQ_z+ z1dBI}WP2HJYAd+%gTV8KDqOMj2Jczen&@~hZLJcyG@%)qdMINpKx)R2mYN{;wpo9H zjLtDuiWvl285M1XD_v{2_1U2RK$?`@C0&bu%gfgq@ikuz5%f4tod}wPEB$M)=tzw_ z8r8^_E+iBj%_sF?HBd8_*O0?LeDF1;wVhKXP)25IwZW@F+y=<3Vat?j{bHFWdj|jN zC3v^WE*s`fQywGhv?{!8peIwpsa4ORFsv1>d?rg(s_7OE#Su4>FIMLWD~Jc<|!zq_+aNb&@} zT>onL?ub%27?S`6#M#k`Kh*mg5mzA_xlVaX{^?9HJsE% ztL;C>JA9)qpR=OB%m3g;U3T%BqYCH%r&Mh~w+8tJ(jkVM06MO1ZMa&2=#8FVA|_lHXih_J}W zNEhBfjwB~u1wA=TMKV{xOZmOvA){NC186Sk<*js)FR94POHa=;c1LtAKj&EFb$&ic zmO?XGSdFeY5F7cOPYU1*4Wk1QR4(;2SXX6ZSxJ=ZN^)&}e;=T9^N}hRg|(d(HF+8~ z%e>6PATZKehO(8&=9Nk6Ji2tHU33RLkg}avs9jyG%`*vS@$F5a2^Z~f0fw*CV*{i~ zZ5p*edqE!Exx$nA{h<-~cvptqNc7gj8?}iGkDu=jnq#Xd@E-y$fK@q0(<7(yvFU2B zzgrj>tL|~I!e`qC$EmLg*@2Pn-T5nfCJ{nEh)}J}K;g-}C!yuS z%e}0d+LO*2Hqo`UoR|sY*7xS^9`FNZ{k}aXr~ZZ;^%K<+D?+}BS!2T+V@P)L$VfJ% z8^{~J8Qaz;CN)4H(so;<&=d#J6U0ZsV1d2o0yOETA~6q``+iVquO2xun_KoOC?hw+ z8!TRa!@*SIUd#qJtUSXCt3zi!IF~qo8p+N!?;P#9&#?2hj3v_5ue0aLPPfg*ZqSmW z*!89S872J4;j>v))@-lF_Bp}iYpy{jBa)??DpHU$jV6+Q4=3^0#A_2oY>OTc>YE49 zDO=U0Af!rX-=CaNrLKiP=~9)BcpF#%?y?Sji`%oB*7ZJC*meFVcTLXGK)SJ=Ux<#~ z=Tou`a84rz{!VVv#L$r9c!HzIF-}1&fjA$cwNlhlNyDX;K#d4Wi>2U>j88q}5=a2n z9!{(>V=G&iSoDizc*%hw@V-Zl9Bu2T$US5J*3g6XVpOF z5em-JOWCkmWmXLqND#-fqp)vgdaiAkySgR(pJl$-ft6)`_5>! zfbaZ{L^yXSIPs7{#05!j|43CmHM1tJjAu_+}MA3Ri2c7`OLah2=kt$MQgS6h)+5S`oaVA!|uGproRH4LGHzJL*g zW57~*=JKXISh#DStw>sCHt!4I@qIT+(ER zmA3XV9hPwt#WhI0x|_5eo`uNW>Nr0;HVtXhXXnb)VIo|BJ`q6rE^+{zqTto31-)K?~8pu+F;P@;Z z@PIgm^7^k_kwObZ7$I>S4CO0jJ#zc|Z0jk2LQBs^PrL4$(>9fFpxn}xNdhx^`zkKp z6=cYOZ!D_|go+J0PQ)lp0{&bX1_(n7 z`E@X(C67VD1(34%pI?D=%m`T7_}`vB2;6pC>_-t8$=ctR?n?ncPq(R=(Bpr<$xCa< zdFp}oPhuX;+c@e#D}-o8!$W2j-&Xklsh<9RFur#9&5_7*MKhb(pYEO;L4vVpjAZq0 zLuDtRid6p|^VvT|Iy`6y^mnuYW{LmbrHNG-_~ulc^*4_G#KM2t!jS*^^8fv!{oicj zf1sC_#*p)Yo5FhH>b72@-)V(R7});Kb4VWRe-tYJ`Y6wfkV|RtV<=S#HMGBx*oCBL z0Ms4lKkN1XdN)4W`unGq^>HO7XK!E)}Cf`m; z{GWgS-+xN~`aa)Ir|G{oozHxT%h3Nvj_Uu0bGL-Lxt4NcdlQ=YheFYhpbIELFqJ=! z^uOfPzMmhi=3aCB&3$V$UTxcnpD)Fziii9QUk|CzL+W7IbBVD7yes{g({4-J+J^R< z-+x2BVM}b}40llIzWwc|f!us1o9*G`2It+H?dDH{Hcz{)UsVPOG5#~!F1Po^+s%0M zZE65|v{RLB6AKWyP#R+$`fR5pkIf+Aa$LqQpPbfsp~QvZd2**3BH?+~}D3 zR^tVMn!o<8jl%vaEZ=&ae|W>}@5`q?Rp+ z;K}RySCyG)9ZcoMcG^>DlL0XL1}H>tM}~la8t{)yF@^*rcjV*3JmdDFzFy!oC~iAK zQD}5_{QI~Vzrllo_kcHVM(Okd1c@Ff7kDwkz0Zsa>L39GB*Qz9d>FTwnAq$fVWS0p zeFlDFWhS#jBA9(e9+H2g=AruL<&VP;WzP(eKd?4`A8V~ygoqI|{QNQe&=MwDiXQ#p z+qS~wP?q`t=Iu71m#!Jf=DAR9bt{>^kI0co6FvF{^H9BjwZXU>KC4jsI1H&Y`P2h{ zA4M(aC@)5!{qmeIDkA55OgeT9XHdac1Vf?w$?v+ic>zcW#oUn8v-R9Mu!;cB4{Ek>!GKuZ z8B`>Pq&J1$7RSU*Z6wf~4?Ly>&;<_9VSMPLEd6EOJNup14G@F=pcJO+*;z@FDct)UEGTsFuv{tu}o7m+)hF=O1YW|3d%zYZCxN z=cC)2Uu@9<0B-?LhZInwYkjx9^tCx(TqWTupRM}RooTnlm7-mi-)!J3abE2w=h-P+ zp+U%tKN+2UB*$=T2;tLWqpma87pjuLwG zhrIykbw-_l8kW$g4CmzmzHuR@MLZvp-b<39acvFjxy^?@-CMcZMFi{;lSZP&9X!=- z3BKJcCcpC=$B^hv@cLW@QKQMi?=vC4^GNVww1~{JSF{YSK>a^sihpGs`lBlC_o(84 zqLFsl^LL8I?aKaV^vHkN{Pz4u^B)`*9q;~v3JBM^Q~4|yQmUD24jjkZnl!usL>@q4 z{tKZU7lHLoYq~DF)o_{tN&RoCWk3x*fZbtgWY+cX3^xVf`tQ`yR^M0_SYN;P6J*UC z@xt#fb%84>b~pL;W)&ZiC(>HOpkE7Jvem^@L^YY>2CH*1$yqur38p8 zwf6`(m~T}U_FixyP~d-0|40e&^wYHo2^2-h}VHoZEVF(%YD>74lLjR-pr-KprchweN)gF6j7yTkIQ;8?t{0RB!heMCN*>}v& z0I4J7%5q_Z7}^~`G=+b6 z3Q>c|5;`^o>By{TERdkxJ$3j=?jHkqfK~V&w~A5MG}X&LgHu8mu3_(C+*R=F6r-hl zwIdyjg%S<)kCq#s53FP@^cra%fqc0q+TmyEdcbRPA>hzkX-nCstWo>xWQ@h zx4-}~5+-;Hr++tcSz(M!j5q>fy%x13$XA#VPzC?DJc)$O)Lv~Ijy1(OvjWoLEtvlV zE{HAAce5t|`!pCg^zWW^KEb$wc!f6%1T0M*39wNY02B0fCygGEzZbF>&o0qof$ky>$@h;P!4s znFyc@CJD<0=WhAk21t93!PpM?T3f--MrI{CqhMemIR{om01~N(pk~uNd_ev~mZ3TT z2pZf|PGrDEq=ge>t+#|whCfyT_a|+91PYxh=r1K)5$ktZ4A?MBYQLwhGshXra$cxc zYjb-Elv%ddw>69%Bl{@DlxBy%rOU^=)0_xM^d6=?u4 z_Ev>q*rWfdGV1aySeb>d>&4+iH(cU#OyIX!j^VYbQ;&xnBoVlqU>eF?$O5!wx6aOv zmPpB~bA`vswgYa{_q+;ZfJbra+zbdk%ZStJDT)PS*(H{6omt5Rb`SZTCKh%$+K{Xs zdeh$+(AyLS098;Tb~P}7;~rI{Q*cjHFzah}q{$G(Sk?*Qe(MN&tAGUP$lz8MF8aje zwKS;?DDxeY*{yIHzrr~k1=?HwpA!S;=gXnxf=>D_o25yk_+sM)ESpb~T z;3G|LL!IwA17cYGUwQr)pt{96=iL9nx@KQB5UJ=kjqib!S8pBW-<&%VxGaD15B&7M zNap@^dTh)A9^C2evFLSci>~@VIdnUKlIQ>>XR6N+il$1;WBA{1gTfkAiv` z)vB*Z`nMl$HFbz5A#kz^V$zC&aT76iyEjoPykiHrpn5UxI!ROfh8^>g(4F?kAGn!Z zL0>-B@#Q`k*d9;}5Sr19o>il!y!j#1-2iTB<+{3Aa|lDh3MOqO!e&5fajn#3^~I-f>Me-M=V^f{GLoML`IUf+$6hE-fHf z01>43AiWpqH53Ku0s_)OL_i2dIw2H6kluT5h8}7{`rY{4_x|4VIp_R$Cp&ddrmXc{ zWoECLU1_PZgWv`#RB#W;N_L%p@V4m8F+wdJhK&pjF=n1Qp1GC_7Rtw_2}{p+MLuwA zsq0>KxvyNm9?0AGe)ZXoXJJ~@5`@VstWrK^*3dUN4UZPJq5>=VF zgRV`kT~GRb*KIQE+~$wY|G=N(UcWnkBppYB|I;2o-QRk|Z2V#_M?TV{g32Oh?l2p$ z46DWk+pj`AG!?JJ^#3(26iGnDi&D#>-IF5e+t|>hjj%_He7AE%f9C%RxHehMYOY)} znf1qdDic7VeD^uxop$UarY4(rK(uFNDcs-{4z|9=l{`|mX|XI=SUhC}~12~z#Q%_nDQY9IlO zVT#l%fq9rS-|*~m&i`qt&A-J0mz%o&mw}b%Ml*iTs5t=3^k?R9y%z;XHJ367Qnaqz zOJV*w;WUfhnLf%w1t6dI)c~*3{=oM}C!-0PTNGwjfiQ_TnL3W@1^aD_@Lu_Zq*daz>ky^H_n1yQuqxH+d-s# z!88z=P!Q>&mex21|Jg*jATxcp3u88H1l(<}`ca6BCkhs?WLFQkBJ zX-7oQG4-Xc5F^+~8@*Kq zXBi)ysas$Y`(lCqTj}xNI0lITAL0v~lDqIW|AclG?}XS7Qac^=czwF`jJ%(@fhGeZ zx^wYC*mzb}pqNoT*>61bgSd6@Wm$vWbZ45f!k4l}=^lZ$S)-$B5s@9WPiMeR<_ifx zb3XV=);@~-ua1!Xzb|{9HM4Pf?Rm>_1Rao|rv-;VC?Lobv%G0%uRoef5)zs{W@z7* zyRC0id?Bfd+U8Q701ym_R)=}`%tx?2ficuc=KW8(Z@Lq?7s(_Hm{A%_CVjY%&)%=FWcsiP_fX&*6 zRtNzCo1V;Zozbh!m6_futYztC~k}5I0mYl+n?|EPS;ebg@5U>a)_Bfdd?u_Z1YC zmb~XX_`j~C14VJlUG5W2c}bKJdu!@l7P`)&1DoD;90^3NX8d2P-Ta#3Ovr!qq&H@_#Qv|T4rrg9bs0lseaF*Ng13)s5 z%@H;U=eg!Uyo~!UdUqE1tl#Ki_dhZ{Tk8b(+QoHBG#{|K@3JkPc9xmIYn^6OP86sq z^gB8dzfAqG>K!RiO%<9t|T&TDD7i(Urzo^|_(hJ#25c@Fko8h*|YfEJ;V^CYv()`6Se5Q)91PNX%c zKH7zZ0fKE7v8RjVh!)~ugnTnO_y_yPzv1Bwr8Az(;I@@5!$n+AFUA_=yj zGsvfPa=7v!@*-)OhjaubsPm;foUINb65-xZ=S4+`uMc^W13OwMN4D*<$N?X|*I*CY zIf?+`3Cn^3WvlM-w+VAOaworSvI9;>iQM+fJH ziKe$*-^ZnO)t&#O18=aI=C|v$fByX2&PuCahXQ;lE(Vq64o6W=e;YG5{KFbKQ{z8T zH{bGxNX0e@t~hJOI!93NC0P+aH4JUUT4G>jUp8maCXt5A`gZYIY zem1>ZSuh8$n%W)H*&lGH-Gvh;jEgb3^-nB=^YrmhN-RT){ZY8Old(4$SK~ix=v7w+ zP~5(2D|uEAHZ{={;Ba&p87?N_VpQd4GdqJ9cl2>R`U9*^-&?HQUCx>%dmzyf-j4Gv zPDjoCY~UI@B2~t{bX;ra34`Nj$F0T*StkMb-(nZW8~tpyx3UCEylYGCU4WK)o|H|9 z!Hta2)v$T^n|We}xLm!}QL~c~IvGvI)gqi6yz6RrjH~>*zMr*buGW4%ZoI_nlep{2 z_eh!yJx3=~fM`EP@&vQ4XYioOKLiSnET{i6+t?4)>5npjqM$}(9vEn_RQ2 zPO_XwV4RJc15}TC*c~QzoE_lM(N3B=r}-9(S({oX>~V@3gY(ROYq%#s4R06#v-K!g z!8MoZk-s3S^*B2G3$Yo1O<}JSGk7m2dptBM1QAx}NGT!8*bA%rG z$#o;$(y5WA zFV(H=4k~cB{xX2GlV#KMjef{K&vdpCUSs9$&|5Z< zk|l5rxg4j%R|hk0a9Z!_R@0wfnEA_l&jNRs_Cj%|0N37cG4FDR0NnI%cu!$7k44{`S{#7sa z%cQ?O%$!XxH2rx^a8001vBhsaPORh}!^E0hi&wvrh@l?JxXQlk`=1fPG&QZ3nms^Y z{ID`g2gp780}k75K4IgSs@`ma8KHNlYN1^dL?a1swcRQpn)4FFF*?%c3g;&N{Bh#b zJA*-2da>Sgx=8_x86brYDuo+>So75;$DIP24d5Hl&WBlC4mngy6~N+z#q1{WrOR{xs?)4;1N0PXOqd@LKGo14On7ik|@FEwDatw!Hvy(MUqJ8W6ed$vpvL zC@&&NwV!tP%jUCMK#Ci@a2q?BGE#prQv>wrZ$Z<4k&s;rNSBlU?8KhQWNn?3)8?lI zpi+GL__dZ>6Qy=8cGC^Dp58{Y3n$wgQ}xSj0vQ;mMO<2zG|9sTZ{xk^;AlDqu0(^qwrdXWt$M0J^%yqXQs%6|oBLE$g?KJ-FC{Ir8@gH~J%Oymx(kkhOz5 zQ-_>Os{K`R9EaojEgY5}{EofW_5Ox_uDSrYhH6#;@}1o0a+ zhTH7U%sV+?N`X4gKjOQ9Bi?<1bBy^5K%#7{34Nr zA>V%Ry;L7)PW{)_kt zOtU``Fl~XWD&+Byd_{Gz*G3*X5T-gwI^dDR;>j!dE!g;=?MYVXE)^6N2Hj?XVp)Pn zEJ3)!Ae^i>0+ZzeMb0jw(RHK_BPgLOh|ooviPtFu;VVJpN>KcmI^k6P)0P1EAVm{# zBH$u0KD&UctwWqRxj<)U7fH2sEvvhz`{UA!2Ls;Ct63;NBz)myz#Fk`f@<70@t!{^ zgYPwNmw7Lq?43O^O?X+9FUEfXpN$FMLZA?Mg!l99J@}$G2ESEqUMm_M#SzN7y@y#K zHp3S&N#5i&Jamf)CRc&U(JlMY(CyS9tR88voUjG>CnyOL5kjVEIq+{G3X zk6*-A?W}HjAm>8;_lt*5qhemVrze5sv_$rQc@cgf>!s81Z=o zE}ou_9dzrl+n>J3Dx1cEtjBI%#~o?ItNDt+Nhw@oj@0}~N8~`4bUb*$mrzmwg-hjZ zZ229IbyF3pvrEpOtQB8V_h5%M9Zjuv#mg@E?v!M8HO~N9dE%faN=Q9;9N6v4QRKC* z97#7qWZ9~^hiA~Pd?n+%wHC5Bs*dpj?QB1un)EL!M`=J&ZOway{;xnAa@e)v zG9GnLSzjEGElK?()331(uK{uCl3!d7A+=K>*om?<{_5cIz^&HJB$`*A?2?`<-AP&M z*)ncR+CZ~-a<=3GE6P#7mxd08MNE)`Sxr8BW513HADT*fE)%+Gkt*D$OBmFqW=mpRi9mNH6CNBd75p^aM|g8^+ulv{~SSS>V9s zx$YyISDEa)x7i=d2?tb%``8+3pP^BJllEA|t<5jfU+Z8A4 zcDObgNPPZ$AX5rjOr9BUvk}BV5M%DxpPRHc>Y2CX#K$Iwy|;=-O(5G+2Q`0dlLMgS zV8W9v<9S#d>7ENPb}+AbK`~G^!Vk`X&h+~Z_pnswkOa<-7G`hBop@k23-5i$Z)RtQ z1tKDFcqwX{xVRXvY-#A$$ohhV9zF*#FKq0dWO1%us~ULOm@(B zb-M%78J8_7GV)l;Sn4_;wjAuNGU9H{bl!0Q zv~J0|psvHgG|cEjYSwXo}XRti=b7qso7`BzmAW3suXDLz?db%#WankG;aq_JF;gbTQx`E)g^|arA01zx@r3%}GN*-!;dDWGfP7 z0pQa!(BEd~kdl*{^R-^r*VtfGKoyrN114>zou^@Yy7& zP7azt5Bj19>A>DjOEU%8sz~)L@TeGK>#sGX!N*-egV=9NipzL39Y@J|*KQNAK!`)jHwjw{~TF zIUwj**n8O$_+3W~%XKfsnD19&;BJnyNi8}ae9*l}o{uN}0pnm0{O?kWZb)<_cV+jQ zfQzrHP@2+Dau%Q^aDL0Y4T5u0P2K z1t23_0`N5D(4*Kh4=HoQ(;%XdB3FHs8IOr5Zpc1&@sZJ+*0$T8{>J zjy7!oWM`{YWblfdztjG-1J$50d%af;YHK~a7tk_nfaP(mZ$W7+Y9ryOeZcX^>vqO$ z0Ez)ni`O0_e|MCVG#9;B$j>9F0Rg&wYYQx_@3+k=2e=_?Sa-nM?WFl&{Jea2W|pe- z@Z~0(@VCYIkp?Z~V5X#WfTQIPu!N|qhppKcl&5v|(N5Ym5CjMZhaRn^Dr;*2&Zf=!QR+@iY#4Q z;vIDUr~dt>8nv!(bDIx}PPstK;mv$*tw5uc3%jG^pDX+O4y;+)R$tdDnM3M(lztTY z02^J!t;llIJfqLN@Z@wVc)T^G@m%ZjmH7bow-d)qF5t21~@ z6+oB7_Hi!s_y$)UXY&D`0|a>&!N4$EI19(_6- z6tJJJp4Aei?k#D@?>(9CYx?ao9#c6cYYX!mv>wps)AdOF zM*3gJ*{WV{X`vaQ7Xj_ZF|)-4aAllxjtU4Hj$4wwOIZj!c&aRUY@?6V5@1Ic?$721 zL`PETxh$7|Y%-Dh^I~txTo6MeVw}6R4B?Q!~e8Y$6if$^6Biui7yWfQzymUsb_dat_w-QM1`&kU9Zrwrt=Ul zXScVX^YplRy2&NT%Heu9os90 zqelsOysOg%{+|+<@+_Y#oO^a|;K_qKI`^L0Onj*=Xum&@)D#o2wK=q0rV!g}oXncs zrMteB9>na{*=*B$?e7WF7az8Ja7LwT3- zWZt*9Y3cO?bDevJ+{v$ypRA0dG!8XR!3B9{d4vVMoIuZCMoCFvU>agg!2NLW%FBfg zsFTm3p!%!ku=b>uI_`uRu(DhL1}hjOH=F1kgdR{2B8-9%cB(;$HX7XBh5>!SU z`^^1N%;pegk>pavO`asJ(U9TG-QH6vgp)xGB+!@C%Tg!^&S^e%JS8yngCH}hES_l{ zW21R(FvXhgtZoNd;F%#&X3I8LC(`%__mpRN<^DcB3)?&K3o|PL(Zhhouz234_~1(- z=)%e62l`S6BepiTZ$1{PM7Q+R?`?79bijhMa3g1&x6pH6F$QuK=-tAxGl zqKrHDef6V?J|!e3@LF)Qz&hj1pWQdmKP+NC5^0R7i5Z)F92ekBag?5UA(Xw~qH3Bg zU1>;-A}qd#wp_~Pw(+O!5!zn;{%6kOLX)-2Y%r0ustWYT_XlO`yNHUTUc-$m6;iNI z@k0E*_ZtSeKi$dp&*-0R+>jQ&;>e1%Gt*M<%8p^bWlDu{8Wt-u`T`ShrEaQKET=TS zkl7vJXc7&-;Vot_P>M85{2p_%J;nq}RN>Z1+Yr_j=C#^@lWP7X4u0mQUAR`wN7&&e zZ20)pF3Qa>1XeU-=eN)Zc>gGI*_V0Va{60q$j4&0BBz6)rLqSztYV&~Y-XOC-9^m3 zD?9g7=k1kK5yequ;Nn*ztS}HqmfNBgpuecI&Mv$*~$hjoC4!RyBcp@k#Xo>;#$0(fW5Y zHv+=|BjYgTBRM5GHRTxT`@rSag9dq}?=PEZ_HWp-PT8#$DrfQpZFLXjPFTO9$_I!` z^zx_suH*q*>(hZU5#NY5D;dbf`!T`p{Gu{-q^&r&9KGt<$kg=VCmV%~0HE{jb4ab< z60-cHa3-GxE(`Jc_P3X~mIjNZiKU68k>Bu{dD?4hnl$7E52uZ%!E!~0(&lb$eDAZ@ zDArDmOq@KQdV5`B%qBer7vs3qE!0K5eOW(Co8*`2lB^L`@u@N~QrB)hta_+H!m)u; zmnwfmrQlh?Gb$sifj>1*V-?k6XIKF|JDO&sVS%$E`60t;VncxXjIM19eE!@;U|^l7 zY<$m+6)RfdmfJ25piGwCUy9!2_J-&w!n!aa2Ow%H0|s|c>33o)7g%a4yOGL(J1~_s z?!i|zWd<|{uuh2%RTe5f|5K~e^1c(R;ck+OkQoL ziDG!1T7G@zczc-dS!qS43l5-e-xaNv&t=$^Cu*_jofs{tV@KBY!!qLWaMPhr5r^Ow ziA!+74f{YPmK9K*QGReJ%Mc zDE?=~m`~;|!q-PzrxDdcL@gi}zysK<(LyIDcn$n%hJw;kwyw;)SAOnAWyYsYc^A%k zd?_?CWZ?ZG{OP&rUhq;;GX1`tsQpKqxA^;*%;3>SZEK+x@WcWft*!M! zN1?KL5WiNu^BsYi8AS$8!Y52=)8354Th2GQBY~^FbuNq9K>8{A`0-=P3qZQArS|I8 ziazigb!oFZlK#S~$G~06di8g5OLCl~)6>(bziHzv6-{olhlBzt>PwTUAg567!Re{w z-X)64Tl2vX9G(^(IfU^;n3j9{oTaJQ?z0LmTz|TJdO?)h@*AA8k-;n%e1Ry5aodQG ziSd!)sGHsOkYcBg=(nz#cGN8yH?P#^zahd5ByH{UMGiHFlo7z$(M=EdJV!i@Hf=B) zCyt_#N}iAh>c9u%Is3dDjJ@FV)>Xhw3X{4mg>D|7)jw%IVk>HRA4o+-7a6C_gg(E# z7yZk;YI?^@y68smOzYIt%_15hDT)pd?%?C%>Vag|EBL%~rGCt_yR8UAm@aSf+Xmx@ zsj82ZxtJdOzpc4gs?9rYFXl@9EPvR%a%$JBaCGy)=R-2koc-aPP}1=5a6-b>y4hHF zNa1Mlxc&Pl|0JvYGCvp^`Y6x2bl?*f7Dn|q89(%MCC=Rcxs)EDeEiF)2SH^nE2IDf_ zk`q6~v?Fz7?(*_7PksO_UVG6_XqsB?jMd3n8lJ$$k~nUS6@B_$$7}ftPIs;x3D2JHILUm7?WnmROPJ2qhwAY*_4fO;$6y@?T=c>V z&1Am)DStOrS6ArLQs=k6>#vA{nfm(UyqsU{{ak#Q33h4Y$q7gV2y(FUt3+Pd$y$5)m%X5;gpIX-fm9%~bpRC+V zJ?SZs72Qrzg@)kC*J+a^OBcV=r8$|5prHC zr+)JIb4gEWMj**c#8}!@EikoS{hw{E-+1N?+1A%RZHQrpD{!ZJ-V1sK=f!iW!xtRG zT1CGr#6}gqUKKBToi9J@y9^YggQzj{5TIMM36r2(%&tx5{)M~8vI z%6I+)?UXBeDKXl>Vafq(lF{|`or{l6aH>8$v|V3M=;^(i%-x>Mo!!G^V-=bIqr=d^ z9A=ruXV9sVQkiH~|8qpQVkb}*)l3-q;I1SnR_~NeIKsxu5bnED0HQEiX41~y3Mi46 z_eSk&05!Sn%Ggep_TJ;{_zLDYWxGP1tisKF8Q$3FJXi0wGgbMtCGgLay$h++YRk>a z_Tt@r_tK`ha;QXlo>V?Q5-n=EX}!Qvz|e8mN0wNahl;!NCEO zmpu*N$kT9gIS+wwo-du{^KYDPv>d2ID?B~7^xsSA=7s3kT3%0Aq2({QP&;z&xm`$A zX{(N|kg={%=(MfS5z`fjTm9KDOZ(D$y9^9s6;)ru2z}9cqifFAX(!lbZsC@`nVNRGTvkP zqphvYsLnb0)2D#b<%mInAm@(tr;&n3R~Px~KCj=X`f09f*ryWx)UNVAtV+cFg>_oN zgU|iUts5j|1@VUI7edDp!b!?;*>|W5-}|a*>V#|3UcGh&L*qk~&z-zD)O9J4KrQ;6 zGB&D2^X-Fw!0b2`-|{DMcXMe(toM@gK;jt6-`3qkf6;}US-)Tqh!Z`{A4su9eGVTi zXAR;k9HXkw!%}ec)0ib|i$U_29Rf}$#wdsEDHLsGt=*?2Bw{kfA;psaaPH@x;s(k>SP0w-a9rRkWfge_xU~OcuHqV5l5&nbWvC<(~ z3y27}NFH*G2ylRBv(IwY{;^>@s*1%<;|M^=Os$llQCcdjuRjH8&E_KJa$3H4b+bH) z6)-HR4^40=wjU?NL%st7@r^&s~jU1c1MQ4ICb=wQwh3O@@91XJ!;G3s{{OiQZg?IPuZ zC$2Dx(ta%%qj=ZGce#U(y7cl#nUKj{6EZ>A!XoR~F@;}RH6^Q{Z$LAve^O20qe$r?1~)OH?sae z-=g0gIHqhmrYt+A>^Y|VaZK5AOt~Yinx4hoKagl?bBlFr0^D+?04&sOKPDmtT?kbN z6OT_1RyhgfWo6FJ&U>4i%STwiS1cSgfa&g|1z(VIk7?!!S+5GG9VhH-G>bi4T`K^$ zrnGbi2(iupO!Zg?Gb`#^LwV(_s26TVQ<=67uA1LaR6 zIS=d3!6tXr^l>qNI>kuCqHUGcc@}mn7IulNG*(>Tsjv*@!AYvCb_`x*YgCCNG>1)5sZN_!{^HJnlu{GE{38wkj8B=r*x3UTSD&XR9l_} z&4n)d!#IvHZHTHquJ40`QnwbR*1q;NizLANnyPWod-kkzy2>UxDvFnnZ+m-NT1twV znwpC#@>xD*H)!Y}M+q9=wdyLlU#$*>Lfzfn-P{fiR=bdcMnbZWoOD0;14`Md<~z*x zD?@#`x73wag>9RnjhW9_+xj9!Jg6tR>cyp*i=cU~}-N)LT3Z=t%dD3>d80slsf>fIPU z|B&DOLe1cSo(cS??D4o6PLFV09zN2-#IeBFGsV|CRU+A>=jl_v_1knl0nvEZKlV8~ zJ#I&gecGXI2hKo#^-eC1gpwn`FW@V$8ku-nmLKk$VwVv=Vh~?q5I^S?S zAw6P5v!*Hh2YMQ-gyVaJg95gUhW@rB;8y>NX6fzeab9Seo|x!dc2&BQpjj-+8Vd}i zRu2FKt2O(KK*}fil6!z52H?quhll_C`4b4Rr!D}82bFYEC(6(x+Vh?_poANY?@6F1 zcZF$$3m-7MKOK)5X#I1sccWPWl{;n;sw1fZG8>K)T+@ z&9&~1Q{BD4hn!R0KYx!%v&C;g^>0>R1?Z;Gv3Un&;Ql$iOwf;qmA#l10M{G&xz?Sw zI=7ML2}HQ>-*OGe&4V~};J12B9PUfuGvm7|a>=9z4;}!~<(|5_x_~xtb92+t8HX9w z`T6;sKNs>OZ)p2Ox8(X)5)Tj0)uwKim_3R{EbaMFV5~heGXo5xV`8qzL!*1_+lE|5 zr+57#+Bx|RA~-LG-Zq23bWV-TI$%s(ctL@9-+fM!+SHB-2oxJ$7pAGLjfr4flQ*i! zX)v}NlwbYj~2Y`)fRS3S=21blhuo#h0T2x~Izh zm6R^D5MRpnp^4$*5EtV>FXh-Pg?~gZitvP1cPKIDNq>wh=E%K^r7(nQ&<#@xH8ToH zWGTGHm7ms;+aCv=Zt)F5j7|c^zaw2r{hFP}QLGT+JWP*VwL8APTP}byt;(#je(c?U z*e2F{!6Aiqf**8eN@9D`Wvc#KPM%eJXV&wHavI2`34Ua`fn0^PFFAcZQ>+(0$?pPn z@|`W|bwS{AV#`ToUgN0mda}^K@gqGwSzw=nqrff^UBWC`VKe?#E;)`}8of840gN4! zlC-q7J%DKa&d$!VvWIdxf=S)-TZ`*&L&70UM3`>Lt3qHhL58Eeq@?8Aw?8YtqBl1; zC5Z~D92pbNlaF`KIAsn~9AVq{$vI=v@S2wqfwc-OAA9yqn@a)A^C>EfAom$!*W+`s z+t$KEB=*)B(VrQ8a1L9eo*B8yg?JR4<9hBcj$+Q{yu*cme9jFO1s4RTH$P!|d%^ns zFD^y4kdr%MuZkw=H^pSKSYwF?)$y7Wd^VS{R2}$FLAdic@7A>-%fQw-(M#`4uV0+v zU>u+|Z(F!x79e&-_55o%)g>XCR)&-dhkBRHdJgmHTh&$NH?kBEd&4ZG6X;1$lJ3FC z2p`ng?<8Keyrug1kLuufc|e)ndSXg)^sK4r9JXg=LGOmUscB!J?<3UuuYgc?<(E?x zZiR8BfW&YpzoY;!A(}qp56uU9qx~Vk9}ZV)lcSAD)%Ba|s#~Pvx!BZfIC^BHL{I>6 zI5H9i=HHb~ME`6dlwVEN`=wX%`*;ypjgT$tAIBk!Yi9rlXM=&2Fj-kyz*LE5u{K~+ z`ET$N5vGD0o8`l{@<}c>Hpo~uiNm8K26m};BOp40lkJlFmzG{DFZgSm|J;pqgR~o( zF_2mgW!`m~w;ap2a=}SCw$dNCu2&jdT1!`9JQ{yYK@6n3`SO{aHpMY`Z0UHhPu})1 zX9PLdC?THoR+u=f2aFpjYkojrOGRsemkr88JBXaV9EMHtM)>*WV%i1}JBai0A1dpE zbp8Ffyf&!|uOST7#ZXb&cf{UN%?!#@!x}J+eDAr}ffQO5D0d2l@8`Y_RB1sBC>5Ib&)t(qONQ`p%s>KIo>) zaB(RVB>{72xa%dlyXt!LHBMUXVe0gSP)v+< z{4B44T8FUY3(W_McN>~GlaIJ`=|PzKNCkVPRe~aW@()w+ zT~aoulVpEZxX;wgk*Lr4_GTviL%yrZQq>Hy(vd9TrK}k`7A~aA%D=CDzF!I6z(jiD zU%%D49H%)^`0<2s10=dos0eaxG2wMi{Xop4xredXpd!?V+#jO~^|*YQ`|3MsiWULN zW7gn7n$rzbxiq7e2*o(f`E3Rj7wY{+gdhP=-X){=lPC3z{R4lUOzO=U!@qdVN8xJt z(kIJoP2gVw=c5KZ`TVZwxiaawCYdgABU;r1IHrK{z`>;kamP8|wSI~Fs;7~IM@*2V zd(ExN`okF&U)*=2&^3I9KoO?!FG0IeGc|n9&CM&g^y`xorS(6opF$^=SxCENTt3+* zC(vu{cY=t`fN{NR9>B%g+7w_msKK~WzjWC4<-Kbg=xZNHySux<%w9u70}TVm`Qtjx zO_ayYr={nap%1Ir3R}9OGOGEnD$v)$FL0J&>R}uJ50#&4O6;H4?bEsKNJBn1u?jXT zlwEUY(~X~<$v$8V1(@yl>+7B3**gMit;QEmGc|Z?eT>y2Ku?5c_&HdnJDzS|{iwT= zdT%*7?AsM)+!XToUMc%I`J675Cm+8)dGrd(Lkj6qF(0__I4gD&fQayh$7e%^yvml* zN3AMKi7M3cRPvgaCLQ*IhHbrNkJxD>0{KVi$60cZ3U@m?;CJ_ zV+o^@pgO1}#KFcT77b1C6I-}CT`@$%cdJ!CCztXa z9~&zSoX>yJq&v`s8-qx0!ss3@8g-M8R7g2`9KJ{=!hG3XR8xQbI}9>;4qU!Q^0h)q z^T8JlrVj>sYU}iB9RmtB`*luS%DxA>pY%)U>9sWAa2X{Hg+ELQ-7SopsU7d8)5**=lb!N;klrYPDVhT3bnivUZusJW^a zhX@MNx@nxlAR~Y;`@`Vk7g5$9T{lEVAwN}G9jM+7s@?h^sK)h%n^XBc6C=LL$9AA_ zmlN|E_wQs_xIJQkDx{K z2VT1qbe={MqTDXF3(a|+`0!eG7mq!keE%*sg!JOlw^Af<6y7`3y7s;}@(Z)|wQpRP zyUB-IOxOpJb1h{^l4l@lK%%j(Ww?PDTf6I0eb2@A)xuD@LM7y)AWXu<)@V@xj`OE{xe@32nF9e+C zz0>;e$yBFw(gEh z9#^L@SpV9i+?J_d7T67!w>9kYAE}()=|b+|*i2sKf2g5XK-Wn{zG=Ri4^EkF+jQw_ zd{?`p_%Tqx3q;(lZC*Klhd6i?C@c3gnAA}nZ#Z0@hm=+JuFWO( z!u;jz7n0|i_!@RWvooYh*b!*95j@>9jYx+3Z!hh^2}tCD6tJ`_ba_$-v%L47VkPfPr{%q+N8+6Q@%#vtxV^b~%d9KQ$N$c0s>CH+LS;(YD|H~(=A+KT! z0zVP$pXM;Rpt$p)wFh!{G2QeOZ$Y?V_>1#)wy?GiQtqcmU(#@4iQAMRRq}oP6eQlu z^;E4JIi$VLxfs#qg1PK=i02;p>rqL(Ukk1Xy7+vK2s&U0=m76~FNd^5kB}ZJ<1==K z7A-eH-#5H|mv_?#-j_a>P@Y*-vV*ehk)@&JMJyh?vWG7sZv$lzijI2Yr7(dbNe9Ul zoDvdu1&H&pF_q*An2{R}xxSv9k`l_&ym1Tyff&L_*4()*o@X?^9vlV)PxHm0Q~5?j2mU zbn4bPQ%F7yi*MRlLKjVL|Jd9SA6Qr7I(Q4pC9j_c-s8thtHt-80u;Yh01WwySS$i% zu~K5{C9FgD@qzP%Kv^7>Yfj~B36H%h?vQ`3`v-T1T#!U~O9$I7l__{5sY1Cz$3hIl zl;z~x=UDqTDDF(&Vs@aeC@Qs2lX^2eIt>XLKp2*lAj(P}PU@txmGr8OuYb!}pGem< zaw>+^j=k2}Dt+KN{;AR4PWRgHOtFGE;EY-^?Aw@M)tE>AoVJd0Deoj@Ny7k)e~@%| z^zOYnUjc8@2(uVYJ&oBqI`Jk+S_3yJt+2xoGhrnsKiS2T{oUx}EN3?Y&8Lt|8=c z5zXl?Gc(s!=AWmGU-=n#5klaj^K(u%8l6$+bT195p4>p3j6oI_uydoAjyP05WAuUR z_r~PoRTly}l8!d$#v+SFiySQ&$e`wbsUzU0#h75(=s<0s>`Ab2f1fPcBW%S#3` zR@~w!y4}wjsmrZ#4M!;Ax$_d5q-=MO9&I*yDO$m}sb&042eqpFqNn*g$9J7Bj8#k@ zJ5*O(yIeRC39}#LI5!2Ddn_*b^{6)VeJG?G4-U;1_K5Fv9v6<|vcFK;^_;qH0YOKd}JU{F+dMGv;dD z^>szwba#MDB7!vU(AM(z%P$DUGxrnBD{_3#eIP2JzKPto5D7N00&W$F*n3?*t6KFs zbhw3X_SwZ}#?HEFI_Ja^NLS;Dv2T-KMXAq;Z>}SRGnD1!%WA` z=t2RFSfla8=Lv=l9DZkEK(tiU^SA8?WA>Qx#XjCKewC8#W_jlCG$ox@9dW~sV)xP`b04OoTG5}JTuPW;xR)v z&Cp9&96gbT=iUiZn5j7zj-qPB@wFkvPN}`e|HIc;$3^)>?*b|y9a2&PBB+FP2`H^d zO9;XWNOw02N=k{+-AIFUw{&+4NH;9Cu)BBA@9%!@ANStS$E@X2=qM_W$!+NTOMZ#tvDGp zlE2x*wH9MMA1OwBkfX1y2%PSJ8iIb#fG{*DJ4HwCphpSZ`h-VJY*~edI=TIuNm|Vl zZLFIJnSkCMoYpdc)k-z8 z!e?q5r$!kpw1t!J-jz~OwI>M2-H*OXoT9+*k2l`rd#xaoM;!O^b;_^g=aMA^ly-H_ zo>h9=UOC{rh!2B3j+oj{{9 zqej+LFkTJyGr3UAypaby_l+KX2U&~XZz0c)(|edc(ZGrkD+pgp3d@#l^wk)wrvyfa_jr;i=x{XMvc$XG}8ob zVN(f+%^CZkiG2u?@XWsz^bB#NMdozNJ-Itg*5VfCbIy-wzNP)C@p1jAYSmv$V^Cu} z%kdvcH0j?zIhLt#a-%Ux?O;N+WS7GuPH#k^I_5$!x^z)bxEd2L!t7Hg+Hrq@4w;mA$mmg%d16sIykL+lwMrBNI94JA%~+xvLYB-Ul3%Tf5=Np zt=vuWeSzdN`rAjQ?;oYdC$M7q3aQEM_oYxf8icMgekM58X;Rjef8F-Aq}XRZO$v|8 z_5Oz@*N@7d2TMfKRP6Yk@LFQ=6kV;q@4)Nx&2T7r+EUu@bNW-yzfhB7uaiZmEA?q! zmOKvTN11f!fdjp;kJh^i&z2-!%-i1V4_>%D$Z^A{z*A_IWH9l?n8Lfh_L;{c62!gN zL3-N`O|mRqd`s>NGQL8Uy)r27HL{~vr^vB<<^LBQqEaP)=`V#vWC#E3<&zNA zwf<`6+jhWTR8*a6RhGMD%H|j(GXNHNgOf`3gmnpjmide{mxJEGk>YSNo5^jk!tW#a zz9N;utBfQVsnU1-0xk*gI-MH-J|xV*hRL$G!8RE7bat+2WM)*uVZ= z936p-QwW!3KDl*u^|u1$$2zK_XZkD3ng41!D%l)`daCYGhiR{tN&dTu%uSha{USN6 zH%woiA%Zi9U;g{zHTWWsw!MQmgrzH&@f9?kyt+2KdB&1Fq*Efjw7R+)Ac%5vWuHWU zkz(|hSauZNFz3AK!x2Li(!kRcfjvfFVq_{U9AW6HxXBqQ2g2ZW_4V1Rd8&Eiro5P+ zTP^tkwg@B-I0|7B4JM2E-sIQd(?nk9xApd`vlJ5D>24Dfyf~O8X>0$(e0{Sa z%xVHf5}?aP&vR0A|H^`PFxlC zC*3m!mfRf{J){r3oNA+)006KHkTNzki6tuv6wr>+y@c}!ohOhX;wdoifu`RkWbOw| zf73GY;^K7;=CrK11sD4xTBl((+7Cin5}`j{4Z6N^7j}w9>!QR!m{}0}gnPr(D7RIH zY9AmDsIx6!(b~D=bCX&}W}!Nw^o(1qriHjI-~fnJSy5ptnB*Wm6=T_(fYNa z)e^N1ywpw0>H`C1fu>BDJ5ASr{2+?#F5_pC=eN=O^dRwFhYn6bDJh*dckGzJRY8Ga zeS+1lQt&NAk%AzJ!B1=va(C;`l~nJ(4Yoz}Q7mwz-&)6)~8Sy8!&pnlNqJsVidd#58nBpTMjJT^rbvj8v)DZafoRDaU zd+9JrFmmhYgVmYnhjBlQWwdVGcsibSD-s?yKgWx2%v(`v9Y>-Ac+9d}fM8@P{$a`) z(H8v!Zk8;q!@iJxKko?)8YcbvetC=(DtBavZHe@`wpz!9)bNmV&`Z&D*Cu?meO^@u z;$=&}M2avaAXeacD!j(ERwErF&T4+8-!`ywJopJ|TwYsMRaIYqH5~sfS0HwE9yLUm zXiTI8o$c-R9o&0t zXSt(cf7mx&svr*xuv70Kj-K12{o%UnHEUKtL`@xhbZ_~GT%OB{1Qd(XGSRP%D3)hU zjFpewV0WmL{4*2YIwjR0-GbWpm<#Nr@JiNax?MyOBQ}wn7Q~aCxKiwRh##5GMPT9+sNKUC?jLY_4~1xw$kt zIyy0-uB^>>Fcf>(F$ndZo@e2$TiE{xngr9Sr>AFY%j`F%l==AyYN6p-t-ii}d)r=E z3BsjHCUe!c=KcN)K@Wnj=c!Ea@Ao+n3u%9ZvDK&qJ4{3`5DIzY$|-u#Xp*)meNu)) zeyUV0_W@i_`9T*ogl}`vo#_v0%;~&c-K+!XB4T2EYE=IbBJ4km(aKDqgFPtlI9MFHp@}Ss%EcI6(eu zKQG>|B_98myLHRlJ%~)c8jpW!M`>`ne+vpRu&Hp(&-#;Jjfta;!Ai zOz?RkP3Fkwr~pH)5YIn&?5VAr^r{PJOK=(*L!WXbosc7vVI0yu3kBjaQsRpgLKu4% zYT=2I{Pqu%{+#kvuuIUXs9+_p+o-@6G9RSSA_I9tZ=Fbm(r~W(5nZT~L zY^bE9q>GD7n=I;mLniSsbh#?vj?T_U?szS>nAh34T1nD9_#ssSV&#oT@q1xT$@Ty~ zU8yZfH`He3gj+3urc;WLQIQ^KK|{?}?r_9Dm0+1-X}bO`(Xh$5bfPNiMZqk zrk=(gs~LX+fB=-N^50c#t&bhN<(zdqskL$nap7lQoM~`1IoTeXmLvgU0WcW$g$xjw zqkqMUm=T^Fnk@5H;mP4()jb+Ea zA1ruY9^g+=*MebWjFfv4y)QCx{aup-arN{L3TfZkT-0!ZLTt6sS8v!0-ZC=MB-BI{2={f4unUM<6`ESkq;s|d9=i-m+t%ANo~@;J}l@|vSw}8 z7@M4*pC27rg0~tD`fuC zA9$~I0?|N04J_@axjxP9ZHW+PqV`1E2Z{RwSbnvKBd)Hll-9_^QRgum$k~f|aBunA z%4fAl6gF>>px!_TyZ1%qx6~qiFVBjq{QPb3>;Qm-D%um}+-rb$?_@_5K1R&kpB&ON z6vd-y+0Mu%ZQk1j3>fjuMA(cj-sx#+Y5NLb`AMcprLl9ft9KAFfHgZ@g-`8uTG<B>FLW6 zA|*&qtIkY|r*yhH$ju$2hz31)IUieTZ$2T;>|8xA&Xl^^lU15@BHbyQWOnORRxrKuKa!qAN4foCAxT>bt4B;8Zgt zBm@@-5EnNhx$#U(g1I!cr2hECi7cX+9s1|=XKE4Xe8T9Tl91V1;i2Td8 z)T4>S&7e`N&oEW4B9{?M5zE`21JgFOteM%JRUvBqxG(PEDyos%-fb_Ai-^CB3_(;j zU8SgS%}D@XIjWY@^m^n@XgtuvQsfA&xL5nLp_Ai=qcop#`9C-&I6bCI+yzG zq&9Cs#Bl&(Rdd-vEs)}xdH=%arl7RJR=QfJl~poGO!)CO|Emk#0EM%OJgU|+M6`lk zS%&ZfrML+JnM9<49$HS@?e}4KK&w%oo;lwU7JRk&nQtJS4jUffF4MXx(!wY>IP_;a zE1^W?MA>1^n5V!)RyI(IF)!Z+3ad=&dIl4ZQNHZUvWO@tao`L9B}a$^n8 zBAD-)?<(C*x-QxiVTC?sn%$Iqv&wZ92*sAAHC+#TacgS$7cL{d1WyRY#nNLtk=tAp zJ`J)sl*_yTa1u9Z&}wGRx`XMZWvm2^Fx2AY-jsH4lq(^XcGNg8do_`EKh9oxuWB#= z>E76snJJkLkby3HWtDd#iV9rW(vK;Er|1BbDp(-Dde>%ae}8{-6J&(Y5Nrt8EV|ko zB5W4(uTFI;o83>=OBNe0>(7Vy7q?BV_5{6zMH;F-5t9JBks1}QU!&L|#QS5FC4l;B z%%)Iz^I#5=#&z!<`lFZWP+7dOPqcjL7k*elc5FRpl{B7-n2s{TCKyW<1U;6>V&6Ts`o`&rDiw8@-onW+D!dM=@{F zyuK@0!_Y0;kr6(jIA54*rSc0uajl=>P3q^UFuTNZ4zwynnh3s0qP3uc!Xe|x6k}ls zMUXZnTt#+I+i;D+DuQyI__O_XEhDtg)&3LuL%jF5DHNgo=u#=j-uj&8xjiuMp!%viQT>pgoKkYWBmN{7Lj{C;!u_0 z_T_Uxz_~%e%ggI0P!>D4M~_+_P5l`*%*kRBzTtE?5_w^hSA#vjC=!zS$P*m3!5;SR z;`n&c@)Kj&d_O|lQkOeq7g|y{#X?q*fB5Vh<2Onpk8BI%z-Vq0m4TDMwb|@b0vpKl zUOxXamEf(o2{U1(Hq66FO^O?VP@BP(LKU8D1l`!l>gw2`4G?K4YQ0vl-WydAYF<=E z{t>}fYSKmhNmN&A)D?lM?OYEiG<%ioBD@Oo*Y(nsN5|TMD{p0Pj#D1X@@UeS1bswI zJj#@LvollLngOCnUaR+d+5%e#n+C;oL4x^_?G;Nu5m8p73%RVqjEB!pE-Rj03?k1* z4t2qHx#_g`*h!U^ZW%GF&fXci$5SZX#PR>}ej{ykA)Rp-?}t;g-ziw#h>Sn zEQwmcZ{788o1D}rpTX-LY5$(WVJ#LnR2g3u8-r&N^%{#l^+IGYOO75fX9(dq0o`mYHd2UEO6~NeyVtwcJ-_ z20BCT0Du?JE)Ewg|HsO`;^cL?IUK%YHUqs`%@2o4X(&(Ht)^SHOS7m4)#-owix^63l3OUCDdpQaMt-NdfEU{lh*NLG0C zEr(ao_XL6M24x`g4?y|Kw2b4I0>422r?3xFxUfA!<41@k6eTxC57ud%C-)+^N~Z3f zM(!Qm-68~uH%^>EQYhAjot;cn(mLX1ZBA<=S<_u&4TYtt{ueRRu5j^UQi4+c3%Ds+XKiMtA1#^U2+o3{l;5Zf{A0xA%KE8JG8M|quKDVa{ymUih zg#+@V?|wTB`;MDsz_8JUf`9qxVS96e23GKJ+MoM$aaa7#W&D0Lu_ zN~VsvcwL^!e|j5t0sY?iEhb3B5W|Paj=`{%NmZ@ygZ#6)hB}PiV{uf16^g-T# zIlj46^3`yi`+p*Y7zj{tf~^RJlJ zmlsg0ip?SPM=pyjFiw*Y{$$IGlE$^+w3nX&dtuIZ{54CJ&5x2>LsKgR4?s|u^$$&L z5>xDgIILtnK{#rV>L#%4p+)<8BimYc^W(`#Dm^nib2IjIK?xRdYUK5z5*8>&b?@za zb8?vG)n-YUAOaoEfJpy@1BT!U+dw!HBy7pXAqC+^Ufj7eK>NvF+zgk#89!{p%npl4 zA8xoA2n)n{a-*xIyz+2Ef(JOT*dBMIpNkh6&Abj&KiSlTd3e;4L%p$cwm&|sojqtC z(FES(TPN;s?;Bx(@!8d-%=_^J9Z(bF>1yRDinz>;*WX1Vc^pNEs7XicPZnnm0{zE+^v$tQJTfV{14>;Xb;K@4ues077BjOxXY z!O+Ga3ALdYf@;WQLx1J0I0~P{uPs?J%a*L$VgyADf`afhvH$K54vfFZ+Co)&e z-p1VuVne9F&bzZj&v_7c`RpX3Q@>p@FFB=(K+0Sp6;Lh=8pRI zl?NUMX|Fh_^$=ZEFO@X=tI&`xujdI~_TPDM5UEUg*8hfqaN$=PZT3JdTg)eq( z*o6^2nhYP|W0EGAzgJo?MbfRm+(z|(9L+mPrpFk51^hsX9r~s(ch&SWyoEk>E=HspM>z9K7P`LcXz3 z*;1;-NgqiKFg+%r_vI-gzw?BseIIZN+`VCseUuS-&5>8;TV(}({HRyk&*=z51y@ph z`-iSY;q$CL;z4u?yxzQxFW2m=J^C=3m*SG}+`1yV37`8;XvDeV0mzG7aiq=@4vgw^ zRXV!YPA-a@N;B()xc@murSKGGQ_>I#D=U#E_vxq;{VfB0CyR=q7xYqoz8CgLMEx+KD|6=?vA6$}NIHZL0T zn*AF(RUdbDQ|HTBk34lv)KOkDweX9XxGE}V^it-mJ*)*YQ!HtYesuhpWrhvg;Tv1< z#>@MUMcpCPw#qJ+RhN>)nsA zVr)4oKOM9Nuc2y#G*Xf*v<`?Wj^u71VM`cFM6yM=j_6>P-j@B4=QzCkU4&8mXqx;m zkLBoo)sm0(pu@*MNO`fw)WiQ3#3&qQ2f}NcXuS< zSSr0SZ>u|tXp~n89(;n)pDX$#Mbzww<)U`USl8%r{dIhT#GZ|}^-m-=@`fy%HAgtp z2HJ*t3e9CD~DrRCA3JDU+gKH$Vx zwz)O(1>L!JA&^`rR{xm$1#1t${^-~J@E`EyqFQ7uQ!6H7J!;puT%{H4iZW9^wc!b^o zjW`D+3hCE(TbKT~HcElTP}exNK?#%xE|+xkS9ZUDXPeO=3NJjs;g%{f_>#7zV^iw( zRzya#F7NHXZWx)!<>pfEZGs2iU?9RUBHlqhd-`uNFC$KCE>!Xr@d+BEPlNtYF#YeW zG*TIU{sed@|1DcLZc+NpEfhH3m0-A_fdkZV@0UA7e~001;q6V%y+|OiHW=2X4fUsg zO-cvnue2{Zwg`tgO=*8_S$;*@~nxwzgC+*&xi-cA&mU zPx5V-4fi}>a4{~wbf)RC0HcUCJNHjv7ZhDds&R4juSMntXGVj6{#ZziARSYOXy6PGnO2F>}04;B; zCVX3QXOnX)=5q5Oj2EGE`Vgx392>K9#mvdgWk9Sd0U;;Lih;57PCak@L3^gF8kjUc9-)ko^}65f?92d1uc0@6?rep!9fokwy|Ip~ioIaWmd z$C{hwEW*icLl0c^m>$9PPsSU3lJKrX zGz2ZN>d~XyW94Rze%Tk$MzbNt?wl2&B?m27YC^&()uw_+%rf?dTn8yx6*!`M@UOMB zg5aj#tY=*PfYO2HBJaI~Q`ks!M|B~OUhWkik}Hp-iFZ1j=420)Q2+(Yz!`?jKklS` z@o-E0c|d0BRDZPuyen33-o+`}c2w+q`;`az%-jB&G*{ANOKm~~g+rctTTkgGJ(7-5 z+w%cTYC!R(@kvO~(PxN6JNOA`$Q#c6`Z{ydQT~l>u?x22MWgKu6GG=X%c{Nuh9SD= z7jziNkWdYL5c@54X|eVB!OlE)L_pcKi|CMW*+b@X@g;e2VzfA#RlbRaW0}BsJ zZsaly`=awQ>|!KkDagzG+JIPM5e?}9%Kwsv@P3Q&D=91E0@_0wd83rR$cENOawx&K zx3`o!MF#s$s3WBzNx367ie&iks}sl%7fB*N+lH_UmyjmYkJ^n#A=20{sfU0?7y*&x z3H`$n$UK!D@Kpn05#o(C2ix>m4L@r&5h>E$Izpki_KOnadwH=v;CHupyd=V|g_<1E zzI1C3EiYu}oK3qTS8rWJk7}96%PL@xSQAg@W@Mv~v?Cc{hTk+Yt(lhu!EC%#{#i z*jMCH4w&>_W*?+z7!Ze#QhHoZuvSL>QzuBgSFUUZVWTZ_U;t@plh>@x#dU({8Qkwp zXZYJR)e^BW(s8cwT>c@dK3gY@A|)%9k(IrfBtFOtg5VlS5^1;q23!Yx@+vYLx_gfq zzSIspI{9T7h5j-$YEyhz5POT>#NBRbBDRL9t!7Mq{t(QiM`$P3I^BGB^FbDE(K^IPXMN}$tJ zRKYj15dgGr?m>^3%Y22x1o|)@Kw8;sQ{K>3X1^+TU{?s<`-v6QYZO$@?Uez}=U(e- zKnXSzh2q;7OL~W8bL94454wkrkp!oaj6DY6BtM)+3=4>Mq8)wNWpJ< zB}2Wv!uEgUvJU8fus$V++4#UBbk@dCCh1Guz&O>EopxE+Z@Z3m?Z~qr}H(Ojp8zwtK`0u7_(tb$vW3U?oTQm@J zFkq!e%=E(u!Qp@X&=6}HRP^7%6$)G@5kUmv>@q$s?obv5&Uij!5oW+jz)tOE$!q)p zGs%Q4RasFhqOPy6fByUlV#6|Ur8jT>b#}o7=MAbokZ>pf9PY_5M&jY&DQ_M4{=K-4 z?##a{c)D_&@^MbI*&z ze=G#Su-MZc0A`go^mitVhZpx3R!Mcooo{Zi-Xv^McUwLzpQ~_Aw{OQMCMv6|3Gwjc9+HH~81g5A z4E?E{(-EknV@j_D)P*^i_3%RmwRAAURn-b2j$RFGZf#<`JHd?a15TMl#q}BUyFs%iF;oM(tFo9 zZm9yEC2)2L5*~m5P6NDCTaEyPwPqg{9Z1Dl~ z`P7sL#mT6aRtPdmtMy21mzrUpkdz%f2J%bYOJR^7S*YnhmMd3k~1Ra6{YZVwc{`2G3vgq$s@nN@(rWt<0- zebI{7VBLnZf*a6D`^we}aGO6axOQSFl4|gVufJcft1bM=scFv{? zMt1f+K*e!W8x;8*`x;=0rY-qh`!usviO0mgfBz0NL1v4v4Fy=)V*8BBv?{cV-aJ}8 zxm;LSsJ33n2Z`V8?2WER27mx1n3QF7Z0sDg*<>i?CcADGV3)eYk!8Ri)~$E;x(zlq zcgXb77rn2Ky1=S}TnXVkJ6M8V94-U$up}`r_ra0dF)hQ3Gx z7w*2|+Z=&(ZB`;e0vae907`k zQYZ@Pb#>;2|L?{(ynSFU-jFvqZVm%&iJ%upBF>k94yB4ik>JP|*b9)u2{?@&tP)~C zKeqzTis2~-clZ0*DDe2W7tKlyds7BwziClda5xwyTeP*cH880G?-!V)APJa7DdqZX z&PFK-Jf-5|2+)?%0-h z=jo5oFuJVOwfo)da*gynm_RIvm&g;{oX# z@}?LRdF_u&0gl+;v1u3?t%1~VG&ta@yYy^&`{d55JIO8R*RvZH^MbJipscIsjLUtm zBcvDsV+)vgw6wH9djTK;44Y>0`^P{S92^{MY;3HoHMXEFxD=poV6{8`8~JB^)G`NF zRX~EVva$k11eosL0FLp>XRs88y%>KYzT;`@EkN~oFkdT)hYAb~ zY%LY9xkZG18*ohl-2+nrAWn;m_W>Sa3ed#4pKb%_=nc021WqCe-f<$Zxc9^GcB3 zi{t;CE~0(e(ZvN!_iB*BEg&Gk&p$aeH8pwjTJ!^b`t+p~%?41d0DM?tVj|!UoSmBk zKwlvmf`~3q0WkGN8n<8~H-E04x_5PT1^bEzBOhGn3ZelPxk~LYnM{oW^(WCFW1scj z@ueq6Y~Ql&4fMCJPFO@_Zf*`J2K8Uz`E>$@!nrvS5fK1H10?{R9ykp>xs*s(1`bp7 z>mm&c-ur-kVQeca6Ho-QB5nzyeZ}}WV+rUTOQyhg*{YAf_jDL=+1`3iXY=8MPv6?v z4HD-ZI9`AR@h19khm6avcHY+)9neUnagv7^amW7!AGZ2UAhrn5 zD$r{dtOMK8J$+g~3~xEM;IrPtiGTA5@Trjm0~*SZP5>PO)HDAnK(G{J^lMO`L^|5= z)RrUWXLQ@8Wm{0g*BuinFd|40OzG&jVV1lNJ_JKkJ_G9L`G{ftq5yClYV(1L0Ty~3 z#8;G+Bkz6S^l9q(_*09GKXG8o5o6z@aj~qd46ralH(5qfN6>*CU5@qvwhIiqbGV+@)9%xg2@dNF4MC}nuS@iBs!b(F zw0rbu+vqjaXensjJE!3<{+5;oJcnJJXF+{_PqU zaf>L?Z=OLfCs-&bWM1RrTe&{q)8HtAcah!E&EYBAoJMlU&uB21Jr zDrG8as{+ia{|_=&I+K??svKx&H~;@{WUSo(cQV#nCTM8rRDa1>lTv!~|0e+pkg+C1 zEXk%C4>pbt1CDK-=rV$0Gk>VsOWan91`y&J60;~)1yg?oTuhP1?Z+3}9n!v0_ISi! z-@hSoPY}%Ft4*TAD3a{Hlk}oy{PB~=1a_lDfs~&vHz-3}AO6B@sIJ&=Pl#_^A4=dW z-`k6~f{MYhXFQMyYWAB4Y5u&w-#bf|v0U?CA?BDXEU#MDII6;1%aJ zR)Tg@qTB{f_5hSHI8$i;gePctc}>-~k*kM!^U->t{hQ_}JlC3n6I;#Ps~uSO33lYo z)sq;inJb}dC;mhh+B)-^o(!WIJS4<+B-(T1EPge^uu#NngL`|2-g! zk$fbkLO+!O5u4$YK{zZGZ;F+xZT^02*1o2|LBXOgLvvCIBCM4B&@kg_XT3^S0^2EN zf%c%FjD(n&C3ryApJ?IAqUg@Cy?1(^n@RQ9m7oXe4zpT7Lhbm?JBIK{UV8N_WwqjW z&NGi*e~@NdacOTVE7YgKVFi3x$7ydW$7^b>G&g3{tTmnFue@D4W~Qd5-Oi$Bi!MyZ zoF!hZRTg7nz$a zar#lx(0zNSyf~$Wf>w1?`3W$c!Ol-%=h=GvjEpfYvpHf{+B#!qkho-eobL^>f4ch| z7<_u)q#4I*L*JiV7h>l8t}$=m(h!2zHc#p_xEy^|kc}l~?MY#2pq(d}l~5|m)sffz zTs`th+MPU@kMRZ8 z3;Po#n<(|nk&6taeEU8=Ub7i}DiI`IQmEAUK}w3vpD+0s4s_4t9MQiBeF@u3qV*m~ zF&rZ5$MO$ei>HOPr8Vis3%)@U?so~4H+x9WL%C1+;1EtRK8=C+pT%ZYk*zAoXD$oe z1--Ar)Ex@*h3dsUp|-Aax*r|pI9#595vw2U^k^4jIBOK{%1cuq;2RuaqaE5p$?FngW8K^($XUBicc?1m~Upw2TvZ%&BD`B!F8dl)FK^D_%Ct z$6%>|SjW!0a>vnqq`}{8Zn*i0Vc&aGcbUf%duKcog`z}d+9g4^vV`0+hFGo86Q)Ev zS-4JJEb9h!t1WF^e`I^1ejfq?e#O4T`)dzfj4#vrf&Mo|_rHJl9UlIG(SWPh5oESu z=k&U<88@FaNJMX79H`ggHM{dZoVX-^^X>jAb=WMixP4`cdbBW~`D@8AHbrbz4bM$@)d|m_El@cWm|;%!A9% zLLn zZK=;xE{oS%;|=eGKO`QwEAzTWMP&NAGMa;L7Gey`wC%ca?qhMfg&hxfYkWKJC z9qrk3`u%N3*=(aXj;kNQeE!@nIcBj@Tk!3rnwWZKQ+QC2QI^+EqWvBGCe@((DZE<) zSWPT?q9?8tq11u~mg6TGxhMUkYM+LbyVwo!n8p{i))()l$uzck1+JKmAtg|$KZA1c z6}-Y0BaM{$x}&i$l8TK7eC1;98`3{G{Syq8QLlv(x)PQ(Jv$)y#eZ6DQKwjvT>Zn% zO9`4vWB??Z+pHv}FA9{9kFWP&$?l4_C|}6Fs$DnvkF=Cjl5*bYL}L>6p!F@lxOoal8Tx;vO?78>-IH0yEo285$+$0ro zh%@VJlj6d7JrN}Wr32)l7lYp}Br0#Dac0CGPU{qDCxf__9@v>!$+U5MyD^Vgz5?sW z%5$A^(6`ZFW%=uy-BQssVF)1 z%)4;_STae!-8XVEER`IY9x?Ur%oE&J&E#O~Ma5`~NwP;)KkF^(vwd_mH;)o}MEPm0 z|Cjz+Tz!1&xFArw8Eh~o%)?pufVZHC-u3nVgs-ldR7BdYHSA7^U~BiD1)epB!DEPd z)H@a!e|`K@i}?eKsEBmAwOd^K$>HpKS8LF_OtKaJM6F#efBHMadf=+7ptbfpBgut7 z(dn(Uqbuw_`kb+ojG*q*Bp*EY=v^3l9Ce@K;JO3RZg9~)JHGQ$s^j=1ooc|ToL~G* zX|-v+uB&O{y+GfY3F^JTeslx_-xoCET88Nb%G}Hm`<19G-hkH~s@CR7wLfJrHTc$k z^r~nsNKXDFROR3hVVbI_x@bC|TcFi_24Ju;VfBxx%@r&{EaNv5@3S*Ivsfh!Gnsm} zbT1fHD~#unCfBQAqwl!Rv z)Qu0FtYMqHR&vxMmGDF^lG;r*U&x~18%mh|L>VquJZDcM8XbO$bNUfUnp7?DG3*5d z1%?XFPvFt6u5=G3+MKq-HVu-mB|fVHQ2B@iTq0qN+O&7?5vtIgCkXqmdzQ4A#yz z+Ui^J6&IK10e(bGwDlV-dPT|i>+i>Q#zT>PjS@i?9+1~RgJZ+>$R+UTOV}H{0>R_=6!Wh)2KI?glyd4z>LrH~q1=Y$F5kxY zO=0h;lJ{kn$e$+j=FMpMO@tqvS8al6if#=QXBQ*%JI}9_`$ev;Dg^3%GapIpiu(NfLsDfI}@>ouM$^Vl}P|?;LMq5I4DjtKsLO02%82nM}v@60I zhoQ;)ptAS(xNJBfHbX~C`ax7xXl%qh`N~-?{;Qa}okj=7uk9aGv%6C**_`T`D~_kh z7&{hqhnNNz^5q%$bp4f^8GN|kUw`5Anda8*OBHE(3kI&@~l zRLJhhU{W!UCdXZkP0X(Nr?D67sd`t#`-G?`xtOHW{n7IC7d1JR+1ZU&z$hv~A*QeF zMF-h~k&VyxbKqaD$byMmxfaGZ`75(vd3H#6ijG83WQzDAnQ;5uakGo~xqTr=yFqkg zK%+;S#qhN2BTm1IW4Ywx6;2mCY%pC`5`#6=-9xtDNK19pn5$-%G!G*tPU;dK;Tntb z^=?Rb-j{vL&Z5~#NX4xPCJs+s+lS)lRy$kQZVDQsSBZ1TKRU1EJ#-GmBdBQT%*|{p z%xrMMdL&Sd=t;iW$FQjr=ux|joo8?f_Ks7|3f3L7vG6?-_9QkOwvJ?03ge`w23wc( zbG@*Xn=nR@3vyFZ)cej&o2IB3e^h=u|Y=U;}mQuT)8D&7k%Greyho6 zH4!kS2x;;b0kfnw@+8;A+oep@>?~4`p`+7KX@-YWuWtRsqS~KQ_@qwkS`@Wd${DD> zh#K4?2K_dW&vaSul&7FaUi8^mulW%fIGUzejFm@gOk4+qmxIU1t@+h>AwJi25)OIf z0*tW=L&siXtoSrUe4xCx_bTzcN+bej%^GqbjGVjLgF|bVPZs6vTYV)X-m1?Z)l2FM z$oO{?rd+Nrs5{MZ;)+krJ}r1sm>;;&xT+CNf4RP!Vl|O1Iv*7Dee!U8Q^{L#{iKO5 z<$lQh^puuy%GXH*a<#7g;WB-}YUxroj1_S)XH_>FG;>cd58b;KL*exG)K+FTI^zxA z`*mwP+fcT8YGA@Eb1K(tHBCx~RCOgcQCg<+1HX5;zk^9nQulUqZ0uVQK{q2o>hY#( z_uHBLSM|@oYkL^T1$C$EGxKSylWC}*T6jrdAC1iUyZxEAU^r1%pZB`>L?i*b9`RZW zU!oO?C9SpS(kyhF&d9K~@}+sW1p9c#DB*Ty?{7B982 zBb)gTJ5vO_?PS$EX)Tb~BMJ;1-H|BgDYeGqkk%whA*Y7RIVBCP5b!W4H|7o8%8+Wh zMs`2Si_H_YWYjcr8rqZYwQ<%v6;6l)F)?2w?JD_Wo$7(`@5)tI_uR0F#lylNCeEZm zHT^1eGXGV>BFGoMP`eW&D^;vYovZ z~I7kHP$Rg`YqZ(Fi4?9lIo*qy3BrYft8m+-o8i)-3gv1u* z-&CV?d*}R~CK6Un|uIm;q(*A0#VWU{#^7QLxS-LV4 zty&XhY&)~SQPIZ->y8I;o`0sJlZbAyq-bg&k0a+Kf)@9NTp>LWHya%g`Lvrta@vGQ zY)21VOdLh~w|%6tF4a4OW3^w-#m>I=M6oiid~~`#u&9`SrFeV%OnH`YlGS3+)x5uO z|6DVd(p)7o)MCYc!-kh<`be=ytF=qxqqn`Gk-xh7$YCctpDYqa4=E500h2>vLslBu zn-cq^=n3f5vF}0Q?B&Q*qlg}k8!O9?UFK+^-Qwzc+2_*a4LdKC6oVqwbdp=nZJjov zle!_#*KgMtd5BRoVU;D*X$XZk><$baOZ@Sua^2sJddIU=Hs@v}c_m$mJ2n^E`oYRZ z0J>J~hrKPW~e!FQ+CqC<4JItirc=DZG z*aVr{eC-fNY^0t0f@B`WXLQIxH?D|>|DZCHtZrv*W^)C^O!zpO#>{CWvgEzkv-;9B zyvz+fJq~De+41Y0Ux(ZuOO~fZ>7kBlL7qb~Yj#g!1#lOIe@Y^sh}=6#rO!Vbe3bgK z2U^j*4benx_qc>R>eWa0d5t+;``0hHIeQ8-){{lwIS_VK#AX;gNYdDYRpr;e*VR`? z86QlUqn|Oxia<#xEKd-!R8cY3lf=EwmeKbK~oNnLikG=x*^HzLigG+}(n^6P(}@ zoS?zoAt4alA-KCsa0^Z#I0Schce{(6Gjrx-X1?Ed?{ojVcRvq%uV$^PuI|;{^;UIt zHxbcsyoIVd*9XQfEqDK#{%x~8cn^A8f7Rwy< zPPQaxa0}(aUNz{>R@QcCJ#L!1kpzTKfjY;-6<*(Sm)veF0?#r<6l9)75H&=cekzx~ z5y8I_Z~A;O7G8s?=G1*#O|npFzs&1$BA36g?(0M%=5B%v{T?{5pzcab_n-l=aFyt6 zl;}gX^L2(*6v7azRc)QdJosa!)vm3zdm5m}FKiSNbiEeq`u^-nOltO+%6|Y5*ya9p zC(~g;S%n2*`rYRif~9rwL#?}HnS3{s_=k^m0&XrlUw1#ZJ$!C?I-0mC2L`jTbdLI{ zK5yCemlfYdORA)wFCE> z9&AKKU|C#GQJz*Cu-_~$PzNv)+@>qcg!pVp+Q@6J5Gb&>x^DL4a>5VTU}N8eP6LJK+evy4XEkZfY$df-UDW`?vHJW8(clqsXz+Zli=KMc!C?%yUX@C0OWfAu z7(w-=@X_9E-nOI%BL-kqoL#f_^`*?M8?{(Vc0 z0=AcJ-b~}`os&M?6m3Fp*CmG1`On+bW@wZzL9}(4Y67E*8qHR9M|r3>h{3_8=WerQ z!xAZQL@f+@p02=wT`n#m_oZ}S1icl%XJ1a+9p$G^%`<@s*5ucCYh`#{p6h;bAzEy8 zI~W+gV$|K(Ns4<4%dC4{z3hUV))*f%;O)?QC8Q(gud4H4^IG9M6Am`1;49A?zqS&J zSAeZ&4tS4Qf-awU_+8hdzS1S)9N56FT8jXN`2tV_vRSDh8=qQxX}%wH9*mtt2ExzY zh-Z?h(^`=$fwqY~n!>1v3c&9yU$CR@oA9Im=N((pz&nzW>^>bMk!57KkUIr zDr7F-=W2g#T)KrD=p|;)UTeQuJrYf!ySBAw`cQ!W*(E*0`2hdy@@BdF-R1qGafIbT z>DRsLXwb9CJG$S|P`mTx<1<}i+{E)wpovu2^N(5l-;=eGAZ)c~|2U}y`LmTvnl&S0 zkrMLjQRe@aVn15{k7ECmiKfqPf;Y``jtQFoS;&8v*@p-FS3&jva_;}0 zuVK>jY>4moa2h7>srU(4Ai*3*!VdBLPh2Ik=bH)tIhhD28P==LIW=fuJ@2gQcCfqn z0T18(PMvEnG!ZZ6dGLTt*{2#9x3|OUz#9felLG}KmZptklNPO-MEa94`R3Q8 zQk>~do)w9KJuvWCxYKd2 z)4{m&QOSaa2KeZ}oh0bmJrtdldCg5}E^ckJWPc0~k>zokaPtq@-SnELbHj zRS`Y54qT0l>uhej&$3f$-ObqWQ(#o=7FrqiD5yei%bt{CUc|DN7WjJuXi^a zU%=EcO4=`TK@#*hvr!#JzL@L3p;m8%G9-;?tsX#Qc=HGYn?YaS=pyW}uj(njS|>{e%kA@@nuAWoyq7#S=B8=I(gu(E?YISkkOSM1{`gETQ=mGX zFb4=59Rg>8-o=8pLRJ@Fu>KEe;XRszVRL1KdIvs7*ozg#3Uow8L1m7+!}3SIlxaOT z%}Vcoww;J_VA#pg=);BxI^a84AWoJ^5QJC8z3x8S$wp#n??y^x=|T9e>a)jNfE|%A zwZF`j?L(;PqcOM{4)xIbdcio?%JxYq3?Zvbqg@H1w1|QJCrcQ$?#!E&9Q8R4a(0Ul zxH6Jkl$vX__1%-nAvJd%5Q5F9j)zC{Rc~MVgIyTw8y9Gk%SeBihvgHcaFG&pE;|eQ zYDlOz(C2`wQddsoiTKL<8)f~N+oL0Ai;JO`ZV>6x^+q)4Kmm8lZ}?_J(`(ks?0vD;N7%6@t1n&}b11ax$_)$~rbnickfs@j zh(Gp8LZrhQb;cRfY(F)o0Il*;QIK50=Ax}_-bK1^l3^&0asQ!!@sQ+XD^9W^(=u1$ z0VkNA=a_BeW4P`xOk`PUC%V@x(2a^0t2>kPFv6XOhNw;Y;FpN zp34;?f`L7L3LK)3ul1;kx|#R>2t)3RSP5O~QEKiUQP7o}vG>~R`64!ee+7~1I0}B8 zee~j#tJ4w0u$&}Z4~*Q@exqg+=mG`Wt>0E&JC`E+lHadTaYry*Adf}a=o(BfV{@C8 zd{mrK3JNX1Zs>VvaX*5ndFt^<-}o5bQrwA-XPQwi6~|gZkDR#GJyI;v1*g3}&TQ=F z3sx0wj>BVO!KS@qNKsp#t`4_&y^#Rwd@aiMpfsC2m&Jsr8!ae$&>;TJ<0$pM#8IFe zY0a;nV%|q5!hzt_n! z7$X9ce-5I=;@CK$G@asVu{SS~zT1;h%Jy!H)%_Y-dog86O=*d=LLN-)-|}YcZ6BxQ zj#?kC*&27!4F5ZWyFD6(FUMc0Dwx;r5|3@m`e7kr*BJP2{-G=eGt@G^DHMc z)z9Qu>b2WM)>MHVKS(-+x^x*eU-H}V@dbMowsqD{!e{R9eI_44tz*IFsf)XKo!Mql zPV>SrzbD;G-4v~t#Mm%jVzA1XWjTv?tN&vOmS8+9Ro_nOqoBds&u_Rm$@KVDq0wQG zP+-R5VxV(L3wqA}+vv#2)!wroiRVw*5*)~+pJin@kWs;6F>`vpOKa-AtkSyYO65MB z2KFbefv3QOi4x5NzG1=ogJ}{$;DG8QCdrX_R)Nf-7EsT>tpB%?6ACh}QP!fW{dp6;D49DShCpKW?(07gMYisVlIccuZqR5_T* zpLzVhnCwBt!sd^KhfhS`gfHGU}ohSAbmlv}<~<(aPI3O%vND zyMBSnlhzZa&bskdo}P)cfKsdmChPY0jU}yu1vH>6l0D=KVKxl-bzhmoi(kDg@0Pc0 zwwdqTdyC+;GjJzT2ola~%DNO^f=?R*a*9|601GpgWEf3JzobRsNvVH3dl9d0umtrv zOt_83`H>8b2nQJ0Hw?opL(hlNnFFXZmqbzGuxF1_B^TpW((!t!7Cj#$RBs^xl zuKb74TVFb)!NSS*U+2FP&%-pH?WhyUj`9&$^2YE+Dpe-%a8kq7Re&J%Q#DKOeGlQq zZo?28GZ;1W)$NS&v$!Epf=yQ)LDCRXov9d-aQz4$%x5RIBTzT@ zS9Dan;+yZ*=g^F~eX7n5US|?GI_-LgFFK${p>!6!4_kn;)0&zeD8#c2PX8)1oz2aVlqt)VrpOrmeem#MWoi@{Kgmpe{opjblIyFFJYC*ksI=vwcKZ z3KdyBMhjUikFs}V=T|np+{vB8l`H}e-=EWG&afkipR@NAbOO5%0?74S!gqTM#QCZ1 zODc(lDI7ZXfJMfH_12zm!8O86uh?&G9+jgbJ<#)OLlSE54*)n>2ubJlRMA?PfGjGK7I5XL?J|aqX2#QTQI7?;CRv(Ozm-6Esli#zB&Pgi>K^L*(IVF|Jd< zlX>(xJrfCCqZTiZKtTP(QWO_H_c^dCs6T#xME>g5-w^*y;&d2>k^Q>Xr~RKtK;_ek zYe+E3h!`pb`5&+0z`$hPfss4uXfJf}n-rL2T+j_QIGC@L0x&XbIQ|+-eWk$ubEdz^ z@INOLPFEpoe+@#uh5wNHHwql3wP+Yisb6EQ@?R!RJPg0-FcIJRW4hLpO@qhr$Q_Wz z9));YYpGdjDE>fh*d2@sByg{kffkS<)};`JvMuX@od>nWbgoBOpXQ9Y_HEwTZEs5y10u_TI73c0w%DvFK=1UV7RG{_I0tJ@Ye;MXK``GRuW=j=7FOOo{`EzNJ~pqg$RXL3*F zyLb$KX#&|Wi{XO0Y*i0V$1D52hTuT^5K?9Hb|C}xge z`7p>R{I|U0Ne!18=dyOVQ*k@bRUn=d$7iN1`CE z1WQ2Wz{{1AP1_&CXgUgKsag4aoEd0PKlf*LuN&J)P0#tOroJA3bn^%N*T5PlJqdfW zjh3G+bSO7^j}M*$Nl$kp*rb%)bi7|rb%*&L!|=7-%6Vtnc;tj>fybYFCN*|d0?7ZV zth0i#a(kixl_#dk`-XzwU^s@W+#fT$l;g6_6EG`i2X5?3Kl0?$u!GbRf+k#Pqx}?? z-Y?vp3$GO)(xJudr>A*$j14JXKLnMYZj~x%91h=p|LK3Bb}T92MlVNnysOFOi0rFQ$1i0a@S z+-k?}>vLr-ytOqGT|{|+DC_4w^M+BjV}gt3#Al$+{mf+91KWvHS;A|e&cwgHyafO5 z38d?2u^*gspnj#{?R_q-KgQo?G0p(6xtrwgFSn<>b1@DgY8ksM_DBhHY&j(xuJyu$ z_y5(Sp$aScmVGdqfu#dMmS;`9^nhNW&{_uq#Q%6jhz53rWQ8m`l3~wjUq=%5c$l0X zJWlI-vbp;$qxg$yA4;uH|71nXj*Nul^=bzP1p3ux8-y(AQSw|ZEX~ZgfS7q;?a3Co zp}zj|{mmJ$dMMZI-SZ&$c|wCQrESE=ZP|TRH5Bp-Oc{0*DBa_*VKA9fui4ek?4=!W zyf}~$y!z+B`Ah>GI(^o$(f)k}2)_?8`+$T896!!Bp+E`(fjBIunGf^f!N7!qm~(qz zto|J36Q>L9b|87i7lDx*Xn@?$SV{U11W)p(s#_KM&xrm+dCl){g#SDJ_g}PQK!wJh zae^8GU@yFa0!{x?eg|6(!xD%Jl( z`|3Z_8o`Dr@cfpWk#v|~#cyWUe=&&w*g{3;l-GjrT{N8Ybw~xabUEeOuG;}+89wegJ7J3rz?{g4Ji_1WO<2dwGbJGL1fOM;Q|iq}ff-5R>l9Mi$2 z0^~1m*6yANi3*FS4to&^UXsu#%<4Ya4~mkXxCzBn94ruCGL^bX(xyNqoP7G)LKC%E z6Lz)K6g;IWX82Lxi*(9vE+kfZ>PvhMN~ebICXJN7^$+n-%;sQQ8q{mp?H)_>2DP_3 z!7OrovCBApi=c=?g^@Qg=N$H{{Ltk=(eB?&ft_N|P5s-UVVuGum1m402n>H-`YL>j z2v~1DMeS5-7n>_iOt1TD=LA=78j_$@QTw&b#(SpGQrNb_(lyvtg}L+!uaxfX3ol50 z3qoM&Wn+uG@Gw}#kzbx#{Hs9;pVGze=J7(8c4^LaKTFuPJ%b+mQ+|}n=K~0&N+S#U z9TA?xb%2xms%=(;{~DZ%WK=>$Sw zLiK_4HR#)v1+HhnM>FaynQELfF^1q8oTara6fmTB8lzB!=F&aWpQ#U5UCF6`A|CU! z=i>6N4>XVrB1q|tsMNHeC?n#sWMA#xT$QH@iua8_WeA-ZD zYJ1op?j_0=O!GcF9mSq>)$Dn??WAhEzjtFt9W$jI3SmmW2iBQ~lnXpOG`+?=mizG9 z_&TyjEGu~(_TUT$gH_Frf{M(p6|)m|{4{uwJeI3HN#?~vS}^|kAdN|)3qChbSIsg3 z_(nFotC#&Snk#BhP!?v2OV%{_q5Tk#wu+X)>oeL!H!i6Ti%mnNo&zIKjqaup^xn1> zDR?JV6q(m2)?)Z9S2*$*$WkI0V-EMek?;qHO1sleUv59j2&io{iWA7v$-T-Uqe?Of zsWnIRPE^}Ld~~*~_JDEXDjstW!Eco8ga1MMiRk5K!U<0rHNJWj{%S%Tk~d^=fplNH z%C)h!0`0M*B+ly=UrEiH&3G^`8TqC5HSxqqq6d z;29Z8BVjn@tM#(oG<6J8t5^@Ltip4~_G9Y_mPOuKG0Y@ac&KjtxC|0$fpw|kb7_Fx zp3_UMJ0_nYi$pzpJJGayUk0oYxLIwcPG@Q*A1-3XFk1+jmYDmxaMDrcA&ZMwKtslv zW8O@$&o4{_eZk|fO5ROFAGWM$`ij}sHuIYa(o1bGF;%ueTX;E-g>f;F#3*D6>4s08 zS-536r6(iTbRH9yyP|=m_%Dlf2&Y#t`BT!_;a^D?qWWD!fQjU4&#{ePe^ylF*EOOek7M_ zvv9)g+FlqO2;^5N!zhtVV#P-xA+g5!gUPT_(LLFt|8Q4?S5e8Xma43RZa*%U0(W-Q zk?Ap7Ev~ATA)9r+WT(sZ%nHO2YexfB22J-adlM98C=q+2zznzn9=;oGb zJPk`|pRxNf25Y*ZmT#8!9m^VCiNw#1E(oSkwck3Hw~dx^gGn;Z9_MLTW%LeiUZ4bO z7E(YP2_e)m?<+r}N>?U)F51N%1PDf%mso4r8#|ArVEN8$uQwWE;Hy8w|V_F_~)AFrQ*?Ep{c%9&r{n+<0iK(c)wh`IGm1Za=O+`93@mn4?nrQqi z@2f#>YQPymY9sw)kL==HTWas=ex~#c3~F;7uQvBEYp{vY%#)Bjz+4K_dYZI3ZzDPN zU1ipiUb|)n2~P{D=v9TmjJ+5`4$rWw^5aNgqj^7D;xwiEWn zR%^T z_0r8`^G96vlua5GQ}~2N-aB;;Y$we(L6`>iyZs78SIK)-706N_>!ZKYDNMxMSbINg zT#RY$;up+7Q0G{^IPCXxXe^}-K~W+0$YhHn#*ahmYoC;j6WX-(C@XRxJW(rJ`@dD2+ z%R1^;{@|wkc^uTR!L;8tdNAGX!GZJ6Fxddi69b~|h_Vn7#DzFHw%?DJP%tbVWN6OL zj*|qnrZHu_@#2%_;OGuRM?{QbHTeU$IY=xrALQ{F|AkC3&6a^9OFry9{lU9P-^{)K zKrtSkti+}Wv+dNe3`eoZp`*EVB%(;+X~psPpFSL@Ntt2{yNf*l0|H{jhufZOiQE*G z@K#QNSx-nviAMYJ6gmnnu41(VGZ_laps@|QGzYfv6x^Pz4WpoZ0RdIwXi1@VvZS;n zKhg2Y1kPmY3JAN_&*0xbj)0??oQH>hh!-SgEp3+S^hBp{yuV8v80Kg9=?LB1wqlWN zi-B6+FPk}dNfdLK78E+?wp|_fY3tJ8EPj0{`{dK4R$8u8MQ&mFFn_f2AyizlLW{b8 zxc&H@oIFwF&tqgE1zz8;bO zjM?;KdLy{KHQ2og(<81@oz6Lq**aQzfO?Kf3MJbR1KL2GkxW z()lD4B96r*G*}Xr@9Ojz)wD`1GmN10V4#qKx1Cjav)fp}WUh%z-k!0pW_soeVdM{P zW|N6_u7-Nu5FSy6&}-Acxe15)Avj#7KQB}|X&w57`d4Zmu@a_yt_FSnW5-ORvV{W& z{L0k;?tJ-=j%i|J?Wkg4XleZ1Gn-?VtY?`qdXA_L2uPQ{aFG}@SO6QOj9ELgRKhU# zko>%-I%Rp+{2;&oE$@|9hEh;uG?PGjxX(>E5uwlfI7@#>b2+IhaEc)2`LZ0%FY8-| z-VU#UU64x>sw86HQTg)83;4L3^~SLizAWKn{@F}kb2Z2%_hCwe6=zxk$5T@?Ke6|9 zojkik8^<70U88|6V{Wwfm(AF4Nt?AHyGm7xhHHx(34}FKuiZ}~uit0HBkeEDI?QYB zsfAT*gDt1k1bZh*IaGWPCL?2LsMed~^`&G^WoZWU&$xr6)uM4}^$vqe)a@;4 z9}hi@UEeSZPiq{*$y9Co!QY;%W)8DSYzOvX%qdZE@sWHcJ>E`O$F}oTgXkJ;{nB|% z#zn6Yrgx}{%JPyRQU=2AMIa*N$^9!-GWWalmtv1<#IM}#h)rafSkS2?9m&wR9m(u* zgZ3o+HlL!Y8)dO!Hjd0b34ivV$CDZ;u1C_ME=Z-g&k8*ioVbqAt`J6 zL{cfpu_&4)$e@1;^PfiYGRb6cZotng^%@KeJdzs57DK3s1O;vRn=_>ul6d1kZ<{?$&ChA*l({A!t`N8WdF5!h+JhxVD= zu*nEPFNM|R#%?sic-F>*P-LFn2=Y%7%Np*rXa!>7#$EF11dXiZcj{Jnpc~#ioMGC#fA3h9y z)NU_>=^aT|85W`~Xp+u)XO@1P9zn}+x_lzCZh)bKTvjFN`>hv&=5&=dLd@9AD{ga= z#z5DbYa&Yovlvm$8~tQM|C0~&weX_?H&0?L*%S!fG~TFE@@Rl1vGtZ`X~`c?OH5|^ zQ=jf&`PT{(TD8Zwini7HjC?!%n|Np+Z@{U-9aH3nNGN}FekrX@oyO`9?xrAarG+JY zujcRSyPc3s?60t~tLBel&&{+9S>cC;;-_aLU>em=jLHOav^dk=Ae*I^y`i+rswgiz zHLCR35Wh2}&FHe`EnEIz|p@NHA))6thq9U+<;{&Hzoi0rmG@HhdZ_5WJ zA!mn8V26jhXy|xx1v$JmZ!+OpiwN?L!atShjs|A^#0<+Y*BK3r0xlxWfD7NBm`I=N z%FM3ooWwg*U#owD2r4ENSN;mUqrW6BPJeNm4aIgS>BP|hl`c+s$Xclh!{hd|&MTCD zYffBvj&^Kk=N&iGtGLBFEhzhPfkrBaQ>O1G45zTPnONfrJV}r8>KyG))n+sB7d=pV zqEz(a$axjRm9QIH-7<+UTuz%#sEr<|Fn`GDj5aoeTepNAPKh(?8TDJeNOlW7tosz@ zgSTPkm;Kp%Q!!VL>-%R`1?^k^C(19Q95iyG1rjC!!?@OE!pm3@$=k9`1#XR6H6zFw z1^Qzz^j^d&Ot(ofdfv?T#y%vgIA(cvJj$)|C<^rS+C5bzZbCLEKb32 z=pYOiR7s%HnZ#VtXvY8 zTD(DOrI(@s(acPF_|pa}2@2FO>wjkzMwkyHZr>=6S&j**Aoqds)! z8Gq?!-tYV2Ib>o2(KcKxxu745F38#@( zvT~&ur_3!~d1ivyrwRcTc1vOd@kVf64s7>xGn~-E_a=fI!Ba~8%7%73i#XsvT>fW8 zN4`bC1BMQM2E2Ey*{_Z=W7nAK_#-*N{SPuI-O%4mFP=nkf+OVHl4b^M6omUuqPU^^ z{+;my@N@yMTbqRJf4o)ul(r8ZbKsglT0_jC4;*^e+0KfIH{KuK^$-W)VZ(^F^ zs4b5sU?(vPq3CPX0if*60PF74p5;@ zOaVz(V$pq%G3@65V*l@TZRu_+qzXJ+*&w`B?SGfGzE^0ZfcoYLH?|Jc=ZhW@Q{b!C z&SX!)YL*jyP$$X*5f6HW%D*D4dSaSO2r=7zSV$$*_hytd97A`D4;{3g`9-hZcq$!-iBcPN^OEpvfgeR)OFWNf|GE1**!Shpj|+d4V3LtW6Sbn$ z*;tiQ*T?C}j&L9m2Z1z1WqpP=1TuJmws^bylz{jdeFEzoKl9)}&W$CFe^;mpkv*>yzu)h94ylRZ<1a(&+H{@=H6SB}+{>%SzI zToMqv7?!@wY-sm3>a`Z~G5+jTrAvLqRy$LtMUq(Q+_t|_YMTs6Fm&Nz^)OjuJz=y6 z?`%>oe%p>1IO~ev=a{ynT+8Tg=ivtvDRp-B1c2{SHO^5uJLl7F&VCrJ#Ym;!){Fa`=m zO4H8A3mXA7NAiPq;8)Y|2V!)H%Q?K(7sh4Yw>Pgb+=uxFA<*=~@{TCUB6?djU{2O1 zx9>W)s!_<81~i*ZG6QcWxBX4C(*+;y^aKx>s_!Y*6Ja1$_wCcK)w8YAsJ^V(ZQ8hX zRkO`2v>_9z9E3KT-Lw?1>60Ek&=@yqWCtYFDw-N(Y z@_A5=_1blfHEfpCt6Xd^oClM|Hu3F;n zGr(zyy_wi7+m?5$q_;9)inf(l*Y+-v$k(H6+*jE8h>3gPbdO#?F7v=CMK%9g|3i{s ze3mC#Fov2y^|1w8dpcTc)PqjwkV$u6SXWnKw?^M;uVHAf>C%_aS_zq|70?tK?zPSF z9X)0mCt57b+|1ZzIpLZep40Dr(V<^`tVYmha5}M~BIt8&7%{Yi3oM8KIFO|N!N)f& zJ~(bgr?mn55nYeT!4>kJxVv-ts;S(ZSSh2wc(gad-S&I-@|AweW)&<3`kGb6=F`mS zwMWm?#8CvtM+TGZ=u^Fceh3;DKwuoV*WsP)Yt z*G5dmTBRzQa6m0T(o*zy&yP0e+-C8fdc>EW!0w z{TeZ-I8EH)92(g65Xud<2KBlnY$uPuP#zomh)!n4s6V=tD#TRhfTK$LP>owoHD`SM zyM1E52q6tGA4HA1^+F8y%@p-a6}@ka3-%j@DZ#$Au&cMAZ)i1;yDieK0dlSw+*%#2 z0YA3hqLsPr@*fk?W+Csj!P*oKVW#$9Anth`*AMb@-F%OpgR8CJS~!HGcoOIvfhkQk zH(<$?;i3sZkkOs>e`=p)kMx82?vWTBy)yD&kRQ$O7)LtlEUp`_F~H|rCySmH6<+w#=Drr{A*ge^tIL&NKO z@-;#vE9)6I6}D7`qDAhmdc73~uw8X<0^i#>5g1|_@9AN_JjyX(m*dwk^rl)Is)*y^ zKYm~j{jl_%m;NT?6l42XwXf^J$hJob-pwsE*eE4r7cO5KpV%n%4OC+NvVvZf?`s0uSokhfQZN06cNQ6i5MxXKQ=9FWJ{$S^HIHfH8pi*b#xp0|2};!VF+VPyhfO zJD)M1pqq;y;xpzmwPsGy0`OQQD?iRJ-nPLAocI(r^B3jM2x<$A9e{qT_^F`GBvD%M z0d667dO$?_l+|cN5JJpccL5-*{^D{+P3P}|qt7XpC6&gq6 z)5CmGcL*#j9%8LAKZ{i+5k9xCFil(WP$Z%+ikVTbC9e4Wx|bCJ`VKOAOSG@){kfA1j~VfB&9Fs7nOqyI9N@m})MdIyVm|E}3DfOz328TNnx zQ9_`ViaXAu4FWY+gJ?5a0aAh?m7?mqnOVOlBwZFW$y?=1>`5?TG*^q;>H5P)_f@_d z2mtpr*MHtDMlA0SD8c+pseIgi1NC&)#lii#c4Wsg>;9-S`;yqOSLC6Doe{f9o5OxV z@be2kd3Bw)W8fp_lzM9LC6;1$8963C>Y!0u#Q4=D^cJpacg4EamMHA4-IXKdmOwc~ zB&PT<&oiqP9q@$`vZj2WY|OwNxc^ zq{;Rl!(B#$^BZ6MaF>mBaR_UHZn5C9mU>Z?f6z#PZ!n0foVvDWUL>Iyr_Q+77~Yu) zI~qSCwUf83*BSj@OPOjzh#SIdCsmJK7 z_ROV|8*3ACm6^)MHK%QbiQT!V&D+3$S}Zg*+3Cy9mC9SwFLTTCtA%~O!6SJ3#<>ne zCLfP(qZ~i&uqS$6^XbXj#Hpm}ZKOs%TEMH0ZgiiN=P`3~nji4;5l*WCu|SoNJ>m93 z-o~F>#}ug@lXiFC@{<%+9@gVeF!+1{Ct%$0vU>Pgb2w3J=9WA6KGFLtL>7BI7!UL? zA&nQKyMvD?RHRh3!qb2B!xFt5`n&{00L}uFB&cAp;O}gV-q_pNIxrd7+CF<>iL;=< zsWZTyW7GdX{Yg)&xYW(fEh!~Kt$)z$dRt+J*|L zSrXP99Vc2m+1f7Z)0eL`uXYd=21ldxk&!OtLjvzTqO(89!I@cNG%E6+a_8oQaTtF7 z-~+}1;ab~@bZ_JYY5A#Q5rOF)`PubqUL$lo#d5WSmK54|^+!1=8@~g?6K1YAoa_Hl~Nr=rhPrI#Lei)yo|5%CvnsRhrgd;$m<_5o_9&54w zMA~f|SPa>3=7l!F)Hoxqd5;PnW8~z9stbqyy}#h6Y1S z^@PlF6$`~{B$avee_(S1H_UNf9r6Z=2G5g&00b&QV2 zYMb3$6Mq~&Xm&sRgiFLSPUKi?2G@kE{YpJO7MBJ)3|CLp)*`RGqgUN|IdSGfaxgJ| zt#aeZUA&DKza5(`m#~QXg!G@RpqUsrIz^z#2Lm<|+P`)RBOCi)a})o6ulQpyNQu^y z>14*}UV70c+E;BgD<2Tc0ZHXyPpn~gjTPO*Fr7mZw0C(R_f%rN9W(OfJmqeHyN&_t zwQ4q`1{I#pDw{kr#2_BYMOl~4B(3|mKDWFV#dt^*0v|dN+&z?SW6pXyLaY!qnA$Ui z#u&Hqx;&2L3LPy%vYjgD zrpgHgHAM&s{;LalnDXh`g?`+fLxwtIiu7#^Txw7K7t3}SJA0zklu)a=o`aGIwA1`| z)!yC*#S%&`O{>1U>)5veOJ9GwJ zrhHHyfN8LQx5g!i9ZA=Lnsx))A_nmLYxdg3*iiXjCa^A(Sc7;Q&JwGn#NAV=BeSCbS-N zM7k5L0LxU~%t3D4a3t@_Xr8ObteVK{_~zZ=?4|A#^A5;=YlheLor_q8XBsD*2xj8D z3q|i5`!F>wIhIPuD0h^Akk3EIiN>v-gtv7JSGYMZa2#g(Je8fA-w&ffmyTQvBiL0L z6%f%cs3ku<2P6J_t;`C%TgL|iEywu(W$Mt{$;!~!9+=ht6|44k!8)4@qgBs*i9{r6 zfa6{?OX{^$Qb}WxME1fVBrwOB_i50MwK$E1pw1pKn{! zM30`2mOl6A4974YVunmz=u!>wx!@hv^_RzMVz+AsZpJcxTz1E^C!(R0W9Y%T3Y>yZ z=PU$kIu#;NAY>t!@LuzE`5dcgv9%Ru=Q?WJ)xB>HQaGQJ*JqLZ4C-fG89{j@nkcH8 zQPpjvFB_@Dg@@NnMH7JXFrkKMql%gM|6H8(Q_HaG>b^-dh6Euh3|v) z4E@9>bo1B8Ttp+P+{Co6Od$JxFkh~NiHo+$o^m+4fOkm!T#FOoy~-4h>X9-4$k zt?Q1wv?9Lzp!ZdVOk8lg{L{QKvUN~QhYBAZ-!^k{&tD9v)9AVe2H~lf?{LZm4E< zYr`YQA0EA>5*Z`5?RAOZA|LAijFuZLkP#Yd{S7!AgNr0Q*>mxQ->i?zUJ$vdob7(; z%EIEwN>FY=JhxIV2_~|$_v%76|0z)#smj;yX}9Mz@8h7N^qOPha{2Xe5H5R`#<2TEtC8Dz`JG4FszlGlDoE*ARRO%PZu-PaE_88X{c$#GRdTkcN8PST$V}YW~b$%jN zrBYF{9$2kRzn#Cpm5nCMIxm z+KLJoAqf=LE(LBK-mh@k-k~37Ac?*EaZf)ejtl~+Nf=^lI#Uf8iT05@7I_)}7gNqioINsqSR zQg3ygGMz~W;O*F+mYmZLOPBi{fmdP+WJOF-S=)I@p z`dL_LZxhO8mf~J;D^F(1u`SNIDbx!)^65$cG2IG9?V$}0 z+}B)#b+Zjv;o^X_iaVF)a{3gOd{Zj3LU8*O^Pz$oqGE#~7;MHa$+`(ghx1aQN&y2L z=S~dG*UwAm>iW;*VioMS@QI0!U;`Rj*_wxGH-5f_rQem`9;iW~3WHhd_@D~=!a|I( zm^#yZ1RJYDp>T#+X0D!wTh>HeRy>fjIzfHwI@@b9i) z(Dx=lzYGHR(f`ou|MLA-6bQ*MwszE0akDjc(0LwQ-^l!(0bvxV?hGK22f)&=80LSH zp9409p1rZ90~6!(_wR(Qb8hnAfSlWa*ev{i5pIsjUG9zZ~bk)8k#Fs6Nxf0`z|uK8xT_dSmN% zzmWsQ`t>0JWB>BFfB>xeeg1piLHw^z4bh+ER>tql4VcWW3`~t#pZ630LxR6ph}%RG zX{myNJ^%fk#hKH;vtap8EPmg|{4Xhd2mYPKuU*Z5uZQ2G(Enob;`UD#zsIEi&f@oI zzrR>40~YMBSMjg0f4`Ie9+UJJxf|4<URGZXK;G4l_e**ha6BlrH0 znQ^SO4yA%LC>Sab1P~Mu5D*a%H0ht9Kwu!CSa2X96d))NZDD&m7gIYIeHBj!Q)gXz z4_h0;LNE}@d?1j2`~Sc3zwsAnPL`Dq{{1WLhWs0{Q5|%{i*YphIsd6#w)(D{UKlX$ zXJY>Gbb}`)U0G0~)f3;(eDg64%M!dGm9_xFOKq*RD(^)LLSkDwO>0`WH1?V*iWxE? zVhLYt13xY{G!-@Aas@uvrA(7wB9UuFk@~pUZt?J4x_!nidvP|!HkfZu( zyXv)w#^A?PpWr7<=aBtNBvn#e{tTWquU>@{NLRjT0X{tU;4%PTYx(9aJjki!2Ta`6+e+aCUz zquf7W!u~_9zLTkqGXwp9=l>6}{~N>f|Mu$9i5pU&f^cCs;5&xnz8o7c#EXD!i2`@x z3($~^OJH||>EiX?o+83dg$=#q$CD}f)vVyGWu7u#h&n^fmHf3V1MwYe58JjVNCnMt z?aUx^c=6eKOFR2j2Hu3^0^Vq*s>1!IFhNp&Vl$TdBAw9jUX{*xTuErrx+`$Ct7S9 z#yPT_1fyyg_Fc=ul_!xO{ixVbTId4kh`9$J*KANNJwz8kq32i~4*`)TExNDwhj4Hc zg9ZOT4f}s$#D^!1i}>G42PhB_E)W#3ySQS=}_8+&zB-#LmM3V_$fnd|%X^SM-V~#hfs8(B)aes53 znwTK#vRvzW)}UP|kv%g^<`RYgunqV9-HF%s!TkUs+hq4s){)7T&!lg`9!$Mxk`}bx zqJn!dYlY>ppUupB2}F8XAl)#aHlEa1)EGe$7*e3|#mBE^YI{u)i1 zn)UyAFZif*PR5``&`2KsY~G*eh~O}@<$>qdW#+#Nq7zC>}!`7Ps_1XEXJ72 zJ1L^dYxo4v;+jh4Mn{A4p-XEB) z$V)5XNA1t+>SMU8oKkZ&w~!@ zbZF@<-by}Ws+}-!zOVN=>QZU)zxN-a#rLrjIrGBKhHQN<$|AJ0Q`213-BH||%0D|k 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 MppnXM`^UTg1M90msQ>@~ literal 0 HcmV?d00001 diff --git a/docs/End-user Instructions.docx b/docs/End-user Instructions.docx new file mode 100644 index 0000000000000000000000000000000000000000..ade70fd830777383d61edab0fa3a8e81c72b051a GIT binary patch literal 94975 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 Q$At;=5h`@>7T>@94+Clur2qf` literal 0 HcmV?d00001 diff --git a/images/calendar.gif b/images/calendar.gif new file mode 100644 index 0000000000000000000000000000000000000000..8526cf5d19a915aa8073cf344873c4505491970d GIT binary patch literal 127 zcmZ?wbhEHb6krfwSj51v)Yr?)cd3`J*V1K6uU)?O9}E~67!-f9FfuT(G3WrDe9t*lZz92P)_CURn81=vJK(=WJKu)i=3GlhO3 z0iqpEzbZu|`#@c}d=?aGjj&?az~N97${KEmM4{kYptd$}TbK=aqpaX|SR@K-i-!Jn znS#>z%y6tPf%KOwaO7wj2>?7S43?0PV4Z-l=JF$8a0~{sfMIKE1yWcEl41dRqE)QG z>>C1sC1CK`Jb=xOg)Sh{!?;4g(G=A5s|g$)nfy0!tl%$4fi8n3(s?krwGE8JS+MI1 zwE*yC{a1~Dq!v(I%(o2i ziR1!YK_r(4b)}%7n|85dncM_{#X@+#T1#N@+3_qUiO=OgzxWr+{s;Ls_Cx|21t-{` z2zLK$_g7x#|Kl?ls0?f&IsPYEzD%IL?a2jdenO4HkelED=FH+$OWp4UeN z*soK*Ijqb9Ap4iz7rk!c)9b1OY1ZnH*%Kq_v+yt6EPYQj$^Mi5M-1ml%jYS}!TY3M<;XS7cAV z@4KFm)h9c9B6db$QXLf?egFRbo}M1$#fCjo@drI7zAFx_Ppt9&JsCtFe|ame$rikj^pojvKl%rI&V9fojo)Zo_PyDVc^SeyWm$j^KtByQ)qul8PT zfuQdf$Cn7j$B(Z`#U+max=wf7Ti{TX2%@onYjpGl4LZ`!?&sM}+R@$0hq>oGJ2&OJ zm9$R{Jy@&N_S4PK6{Ww8NGWSyGdlK+=Ote}i9g+5;+zoLmOgvV!sCsGmJVUA*dd_` zm2Y%EAJ&zmeqh=t*Nl{%I6WcJ(8u+nW1iZKHMX|4x@PLUtn9iN0$H_6hT}V2#$5$QMpgo?b?g zI_vEBT@9^~Y|GacPo|lT&AXoSPr_7}hz2ptyDJ)^3~fU99hsSUeSe@iOBncQ%x5(4 z-~kiYmZnFBL3ZlC15Qzg0-0nDMb27u+p|CQd23NI59gM=`8_Y&Yn`v+sFkQA&wShM zTy;_8W=qTdhCS%C&wIxRL+4v^jU9aa?>cpe-8EMQ^=6*4DmYUxd`&poIrr(EMoUcZ zwWB4!*yf)))zi^2_?y!eG*|a-EVv}oT`A`oBWvTw0u%$AKD;b{q%1)H8whoMB0x$98=AIN(`eNTay-nIhdQ7F6MbtgdL&ll2 zVO18pe@~y)T)xJj?#%AK7V)phRm8N-zl7F!`S)dJS9$C}22k?!N*}d6Ns(u+TBhk= zE-lD=lI^u*g9Ir#d%R!eHu3Xlf|rg|Cc}=%ju;@YZ^b|mtrQ?#^#hW8eSB8*h(jT? zUQSmEP!;}EIMSN3`$`Pl7Hjw9RB(C<9c~WL6y5SyD(5=<>M73i`tD)Sl85ZD#=SSb zyPmr$$Q{fw`7npW$#BiNlZ+6lEO^F^zBTdK0I=@#huN{2OnREX_RL`p#3 z^z?LJuWB2dW^efscTz8dnvs2Y)uqU&$7ST7%8ualDdl?0FWkxoSCf^FQ~n5 zmg$W&-oA;SAkZHzMMvI)Ht(z2h458irj9ajes{0zlOSYvY5t0%ij(Ep%bm>3hu3Re zQ@y;EDc61!m$8#VVQldB1L8C59B*NF?$}{cdID6I8yV?7Fta7N`iNdA+U#uBEMQzz zvC@A(HNuj4?V`gCZBIuUR6x= z?KBfXgt+Zdfvx*Uo$h<~Qxzw^G82WTn2Z z?Ocr>T^e#Dc%ygU`|W*)J8$F%(GQ`gd>UV*2uvgw<1qNw6UhyNp;k=N#D+suZWYg)PSaB_ z)k7kYBfC}iesE6R>+f$k)HtQ;zmLi|;0CGgl=_=R$%LbRpHz2tL09Y>DI=e{65Unh zmTQ#q`Amc6sjeg@WhXUK z&Ff61j<4@k)yiaRss}ft6G}yW^Omi1Tto02v*pV<=CuyQ4|gX`eVLlwVDMBCv~B0Y Ozl#Uai%^9RP5%$ilH;ZT literal 0 HcmV?d00001 diff --git a/images/icon-exit.png b/images/icon-exit.png new file mode 100644 index 0000000000000000000000000000000000000000..f70e1bb294b5b24db78489f48f869b121ca0d998 GIT binary patch literal 6521 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 VF$`7r^FM!vXsGDIDwXU){|hE_HF5v| literal 0 HcmV?d00001 diff --git a/images/icon-folder.png b/images/icon-folder.png new file mode 100644 index 0000000000000000000000000000000000000000..ef2fd773712a07c924f6c65704c0d283845f8725 GIT binary patch literal 1487 zcmeAS@N?(olHy`uVBq!ia0vp^DIml3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8KW+g=7RhMR$W{Yl!|Z$R@KEJl?AE#L8-<0 zrA5iW_()TRX$FQJev3c~fv&OgFUkZ)N@9*nesXDUYF>$_i>(q+MlU5Z#md6c$k^D~ z#nsK!#n{!v(9qJ=($&e?7$|0D;bQJ;1~UVjUK1BX6EkO^P7?z&Lqk^+OCvW!XG;?| zGb3jwHwz~Nm|oAk;*!L?>O)SYT3dzsUfu(?ejQo=P;*9(P z1?ONh1`yp;U%Vogx=Kz!?xT9jFqn&MWJpQ`{4U#m{Ab0f8Be};+(BfW@c_*zu%sF zG%0ZX^=1VQ_N^{$B9fBrhZmMAKemrJ{AiH)-H6v;tG3_v zEYH)L7c=Rm|Bp4-PtJP(d%eb@kb>Trij5IH(_Wli67uV=+u}m2xn~%kO_KY2KCbMS z=ItCa>zO{Mo_^AgxcstY^UZ>2;k5nt`;R{sIK6SvocS|euuPWDoM+X*Di)C-2o8=7 z2b2;TLEJ`HXux!XWr1Rh&=6w+$pV$IKmu?BN5uC;&80HWFAKUJsJSlvch~o4(l4DB zPWTmf>iOY~XM)5g)!6+H?p>re?>R49^VO`UzyB$RX>9N~wZ=YRZJ703zZXkaxRiW= oSnJ3DHC+H^ElYx}N<0$}!xHrmX|q>dOa~RQp00i_>zopr0P@lu761SM literal 0 HcmV?d00001 diff --git a/images/icon-new.png b/images/icon-new.png new file mode 100644 index 0000000000000000000000000000000000000000..9109c97a2224badf96e09c7d0525fb228a7ff73a GIT binary patch literal 2128 zcmbVNYg7|w8qP*h0=OV3i&4rn2t=FPl zRa8n5j~v7mi;9I>lnN|pD6kaqLfgfnfVe_|5|C1aB9fgT*!|(@kNwU&^Ihh7-{-x3 zXYzx0?_6g^w8G(V>m-4Y6q^<1#}bddO^5NTuxS%24o5?fcr;z6g>fPU5(fhkl`H|4 z!ZJlhN(bzX!>x)}hK8fzL4W4U5fx2l#?bUC4W^C5c?Ti$C>ZcZv@pP-v8Zwe2m)L#4PFMd|v~(5?(I(JA9*<|X!DLb~1XY)zMrC@cTIafA z0fKdMtx|(35j9}8D2qcFv@SG51Jk9j4oTI@v3kV2t|()<`+Xua5c7t=N2|n&B1?u4d8!IlqY_9!!oJWH zN(JAG$7HemA#nf)Vu{%x$P@F#e*P@%jOzt?in%K`-lfZAd$L4KkPWdJTo4qq{diss zFA;|;_VfziLM+ybu0*XvWokLR!mGr1mvvdctIPM-!ZH-mh9XGvN(TfdA}FFuL^ObZ z2p1rSDb)%jUAN6#o;T4#uvVD{D+08L3Ruc7U-=Gx23HJuazTi}h1lkv38MG$cIY6+SLW?y;4kqEfcf@+)6mOCeaF$_uzyac!}zx!6HT zyks1yZJ(yO8!Jn`9q^vi_3JM23SEx1{_Het5Un0=Q4ah2lp!!&QB(86Xr%t_?1^)l zhCXL!XAXx`vSX+K6bj33gf(2d)-^fX&a}VOT~k>}{&3nb8XXn2dDAAIP^ijyaZu$N= zI5;>oB%V4gG>(sdeEfJ%S1c&`<`<>9UTOjTi)<+JeqfMAl~xv^oRDsOvV5=4TqVRzJxtGTeD!pC4;`&bkrccgf!WOgdM6<;r%;D~*lO9}&KbdHQ`{pK$7Jl*t6o#OEC`;A}Uvh0+$Z#_~yPoiu;R%2-vQFyj^Nm>DlfwUxXc8;?3O9C!I z%s{7QlsMdG8AYP3Sw^jQJZgrZN8OTa#-?98OYAi6snHQGBg4aOjF0aMTMWG?U;d|| zGN-&M+wG?fLLZ--b#;$tY^*yoa#{v`f!Nmu!PvvKv$L~&!HJ;2l87b`Lb%sC3bW{o zcH_cdD-&LxiD7kYphT<=blz(l(MlD$(iMMctc}h1XaDG^vXp-(yTr*V2fK334z4b1 hIxc)tGk)R_-Ue4&1n}_f0;BmKFA?vCKKF|~@?WfiW$OR{ literal 0 HcmV?d00001 diff --git a/images/icon-snapshot.png b/images/icon-snapshot.png new file mode 100644 index 0000000000000000000000000000000000000000..d2d6b67d318bafa4a6b26350e90abc97ffa98eaa GIT binary patch literal 3370 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 literal 0 HcmV?d00001 diff --git a/images/icon_16_cancel.png b/images/icon_16_cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..6d16f509c3245e920cee04d252975a0326e58d04 GIT binary patch literal 689 zcmV;i0#5yjP)NU@1X4RY*jrr{$=%)M z7+t>y6n+uh0-P6Bb^Y@6^lT|7^M>OnGBxK&4~jc!i=In45;djOH)&@`+QKGPADxc;F3sYA)6?p zlcP~A!q7C7(`me3T0+7w9em@SVkyZ)yCiZ$fa1x14qO}#O+YN5FSDRQaL(k_?IX*^(95upzE>~^hU6L_K zGEx@2!|R2OAf2TeQcjCN%17O|NU~Y{AW(D>monA|sZ&uRr%5`G%LP?RNoPg_Wz7K% zkJMi$l3byHZ*)F1jOrlC3pZ($!;GzWaz5-QCoiRLBQ(xIh04ehl06;6Lm9oz{7#X`O!p XY1kM!bNuGi00000NkvXXu0mjfmoYY3 literal 0 HcmV?d00001 diff --git a/images/icon_16_delete.png b/images/icon_16_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..7173b4e900f1afa29b76665b007fa2c0975402ac GIT binary patch literal 812 zcmV+{1JnG8P)Nkl*%=J3^|9P;U7ReSmr}X zWO%qWHZv1bSlAzQm%~9-K>;-t6)o>z-cfk`8!%YfTmfbAW^-a}##(eHBRWk(^(cC} z!Rvu;j|Zg`wU;hYRbAbD4`PeqqYp3#RxO5tnB>_QCr2|XEr+@bCo$TaP~93fr(*Pm zE!1DRimS4cn!-ZLJ)U#NV5RB@S{77H)oGJPq)wrGS`yavJ8(O`QNA|~SIZ}2b5Ap9 zR3x?6i)q-k8+XlX-q>tiM_`yTL5R%rIouyDG{K0|9DsXTIx{l&()rCsd-DedM~vfD zNfB@I)?jJ*j^n+PCNG?U1!@>fJOIyz28oK3!EY$OpZ4*2%*)>C6YxdZEvoj+C)&?V zS0gw?#pZT64;e}Xj23@iS^^3$ifjr*ID2yS?a{gFUyuoV(} zT`+8f%QIyj%>tpDbBW8@$4A-RcySS?0dDj$*+irs;`8HDo@XZ0^+X!+(zsTV>a%e; z%sK(3;+Vl3su-EJ8e7F#foW9Lc7c!-~?%)bO)sLh@O4ZIv_;=>mb`9S~_KuM?#`>5)_xf z+#tN3J5Y2G*13Ih{&ksT1%$!$B~l=UBuGYr@JnQ^ligivM94n8y$1MexoLrxTedBlJi5XEKS*Qu$Ze zY77{MqAIEu{umBv>l(Grtq12o46%X8Kzw3k!k0Wv;&AJb;sOqU2nhRuof{n*omV?m zRyTE|vuUJuQxutcz%T^9o!^KKMyJJq2%YGtmaE(qF83}ee%1mep-AnL))VdtF)Y`%nQCuBv&Em|EAsIjbFI5Cwc@OlJ z3dM1~LmY#^h1?r#keRMX_S~S|*9Lg<6qSWC#gUV1>;+-^xH+me&6oT|7BWEZyeKc1 z90ITT&U_ZaLj2xe6g?Fl_iO(f1giN;6mNISfh;$F`n~zr1{!(FuZa;s?rQ$_FHu^2 fOg%REnQG(-x4)ec>g2LQ00000NkvXXu0mjf!$jmc literal 0 HcmV?d00001 diff --git a/images/icon_16_pencil.png b/images/icon_16_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..8bfc329437b58f54ac524ee70669687ed02158fb GIT binary patch literal 733 zcmV<30wVp1P)2 zUr19?90&04-BzwuFlxBbTz|+xj6t%dSVE!HOJJZ6J*1TN5dEWuL=2zC)a)Uphs21q zNFOqT3WYL*ki-P72rW0I&C0bKZEm~U?*83B-8<*aKTrn_=Wx#XeK zmC8*rnGFAH6-MQj#$CmO8GqRA3Iyti+`2X#iI6PILPiiE1c(qvVM82|n{#Xe%;yv6 z>F{9BOA2f}-Y)^cg@r{R7rYt*cw}7X(ffQH%@1gtwfH%DjCdjep>S9NmIupnH%NP~ zV`O*`wzeS3O+Fkg<;H59OqB#gC~6Im9fh9pKZ5&1A5J^GDAfEwt4)vMlQZR^DBei` z6^)V{$4S6aDr{&3r0XGS?Nd+@-_c&b4z!^I`wmo@ggBQ3#A30(K(2FfHz-dh>Kfi7 z9GJr$TMW_sCTMmZhRI|q;CbFB0r7a86c(glKIKPh{vIwk#_(nOD>^O*kJaMps2_q<_)n@9Ei;J0=-@Uey;(3x(DH#c?#F`CsgcBV8By{-9|GE1_J`Y z1#DEQ_?8%Xtx3QS4RS)xt2h1tW;9I(C@)70 P00000NkvXXu0mjfdbvTI literal 0 HcmV?d00001 diff --git a/images/icon_16_redo.png b/images/icon_16_redo.png new file mode 100644 index 0000000000000000000000000000000000000000..f0abac679939bd59d71d556a11cfde6dacc9550f GIT binary patch literal 881 zcmV-%1CIQOP)Qnsu_t#@2)~6;j`L4&iGHvpv*wpkCj35^9EqBfuDhK=bWjm!m;}`u_7*0h=EdVd8~?)H zUH_S6oroYqTa?}`UpB8in;gq2IypvkNAlKvkDFNIHv2GOMC>NbO1D%nJ6&0fQ-ov* zEmp+v%fV@Dj!k$~pG!@`pw=ZFH8Sp_8e>5URvH+?Z^$2c{lVL!MiEiu z#!V0nyviM))tNU@&r;d4<+6K*?auiun78k<>Dndl_l5w;BiWJ*&jejO9aa^@v^voU zV8=c9B8TKqu2w~tnZbhPu-~i&ce?b4c?s81+Ztv1I@yyx5dSXPsicK4fzj&1XmP=m z0E#IhR+4$s6V)!x8k36;)=pspOaEIYa;!eJdqVH0I%6kEmME2u8l0$y_<{;LP2APn z#?{JV?Hq2PyyG@*Ide#$35OI-?AWxOnzz8$aTB-jbbIVSO?P0K0AcGg00000NkvXX Hu0mjfa9FvS literal 0 HcmV?d00001 diff --git a/images/icon_16_right_green.png b/images/icon_16_right_green.png new file mode 100644 index 0000000000000000000000000000000000000000..afe837e75ca0f1936f658dbdd3b4704f47a76ce9 GIT binary patch literal 499 zcmVg^KH zsv6UEskNuWXUUV;(@0Wfl9FIWbG)Hbo$0eG~YCF^h+ix0)cV> zG;1C>hxP#8X@B2n%>+5RC9`S)h+pbc p@!(TQb&I`F--M4KelGnlE&yfqzY#-b#(n?*002ovPDHLkV1k6C;06Ey literal 0 HcmV?d00001 diff --git a/images/table-tdborder.gif b/images/table-tdborder.gif new file mode 100644 index 0000000000000000000000000000000000000000..eea1a05247452a7a6de4e7da2c37f555634d3bba GIT binary patch literal 809 zcmZ?wbhEHbWM*Jw_|Cxa|NsAhs+kOfkY*4NV6X-N D0Bs1q literal 0 HcmV?d00001 diff --git a/index.php b/index.php new file mode 100644 index 0000000..2078526 --- /dev/null +++ b/index.php @@ -0,0 +1,4 @@ + diff --git a/jquery/jquery-1.10.2.js b/jquery/jquery-1.10.2.js new file mode 100644 index 0000000..c5c6482 --- /dev/null +++ b/jquery/jquery-1.10.2.js @@ -0,0 +1,9789 @@ +/*! + * jQuery JavaScript Library v1.10.2 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2013-07-03T13:48Z + */ +(function( window, undefined ) { + +// Can't do this because several apps including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +// Support: Firefox 18+ +//"use strict"; +var + // The deferred used on DOM ready + readyList, + + // A central reference to the root jQuery(document) + rootjQuery, + + // Support: IE<10 + // For `typeof xmlNode.method` instead of `xmlNode.method !== undefined` + core_strundefined = typeof undefined, + + // Use the correct document accordingly with window argument (sandbox) + location = window.location, + document = window.document, + docElem = document.documentElement, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // [[Class]] -> type pairs + class2type = {}, + + // List of deleted data cache ids, so we can reuse them + core_deletedIds = [], + + core_version = "1.10.2", + + // Save a reference to some core methods + core_concat = core_deletedIds.concat, + core_push = core_deletedIds.push, + core_slice = core_deletedIds.slice, + core_indexOf = core_deletedIds.indexOf, + core_toString = class2type.toString, + core_hasOwn = class2type.hasOwnProperty, + core_trim = core_version.trim, + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Used for matching numbers + core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, + + // Used for splitting on whitespace + core_rnotwhite = /\S+/g, + + // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE) + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g, + rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }, + + // The ready event handler + completed = function( event ) { + + // readyState === "complete" is good enough for us to call the dom ready in oldIE + if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) { + detach(); + jQuery.ready(); + } + }, + // Clean-up method for dom ready events + detach = function() { + if ( document.addEventListener ) { + document.removeEventListener( "DOMContentLoaded", completed, false ); + window.removeEventListener( "load", completed, false ); + + } else { + document.detachEvent( "onreadystatechange", completed ); + window.detachEvent( "onload", completed ); + } + }; + +jQuery.fn = jQuery.prototype = { + // The current version of jQuery being used + jquery: core_version, + + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + + // scripts is true for back-compat + jQuery.merge( this, jQuery.parseHTML( + match[1], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return core_slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; + }, + + slice: function() { + return this.pushStack( core_slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: core_push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var src, copyIsArray, copy, name, options, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ), + + noConflict: function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger("ready").off("ready"); + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + isWindow: function( obj ) { + /* jshint eqeqeq: false */ + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + return !isNaN( parseFloat(obj) ) && isFinite( obj ); + }, + + type: function( obj ) { + if ( obj == null ) { + return String( obj ); + } + return typeof obj === "object" || typeof obj === "function" ? + class2type[ core_toString.call(obj) ] || "object" : + typeof obj; + }, + + isPlainObject: function( obj ) { + var key; + + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !core_hasOwn.call(obj, "constructor") && + !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Support: IE<9 + // Handle iteration over inherited properties before own properties. + if ( jQuery.support.ownLast ) { + for ( key in obj ) { + return core_hasOwn.call( obj, key ); + } + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + for ( key in obj ) {} + + return key === undefined || core_hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw new Error( msg ); + }, + + // data: string of html + // context (optional): If specified, the fragment will be created in this context, defaults to document + // keepScripts (optional): If true, will include scripts passed in the html string + parseHTML: function( data, context, keepScripts ) { + if ( !data || typeof data !== "string" ) { + return null; + } + if ( typeof context === "boolean" ) { + keepScripts = context; + context = false; + } + context = context || document; + + var parsed = rsingleTag.exec( data ), + scripts = !keepScripts && []; + + // Single tag + if ( parsed ) { + return [ context.createElement( parsed[1] ) ]; + } + + parsed = jQuery.buildFragment( [ data ], context, scripts ); + if ( scripts ) { + jQuery( scripts ).remove(); + } + return jQuery.merge( [], parsed.childNodes ); + }, + + parseJSON: function( data ) { + // Attempt to parse using the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + return window.JSON.parse( data ); + } + + if ( data === null ) { + return data; + } + + if ( typeof data === "string" ) { + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + if ( data ) { + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test( data.replace( rvalidescape, "@" ) + .replace( rvalidtokens, "]" ) + .replace( rvalidbraces, "")) ) { + + return ( new Function( "return " + data ) )(); + } + } + } + + jQuery.error( "Invalid JSON: " + data ); + }, + + // Cross-browser xml parsing + parseXML: function( data ) { + var xml, tmp; + if ( !data || typeof data !== "string" ) { + return null; + } + try { + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + } catch( e ) { + xml = undefined; + } + if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; + }, + + noop: function() {}, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && jQuery.trim( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + // args is for internal usage only + each: function( obj, callback, args ) { + var value, + i = 0, + length = obj.length, + isArray = isArraylike( obj ); + + if ( args ) { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } + } + + return obj; + }, + + // Use native String.trim function wherever possible + trim: core_trim && !core_trim.call("\uFEFF\xA0") ? + function( text ) { + return text == null ? + "" : + core_trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArraylike( Object(arr) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + core_push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + var len; + + if ( arr ) { + if ( core_indexOf ) { + return core_indexOf.call( arr, elem, i ); + } + + len = arr.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in arr && arr[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var l = second.length, + i = first.length, + j = 0; + + if ( typeof l === "number" ) { + for ( ; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var retVal, + ret = [], + i = 0, + length = elems.length; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, + i = 0, + length = elems.length, + isArray = isArraylike( elems ), + ret = []; + + // Go through the array, translating each of the items to their + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } + + // Flatten any nested arrays + return core_concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var args, proxy, tmp; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = core_slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + // Multifunctional method to get and set values of a collection + // The value/s can optionally be executed if it's a function + access: function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + length = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < length; i++ ) { + fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[0], key ) : emptyGet; + }, + + now: function() { + return ( new Date() ).getTime(); + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations. + // Note: this method belongs to the css module but it's needed here for the support module. + // If support gets modularized, this method should be moved back to the css module. + swap: function( elem, options, callback, args ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.apply( elem, args || [] ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; + } +}); + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called after the browser event has already occurred. + // we once tried to use readyState "interactive" here, but it caused issues like the one + // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + setTimeout( jQuery.ready ); + + // Standards-based browsers support DOMContentLoaded + } else if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed, false ); + + // If IE event model is used + } else { + // Ensure firing before onload, maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", completed ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", completed ); + + // If IE and not a frame + // continually check to see if the document is ready + var top = false; + + try { + top = window.frameElement == null && document.documentElement; + } catch(e) {} + + if ( top && top.doScroll ) { + (function doScrollCheck() { + if ( !jQuery.isReady ) { + + try { + // Use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + top.doScroll("left"); + } catch(e) { + return setTimeout( doScrollCheck, 50 ); + } + + // detach all dom ready events + detach(); + + // and execute any waiting functions + jQuery.ready(); + } + })(); + } + } + } + return readyList.promise( obj ); +}; + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +function isArraylike( obj ) { + var length = obj.length, + type = jQuery.type( obj ); + + if ( jQuery.isWindow( obj ) ) { + return false; + } + + if ( obj.nodeType === 1 && length ) { + return true; + } + + return type === "array" || type !== "function" && + ( length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj ); +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); +/*! + * Sizzle CSS Selector Engine v1.10.2 + * http://sizzlejs.com/ + * + * Copyright 2013 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2013-07-03 + */ +(function( window, undefined ) { + +var i, + support, + cachedruns, + Expr, + getText, + isXML, + compile, + outermostContext, + sortInput, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + -(new Date()), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + hasDuplicate = false, + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + return 0; + }, + + // General-purpose constants + strundefined = typeof undefined, + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf if we can't use a native one + indexOf = arr.indexOf || function( elem ) { + var i = 0, + len = this.length; + for ( ; i < len; i++ ) { + if ( this[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + // http://www.w3.org/TR/css3-syntax/#characters + characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Loosely modeled on CSS identifier characters + // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors + // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = characterEncoding.replace( "w", "w#" ), + + // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace + + "*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]", + + // Prefer arguments quoted, + // then not containing pseudos/brackets, + // then attribute selectors/non-parenthetical expressions, + // then anything else + // These preferences are here to reduce the number of selectors + // needing tokenize in the PSEUDO preFilter + pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rsibling = new RegExp( whitespace + "*[+~]" ), + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + characterEncoding + ")" ), + "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), + "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + // BMP codepoint + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var match, elem, m, nodeType, + // QSA vars + i, groups, old, nid, newContext, newSelector; + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + + context = context || document; + results = results || []; + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { + return []; + } + + if ( documentIsHTML && !seed ) { + + // Shortcuts + if ( (match = rquickExpr.exec( selector )) ) { + // Speed-up: Sizzle("#ID") + if ( (m = match[1]) ) { + if ( nodeType === 9 ) { + elem = context.getElementById( m ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE, Opera, and Webkit return items + // by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + } else { + // Context is not a document + if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && + contains( context, elem ) && elem.id === m ) { + results.push( elem ); + return results; + } + } + + // Speed-up: Sizzle("TAG") + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Speed-up: Sizzle(".CLASS") + } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // QSA path + if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + nid = old = expando; + newContext = context; + newSelector = nodeType === 9 && selector; + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + groups = tokenize( selector ); + + if ( (old = context.getAttribute("id")) ) { + nid = old.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", nid ); + } + nid = "[id='" + nid + "'] "; + + i = groups.length; + while ( i-- ) { + groups[i] = nid + toSelector( groups[i] ); + } + newContext = rsibling.test( selector ) && context.parentNode || context; + newSelector = groups.join(","); + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch(qsaError) { + } finally { + if ( !old ) { + context.removeAttribute("id"); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {Function(string, Object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key += " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = attrs.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Detect xml + * @param {Element|Object} elem An element or a document + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var doc = node ? node.ownerDocument || node : preferredDoc, + parent = doc.defaultView; + + // If no document and documentElement is available, return + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Set our document + document = doc; + docElem = doc.documentElement; + + // Support tests + documentIsHTML = !isXML( doc ); + + // Support: IE>8 + // If iframe document is assigned to "document" variable and if iframe has been reloaded, + // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 + // IE6-8 do not support the defaultView property so parent will be undefined + if ( parent && parent.attachEvent && parent !== parent.top ) { + parent.attachEvent( "onbeforeunload", function() { + setDocument(); + }); + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( doc.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Check if getElementsByClassName can be trusted + support.getElementsByClassName = assert(function( div ) { + div.innerHTML = "
"; + + // Support: Safari<4 + // Catch class over-caching + div.firstChild.className = "i"; + // Support: Opera<10 + // Catch gEBCN failure to find non-leading classes + return div.getElementsByClassName("i").length === 2; + }); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !doc.getElementsByName || !doc.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== strundefined && documentIsHTML ) { + var m = context.getElementById( id ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== strundefined ) { + return context.getElementsByTagName( tag ); + } + } : + function( tag, context ) { + var elem, + tmp = [], + i = 0, + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + div.innerHTML = ""; + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + }); + + assert(function( div ) { + + // Support: Opera 10-12/IE8 + // ^= $= *= and empty values + // Should not select anything + // Support: Windows 8 Native Apps + // The type attribute is restricted during .innerHTML assignment + var input = doc.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "t", "" ); + + if ( div.querySelectorAll("[t^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + + // Element contains another + // Purposefully does not implement inclusive descendent + // As in, an element does not contain itself + contains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = docElem.compareDocumentPosition ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b ); + + if ( compare ) { + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === doc || contains(preferredDoc, a) ) { + return -1; + } + if ( b === doc || contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } + + // Not directly comparable, sort on existence of method + return a.compareDocumentPosition ? -1 : 1; + } : + function( a, b ) { + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Parentless nodes are either documents or disconnected + } else if ( !aup || !bup ) { + return a === doc ? -1 : + b === doc ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return doc; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch(e) {} + } + + return Sizzle( expr, document, null, [elem] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val === undefined ? + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null : + val; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + for ( ; (node = elem[i]); i++ ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (see #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[5] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] && match[4] !== undefined ) { + match[2] = match[4]; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, outerCache, node, diff, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + // Seek `elem` from a previously-cached index + outerCache = parent[ expando ] || (parent[ expando ] = {}); + cache = outerCache[ type ] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = cache[0] === dirruns && cache[2]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + // Use previously-cached element index if available + } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { + diff = cache[1]; + + // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) + } else { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { + // Cache the index of each encountered element + if ( useCache ) { + (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf.call( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)), + // not comment, processing instructions, or others + // Thanks to Diego Perini for the nodeName shortcut + // Greater than "@" means alpha characters (specifically not starting with "#" or "?") + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +function tokenize( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( tokens = [] ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +} + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var data, cache, outerCache, + dirkey = dirruns + " " + doneName; + + // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) { + if ( (data = cache[1]) === true || data === cachedruns ) { + return data === true; + } + } else { + cache = outerCache[ dir ] = [ dirkey ]; + cache[1] = matcher( elem, context, xml ) || cachedruns; + if ( cache[1] === true ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf.call( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + // A counter to specify which element is currently being matched + var matcherCachedRuns = 0, + bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, expandContext ) { + var elem, j, matcher, + setMatched = [], + matchedCount = 0, + i = "0", + unmatched = seed && [], + outermost = expandContext != null, + contextBackup = outermostContext, + // We must always have either seed elements or context + elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1); + + if ( outermost ) { + outermostContext = context !== document && context; + cachedruns = matcherCachedRuns; + } + + // Add elements passing elementMatchers directly to results + // Keep `i` a string if there are no elements so `matchedCount` will be "00" below + for ( ; (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + cachedruns = ++matcherCachedRuns; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // Apply set filters to unmatched elements + matchedCount += i; + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !group ) { + group = tokenize( selector ); + } + i = group.length; + while ( i-- ) { + cached = matcherFromTokens( group[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + } + return cached; +}; + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function select( selector, context, results, seed ) { + var i, tokens, token, type, find, + match = tokenize( selector ); + + if ( !seed ) { + // Try to minimize operations if there is only one group + if ( match.length === 1 ) { + + // Take a shortcut and set the context if the root selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + } + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && context.parentNode || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + } + + // Compile and execute a filtering function + // Provide `match` to avoid retokenization if we modified the selector above + compile( selector, match )( + seed, + context, + !documentIsHTML, + results, + rsibling.test( selector ) + ); + return results; +} + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome<14 +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + elem[ name ] === true ? name.toLowerCase() : null; + } + }); +} + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.pseudos; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})( window ); +// String to Object options format cache +var optionsCache = {}; + +// Convert String-formatted options into Object-formatted ones and store in cache +function createOptions( options ) { + var object = optionsCache[ options ] = {}; + jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + }); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + ( optionsCache[ options ] || createOptions( options ) ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list was already fired + fired, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // First callback to fire (used internally by add and fireWith) + firingStart, + // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = !options.once && [], + // Fire callbacks + fire = function( data ) { + memory = options.memory && data; + fired = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + firing = true; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { + memory = false; // To prevent further calls using add + break; + } + } + firing = false; + if ( list ) { + if ( stack ) { + if ( stack.length ) { + fire( stack.shift() ); + } + } else if ( memory ) { + list = []; + } else { + self.disable(); + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + // First, we save the current length + var start = list.length; + (function add( args ) { + jQuery.each( args, function( _, arg ) { + var type = jQuery.type( arg ); + if ( type === "function" ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && type !== "string" ) { + // Inspect recursively + add( arg ); + } + }); + })( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away + } else if ( memory ) { + firingStart = start; + fire( memory ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + jQuery.each( arguments, function( _, arg ) { + var index; + while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + // Handle firing indexes + if ( firing ) { + if ( index <= firingLength ) { + firingLength--; + } + if ( index <= firingIndex ) { + firingIndex--; + } + } + } + }); + } + return this; + }, + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); + }, + // Remove all callbacks from the list + empty: function() { + list = []; + firingLength = 0; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( list && ( !fired || stack ) ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + if ( firing ) { + stack.push( args ); + } else { + fire( args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; +jQuery.extend({ + + Deferred: function( func ) { + var tuples = [ + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], + [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], + [ "notify", "progress", jQuery.Callbacks("memory") ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred(function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var action = tuple[ 0 ], + fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[1] ](function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .done( newDefer.resolve ) + .fail( newDefer.reject ) + .progress( newDefer.notify ); + } else { + newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); + } + }); + }); + fns = null; + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[1] ] = list.add; + + // Handle state + if ( stateString ) { + list.add(function() { + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[0] ] = function() { + deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[0] + "With" ] = list.fireWith; + }); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = core_slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value; + if( values === progressValues ) { + deferred.notifyWith( contexts, values ); + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ) + .progress( updateFunc( i, progressContexts, progressValues ) ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +}); +jQuery.support = (function( support ) { + + var all, a, input, select, fragment, opt, eventName, isSupported, i, + div = document.createElement("div"); + + // Setup + div.setAttribute( "className", "t" ); + div.innerHTML = "
a"; + + // Finish early in limited (non-browser) environments + all = div.getElementsByTagName("*") || []; + a = div.getElementsByTagName("a")[ 0 ]; + if ( !a || !a.style || !all.length ) { + return support; + } + + // First batch of tests + select = document.createElement("select"); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName("input")[ 0 ]; + + a.style.cssText = "top:1px;float:left;opacity:.5"; + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + support.getSetAttribute = div.className !== "t"; + + // IE strips leading whitespace when .innerHTML is used + support.leadingWhitespace = div.firstChild.nodeType === 3; + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + support.tbody = !div.getElementsByTagName("tbody").length; + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + support.htmlSerialize = !!div.getElementsByTagName("link").length; + + // Get the style information from getAttribute + // (IE uses .cssText instead) + support.style = /top/.test( a.getAttribute("style") ); + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + support.hrefNormalized = a.getAttribute("href") === "/a"; + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + support.opacity = /^0.5/.test( a.style.opacity ); + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + support.cssFloat = !!a.style.cssFloat; + + // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere) + support.checkOn = !!input.value; + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + support.optSelected = opt.selected; + + // Tests for enctype support on a form (#6743) + support.enctype = !!document.createElement("form").enctype; + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + support.html5Clone = document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>"; + + // Will be defined later + support.inlineBlockNeedsLayout = false; + support.shrinkWrapBlocks = false; + support.pixelPosition = false; + support.deleteExpando = true; + support.noCloneEvent = true; + support.reliableMarginRight = true; + support.boxSizingReliable = true; + + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Support: IE<9 + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + // Check if we can trust getAttribute("value") + input = document.createElement("input"); + input.setAttribute( "value", "" ); + support.input = input.getAttribute( "value" ) === ""; + + // Check if an input maintains its value after becoming a radio + input.value = "t"; + input.setAttribute( "type", "radio" ); + support.radioValue = input.value === "t"; + + // #11217 - WebKit loses check when the name is after the checked attribute + input.setAttribute( "checked", "t" ); + input.setAttribute( "name", "t" ); + + fragment = document.createDocumentFragment(); + fragment.appendChild( input ); + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<9 + // Opera does not clone events (and typeof div.attachEvent === undefined). + // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() + if ( div.attachEvent ) { + div.attachEvent( "onclick", function() { + support.noCloneEvent = false; + }); + + div.cloneNode( true ).click(); + } + + // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event) + // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) + for ( i in { submit: true, change: true, focusin: true }) { + div.setAttribute( eventName = "on" + i, "t" ); + + support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false; + } + + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + // Support: IE<9 + // Iteration over object's inherited properties before its own. + for ( i in jQuery( support ) ) { + break; + } + support.ownLast = i !== "0"; + + // Run tests that need a body at doc ready + jQuery(function() { + var container, marginDiv, tds, + divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;", + body = document.getElementsByTagName("body")[0]; + + if ( !body ) { + // Return for frameset docs that don't have a body + return; + } + + container = document.createElement("div"); + container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px"; + + body.appendChild( container ).appendChild( div ); + + // Support: IE8 + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + div.innerHTML = "
t
"; + tds = div.getElementsByTagName("td"); + tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none"; + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Support: IE8 + // Check if empty table cells still have offsetWidth/Height + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + + // Check box-sizing and margin behavior. + div.innerHTML = ""; + div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;"; + + // Workaround failing boxSizing test due to offsetWidth returning wrong value + // with some non-1 values of body zoom, ticket #13543 + jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() { + support.boxSizing = div.offsetWidth === 4; + }); + + // Use window.getComputedStyle because jsdom on node.js will break without it. + if ( window.getComputedStyle ) { + support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%"; + support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px"; + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. (#3333) + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + marginDiv = div.appendChild( document.createElement("div") ); + marginDiv.style.cssText = div.style.cssText = divReset; + marginDiv.style.marginRight = marginDiv.style.width = "0"; + div.style.width = "1px"; + + support.reliableMarginRight = + !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight ); + } + + if ( typeof div.style.zoom !== core_strundefined ) { + // Support: IE<8 + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + div.innerHTML = ""; + div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1"; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); + + // Support: IE6 + // Check if elements with layout shrink-wrap their children + div.style.display = "block"; + div.innerHTML = "
"; + div.firstChild.style.width = "5px"; + support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); + + if ( support.inlineBlockNeedsLayout ) { + // Prevent IE 6 from affecting layout for positioned elements #11048 + // Prevent IE from shrinking the body in IE 7 mode #12869 + // Support: IE<8 + body.style.zoom = 1; + } + } + + body.removeChild( container ); + + // Null elements to avoid leaks in IE + container = div = tds = marginDiv = null; + }); + + // Null elements to avoid leaks in IE + all = select = fragment = opt = a = input = null; + + return support; +})({}); + +var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, + rmultiDash = /([A-Z])/g; + +function internalData( elem, name, data, pvt /* Internal Use Only */ ){ + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var ret, thisCache, + internalKey = jQuery.expando, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + id = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + // Avoid exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( typeof name === "string" ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; +} + +function internalRemoveData( elem, name, pvt ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split(" "); + } + } + } else { + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = name.concat( jQuery.map( name, jQuery.camelCase ) ); + } + + i = name.length; + while ( i-- ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject( cache[ id ] ) ) { + return; + } + } + + // Destroy the cache + if ( isNode ) { + jQuery.cleanData( [ elem ], true ); + + // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) + /* jshint eqeqeq: false */ + } else if ( jQuery.support.deleteExpando || cache != cache.window ) { + /* jshint eqeqeq: true */ + delete cache[ id ]; + + // When all else fails, null + } else { + cache[ id ] = null; + } +} + +jQuery.extend({ + cache: {}, + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "applet": true, + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data ) { + return internalData( elem, name, data ); + }, + + removeData: function( elem, name ) { + return internalRemoveData( elem, name ); + }, + + // For internal use only. + _data: function( elem, name, data ) { + return internalData( elem, name, data, true ); + }, + + _removeData: function( elem, name ) { + return internalRemoveData( elem, name, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + // Do not set data on non-element because it will not be cleared (#8335). + if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) { + return false; + } + + var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ]; + + // nodes accept data unless otherwise specified; rejection can be conditional + return !noData || noData !== true && elem.getAttribute("classid") === noData; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var attrs, name, + data = null, + i = 0, + elem = this[0]; + + // Special expections of .data basically thwart jQuery.access, + // so implement the relevant behavior ourselves + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + attrs = elem.attributes; + for ( ; i < attrs.length; i++ ) { + name = attrs[i].name; + + if ( name.indexOf("data-") === 0 ) { + name = jQuery.camelCase( name.slice(5) ); + + dataAttr( elem, name, data[ name ] ); + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + return arguments.length > 1 ? + + // Sets one value + this.each(function() { + jQuery.data( this, key, value ); + }) : + + // Gets one value + // Try to fetch any internally stored data first + elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null; + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + var name; + for ( name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} +jQuery.extend({ + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray(data) ) { + queue = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return jQuery._data( elem, key ) || jQuery._data( elem, key, { + empty: jQuery.Callbacks("once memory").add(function() { + jQuery._removeData( elem, type + "queue" ); + jQuery._removeData( elem, key ); + }) + }); + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[0], type ); + } + + return data === undefined ? + this : + this.each(function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = setTimeout( next, time ); + hooks.stop = function() { + clearTimeout( timeout ); + }; + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while( i-- ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +}); +var nodeHook, boolHook, + rclass = /[\t\r\n\f]/g, + rreturn = /\r/g, + rfocusable = /^(?:input|select|textarea|button|object)$/i, + rclickable = /^(?:a|area)$/i, + ruseDefault = /^(?:checked|selected)$/i, + getSetAttribute = jQuery.support.getSetAttribute, + getSetInput = jQuery.support.input; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + name = jQuery.propFix[ name ] || name; + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} + }); + }, + + addClass: function( value ) { + var classes, elem, cur, clazz, j, + i = 0, + len = this.length, + proceed = typeof value === "string" && value; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).addClass( value.call( this, j, this.className ) ); + }); + } + + if ( proceed ) { + // The disjunction here is for better compressibility (see removeClass) + classes = ( value || "" ).match( core_rnotwhite ) || []; + + for ( ; i < len; i++ ) { + elem = this[ i ]; + cur = elem.nodeType === 1 && ( elem.className ? + ( " " + elem.className + " " ).replace( rclass, " " ) : + " " + ); + + if ( cur ) { + j = 0; + while ( (clazz = classes[j++]) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + elem.className = jQuery.trim( cur ); + + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, clazz, j, + i = 0, + len = this.length, + proceed = arguments.length === 0 || typeof value === "string" && value; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).removeClass( value.call( this, j, this.className ) ); + }); + } + if ( proceed ) { + classes = ( value || "" ).match( core_rnotwhite ) || []; + + for ( ; i < len; i++ ) { + elem = this[ i ]; + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( elem.className ? + ( " " + elem.className + " " ).replace( rclass, " " ) : + "" + ); + + if ( cur ) { + j = 0; + while ( (clazz = classes[j++]) ) { + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) >= 0 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + elem.className = value ? jQuery.trim( cur ) : ""; + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value; + + if ( typeof stateVal === "boolean" && type === "string" ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( jQuery.isFunction( value ) ) { + return this.each(function( i ) { + jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + classNames = value.match( core_rnotwhite ) || []; + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( type === core_strundefined || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // If the element has a class name or if we're passed "false", + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " ", + i = 0, + l = this.length; + for ( ; i < l; i++ ) { + if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var ret, hooks, isFunction, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + ret = elem.value; + + return typeof ret === "string" ? + // handle most common string cases + ret.replace(rreturn, "") : + // handle cases where value is null/undef or number + ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + // Use proper attribute retrieval(#6932, #12072) + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + elem.text; + } + }, + select: { + get: function( elem ) { + var value, option, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one" || index < 0, + values = one ? null : [], + max = one ? index + 1 : options.length, + i = index < 0 ? + max : + one ? index : 0; + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // oldIE doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + // Don't return options that are disabled or in a disabled optgroup + ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) && + ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) { + optionSet = true; + } + } + + // force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + attr: function( elem, name, value ) { + var hooks, ret, + nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === core_strundefined ) { + return jQuery.prop( elem, name, value ); + } + + // All attributes are lowercase + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + name = name.toLowerCase(); + hooks = jQuery.attrHooks[ name ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook ); + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + + } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, value + "" ); + return value; + } + + } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, value ) { + var name, propName, + i = 0, + attrNames = value && value.match( core_rnotwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( (name = attrNames[i++]) ) { + propName = jQuery.propFix[ name ] || name; + + // Boolean attributes get special treatment (#10870) + if ( jQuery.expr.match.bool.test( name ) ) { + // Set corresponding property to false + if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { + elem[ propName ] = false; + // Support: IE<9 + // Also clear defaultChecked/defaultSelected (if appropriate) + } else { + elem[ jQuery.camelCase( "default-" + name ) ] = + elem[ propName ] = false; + } + + // See #9699 for explanation of this approach (setting first, then removal) + } else { + jQuery.attr( elem, name, "" ); + } + + elem.removeAttribute( getSetAttribute ? name : propName ); + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to default in case type is set after value during creation + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + }, + + prop: function( elem, name, value ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + if ( notxml ) { + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ? + ret : + ( elem[ name ] = value ); + + } else { + return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ? + ret : + elem[ name ]; + } + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + return tabindex ? + parseInt( tabindex, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + -1; + } + } + } +}); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { + // IE<8 needs the *property* name + elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name ); + + // Use defaultChecked and defaultSelected for oldIE + } else { + elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true; + } + + return name; + } +}; +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { + var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr; + + jQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ? + function( elem, name, isXML ) { + var fn = jQuery.expr.attrHandle[ name ], + ret = isXML ? + undefined : + /* jshint eqeqeq: false */ + (jQuery.expr.attrHandle[ name ] = undefined) != + getter( elem, name, isXML ) ? + + name.toLowerCase() : + null; + jQuery.expr.attrHandle[ name ] = fn; + return ret; + } : + function( elem, name, isXML ) { + return isXML ? + undefined : + elem[ jQuery.camelCase( "default-" + name ) ] ? + name.toLowerCase() : + null; + }; +}); + +// fix oldIE attroperties +if ( !getSetInput || !getSetAttribute ) { + jQuery.attrHooks.value = { + set: function( elem, value, name ) { + if ( jQuery.nodeName( elem, "input" ) ) { + // Does not return so that setAttribute is also used + elem.defaultValue = value; + } else { + // Use nodeHook if defined (#1954); otherwise setAttribute is fine + return nodeHook && nodeHook.set( elem, value, name ); + } + } + }; +} + +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !getSetAttribute ) { + + // Use this for any attribute in IE6/7 + // This fixes almost every IE6/7 issue + nodeHook = { + set: function( elem, value, name ) { + // Set the existing or create a new attribute node + var ret = elem.getAttributeNode( name ); + if ( !ret ) { + elem.setAttributeNode( + (ret = elem.ownerDocument.createAttribute( name )) + ); + } + + ret.value = value += ""; + + // Break association with cloned elements by also using setAttribute (#9646) + return name === "value" || value === elem.getAttribute( name ) ? + value : + undefined; + } + }; + jQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords = + // Some attributes are constructed with empty-string values when not defined + function( elem, name, isXML ) { + var ret; + return isXML ? + undefined : + (ret = elem.getAttributeNode( name )) && ret.value !== "" ? + ret.value : + null; + }; + jQuery.valHooks.button = { + get: function( elem, name ) { + var ret = elem.getAttributeNode( name ); + return ret && ret.specified ? + ret.value : + undefined; + }, + set: nodeHook.set + }; + + // Set contenteditable to false on removals(#10429) + // Setting to empty string throws an error as an invalid value + jQuery.attrHooks.contenteditable = { + set: function( elem, value, name ) { + nodeHook.set( elem, value === "" ? false : value, name ); + } + }; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }; + }); +} + + +// Some attributes require a special call on IE +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !jQuery.support.hrefNormalized ) { + // href/src property should get the full normalized URL (#10299/#12915) + jQuery.each([ "href", "src" ], function( i, name ) { + jQuery.propHooks[ name ] = { + get: function( elem ) { + return elem.getAttribute( name, 4 ); + } + }; + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Note: IE uppercases css property names, but if we were to .toLowerCase() + // .cssText, that would destroy case senstitivity in URL's, like in "background" + return elem.style.cssText || undefined; + }, + set: function( elem, value ) { + return ( elem.style.cssText = value + "" ); + } + }; +} + +// Safari mis-reports the default selected property of an option +// Accessing the parent's selectedIndex property fixes it +if ( !jQuery.support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + var parent = elem.parentNode; + + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + return null; + } + }; +} + +jQuery.each([ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +}); + +// IE6/7 call enctype encoding +if ( !jQuery.support.enctype ) { + jQuery.propFix.enctype = "encoding"; +} + +// Radios and checkboxes getter/setter +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); + } + } + }; + if ( !jQuery.support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + // Support: Webkit + // "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + }; + } +}); +var rformElems = /^(?:input|select|textarea)$/i, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + var tmp, events, t, handleObjIn, + special, eventHandle, handleObj, + handlers, type, namespaces, origType, + elemData = jQuery._data( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !(events = elemData.events) ) { + events = elemData.events = {}; + } + if ( !(eventHandle = elemData.handle) ) { + eventHandle = elemData.handle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( core_rnotwhite ) || [""]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !(handlers = events[ type ]) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + var j, handleObj, tmp, + origCount, t, events, + special, handlers, type, + namespaces, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( core_rnotwhite ) || [""]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery._removeData( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + var handle, ontype, cur, + bubbleType, special, tmp, i, + eventPath = [ elem || document ], + type = core_hasOwn.call( event, "type" ) ? event.type : event, + namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf(".") >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf(":") < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join("."); + event.namespace_re = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === (elem.ownerDocument || document) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) { + event.preventDefault(); + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && + jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + try { + elem[ type ](); + } catch ( e ) { + // IE<9 dies on focus/blur to hidden element (#1486,#12518) + // only reproducible on winXP IE8 native, not IE9 in IE8 mode + } + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, ret, handleObj, matched, j, + handlerQueue = [], + args = core_slice.call( arguments ), + handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( (event.result = ret) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var sel, handleObj, matches, i, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // Avoid non-left-click bubbling in Firefox (#3861) + if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { + + /* jshint eqeqeq: false */ + for ( ; cur != this; cur = cur.parentNode || this ) { + /* jshint eqeqeq: true */ + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) >= 0 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, handlers: matches }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); + } + + return handlerQueue; + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: IE<9 + // Fix target property (#1925) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Support: Chrome 23+, Safari? + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Support: IE<9 + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) + event.metaKey = !!event.metaKey; + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var body, eventDoc, doc, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + special: { + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + try { + this.focus(); + return false; + } catch ( e ) { + // Support: IE<9 + // If we error on focus to hidden element (#1486, #12518), + // let .trigger() run the handlers + } + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Even when returnValue equals to undefined Firefox will still show alert + if ( event.result !== undefined ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 + // detachEvent needed property on element, by name of that event, to properly expose it to GC + if ( typeof elem[ name ] === core_strundefined ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + if ( !e ) { + return; + } + + // If preventDefault exists, run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // Support: IE + // Otherwise set the returnValue property of the original event to false + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + if ( !e ) { + return; + } + // If stopPropagation exists, run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + + // Support: IE + // Set the cancelBubble property of the original event to true + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !jQuery._data( form, "submitBubbles" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submit_bubble = true; + }); + jQuery._data( form, "submitBubbles", true ); + } + }); + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( event._submit_bubble ) { + delete event._submit_bubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + } + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !jQuery.support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + } + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event, true ); + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + jQuery._data( elem, "changeBubbles", true ); + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !jQuery.support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0, + handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var type, origFn; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on( types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + var elem = this[0]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +}); +var isSimple = /^.[^:#\[\.,]*$/, + rparentsprev = /^(?:parents|prev(?:Until|All))/, + rneedsContext = jQuery.expr.match.needsContext, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var i, + ret = [], + self = this, + len = self.length; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + + has: function( target ) { + var i, + targets = jQuery( target, this ), + len = targets.length; + + return this.filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector || [], true) ); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector || [], false) ); + }, + + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + ret = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { + // Always skip document fragments + if ( cur.nodeType < 11 && (pos ? + pos.index(cur) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector(cur, selectors)) ) { + + cur = ret.push( cur ); + break; + } + } + } + + return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( jQuery.unique(all) ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter(selector) + ); + } +}); + +function sibling( cur, dir ) { + do { + cur = cur[ dir ]; + } while ( cur && cur.nodeType !== 1 ); + + return cur; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + if ( this.length > 1 ) { + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + ret = jQuery.unique( ret ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + } + + return this.pushStack( ret ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + })); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + }); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + }); + + } + + if ( typeof qualifier === "string" ) { + if ( isSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not; + }); +} +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, + rtagName = /<([\w:]+)/, + rtbody = /\s*$/g, + + // We have to close these tags to support XHTML (#13200) + wrapMap = { + option: [ 1, "" ], + legend: [ 1, "
", "
" ], + area: [ 1, "", "" ], + param: [ 1, "", "" ], + thead: [ 1, "", "
" ], + tr: [ 2, "", "
" ], + col: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, + // unless wrapped in a div with non-breaking characters in front of it. + _default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
", "
" ] + }, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement("div") ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +jQuery.fn.extend({ + text: function( value ) { + return jQuery.access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); + }, null, value, arguments.length ); + }, + + append: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + }); + }, + + before: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + }); + }, + + after: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + }); + }, + + // keepData is for internal use only--do not document + remove: function( selector, keepData ) { + var elem, + elems = selector ? jQuery.filter( selector, this ) : this, + i = 0; + + for ( ; (elem = elems[i]) != null; i++ ) { + + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem ) ); + } + + if ( elem.parentNode ) { + if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { + setGlobalEval( getAll( elem, "script" ) ); + } + elem.parentNode.removeChild( elem ); + } + } + + return this; + }, + + empty: function() { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + + // If this is a select, ensure that it displays empty (#12336) + // Support: IE<9 + if ( elem.options && jQuery.nodeName( elem, "select" ) ) { + elem.options.length = 0; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function () { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + return jQuery.access( this, function( value ) { + var elem = this[0] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) { + + value = value.replace( rxhtmlTag, "<$1>" ); + + try { + for (; i < l; i++ ) { + // Remove element nodes and prevent memory leaks + elem = this[i] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch(e) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var + // Snapshot the DOM in case .domManip sweeps something relevant into its fragment + args = jQuery.map( this, function( elem ) { + return [ elem.nextSibling, elem.parentNode ]; + }), + i = 0; + + // Make the changes, replacing each context element with the new content + this.domManip( arguments, function( elem ) { + var next = args[ i++ ], + parent = args[ i++ ]; + + if ( parent ) { + // Don't use the snapshot next if it has moved (#13810) + if ( next && next.parentNode !== parent ) { + next = this.nextSibling; + } + jQuery( this ).remove(); + parent.insertBefore( elem, next ); + } + // Allow new content to include elements from the context set + }, true ); + + // Force removal if there was no new content (e.g., from empty arguments) + return i ? this : this.remove(); + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, callback, allowIntersection ) { + + // Flatten any nested arrays + args = core_concat.apply( [], args ); + + var first, node, hasScripts, + scripts, doc, fragment, + i = 0, + l = this.length, + set = this, + iNoClone = l - 1, + value = args[0], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) { + return this.each(function( index ) { + var self = set.eq( index ); + if ( isFunction ) { + args[0] = value.call( this, index, self.html() ); + } + self.domManip( args, callback, allowIntersection ); + }); + } + + if ( l ) { + fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + if ( first ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( this[i], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { + + if ( node.src ) { + // Hope ajax is available... + jQuery._evalUrl( node.src ); + } else { + jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) ); + } + } + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + } + } + + return this; + } +}); + +// Support: IE<8 +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName("tbody")[0] || + elem.appendChild( elem.ownerDocument.createElement("tbody") ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + if ( match ) { + elem.type = match[1]; + } else { + elem.removeAttribute("type"); + } + return elem; +} + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var elem, + i = 0; + for ( ; (elem = elems[i]) != null; i++ ) { + jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) ); + } +} + +function cloneCopyEvent( src, dest ) { + + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function fixCloneNodeIssues( src, dest ) { + var nodeName, e, data; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 copies events bound via attachEvent when using cloneNode. + if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) { + data = jQuery._data( dest ); + + for ( e in data.events ) { + jQuery.removeEvent( dest, e, data.handle ); + } + + // Event data gets referenced instead of copied if the expando gets copied too + dest.removeAttribute( jQuery.expando ); + } + + // IE blanks contents when cloning scripts, and tries to evaluate newly-set text + if ( nodeName === "script" && dest.text !== src.text ) { + disableScript( dest ).text = src.text; + restoreScript( dest ); + + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + } else if ( nodeName === "object" ) { + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) { + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.defaultSelected = dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone(true); + jQuery( insert[i] )[ original ]( elems ); + + // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() + core_push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +}); + +function getAll( context, tag ) { + var elems, elem, + i = 0, + found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) : + undefined; + + if ( !found ) { + for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) { + if ( !tag || jQuery.nodeName( elem, tag ) ) { + found.push( elem ); + } else { + jQuery.merge( found, getAll( elem, tag ) ); + } + } + } + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], found ) : + found; +} + +// Used in buildFragment, fixes the defaultChecked property +function fixDefaultChecked( elem ) { + if ( manipulation_rcheckableType.test( elem.type ) ) { + elem.defaultChecked = elem.checked; + } +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var destElements, node, clone, i, srcElements, + inPage = jQuery.contains( elem.ownerDocument, elem ); + + if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && + (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + // Fix all IE cloning issues + for ( i = 0; (node = srcElements[i]) != null; ++i ) { + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[i] ) { + fixCloneNodeIssues( node, destElements[i] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0; (node = srcElements[i]) != null; i++ ) { + cloneCopyEvent( node, destElements[i] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + destElements = srcElements = node = null; + + // Return the cloned set + return clone; + }, + + buildFragment: function( elems, context, scripts, selection ) { + var j, elem, contains, + tmp, tag, tbody, wrap, + l = elems.length, + + // Ensure a safe fragment + safe = createSafeFragment( context ), + + nodes = [], + i = 0; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || safe.appendChild( context.createElement("div") ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + + tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[2]; + + // Descend through wrappers to the right content + j = wrap[0]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Manually add leading whitespace removed by IE + if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { + nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) ); + } + + // Remove IE's autoinserted from table fragments + if ( !jQuery.support.tbody ) { + + // String was a , *may* have spurious + elem = tag === "table" && !rtbody.test( elem ) ? + tmp.firstChild : + + // String was a bare or + wrap[1] === "
" && !rtbody.test( elem ) ? + tmp : + 0; + + j = elem && elem.childNodes.length; + while ( j-- ) { + if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) { + elem.removeChild( tbody ); + } + } + } + + jQuery.merge( nodes, tmp.childNodes ); + + // Fix #12392 for WebKit and IE > 9 + tmp.textContent = ""; + + // Fix #12392 for oldIE + while ( tmp.firstChild ) { + tmp.removeChild( tmp.firstChild ); + } + + // Remember the top-level container for proper cleanup + tmp = safe.lastChild; + } + } + } + + // Fix #11356: Clear elements from fragment + if ( tmp ) { + safe.removeChild( tmp ); + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !jQuery.support.appendChecked ) { + jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); + } + + i = 0; + while ( (elem = nodes[ i++ ]) ) { + + // #4087 - If origin and destination elements are the same, and this is + // that element, do not do anything + if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( safe.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( (elem = tmp[ j++ ]) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + tmp = null; + + return safe; + }, + + cleanData: function( elems, /* internal */ acceptData ) { + var elem, type, id, data, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + deleteExpando = jQuery.support.deleteExpando, + special = jQuery.event.special; + + for ( ; (elem = elems[i]) != null; i++ ) { + + if ( acceptData || jQuery.acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( deleteExpando ) { + delete elem[ internalKey ]; + + } else if ( typeof elem.removeAttribute !== core_strundefined ) { + elem.removeAttribute( internalKey ); + + } else { + elem[ internalKey ] = null; + } + + core_deletedIds.push( id ); + } + } + } + } + }, + + _evalUrl: function( url ) { + return jQuery.ajax({ + url: url, + type: "GET", + dataType: "script", + async: false, + global: false, + "throws": true + }); + } +}); +jQuery.fn.extend({ + wrapAll: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapAll( html.call(this, i) ); + }); + } + + if ( this[0] ) { + // The elements to wrap the target around + var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); + + if ( this[0].parentNode ) { + wrap.insertBefore( this[0] ); + } + + wrap.map(function() { + var elem = this; + + while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { + elem = elem.firstChild; + } + + return elem; + }).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapInner( html.call(this, i) ); + }); + } + + return this.each(function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + }); + }, + + wrap: function( html ) { + var isFunction = jQuery.isFunction( html ); + + return this.each(function(i) { + jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html ); + }); + }, + + unwrap: function() { + return this.parent().each(function() { + if ( !jQuery.nodeName( this, "body" ) ) { + jQuery( this ).replaceWith( this.childNodes ); + } + }).end(); + } +}); +var iframe, getStyles, curCSS, + ralpha = /alpha\([^)]*\)/i, + ropacity = /opacity\s*=\s*([^)]*)/, + rposition = /^(top|right|bottom|left)$/, + // swappable if display is none or starts with table except "table", "table-cell", or "table-caption" + // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rmargin = /^margin/, + rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ), + rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ), + rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ), + elemdisplay = { BODY: "block" }, + + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: 0, + fontWeight: 400 + }, + + cssExpand = [ "Top", "Right", "Bottom", "Left" ], + cssPrefixes = [ "Webkit", "O", "Moz", "ms" ]; + +// return a css property mapped to a potentially vendor prefixed property +function vendorPropName( style, name ) { + + // shortcut for names that are not vendor prefixed + if ( name in style ) { + return name; + } + + // check for vendor prefixed names + var capName = name.charAt(0).toUpperCase() + name.slice(1), + origName = name, + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in style ) { + return name; + } + } + + return origName; +} + +function isHidden( elem, el ) { + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); +} + +function showHide( elements, show ) { + var display, elem, hidden, + values = [], + index = 0, + length = elements.length; + + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + values[ index ] = jQuery._data( elem, "olddisplay" ); + display = elem.style.display; + if ( show ) { + // Reset the inline display of this element to learn if it is + // being hidden by cascaded rules or not + if ( !values[ index ] && display === "none" ) { + elem.style.display = ""; + } + + // Set elements which have been overridden with display: none + // in a stylesheet to whatever the default browser style is + // for such an element + if ( elem.style.display === "" && isHidden( elem ) ) { + values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) ); + } + } else { + + if ( !values[ index ] ) { + hidden = isHidden( elem ); + + if ( display && display !== "none" || !hidden ) { + jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) ); + } + } + } + } + + // Set the display of most of the elements in a second loop + // to avoid the constant reflow + for ( index = 0; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + if ( !show || elem.style.display === "none" || elem.style.display === "" ) { + elem.style.display = show ? values[ index ] || "" : "none"; + } + } + + return elements; +} + +jQuery.fn.extend({ + css: function( name, value ) { + return jQuery.access( this, function( elem, name, value ) { + var len, styles, + map = {}, + i = 0; + + if ( jQuery.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + }, + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each(function() { + if ( isHidden( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + }); + } +}); + +jQuery.extend({ + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "columnCount": true, + "fillOpacity": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: { + // normalize float css property + "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat" + }, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = jQuery.camelCase( name ), + style = elem.style; + + name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) ); + + // gets hook for the prefixed version + // followed by the unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // convert relative number strings (+= or -=) to relative numbers. #7345 + if ( type === "string" && (ret = rrelNum.exec( value )) ) { + value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) ); + // Fixes bug #9237 + type = "number"; + } + + // Make sure that NaN and null values aren't set. See: #7116 + if ( value == null || type === "number" && isNaN( value ) ) { + return; + } + + // If a number was passed in, add 'px' to the (except for certain CSS properties) + if ( type === "number" && !jQuery.cssNumber[ origName ] ) { + value += "px"; + } + + // Fixes #8908, it can be done more correctly by specifing setters in cssHooks, + // but it would mean to define eight (for every problematic property) identical functions + if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) { + + // Wrapped to prevent IE from throwing errors when 'invalid' values are provided + // Fixes bug #5509 + try { + style[ name ] = value; + } catch(e) {} + } + + } else { + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var num, val, hooks, + origName = jQuery.camelCase( name ); + + // Make sure that we're working with the right name + name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) ); + + // gets hook for the prefixed version + // followed by the unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + //convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Return, converting to number if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || jQuery.isNumeric( num ) ? num || 0 : val; + } + return val; + } +}); + +// NOTE: we've included the "window" in window.getComputedStyle +// because jsdom on node.js will break without it. +if ( window.getComputedStyle ) { + getStyles = function( elem ) { + return window.getComputedStyle( elem, null ); + }; + + curCSS = function( elem, name, _computed ) { + var width, minWidth, maxWidth, + computed = _computed || getStyles( elem ), + + // getPropertyValue is only needed for .css('filter') in IE9, see #12537 + ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined, + style = elem.style; + + if ( computed ) { + + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right + // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels + // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values + if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret; + }; +} else if ( document.documentElement.currentStyle ) { + getStyles = function( elem ) { + return elem.currentStyle; + }; + + curCSS = function( elem, name, _computed ) { + var left, rs, rsLeft, + computed = _computed || getStyles( elem ), + ret = computed ? computed[ name ] : undefined, + style = elem.style; + + // Avoid setting ret to empty string here + // so we don't default to auto + if ( ret == null && style && style[ name ] ) { + ret = style[ name ]; + } + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + // but not position css attributes, as those are proportional to the parent element instead + // and we can't measure the parent instead because it might trigger a "stacking dolls" problem + if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) { + + // Remember the original values + left = style.left; + rs = elem.runtimeStyle; + rsLeft = rs && rs.left; + + // Put in the new values to get a computed value out + if ( rsLeft ) { + rs.left = elem.currentStyle.left; + } + style.left = name === "fontSize" ? "1em" : ret; + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + if ( rsLeft ) { + rs.left = rsLeft; + } + } + + return ret === "" ? "auto" : ret; + }; +} + +function setPositiveNumber( elem, value, subtract ) { + var matches = rnumsplit.exec( value ); + return matches ? + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) : + value; +} + +function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { + var i = extra === ( isBorderBox ? "border" : "content" ) ? + // If we already have the right measurement, avoid augmentation + 4 : + // Otherwise initialize for horizontal or vertical properties + name === "width" ? 1 : 0, + + val = 0; + + for ( ; i < 4; i += 2 ) { + // both box models exclude margin, so add it if we want it + if ( extra === "margin" ) { + val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); + } + + if ( isBorderBox ) { + // border-box includes padding, so remove it if we want content + if ( extra === "content" ) { + val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // at this point, extra isn't border nor margin, so remove border + if ( extra !== "margin" ) { + val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } else { + // at this point, extra isn't content, so add padding + val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // at this point, extra isn't content nor padding, so add border + if ( extra !== "padding" ) { + val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + return val; +} + +function getWidthOrHeight( elem, name, extra ) { + + // Start with offset property, which is equivalent to the border-box value + var valueIsBorderBox = true, + val = name === "width" ? elem.offsetWidth : elem.offsetHeight, + styles = getStyles( elem ), + isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // some non-html elements return undefined for offsetWidth, so check for null/undefined + // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 + // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 + if ( val <= 0 || val == null ) { + // Fall back to computed then uncomputed css if necessary + val = curCSS( elem, name, styles ); + if ( val < 0 || val == null ) { + val = elem.style[ name ]; + } + + // Computed unit is not pixels. Stop here and return. + if ( rnumnonpx.test(val) ) { + return val; + } + + // we need the check for style in case a browser which returns unreliable values + // for getComputedStyle silently falls back to the reliable elem.style + valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] ); + + // Normalize "", auto, and prepare for extra + val = parseFloat( val ) || 0; + } + + // use the active box-sizing model to add/subtract irrelevant styles + return ( val + + augmentWidthOrHeight( + elem, + name, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles + ) + ) + "px"; +} + +// Try to determine the default display value of an element +function css_defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + // Use the already-created iframe if possible + iframe = ( iframe || + jQuery("