Merge lp:~stewart/percona-server/5.5.23-pam into lp:percona-server/5.5

Proposed by Stewart Smith
Status: Merged
Approved by: Laurynas Biveinis
Approved revision: no longer in the source branch.
Merged at revision: 245
Proposed branch: lp:~stewart/percona-server/5.5.23-pam
Merge into: lp:percona-server/5.5
Prerequisite: lp:~stewart/percona-server/5.5.23
Diff against target: 5171 lines (+4911/-0)
38 files modified
Percona-Server/plugin/percona-pam-for-mysql/.bzrignore (+21/-0)
Percona-Server/plugin/percona-pam-for-mysql/CMakeLists.txt (+30/-0)
Percona-Server/plugin/percona-pam-for-mysql/LICENSE (+339/-0)
Percona-Server/plugin/percona-pam-for-mysql/Makefile.am (+19/-0)
Percona-Server/plugin/percona-pam-for-mysql/README (+40/-0)
Percona-Server/plugin/percona-pam-for-mysql/bootstrap (+18/-0)
Percona-Server/plugin/percona-pam-for-mysql/build/build-binary.sh.in (+122/-0)
Percona-Server/plugin/percona-pam-for-mysql/build/percona-pam-plugin.spec.in (+66/-0)
Percona-Server/plugin/percona-pam-for-mysql/configure.ac (+95/-0)
Percona-Server/plugin/percona-pam-for-mysql/doc/Makefile (+130/-0)
Percona-Server/plugin/percona-pam-for-mysql/doc/make.bat (+170/-0)
Percona-Server/plugin/percona-pam-for-mysql/doc/source/conf.py (+245/-0)
Percona-Server/plugin/percona-pam-for-mysql/doc/source/faq.rst (+51/-0)
Percona-Server/plugin/percona-pam-for-mysql/doc/source/glossary.rst (+8/-0)
Percona-Server/plugin/percona-pam-for-mysql/doc/source/index.rst (+51/-0)
Percona-Server/plugin/percona-pam-for-mysql/doc/source/installation.rst (+50/-0)
Percona-Server/plugin/percona-pam-for-mysql/doc/source/intro.rst (+23/-0)
Percona-Server/plugin/percona-pam-for-mysql/doc/source/manual.rst (+38/-0)
Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/layout.html (+499/-0)
Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/searchbox.html (+22/-0)
Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/default.css_t (+469/-0)
Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/jquery.min.js (+154/-0)
Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/percona.com.css (+271/-0)
Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/percona.com.js (+269/-0)
Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/sidebar.js (+151/-0)
Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/theme.conf (+32/-0)
Percona-Server/plugin/percona-pam-for-mysql/doc/source/release-notes.rst (+8/-0)
Percona-Server/plugin/percona-pam-for-mysql/src/Makefile.am (+37/-0)
Percona-Server/plugin/percona-pam-for-mysql/src/auth_mapping.c (+249/-0)
Percona-Server/plugin/percona-pam-for-mysql/src/auth_mapping.h (+74/-0)
Percona-Server/plugin/percona-pam-for-mysql/src/auth_pam.c (+175/-0)
Percona-Server/plugin/percona-pam-for-mysql/src/auth_pam_common.c (+190/-0)
Percona-Server/plugin/percona-pam-for-mysql/src/auth_pam_common.h (+71/-0)
Percona-Server/plugin/percona-pam-for-mysql/src/auth_pam_compat.c (+131/-0)
Percona-Server/plugin/percona-pam-for-mysql/src/dialog.c (+351/-0)
Percona-Server/plugin/percona-pam-for-mysql/src/lib_auth_pam_client.c (+80/-0)
Percona-Server/plugin/percona-pam-for-mysql/src/lib_auth_pam_client.h (+80/-0)
Percona-Server/plugin/percona-pam-for-mysql/src/test_auth_pam_client.c (+82/-0)
To merge this branch: bzr merge lp:~stewart/percona-server/5.5.23-pam
Reviewer Review Type Date Requested Status
Laurynas Biveinis (community) Approve
Review via email: mp+105034@code.launchpad.net

Description of the change

Add PAM plugin to 5.5.23 build, adapt CMakeLists to work in tree.

To post a comment you must log in.
Revision history for this message
Stewart Smith (stewart) wrote :
Revision history for this message
Laurynas Biveinis (laurynas-biveinis) wrote :

OK if Jenkins testing passes.
After the merge please update all the relevant percona-server-5.5 Jenkins jobs to include the testing part of percona-pam-trunk.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added directory 'Percona-Server/plugin/percona-pam-for-mysql'
2=== added file 'Percona-Server/plugin/percona-pam-for-mysql/.bzrignore'
3--- Percona-Server/plugin/percona-pam-for-mysql/.bzrignore 1970-01-01 00:00:00 +0000
4+++ Percona-Server/plugin/percona-pam-for-mysql/.bzrignore 2012-05-08 06:39:22 +0000
5@@ -0,0 +1,21 @@
6+aclocal.m4
7+autom4te.cache
8+config.*
9+configure
10+install-sh
11+ltmain.sh
12+libtool
13+missing
14+Makefile.in
15+*.la
16+*.lo
17+depcomp
18+Makefile
19+.deps
20+.libs
21+stamp-h1
22+build/percona-pam-plugin.spec
23+build/build-binary.sh
24+*.tar.gz
25+m4/*.m4
26+doc/build
27
28=== added file 'Percona-Server/plugin/percona-pam-for-mysql/CMakeLists.txt'
29--- Percona-Server/plugin/percona-pam-for-mysql/CMakeLists.txt 1970-01-01 00:00:00 +0000
30+++ Percona-Server/plugin/percona-pam-for-mysql/CMakeLists.txt 2012-05-08 06:39:22 +0000
31@@ -0,0 +1,30 @@
32+# (C) 2011 Percona Inc.
33+#
34+# This program is free software; you can redistribute it and/or modify
35+# it under the terms of the GNU General Public License as published by
36+# the Free Software Foundation; version 2 of the License.
37+#
38+# This program is distributed in the hope that it will be useful,
39+# but WITHOUT ANY WARRANTY; without even the implied warranty of
40+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
41+# GNU General Public License for more details.
42+#
43+# You should have received a copy of the GNU General Public License
44+# along with this program; if not, write to the Free Software
45+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
46+#
47+INCLUDE (CheckLibraryExists)
48+CHECK_LIBRARY_EXISTS(pam pam_authenticate "" HAVE_PAM)
49+CHECK_LIBRARY_EXISTS(mysqlclient mysql_init "" HAVE_MYSQLCLIENT)
50+CHECK_SYMBOL_EXISTS(getpwnam_r "pwd.h" HAVE_GETPWNAM_R)
51+CHECK_SYMBOL_EXISTS(getgrgid_r "grp.h" HAVE_GETGRGID_R)
52+IF(HAVE_PAM AND HAVE_MYSQLCLIENT AND HAVE_GETPWNAM_R AND HAVE_GETGRGID_R)
53+ SET(AUTH_PAM_COMMON_SOURCES
54+ src/auth_pam_common.c src/lib_auth_pam_client.c src/lib_auth_pam_client.h
55+ src/auth_mapping.h src/auth_mapping.c)
56+ SET(AUTH_PAM_SOURCES ${AUTH_PAM_COMMON_SOURCES} src/auth_pam.c)
57+ SET(AUTH_PAM_COMPAT_SOURCES ${AUTH_PAM_COMMON_SOURCES} src/auth_pam_compat.c)
58+ MYSQL_ADD_PLUGIN(auth_pam ${AUTH_PAM_SOURCES} LINK_LIBRARIES pam MODULE_ONLY)
59+ MYSQL_ADD_PLUGIN(auth_pam_compat ${AUTH_PAM_COMPAT_SOURCES} LINK_LIBRARIES pam MODULE_ONLY)
60+ MYSQL_ADD_PLUGIN(dialog src/dialog.c LINK_LIBRARIES mysqlclient MODULE_ONLY)
61+ENDIF(HAVE_PAM AND HAVE_MYSQLCLIENT AND HAVE_GETPWNAM_R AND HAVE_GETGRGID_R)
62
63=== added file 'Percona-Server/plugin/percona-pam-for-mysql/LICENSE'
64--- Percona-Server/plugin/percona-pam-for-mysql/LICENSE 1970-01-01 00:00:00 +0000
65+++ Percona-Server/plugin/percona-pam-for-mysql/LICENSE 2012-05-08 06:39:22 +0000
66@@ -0,0 +1,339 @@
67+ GNU GENERAL PUBLIC LICENSE
68+ Version 2, June 1991
69+
70+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
71+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
72+ Everyone is permitted to copy and distribute verbatim copies
73+ of this license document, but changing it is not allowed.
74+
75+ Preamble
76+
77+ The licenses for most software are designed to take away your
78+freedom to share and change it. By contrast, the GNU General Public
79+License is intended to guarantee your freedom to share and change free
80+software--to make sure the software is free for all its users. This
81+General Public License applies to most of the Free Software
82+Foundation's software and to any other program whose authors commit to
83+using it. (Some other Free Software Foundation software is covered by
84+the GNU Lesser General Public License instead.) You can apply it to
85+your programs, too.
86+
87+ When we speak of free software, we are referring to freedom, not
88+price. Our General Public Licenses are designed to make sure that you
89+have the freedom to distribute copies of free software (and charge for
90+this service if you wish), that you receive source code or can get it
91+if you want it, that you can change the software or use pieces of it
92+in new free programs; and that you know you can do these things.
93+
94+ To protect your rights, we need to make restrictions that forbid
95+anyone to deny you these rights or to ask you to surrender the rights.
96+These restrictions translate to certain responsibilities for you if you
97+distribute copies of the software, or if you modify it.
98+
99+ For example, if you distribute copies of such a program, whether
100+gratis or for a fee, you must give the recipients all the rights that
101+you have. You must make sure that they, too, receive or can get the
102+source code. And you must show them these terms so they know their
103+rights.
104+
105+ We protect your rights with two steps: (1) copyright the software, and
106+(2) offer you this license which gives you legal permission to copy,
107+distribute and/or modify the software.
108+
109+ Also, for each author's protection and ours, we want to make certain
110+that everyone understands that there is no warranty for this free
111+software. If the software is modified by someone else and passed on, we
112+want its recipients to know that what they have is not the original, so
113+that any problems introduced by others will not reflect on the original
114+authors' reputations.
115+
116+ Finally, any free program is threatened constantly by software
117+patents. We wish to avoid the danger that redistributors of a free
118+program will individually obtain patent licenses, in effect making the
119+program proprietary. To prevent this, we have made it clear that any
120+patent must be licensed for everyone's free use or not licensed at all.
121+
122+ The precise terms and conditions for copying, distribution and
123+modification follow.
124+
125+ GNU GENERAL PUBLIC LICENSE
126+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
127+
128+ 0. This License applies to any program or other work which contains
129+a notice placed by the copyright holder saying it may be distributed
130+under the terms of this General Public License. The "Program", below,
131+refers to any such program or work, and a "work based on the Program"
132+means either the Program or any derivative work under copyright law:
133+that is to say, a work containing the Program or a portion of it,
134+either verbatim or with modifications and/or translated into another
135+language. (Hereinafter, translation is included without limitation in
136+the term "modification".) Each licensee is addressed as "you".
137+
138+Activities other than copying, distribution and modification are not
139+covered by this License; they are outside its scope. The act of
140+running the Program is not restricted, and the output from the Program
141+is covered only if its contents constitute a work based on the
142+Program (independent of having been made by running the Program).
143+Whether that is true depends on what the Program does.
144+
145+ 1. You may copy and distribute verbatim copies of the Program's
146+source code as you receive it, in any medium, provided that you
147+conspicuously and appropriately publish on each copy an appropriate
148+copyright notice and disclaimer of warranty; keep intact all the
149+notices that refer to this License and to the absence of any warranty;
150+and give any other recipients of the Program a copy of this License
151+along with the Program.
152+
153+You may charge a fee for the physical act of transferring a copy, and
154+you may at your option offer warranty protection in exchange for a fee.
155+
156+ 2. You may modify your copy or copies of the Program or any portion
157+of it, thus forming a work based on the Program, and copy and
158+distribute such modifications or work under the terms of Section 1
159+above, provided that you also meet all of these conditions:
160+
161+ a) You must cause the modified files to carry prominent notices
162+ stating that you changed the files and the date of any change.
163+
164+ b) You must cause any work that you distribute or publish, that in
165+ whole or in part contains or is derived from the Program or any
166+ part thereof, to be licensed as a whole at no charge to all third
167+ parties under the terms of this License.
168+
169+ c) If the modified program normally reads commands interactively
170+ when run, you must cause it, when started running for such
171+ interactive use in the most ordinary way, to print or display an
172+ announcement including an appropriate copyright notice and a
173+ notice that there is no warranty (or else, saying that you provide
174+ a warranty) and that users may redistribute the program under
175+ these conditions, and telling the user how to view a copy of this
176+ License. (Exception: if the Program itself is interactive but
177+ does not normally print such an announcement, your work based on
178+ the Program is not required to print an announcement.)
179+
180+These requirements apply to the modified work as a whole. If
181+identifiable sections of that work are not derived from the Program,
182+and can be reasonably considered independent and separate works in
183+themselves, then this License, and its terms, do not apply to those
184+sections when you distribute them as separate works. But when you
185+distribute the same sections as part of a whole which is a work based
186+on the Program, the distribution of the whole must be on the terms of
187+this License, whose permissions for other licensees extend to the
188+entire whole, and thus to each and every part regardless of who wrote it.
189+
190+Thus, it is not the intent of this section to claim rights or contest
191+your rights to work written entirely by you; rather, the intent is to
192+exercise the right to control the distribution of derivative or
193+collective works based on the Program.
194+
195+In addition, mere aggregation of another work not based on the Program
196+with the Program (or with a work based on the Program) on a volume of
197+a storage or distribution medium does not bring the other work under
198+the scope of this License.
199+
200+ 3. You may copy and distribute the Program (or a work based on it,
201+under Section 2) in object code or executable form under the terms of
202+Sections 1 and 2 above provided that you also do one of the following:
203+
204+ a) Accompany it with the complete corresponding machine-readable
205+ source code, which must be distributed under the terms of Sections
206+ 1 and 2 above on a medium customarily used for software interchange; or,
207+
208+ b) Accompany it with a written offer, valid for at least three
209+ years, to give any third party, for a charge no more than your
210+ cost of physically performing source distribution, a complete
211+ machine-readable copy of the corresponding source code, to be
212+ distributed under the terms of Sections 1 and 2 above on a medium
213+ customarily used for software interchange; or,
214+
215+ c) Accompany it with the information you received as to the offer
216+ to distribute corresponding source code. (This alternative is
217+ allowed only for noncommercial distribution and only if you
218+ received the program in object code or executable form with such
219+ an offer, in accord with Subsection b above.)
220+
221+The source code for a work means the preferred form of the work for
222+making modifications to it. For an executable work, complete source
223+code means all the source code for all modules it contains, plus any
224+associated interface definition files, plus the scripts used to
225+control compilation and installation of the executable. However, as a
226+special exception, the source code distributed need not include
227+anything that is normally distributed (in either source or binary
228+form) with the major components (compiler, kernel, and so on) of the
229+operating system on which the executable runs, unless that component
230+itself accompanies the executable.
231+
232+If distribution of executable or object code is made by offering
233+access to copy from a designated place, then offering equivalent
234+access to copy the source code from the same place counts as
235+distribution of the source code, even though third parties are not
236+compelled to copy the source along with the object code.
237+
238+ 4. You may not copy, modify, sublicense, or distribute the Program
239+except as expressly provided under this License. Any attempt
240+otherwise to copy, modify, sublicense or distribute the Program is
241+void, and will automatically terminate your rights under this License.
242+However, parties who have received copies, or rights, from you under
243+this License will not have their licenses terminated so long as such
244+parties remain in full compliance.
245+
246+ 5. You are not required to accept this License, since you have not
247+signed it. However, nothing else grants you permission to modify or
248+distribute the Program or its derivative works. These actions are
249+prohibited by law if you do not accept this License. Therefore, by
250+modifying or distributing the Program (or any work based on the
251+Program), you indicate your acceptance of this License to do so, and
252+all its terms and conditions for copying, distributing or modifying
253+the Program or works based on it.
254+
255+ 6. Each time you redistribute the Program (or any work based on the
256+Program), the recipient automatically receives a license from the
257+original licensor to copy, distribute or modify the Program subject to
258+these terms and conditions. You may not impose any further
259+restrictions on the recipients' exercise of the rights granted herein.
260+You are not responsible for enforcing compliance by third parties to
261+this License.
262+
263+ 7. If, as a consequence of a court judgment or allegation of patent
264+infringement or for any other reason (not limited to patent issues),
265+conditions are imposed on you (whether by court order, agreement or
266+otherwise) that contradict the conditions of this License, they do not
267+excuse you from the conditions of this License. If you cannot
268+distribute so as to satisfy simultaneously your obligations under this
269+License and any other pertinent obligations, then as a consequence you
270+may not distribute the Program at all. For example, if a patent
271+license would not permit royalty-free redistribution of the Program by
272+all those who receive copies directly or indirectly through you, then
273+the only way you could satisfy both it and this License would be to
274+refrain entirely from distribution of the Program.
275+
276+If any portion of this section is held invalid or unenforceable under
277+any particular circumstance, the balance of the section is intended to
278+apply and the section as a whole is intended to apply in other
279+circumstances.
280+
281+It is not the purpose of this section to induce you to infringe any
282+patents or other property right claims or to contest validity of any
283+such claims; this section has the sole purpose of protecting the
284+integrity of the free software distribution system, which is
285+implemented by public license practices. Many people have made
286+generous contributions to the wide range of software distributed
287+through that system in reliance on consistent application of that
288+system; it is up to the author/donor to decide if he or she is willing
289+to distribute software through any other system and a licensee cannot
290+impose that choice.
291+
292+This section is intended to make thoroughly clear what is believed to
293+be a consequence of the rest of this License.
294+
295+ 8. If the distribution and/or use of the Program is restricted in
296+certain countries either by patents or by copyrighted interfaces, the
297+original copyright holder who places the Program under this License
298+may add an explicit geographical distribution limitation excluding
299+those countries, so that distribution is permitted only in or among
300+countries not thus excluded. In such case, this License incorporates
301+the limitation as if written in the body of this License.
302+
303+ 9. The Free Software Foundation may publish revised and/or new versions
304+of the General Public License from time to time. Such new versions will
305+be similar in spirit to the present version, but may differ in detail to
306+address new problems or concerns.
307+
308+Each version is given a distinguishing version number. If the Program
309+specifies a version number of this License which applies to it and "any
310+later version", you have the option of following the terms and conditions
311+either of that version or of any later version published by the Free
312+Software Foundation. If the Program does not specify a version number of
313+this License, you may choose any version ever published by the Free Software
314+Foundation.
315+
316+ 10. If you wish to incorporate parts of the Program into other free
317+programs whose distribution conditions are different, write to the author
318+to ask for permission. For software which is copyrighted by the Free
319+Software Foundation, write to the Free Software Foundation; we sometimes
320+make exceptions for this. Our decision will be guided by the two goals
321+of preserving the free status of all derivatives of our free software and
322+of promoting the sharing and reuse of software generally.
323+
324+ NO WARRANTY
325+
326+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
327+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
328+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
329+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
330+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
331+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
332+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
333+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
334+REPAIR OR CORRECTION.
335+
336+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
337+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
338+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
339+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
340+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
341+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
342+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
343+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
344+POSSIBILITY OF SUCH DAMAGES.
345+
346+ END OF TERMS AND CONDITIONS
347+
348+ How to Apply These Terms to Your New Programs
349+
350+ If you develop a new program, and you want it to be of the greatest
351+possible use to the public, the best way to achieve this is to make it
352+free software which everyone can redistribute and change under these terms.
353+
354+ To do so, attach the following notices to the program. It is safest
355+to attach them to the start of each source file to most effectively
356+convey the exclusion of warranty; and each file should have at least
357+the "copyright" line and a pointer to where the full notice is found.
358+
359+ <one line to give the program's name and a brief idea of what it does.>
360+ Copyright (C) <year> <name of author>
361+
362+ This program is free software; you can redistribute it and/or modify
363+ it under the terms of the GNU General Public License as published by
364+ the Free Software Foundation; either version 2 of the License, or
365+ (at your option) any later version.
366+
367+ This program is distributed in the hope that it will be useful,
368+ but WITHOUT ANY WARRANTY; without even the implied warranty of
369+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
370+ GNU General Public License for more details.
371+
372+ You should have received a copy of the GNU General Public License along
373+ with this program; if not, write to the Free Software Foundation, Inc.,
374+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
375+
376+Also add information on how to contact you by electronic and paper mail.
377+
378+If the program is interactive, make it output a short notice like this
379+when it starts in an interactive mode:
380+
381+ Gnomovision version 69, Copyright (C) year name of author
382+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
383+ This is free software, and you are welcome to redistribute it
384+ under certain conditions; type `show c' for details.
385+
386+The hypothetical commands `show w' and `show c' should show the appropriate
387+parts of the General Public License. Of course, the commands you use may
388+be called something other than `show w' and `show c'; they could even be
389+mouse-clicks or menu items--whatever suits your program.
390+
391+You should also get your employer (if you work as a programmer) or your
392+school, if any, to sign a "copyright disclaimer" for the program, if
393+necessary. Here is a sample; alter the names:
394+
395+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
396+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
397+
398+ <signature of Ty Coon>, 1 April 1989
399+ Ty Coon, President of Vice
400+
401+This General Public License does not permit incorporating your program into
402+proprietary programs. If your program is a subroutine library, you may
403+consider it more useful to permit linking proprietary applications with the
404+library. If this is what you want to do, use the GNU Lesser General
405+Public License instead of this License.
406
407=== added file 'Percona-Server/plugin/percona-pam-for-mysql/Makefile.am'
408--- Percona-Server/plugin/percona-pam-for-mysql/Makefile.am 1970-01-01 00:00:00 +0000
409+++ Percona-Server/plugin/percona-pam-for-mysql/Makefile.am 2012-05-08 06:39:22 +0000
410@@ -0,0 +1,19 @@
411+# (C) 2011 Percona Inc.
412+#
413+# This program is free software; you can redistribute it and/or modify
414+# it under the terms of the GNU General Public License as published by
415+# the Free Software Foundation; version 2 of the License.
416+#
417+# This program is distributed in the hope that it will be useful,
418+# but WITHOUT ANY WARRANTY; without even the implied warranty of
419+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
420+# GNU General Public License for more details.
421+#
422+# You should have received a copy of the GNU General Public License
423+# along with this program; if not, write to the Free Software
424+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
425+#
426+
427+ACLOCAL_AMFLAGS = -I m4
428+
429+SUBDIRS = src
430
431=== added file 'Percona-Server/plugin/percona-pam-for-mysql/README'
432--- Percona-Server/plugin/percona-pam-for-mysql/README 1970-01-01 00:00:00 +0000
433+++ Percona-Server/plugin/percona-pam-for-mysql/README 2012-05-08 06:39:22 +0000
434@@ -0,0 +1,40 @@
435+Percona PAM Authentication Plugin for MySQL
436+-------------------------------------------
437+
438+(C) 2011 Percona Inc.
439+
440+This is a Authentication plugin written for the MySQL 5.5 Authentication plugin
441+API enabling MySQL to perform authentication using PAM. Examples could include
442+authenticating MySQL users using system accounts or two-factor authentication
443+systems.
444+
445+Compiling
446+---------
447+
448+You will need both the PAM and MySQL headers installed.
449+
450+The first command (bootstrap) is only needed if building from the source
451+code as checked out from the source repository, source tarballs don't require
452+this step.
453+
454+$ ./bootstrap
455+$ ./configure
456+$ make
457+# make install
458+
459+Development
460+-----------
461+
462+All development is hosted on Launchpad:
463+http://launchpad.net/percona-pam-for-mysql
464+
465+Bugs
466+----
467+
468+http://bugs.launchpad.net/percona-pam-for-mysql
469+
470+
471+License
472+-------
473+GPLv2, see LICENSE for full text of GPLv2.
474+
475
476=== added file 'Percona-Server/plugin/percona-pam-for-mysql/bootstrap'
477--- Percona-Server/plugin/percona-pam-for-mysql/bootstrap 1970-01-01 00:00:00 +0000
478+++ Percona-Server/plugin/percona-pam-for-mysql/bootstrap 2012-05-08 06:39:22 +0000
479@@ -0,0 +1,18 @@
480+#!/bin/bash
481+
482+# (C) 2011 Percona Inc.
483+#
484+# This program is free software; you can redistribute it and/or modify
485+# it under the terms of the GNU General Public License as published by
486+# the Free Software Foundation; version 2 of the License.
487+#
488+# This program is distributed in the hope that it will be useful,
489+# but WITHOUT ANY WARRANTY; without even the implied warranty of
490+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
491+# GNU General Public License for more details.
492+#
493+# You should have received a copy of the GNU General Public License
494+# along with this program; if not, write to the Free Software
495+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
496+
497+autoreconf -i -I m4 -W all,no-obsolete
498
499=== added directory 'Percona-Server/plugin/percona-pam-for-mysql/build'
500=== added file 'Percona-Server/plugin/percona-pam-for-mysql/build/build-binary.sh.in'
501--- Percona-Server/plugin/percona-pam-for-mysql/build/build-binary.sh.in 1970-01-01 00:00:00 +0000
502+++ Percona-Server/plugin/percona-pam-for-mysql/build/build-binary.sh.in 2012-05-08 06:39:22 +0000
503@@ -0,0 +1,122 @@
504+#!/bin/sh
505+#
506+# (C) 2011 Percona Inc.
507+#
508+# This program is free software; you can redistribute it and/or modify
509+# it under the terms of the GNU General Public License as published by
510+# the Free Software Foundation; version 2 of the License.
511+#
512+# This program is distributed in the hope that it will be useful,
513+# but WITHOUT ANY WARRANTY; without even the implied warranty of
514+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
515+# GNU General Public License for more details.
516+#
517+# You should have received a copy of the GNU General Public License
518+# along with this program; if not, write to the Free Software
519+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
520+#
521+
522+# Bail out on errors, be strict
523+set -ue
524+
525+# Examine parameters
526+TARGET="$(uname -m)"
527+TARGET_CFLAGS=''
528+
529+# Some programs that may be overriden
530+TAR=${TAR:-tar}
531+
532+# Check if we have a functional getopt(1)
533+if ! getopt --test
534+then
535+ go_out="$(getopt --options="i" --longoptions=i686 \
536+ --name="$(basename "$0")" -- "$@")"
537+ test $? -eq 0 || exit 1
538+ eval set -- $go_out
539+fi
540+
541+for arg
542+do
543+ case "$arg" in
544+ -- ) shift; break;;
545+ -i | --i686 )
546+ shift
547+ TARGET="i686"
548+ TARGET_CFLAGS="-m32 -march=i686"
549+ ;;
550+ esac
551+done
552+
553+# Working directory
554+if test "$#" -eq 0
555+then
556+ WORKDIR="$(pwd)"
557+
558+ # Check that the current directory is not empty
559+ if test "x$(echo *)" != "x*"
560+ then
561+ echo >&2 \
562+ "Current directory is not empty. Use $0 . to force build in ."
563+ exit 1
564+ fi
565+
566+elif test "$#" -eq 1
567+then
568+ WORKDIR="$1"
569+
570+ # Check that the provided directory exists and is a directory
571+ if ! test -d "$WORKDIR"
572+ then
573+ echo >&2 "$WORKDIR is not a directory"
574+ exit 1
575+ fi
576+
577+ WORKDIR_ABS="$(cd "$WORKDIR"; pwd)"
578+
579+else
580+ echo >&2 "Usage: $0 [target dir]"
581+ exit 1
582+
583+fi
584+
585+SOURCEDIR="$(cd $(dirname "$0"); cd ..; pwd)"
586+test -e "$SOURCEDIR/Makefile" || exit 2
587+
588+# Extract version from the Makefile
589+
590+# Build information
591+
592+# Compilation flags
593+export CFLAGS="$TARGET_CFLAGS ${CFLAGS:-}"
594+export MAKE_JFLAG=-j4
595+
596+# Create a temporary working directory
597+INSTALLDIR="$(cd "$WORKDIR" && TMPDIR="$WORKDIR_ABS" mktemp -d percona-pam-build.XXXXXX)"
598+INSTALLDIR="$WORKDIR_ABS/$INSTALLDIR" # Make it absolute
599+
600+# Build
601+(
602+ cd "$SOURCEDIR"
603+
604+ # Build the product
605+ ./configure CFLAGS="$CFLAGS"
606+ make clean all
607+
608+ make DESTDIR="$INSTALLDIR" install
609+
610+)
611+
612+# Package the archive
613+(
614+ cd "$INSTALLDIR"
615+
616+ mv "$(find -name auth_pam.so)" .
617+
618+ $TAR czf "$WORKDIR_ABS/@PACKAGE@-@VERSION@-@REVISION@.$TARGET.tar.gz" \
619+ --owner=0 --group=0 auth_pam.so
620+
621+)
622+
623+# Clean up
624+rm -rf "$INSTALLDIR"
625+
626
627=== added file 'Percona-Server/plugin/percona-pam-for-mysql/build/percona-pam-plugin.spec.in'
628--- Percona-Server/plugin/percona-pam-for-mysql/build/percona-pam-plugin.spec.in 1970-01-01 00:00:00 +0000
629+++ Percona-Server/plugin/percona-pam-for-mysql/build/percona-pam-plugin.spec.in 2012-05-08 06:39:22 +0000
630@@ -0,0 +1,66 @@
631+# (C) 2011 Percona Inc.
632+#
633+# This program is free software; you can redistribute it and/or modify
634+# it under the terms of the GNU General Public License as published by
635+# the Free Software Foundation; version 2 of the License.
636+#
637+# This program is distributed in the hope that it will be useful,
638+# but WITHOUT ANY WARRANTY; without even the implied warranty of
639+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
640+# GNU General Public License for more details.
641+#
642+# You should have received a copy of the GNU General Public License
643+# along with this program; if not, write to the Free Software
644+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
645+#
646+
647+Name: Percona-PAM-plugin
648+Version: @VERSION@
649+Release: @REVISION@%{?dist}
650+Summary: PAM authentication plugin for MySQL
651+
652+Group: Applications/Databases
653+License: GPLv2
654+URL: http://www.percona.com/
655+BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
656+Source: percona-pam-plugin-%{version}.tar.gz
657+BuildRequires: /usr/bin/mysql_config, mysql-devel >= 5.5, pam-devel
658+Requires: mysql-server >= 5.5
659+
660+%description
661+The Percona PAM plugin enables users to authenticate to the MySQL server via
662+PAM. This package contains the plugin library, you need to enable this
663+behaviour in your server by issuing the following command:
664+
665+INSTALL PLUGIN auth_pam_server SONAME 'auth_pam.so';
666+
667+%prep
668+%setup -q -n percona-pam-plugin-%{version}
669+
670+
671+%build
672+%configure --disable-static
673+make %{?_smp_mflags}
674+
675+
676+%install
677+rm -rf $RPM_BUILD_ROOT
678+make install DESTDIR=$RPM_BUILD_ROOT
679+
680+
681+%clean
682+rm -rf $RPM_BUILD_ROOT
683+
684+
685+%files
686+%defattr(-,root,root,-)
687+/usr/lib64/mysql/plugin/auth_pam.so
688+%exclude /usr/lib64/mysql/plugin/auth_pam.la
689+%exclude /usr/lib64/mysql/plugin/test_auth_pam_client.la
690+%exclude /usr/lib64/mysql/plugin/test_auth_pam_client.so
691+
692+%changelog
693+
694+* Wed Oct 20 2011 Ignacio Nin <ignacio.nin@percona.com>
695+
696+- Creation of the original .spec file
697
698=== added file 'Percona-Server/plugin/percona-pam-for-mysql/configure.ac'
699--- Percona-Server/plugin/percona-pam-for-mysql/configure.ac 1970-01-01 00:00:00 +0000
700+++ Percona-Server/plugin/percona-pam-for-mysql/configure.ac 2012-05-08 06:39:22 +0000
701@@ -0,0 +1,95 @@
702+# -*- Autoconf -*-
703+# (C) 2011 Percona Inc.
704+#
705+# This program is free software; you can redistribute it and/or modify
706+# it under the terms of the GNU General Public License as published by
707+# the Free Software Foundation; version 2 of the License.
708+#
709+# This program is distributed in the hope that it will be useful,
710+# but WITHOUT ANY WARRANTY; without even the implied warranty of
711+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
712+# GNU General Public License for more details.
713+#
714+# You should have received a copy of the GNU General Public License
715+# along with this program; if not, write to the Free Software
716+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
717+#
718+#
719+AC_PREREQ([2.59])
720+AC_INIT([Percona PAM plugin], [0.1], [mysql-dev@percona.com])
721+AC_CONFIG_SRCDIR([src/lib_auth_pam_client.h])
722+AM_INIT_AUTOMAKE([foreign])
723+
724+AC_CONFIG_MACRO_DIR([m4])
725+
726+AC_CONFIG_HEADERS([config.h])
727+
728+AC_PROG_CC
729+AC_CHECK_PROGS([BZR], [bzr])
730+
731+# Remove AC_PROG_LIBTOOL and enable this once CentOS 5.6 support is dropped.
732+# LT_INIT([disable-static])
733+AC_PROG_LIBTOOL
734+
735+AC_ARG_WITH([mysql_config],
736+ AS_HELP_STRING(
737+ [--with-mysql_config=PATH],
738+ [location of the mysql_config program]),
739+ [MYSQL_CONFIG="$with_mysql_config"])
740+AC_PATH_PROG([MYSQL_CONFIG], [mysql_config])
741+
742+AS_IF([test "x${MYSQL_CONFIG}" = x],
743+ [AC_MSG_ERROR([Unable to find mysql_config. Please install or specify.])])
744+
745+# Checks for libraries.
746+AC_CHECK_LIB([pam], [pam_start], [AUTH_PAM_LIBS="$AUTH_PAM_LIBS -lpam"],
747+ AC_MSG_ERROR(
748+ [Unable to find PAM. Please install the PAM development libraries])
749+)
750+AC_CHECK_LIB([mysqlclient], [mysql_init], [DIALOG_LIBS="$DIALOG_LIBS -lmysqlclient"],
751+ AC_MSG_ERROR(
752+ [Unable to find libmysqlclient. Please install the mysql development libraries])
753+)
754+
755+# Replace -I with -isystem for the MySQL header include GCC option to silence
756+# warnings originating from them
757+MYSQL_INCLUDES=`"${MYSQL_CONFIG}" --include | sed 's@^-I@-isystem @'`
758+
759+CPPFLAGS="${CPPFLAGS} ${MYSQL_INCLUDES}"
760+
761+AC_CHECK_HEADERS([mysql/plugin.h mysql/plugin_auth.h], [],
762+ AC_MSG_ERROR(
763+ [Unable to find MySQL development headers. Please install them]))
764+AC_CHECK_HEADERS([pwd.h grp.h], [],
765+ AC_MSG_ERROR(
766+ [Unable to find pwd.h/grp.h headers. Your libc version is not supported]))
767+
768+# Checks for library functions.
769+AC_FUNC_MALLOC
770+AC_CHECK_FUNCS([getpass])
771+AC_CHECK_FUNCS([getpwnam_r getgrgid_r], [],
772+ AC_MSG_ERROR(
773+ [Unable to find getpwnam_r/getgrgid_r functions. Your libc version is not supported]))
774+
775+CFLAGS="-Wall -Wextra ${CFLAGS}"
776+
777+# Get the plugin dir
778+PLUGINDIR=$([$MYSQL_CONFIG --plugindir])
779+AC_SUBST([PLUGINDIR])
780+
781+# Get the revision if bzr is present
782+AS_IF([test "x${BZR}" != x],
783+ [REVISION=`${BZR} revno "$srcdir"`])
784+REVISION=${REVISION:-0}
785+
786+AC_SUBST([REVISION])
787+
788+AC_SUBST([AUTH_PAM_LIBS])
789+AC_SUBST([DIALOG_LIBS])
790+
791+# Output files
792+AC_CONFIG_FILES([Makefile
793+ src/Makefile
794+ build/build-binary.sh
795+ build/percona-pam-plugin.spec])
796+AC_OUTPUT
797
798=== added directory 'Percona-Server/plugin/percona-pam-for-mysql/doc'
799=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/Makefile'
800--- Percona-Server/plugin/percona-pam-for-mysql/doc/Makefile 1970-01-01 00:00:00 +0000
801+++ Percona-Server/plugin/percona-pam-for-mysql/doc/Makefile 2012-05-08 06:39:22 +0000
802@@ -0,0 +1,130 @@
803+# Makefile for Sphinx documentation
804+#
805+
806+# You can set these variables from the command line.
807+SPHINXOPTS =
808+SPHINXBUILD = sphinx-build
809+PAPER =
810+BUILDDIR = build
811+
812+# Internal variables.
813+PAPEROPT_a4 = -D latex_paper_size=a4
814+PAPEROPT_letter = -D latex_paper_size=letter
815+ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
816+
817+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
818+
819+help:
820+ @echo "Please use \`make <target>' where <target> is one of"
821+ @echo " html to make standalone HTML files"
822+ @echo " dirhtml to make HTML files named index.html in directories"
823+ @echo " singlehtml to make a single large HTML file"
824+ @echo " pickle to make pickle files"
825+ @echo " json to make JSON files"
826+ @echo " htmlhelp to make HTML files and a HTML help project"
827+ @echo " qthelp to make HTML files and a qthelp project"
828+ @echo " devhelp to make HTML files and a Devhelp project"
829+ @echo " epub to make an epub"
830+ @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
831+ @echo " latexpdf to make LaTeX files and run them through pdflatex"
832+ @echo " text to make text files"
833+ @echo " man to make manual pages"
834+ @echo " changes to make an overview of all changed/added/deprecated items"
835+ @echo " linkcheck to check all external links for integrity"
836+ @echo " doctest to run all doctests embedded in the documentation (if enabled)"
837+
838+clean:
839+ -rm -rf $(BUILDDIR)/*
840+
841+html:
842+ $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
843+ @echo
844+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
845+
846+dirhtml:
847+ $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
848+ @echo
849+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
850+
851+singlehtml:
852+ $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
853+ @echo
854+ @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
855+
856+pickle:
857+ $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
858+ @echo
859+ @echo "Build finished; now you can process the pickle files."
860+
861+json:
862+ $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
863+ @echo
864+ @echo "Build finished; now you can process the JSON files."
865+
866+htmlhelp:
867+ $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
868+ @echo
869+ @echo "Build finished; now you can run HTML Help Workshop with the" \
870+ ".hhp project file in $(BUILDDIR)/htmlhelp."
871+
872+qthelp:
873+ $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
874+ @echo
875+ @echo "Build finished; now you can run "qcollectiongenerator" with the" \
876+ ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
877+ @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/PerconaXtraBackup.qhcp"
878+ @echo "To view the help file:"
879+ @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/PerconaXtraBackup.qhc"
880+
881+devhelp:
882+ $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
883+ @echo
884+ @echo "Build finished."
885+ @echo "To view the help file:"
886+ @echo "# mkdir -p $$HOME/.local/share/devhelp/PerconaXtraBackup"
887+ @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/PerconaXtraBackup"
888+ @echo "# devhelp"
889+
890+epub:
891+ $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
892+ @echo
893+ @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
894+
895+latex:
896+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
897+ @echo
898+ @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
899+ @echo "Run \`make' in that directory to run these through (pdf)latex" \
900+ "(use \`make latexpdf' here to do that automatically)."
901+
902+latexpdf:
903+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
904+ @echo "Running LaTeX files through pdflatex..."
905+ make -C $(BUILDDIR)/latex all-pdf
906+ @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
907+
908+text:
909+ $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
910+ @echo
911+ @echo "Build finished. The text files are in $(BUILDDIR)/text."
912+
913+man:
914+ $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
915+ @echo
916+ @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
917+
918+changes:
919+ $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
920+ @echo
921+ @echo "The overview file is in $(BUILDDIR)/changes."
922+
923+linkcheck:
924+ $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
925+ @echo
926+ @echo "Link check complete; look for any errors in the above output " \
927+ "or in $(BUILDDIR)/linkcheck/output.txt."
928+
929+doctest:
930+ $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
931+ @echo "Testing of doctests in the sources finished, look at the " \
932+ "results in $(BUILDDIR)/doctest/output.txt."
933
934=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/make.bat'
935--- Percona-Server/plugin/percona-pam-for-mysql/doc/make.bat 1970-01-01 00:00:00 +0000
936+++ Percona-Server/plugin/percona-pam-for-mysql/doc/make.bat 2012-05-08 06:39:22 +0000
937@@ -0,0 +1,170 @@
938+@ECHO OFF
939+
940+REM Command file for Sphinx documentation
941+
942+if "%SPHINXBUILD%" == "" (
943+ set SPHINXBUILD=sphinx-build
944+)
945+set BUILDDIR=build
946+set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source
947+if NOT "%PAPER%" == "" (
948+ set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
949+)
950+
951+if "%1" == "" goto help
952+
953+if "%1" == "help" (
954+ :help
955+ echo.Please use `make ^<target^>` where ^<target^> is one of
956+ echo. html to make standalone HTML files
957+ echo. dirhtml to make HTML files named index.html in directories
958+ echo. singlehtml to make a single large HTML file
959+ echo. pickle to make pickle files
960+ echo. json to make JSON files
961+ echo. htmlhelp to make HTML files and a HTML help project
962+ echo. qthelp to make HTML files and a qthelp project
963+ echo. devhelp to make HTML files and a Devhelp project
964+ echo. epub to make an epub
965+ echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
966+ echo. text to make text files
967+ echo. man to make manual pages
968+ echo. changes to make an overview over all changed/added/deprecated items
969+ echo. linkcheck to check all external links for integrity
970+ echo. doctest to run all doctests embedded in the documentation if enabled
971+ goto end
972+)
973+
974+if "%1" == "clean" (
975+ for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
976+ del /q /s %BUILDDIR%\*
977+ goto end
978+)
979+
980+if "%1" == "html" (
981+ %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
982+ if errorlevel 1 exit /b 1
983+ echo.
984+ echo.Build finished. The HTML pages are in %BUILDDIR%/html.
985+ goto end
986+)
987+
988+if "%1" == "dirhtml" (
989+ %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
990+ if errorlevel 1 exit /b 1
991+ echo.
992+ echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
993+ goto end
994+)
995+
996+if "%1" == "singlehtml" (
997+ %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
998+ if errorlevel 1 exit /b 1
999+ echo.
1000+ echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
1001+ goto end
1002+)
1003+
1004+if "%1" == "pickle" (
1005+ %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
1006+ if errorlevel 1 exit /b 1
1007+ echo.
1008+ echo.Build finished; now you can process the pickle files.
1009+ goto end
1010+)
1011+
1012+if "%1" == "json" (
1013+ %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
1014+ if errorlevel 1 exit /b 1
1015+ echo.
1016+ echo.Build finished; now you can process the JSON files.
1017+ goto end
1018+)
1019+
1020+if "%1" == "htmlhelp" (
1021+ %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
1022+ if errorlevel 1 exit /b 1
1023+ echo.
1024+ echo.Build finished; now you can run HTML Help Workshop with the ^
1025+.hhp project file in %BUILDDIR%/htmlhelp.
1026+ goto end
1027+)
1028+
1029+if "%1" == "qthelp" (
1030+ %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
1031+ if errorlevel 1 exit /b 1
1032+ echo.
1033+ echo.Build finished; now you can run "qcollectiongenerator" with the ^
1034+.qhcp project file in %BUILDDIR%/qthelp, like this:
1035+ echo.^> qcollectiongenerator %BUILDDIR%\qthelp\PerconaXtraBackup.qhcp
1036+ echo.To view the help file:
1037+ echo.^> assistant -collectionFile %BUILDDIR%\qthelp\PerconaXtraBackup.ghc
1038+ goto end
1039+)
1040+
1041+if "%1" == "devhelp" (
1042+ %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
1043+ if errorlevel 1 exit /b 1
1044+ echo.
1045+ echo.Build finished.
1046+ goto end
1047+)
1048+
1049+if "%1" == "epub" (
1050+ %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
1051+ if errorlevel 1 exit /b 1
1052+ echo.
1053+ echo.Build finished. The epub file is in %BUILDDIR%/epub.
1054+ goto end
1055+)
1056+
1057+if "%1" == "latex" (
1058+ %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
1059+ if errorlevel 1 exit /b 1
1060+ echo.
1061+ echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
1062+ goto end
1063+)
1064+
1065+if "%1" == "text" (
1066+ %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
1067+ if errorlevel 1 exit /b 1
1068+ echo.
1069+ echo.Build finished. The text files are in %BUILDDIR%/text.
1070+ goto end
1071+)
1072+
1073+if "%1" == "man" (
1074+ %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
1075+ if errorlevel 1 exit /b 1
1076+ echo.
1077+ echo.Build finished. The manual pages are in %BUILDDIR%/man.
1078+ goto end
1079+)
1080+
1081+if "%1" == "changes" (
1082+ %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
1083+ if errorlevel 1 exit /b 1
1084+ echo.
1085+ echo.The overview file is in %BUILDDIR%/changes.
1086+ goto end
1087+)
1088+
1089+if "%1" == "linkcheck" (
1090+ %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
1091+ if errorlevel 1 exit /b 1
1092+ echo.
1093+ echo.Link check complete; look for any errors in the above output ^
1094+or in %BUILDDIR%/linkcheck/output.txt.
1095+ goto end
1096+)
1097+
1098+if "%1" == "doctest" (
1099+ %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
1100+ if errorlevel 1 exit /b 1
1101+ echo.
1102+ echo.Testing of doctests in the sources finished, look at the ^
1103+results in %BUILDDIR%/doctest/output.txt.
1104+ goto end
1105+)
1106+
1107+:end
1108
1109=== added directory 'Percona-Server/plugin/percona-pam-for-mysql/doc/source'
1110=== added directory 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/_static'
1111=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/_static/percona-pam-plugin-logo.jpg'
1112Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/_static/percona-pam-plugin-logo.jpg 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/_static/percona-pam-plugin-logo.jpg 2012-05-08 06:39:22 +0000 differ
1113=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/_static/percona_favicon.ico'
1114Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/_static/percona_favicon.ico 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/_static/percona_favicon.ico 2012-05-08 06:39:22 +0000 differ
1115=== added directory 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/_templates'
1116=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/conf.py'
1117--- Percona-Server/plugin/percona-pam-for-mysql/doc/source/conf.py 1970-01-01 00:00:00 +0000
1118+++ Percona-Server/plugin/percona-pam-for-mysql/doc/source/conf.py 2012-05-08 06:39:22 +0000
1119@@ -0,0 +1,245 @@
1120+# -*- coding: utf-8 -*-
1121+#
1122+# Percona PAM authentication plugin documentation build configuration file, created by
1123+# sphinx-quickstart on Mon Jun 27 22:27:15 2011.
1124+#
1125+# This file is execfile()d with the current directory set to its containing dir.
1126+#
1127+# Note that not all possible configuration values are present in this
1128+# autogenerated file.
1129+#
1130+# All configuration values have a default; values that are commented out
1131+# serve to show the default.
1132+
1133+import sys, os
1134+
1135+# If extensions (or modules to document with autodoc) are in another directory,
1136+# add these directories to sys.path here. If the directory is relative to the
1137+# documentation root, use os.path.abspath to make it absolute, like shown here.
1138+#sys.path.insert(0, os.path.abspath('.'))
1139+
1140+# -- General configuration -----------------------------------------------------
1141+
1142+# If your documentation needs a minimal Sphinx version, state it here.
1143+#needs_sphinx = '1.0'
1144+
1145+# Add any Sphinx extension module names here, as strings. They can be extensions
1146+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
1147+
1148+extensions = ['sphinx.ext.intersphinx', 'sphinx.ext.todo',
1149+ 'sphinx.ext.coverage', 'sphinx.ext.ifconfig',
1150+ 'sphinx.ext.extlinks']
1151+
1152+# Add any paths that contain templates here, relative to this directory.
1153+templates_path = ['_templates']
1154+
1155+# The suffix of source filenames.
1156+source_suffix = '.rst'
1157+
1158+# The encoding of source files.
1159+#source_encoding = 'utf-8-sig'
1160+
1161+# The master toctree document.
1162+master_doc = 'index'
1163+
1164+# General information about the project.
1165+project = u'Percona PAM authentication plugin for MySQL'
1166+copyright = u'2012, Percona Inc'
1167+
1168+# The version info for the project you're documenting, acts as replacement for
1169+# |version| and |release|, also used in various other places throughout the
1170+# built documents.
1171+#
1172+# The short X.Y version.
1173+version = '0.1'
1174+# The full version, including alpha/beta/rc tags.
1175+release = '0.1'
1176+
1177+# The language for content autogenerated by Sphinx. Refer to documentation
1178+# for a list of supported languages.
1179+#language = None
1180+
1181+# There are two options for replacing |today|: either, you set today to some
1182+# non-false value, then it is used:
1183+#today = ''
1184+# Else, today_fmt is used as the format for a strftime call.
1185+#today_fmt = '%B %d, %Y'
1186+
1187+# List of patterns, relative to source directory, that match files and
1188+# directories to ignore when looking for source files.
1189+exclude_patterns = []
1190+
1191+# The reST default role (used for this markup: `text`) to use for all documents.
1192+#default_role = None
1193+
1194+# If true, '()' will be appended to :func: etc. cross-reference text.
1195+#add_function_parentheses = True
1196+
1197+# If true, the current module name will be prepended to all description
1198+# unit titles (such as .. function::).
1199+#add_module_names = True
1200+
1201+# If true, sectionauthor and moduleauthor directives will be shown in the
1202+# output. They are ignored by default.
1203+#show_authors = False
1204+
1205+# The name of the Pygments (syntax highlighting) style to use.
1206+pygments_style = 'sphinx'
1207+
1208+
1209+rst_prolog = '''
1210+.. |check| replace:: ``|[[---CHECK---]]|``
1211+
1212+.. |xtrabackup| replace:: :program:`xtrabackup`
1213+
1214+.. |innobackupex| replace:: :program:`innobackupex`
1215+
1216+.. |XtraBackup| replace:: *XtraBackup*
1217+
1218+.. |Percona Server| replace:: *Percona Server*
1219+
1220+.. |Percona| replace:: *Percona*
1221+
1222+.. |MySQL| replace:: *MySQL*
1223+
1224+.. |Drizzle| replace:: *Drizzle*
1225+
1226+.. |MariaDB| replace:: *MariaDB*
1227+
1228+
1229+'''
1230+
1231+extlinks = {'bug': ('https://bugs.launchpad.net/percona-pam-for-mysql/+bug/%s',
1232+ '#')}
1233+
1234+# A list of ignored prefixes for module index sorting.
1235+#modindex_common_prefix = []
1236+
1237+
1238+# -- Options for HTML output ---------------------------------------------------
1239+
1240+# The theme to use for HTML and HTML Help pages. See the documentation for
1241+# a list of builtin themes.
1242+html_theme = 'percona-theme'
1243+
1244+# Theme options are theme-specific and customize the look and feel of a theme
1245+# further. For a list of options available for each theme, see the
1246+# documentation.
1247+#html_theme_options = {}
1248+
1249+# Add any paths that contain custom themes here, relative to this directory.
1250+html_theme_path = ['.', './percona-theme']
1251+
1252+# The name for this set of Sphinx documents. If None, it defaults to
1253+# "<project> v<release> documentation".
1254+html_title = 'Percona PAM authenticatino plugin for MySQL Documentation'
1255+
1256+# A shorter title for the navigation bar. Default is the same as html_title.
1257+html_short_title = 'PAM Plugin Docs'
1258+
1259+# The name of an image file (relative to this directory) to place at the top
1260+# of the sidebar.
1261+html_logo = 'percona-pam-plugin-logo.png'
1262+
1263+# The name of an image file (within the static path) to use as favicon of the
1264+# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
1265+# pixels large.
1266+html_favicon = 'percona_favicon.ico'
1267+
1268+# Add any paths that contain custom static files (such as style sheets) here,
1269+# relative to this directory. They are copied after the builtin static files,
1270+# so a file named "default.css" will overwrite the builtin "default.css".
1271+html_static_path = ['_static']
1272+
1273+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
1274+# using the given strftime format.
1275+#html_last_updated_fmt = '%b %d, %Y'
1276+
1277+# If true, SmartyPants will be used to convert quotes and dashes to
1278+# typographically correct entities.
1279+#html_use_smartypants = True
1280+
1281+# Custom sidebar templates, maps document names to template names.
1282+#html_sidebars = {}
1283+
1284+# Additional templates that should be rendered to pages, maps page names to
1285+# template names.
1286+#html_additional_pages = {}
1287+
1288+# If false, no module index is generated.
1289+#html_domain_indices = True
1290+
1291+# If false, no index is generated.
1292+#html_use_index = True
1293+
1294+# If true, the index is split into individual pages for each letter.
1295+#html_split_index = False
1296+
1297+# If true, links to the reST sources are added to the pages.
1298+#html_show_sourcelink = True
1299+
1300+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
1301+#html_show_sphinx = True
1302+
1303+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
1304+#html_show_copyright = True
1305+
1306+# If true, an OpenSearch description file will be output, and all pages will
1307+# contain a <link> tag referring to it. The value of this option must be the
1308+# base URL from which the finished HTML is served.
1309+#html_use_opensearch = ''
1310+
1311+# This is the file name suffix for HTML files (e.g. ".xhtml").
1312+#html_file_suffix = None
1313+
1314+# Output file base name for HTML help builder.
1315+htmlhelp_basename = 'PerconaPAMForMySQL'
1316+
1317+
1318+# -- Options for LaTeX output --------------------------------------------------
1319+
1320+# The paper size ('letter' or 'a4').
1321+#latex_paper_size = 'letter'
1322+
1323+# The font size ('10pt', '11pt' or '12pt').
1324+#latex_font_size = '10pt'
1325+
1326+# Grouping the document tree into LaTeX files. List of tuples
1327+# (source start file, target name, title, author, documentclass [howto/manual]).
1328+latex_documents = [
1329+ ('index', 'PerconaPAMForMySQL.tex', u'Percona PAM Authentication Plugin for MySQL Documentation',
1330+ u'Percona Inc', 'manual'),
1331+]
1332+
1333+# The name of an image file (relative to this directory) to place at the top of
1334+# the title page.
1335+#latex_logo = None
1336+
1337+# For "manual" documents, if this is true, then toplevel headings are parts,
1338+# not chapters.
1339+#latex_use_parts = False
1340+
1341+# If true, show page references after internal links.
1342+#latex_show_pagerefs = False
1343+
1344+# If true, show URL addresses after external links.
1345+#latex_show_urls = False
1346+
1347+# Additional stuff for the LaTeX preamble.
1348+#latex_preamble = ''
1349+
1350+# Documents to append as an appendix to all manuals.
1351+#latex_appendices = []
1352+
1353+# If false, no module index is generated.
1354+#latex_domain_indices = True
1355+
1356+
1357+# -- Options for manual page output --------------------------------------------
1358+
1359+# One entry per manual page. List of tuples
1360+# (source start file, name, description, authors, manual section).
1361+man_pages = [
1362+# ('index', 'perconapamplugin', u'Percona PAM Authentication Plugin for MySQL Documentation',
1363+# [u'Percona Inc'], 1)
1364+]
1365
1366=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/faq.rst'
1367--- Percona-Server/plugin/percona-pam-for-mysql/doc/source/faq.rst 1970-01-01 00:00:00 +0000
1368+++ Percona-Server/plugin/percona-pam-for-mysql/doc/source/faq.rst 2012-05-08 06:39:22 +0000
1369@@ -0,0 +1,51 @@
1370+============================
1371+ Frequently Asked Questions
1372+============================
1373+
1374+Is there a Windows version?
1375+===========================
1376+
1377+No, Windows does not support PAM, so there will not be a Windows version.
1378+
1379+Can I use it with MySQL?
1380+========================
1381+
1382+Yes.
1383+
1384+Can I use it with Percona Server?
1385+=================================
1386+
1387+Yes.
1388+
1389+
1390+Is it Free and Open Source Software?
1391+====================================
1392+
1393+Yes.
1394+
1395+
1396+Can I use the PAM plugin to authenticate against /etc/shadow?
1397+=============================================================
1398+
1399+Yes, you need to add the mysql user to the shadow group. Because PAM libraries, such as 'pam_unix.so', need to access /etc/shadow.
1400+
1401+For example this is how you can do it in *Ubuntu*: ::
1402+
1403+ root@lucid64:/var/lib/mysql# getent group shadow
1404+ shadow:x:42:mysql
1405+
1406+ root@lucid64:/var/lib/mysql# ls -alhs /etc/shadow
1407+ 4.0K -rw-r----- 1 root shadow 912 Dec 21 10:39 /etc/shadow
1408+
1409+After you restart mysqld for changes to take effect, pam_unix authentication will work.
1410+
1411+The other option is to run mysqld as root. This should be used for testing only or as a last resort method.
1412+
1413+
1414+I'm getting the: "ERROR 2059 (HY000): Authentication plugin 'auth_pam' cannot be loaded"
1415+========================================================================================
1416+
1417+This means that the default client :option:`plugin-dir` setting doesn't work or it isn't set up properly. You'll need to add the location of the plugin folder to your client configuration: ::
1418+
1419+ [client]
1420+ plugin_dir='/usr/lib/mysql/plugin'
1421
1422=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/glossary.rst'
1423--- Percona-Server/plugin/percona-pam-for-mysql/doc/source/glossary.rst 1970-01-01 00:00:00 +0000
1424+++ Percona-Server/plugin/percona-pam-for-mysql/doc/source/glossary.rst 2012-05-08 06:39:22 +0000
1425@@ -0,0 +1,8 @@
1426+==========
1427+ Glossary
1428+==========
1429+
1430+.. glossary::
1431+
1432+ PAM
1433+ Pluggable Authentication Module - allows integrating multiple authentication mechanisms which can be written independently of the underlying authentication scheme that's being used in the application.
1434
1435=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/index.rst'
1436--- Percona-Server/plugin/percona-pam-for-mysql/doc/source/index.rst 1970-01-01 00:00:00 +0000
1437+++ Percona-Server/plugin/percona-pam-for-mysql/doc/source/index.rst 2012-05-08 06:39:22 +0000
1438@@ -0,0 +1,51 @@
1439+============================================================
1440+ Percona PAM authentication plugin For MySQL - Documentation
1441+============================================================
1442+
1443+Percona PAM authentication plugin for MySQL.
1444+
1445+Introduction
1446+============
1447+
1448+.. toctree::
1449+ :maxdepth: 1
1450+ :glob:
1451+
1452+ intro
1453+
1454+Installation
1455+============
1456+
1457+.. toctree::
1458+ :maxdepth: 2
1459+ :glob:
1460+
1461+ installation
1462+
1463+User's Manual
1464+=============
1465+
1466+.. toctree::
1467+ :maxdepth: 2
1468+ :glob:
1469+
1470+ manual
1471+
1472+Miscellaneous
1473+=============
1474+
1475+.. toctree::
1476+ :maxdepth: 1
1477+ :glob:
1478+
1479+ faq
1480+ release-notes
1481+ glossary
1482+
1483+Indices and tables
1484+==================
1485+
1486+* :ref:`genindex`
1487+
1488+* :ref:`search`
1489+
1490
1491=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/installation.rst'
1492--- Percona-Server/plugin/percona-pam-for-mysql/doc/source/installation.rst 1970-01-01 00:00:00 +0000
1493+++ Percona-Server/plugin/percona-pam-for-mysql/doc/source/installation.rst 2012-05-08 06:39:22 +0000
1494@@ -0,0 +1,50 @@
1495+=======================================================
1496+ Installing Percona PAM Authentication Plugin for MySQL
1497+=======================================================
1498+
1499+.. toctree::
1500+ :hidden:
1501+
1502+Compiling from Source
1503+=====================
1504+
1505+You will need both the PAM headers and the MySQL 5.5 headers and corresponding `mysql_config` binary available on your system.
1506+
1507+If you are not using one of the pre-built binary packages, you will need to compile the plugin from source. You can either use a source tarball or the source repository.
1508+
1509+For getting a copy of the latest development bzr tree: ::
1510+
1511+ $ bzr branch lp:percona-pam-for-mysql
1512+
1513+If you are building from bzr, you will need to generate the configure script: ::
1514+
1515+ $ ./bootstrap
1516+
1517+You do not need to run `bootstrap` if you are using a source tarball.
1518+
1519+You then need to build the plugin: ::
1520+
1521+ $ ./configure
1522+ $ make
1523+
1524+To install, you can simply run (as root or using sudo or similar): ::
1525+
1526+ $ make install
1527+
1528+Installing server-side plugin
1529+=============================
1530+
1531+The shared library that holds the plugin, auth_pam.so, needs to be stored in the plugindir directory of mysql. You can get this value via the command: ::
1532+
1533+ $ mysql_config --plugindir
1534+
1535+Make sure that after installed, the library has got the appropiate permissions (file execution is required).
1536+
1537+Most packages should do this for you, so this is likely only required with the binary tarballs.
1538+
1539+In order to load the plugin into the working server, issue the following command: ::
1540+
1541+ mysql> INSTALL PLUGIN auth_pam SONAME 'auth_pam.so';
1542+
1543+
1544+You can now create a PAM configuration for the MySQL server and create users that are authenticated by PAM.
1545
1546=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/intro.rst'
1547--- Percona-Server/plugin/percona-pam-for-mysql/doc/source/intro.rst 1970-01-01 00:00:00 +0000
1548+++ Percona-Server/plugin/percona-pam-for-mysql/doc/source/intro.rst 2012-05-08 06:39:22 +0000
1549@@ -0,0 +1,23 @@
1550+==================================================
1551+ About Percona PAM Authentication Plugin for MySQL
1552+==================================================
1553+
1554+Percona PAM Authentication Plugin is a free and Open Source implementation of the MySQL's authentication plugin. This plugin acts as a mediator between the MySQL server, the MySQL client, and the PAM stack. The server plugin requests authentication from the PAM stack, forwards any requests and messages from the PAM stack over the wire to the client (in cleartext) and reads back any replies for the PAM stack.
1555+
1556+ PAM plugin uses dialog as its client side plugin. Dialog plugin can be loaded to any client application that uses libmysqlclient library.
1557+
1558+Here are some of the benefits that Percona dialog plugin offers over the default one:
1559+
1560+ * It correctly recognizes whether PAM wants input to be echoed or not, while the default one always echoes the input on the user's console.
1561+ * It can use the password which is passed to |MySQL| client via "-p" parameter.
1562+ * Dialog client `installation bug <http://bugs.mysql.com/bug.php?id=60745>`_ has been fixed.
1563+ * This plugin works on |MySQL| and |Percona Server|.
1564+
1565+Percona offers two versions of this plugin:
1566+
1567+ * Full PAM plugin called *auth_pam*. This plugin uses *dialog.so*. It fully supports the PAM protocol with arbitrary communication between client and server.
1568+ * Oracle-compatible PAM called *auth_pam_compat*. This plugin uses *mysql_clear_password* which is a part of Oracle MySQL client. It also has some limitations, such as, it supports only one password input. You must use "-p" option in order to pass the password to auth_pam_compat.
1569+
1570+These two versions of plugins are physically different. To choose which one you want used, you must use *IDENTIFIED WITH 'auth_pam'* for auth_pam, and *IDENTIFIED WITH 'auth_pam_compat'* for auth_pam_compat.
1571+
1572+
1573
1574=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/manual.rst'
1575--- Percona-Server/plugin/percona-pam-for-mysql/doc/source/manual.rst 1970-01-01 00:00:00 +0000
1576+++ Percona-Server/plugin/percona-pam-for-mysql/doc/source/manual.rst 2012-05-08 06:39:22 +0000
1577@@ -0,0 +1,38 @@
1578+.. _user-manual:
1579+
1580+==========================================================
1581+ *Percona PAM authentication plugin for MySQL* User Manual
1582+==========================================================
1583+
1584+.. toctree::
1585+ :maxdepth: 1
1586+ :hidden:
1587+
1588+Configuring PAM for MySQL
1589+=========================
1590+
1591+You will need to configure PAM on your system for how it should authenticate for MySQL. A simple setup can be to use the standard UNIX authentication method.
1592+
1593+*NOTE:* Using pam_unix means the MySQL Server needs to read the `/etc/shadow` file, which usually means it has to be run as `root` - usually not a recommended configuration.
1594+
1595+A sample `/etc/pam.d/mysqld` file: ::
1596+
1597+ auth required pam_unix.so
1598+ account required pam_unix.so
1599+
1600+For added information in the system log, you can expand it to be: ::
1601+
1602+ auth required pam_warn.so
1603+ auth required pam_unix.so audit
1604+ account required pam_unix.so audit
1605+
1606+
1607+Creating A User
1608+===============
1609+
1610+You will need to execute `CREATE USER` with specifying the PAM plugin. For example: ::
1611+
1612+ CREATE USER 'username'@'host' IDENTIFIED WITH auth_pam;
1613+
1614+This creates a user `username` that can connect from `host` and will be authenticated using the PAM plugin. If you are using the `pam_unix` method in PAM (or similar) you will need to have an account for `username` existing on the system.
1615+
1616
1617=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-pam-plugin-logo.png'
1618Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-pam-plugin-logo.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-pam-plugin-logo.png 2012-05-08 06:39:22 +0000 differ
1619=== added directory 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme'
1620=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/layout.html'
1621--- Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/layout.html 1970-01-01 00:00:00 +0000
1622+++ Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/layout.html 2012-05-08 06:39:22 +0000
1623@@ -0,0 +1,499 @@
1624+{#
1625+ basic/layout.html
1626+ ~~~~~~~~~~~~~~~~~
1627+
1628+ Master layout template for Sphinx themes.
1629+
1630+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
1631+ :license: BSD, see LICENSE for details.
1632+#}
1633+{%- block doctype -%}
1634+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
1635+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
1636+{%- endblock %}
1637+{%- set reldelim1 = reldelim1 is not defined and ' &raquo;' or reldelim1 %}
1638+{%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %}
1639+{%- set render_sidebar = (not embedded) and (not theme_nosidebar|tobool) and
1640+ (sidebars != []) %}
1641+{%- set url_root = pathto('', 1) %}
1642+{# XXX necessary? #}
1643+{%- if url_root == '#' %}{% set url_root = '' %}{% endif %}
1644+{%- if not embedded and docstitle %}
1645+ {%- set titlesuffix = " &mdash; "|safe + docstitle|e %}
1646+{%- else %}
1647+ {%- set titlesuffix = "" %}
1648+{%- endif %}
1649+
1650+{%- macro relbar() %}
1651+ <div class="related">
1652+ <h3>{{ _('Navigation') }}</h3>
1653+ <ul>
1654+ {%- for rellink in rellinks %}
1655+ <li class="right" {% if loop.first %}style="margin-right: 10px"{% endif %}>
1656+ <a href="{{ pathto(rellink[0]) }}" title="{{ rellink[1]|striptags|e }}"
1657+ {{ accesskey(rellink[2]) }}>{{ rellink[3] }}</a>
1658+ {%- if not loop.first %}{{ reldelim2 }}{% endif %}</li>
1659+ {%- endfor %}
1660+ {%- block rootrellink %}
1661+ <li><a href="{{ pathto(master_doc) }}">{{ shorttitle|e }}</a>{{ reldelim1 }}</li>
1662+ {%- endblock %}
1663+ {%- for parent in parents %}
1664+ <li><a href="{{ parent.link|e }}" {% if loop.last %}{{ accesskey("U") }}{% endif %}>{{ parent.title }}</a>{{ reldelim1 }}</li>
1665+ {%- endfor %}
1666+ {%- block relbaritems %} {% endblock %}
1667+ </ul>
1668+ </div>
1669+{%- endmacro %}
1670+
1671+{%- macro sidebar() %}
1672+ {%- if render_sidebar %}
1673+ <div class="sphinxsidebar">
1674+ <div class="sphinxsidebarwrapper">
1675+ {%- block sidebarlogo %}
1676+ {%- if logo %}
1677+ <p class="logo"><a href="{{ pathto(master_doc) }}">
1678+ <img class="logo" src="{{ pathto('_static/' + logo, 1) }}" alt="Logo"/>
1679+ </a></p>
1680+ {%- endif %}
1681+
1682+<div class="noborder" id="sidenavi">
1683+
1684+ <div class="sidebanner" id="sidebanner">
1685+ <div class="header"><a href="/contact/sales">Call Us</a></div>
1686+ <div class="numbers">
1687+ <div style="padding-bottom: 4px">
1688+ +1-888-316-9775 (USA - Sales)<br>
1689+ +1-208-473-2904 (USA - Sales)
1690+ </div>
1691+ <div>
1692+ +44-208-133-0309 (UK - Sales)
1693+ </div>
1694+ <div>
1695+ +1-877-862-4316 (Emergency)
1696+ </div>
1697+ </div>
1698+ </div>
1699+ <div id="sidefloater"></div>
1700+</div>
1701+
1702+ {%- endblock %}
1703+ {%- if sidebars != None %}
1704+ {#- new style sidebar: explicitly include/exclude templates #}
1705+ {%- for sidebartemplate in sidebars %}
1706+ {%- include sidebartemplate %}
1707+ {%- endfor %}
1708+ {%- else %}
1709+ {#- old style sidebars: using blocks -- should be deprecated #}
1710+ {%- block serverseries %}
1711+ {%- endblock %}
1712+ {%- block sidebartoc %}
1713+ {%- include "localtoc.html" %}
1714+ {%- endblock %}
1715+ {%- block sidebarrel %}
1716+ {%- include "relations.html" %}
1717+ {%- endblock %}
1718+ {%- block sidebarsourcelink %}
1719+ {%- include "sourcelink.html" %}
1720+ {%- endblock %}
1721+ {%- if customsidebar %}
1722+ {%- include customsidebar %}
1723+ {%- endif %}
1724+ {%- block sidebarsearch %}
1725+ {%- include "searchbox.html" %}
1726+ {%- endblock %}
1727+ {%- endif %}
1728+
1729+ </div>
1730+ </div>
1731+ {%- endif %}
1732+{%- endmacro %}
1733+
1734+{%- macro script() %}
1735+ <script type="text/javascript">
1736+ var DOCUMENTATION_OPTIONS = {
1737+ URL_ROOT: '{{ url_root }}',
1738+ VERSION: '{{ release|e }}',
1739+ COLLAPSE_INDEX: false,
1740+ FILE_SUFFIX: '{{ '' if no_search_suffix else file_suffix }}',
1741+ HAS_SOURCE: {{ has_source|lower }}
1742+ };
1743+ </script>
1744+ {%- for scriptfile in script_files %}
1745+ <script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
1746+ {%- endfor %}
1747+{%- endmacro %}
1748+
1749+{%- macro css() %}
1750+ <link rel="stylesheet" href="{{ pathto('_static/percona.com.css', 1) }}" type="text/css" />
1751+ <link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
1752+ <link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" />
1753+ {%- for cssfile in css_files %}
1754+ <link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
1755+ {%- endfor %}
1756+{%- endmacro %}
1757+
1758+<html xmlns="http://www.w3.org/1999/xhtml">
1759+ <head>
1760+ <meta http-equiv="Content-Type" content="text/html; charset={{ encoding }}" />
1761+ {{ metatags }}
1762+ {%- block htmltitle %}
1763+ <title>{{ title|striptags|e }}{{ titlesuffix }}</title>
1764+ {%- endblock %}
1765+
1766+ {{ css() }}
1767+ {%- if not embedded %}
1768+ {{ script() }}
1769+ {%- if use_opensearch %}
1770+ <link rel="search" type="application/opensearchdescription+xml"
1771+ title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}"
1772+ href="{{ pathto('_static/opensearch.xml', 1) }}"/>
1773+ {%- endif %}
1774+
1775+<script src="{{ pathto('_static/percona.com.js', 1)}}" type="text/javascript"></script>
1776+
1777+ {%- if favicon %}
1778+ <link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/>
1779+ {%- endif %}
1780+ {%- endif %}
1781+{%- block linktags %}
1782+ {%- if hasdoc('about') %}
1783+ <link rel="author" title="{{ _('About these documents') }}" href="{{ pathto('about') }}" />
1784+ {%- endif %}
1785+ {%- if hasdoc('genindex') %}
1786+ <link rel="index" title="{{ _('Index') }}" href="{{ pathto('genindex') }}" />
1787+ {%- endif %}
1788+ {%- if hasdoc('search') %}
1789+ <link rel="search" title="{{ _('Search') }}" href="{{ pathto('search') }}" />
1790+ {%- endif %}
1791+ {%- if hasdoc('copyright') %}
1792+ <link rel="copyright" title="{{ _('Copyright') }}" href="{{ pathto('copyright') }}" />
1793+ {%- endif %}
1794+ <link rel="top" title="{{ docstitle|e }}" href="{{ pathto('index') }}" />
1795+ {%- if parents %}
1796+ <link rel="up" title="{{ parents[-1].title|striptags|e }}" href="{{ parents[-1].link|e }}" />
1797+ {%- endif %}
1798+ {%- if next %}
1799+ <link rel="next" title="{{ next.title|striptags|e }}" href="{{ next.link|e }}" />
1800+ {%- endif %}
1801+ {%- if prev %}
1802+ <link rel="prev" title="{{ prev.title|striptags|e }}" href="{{ prev.link|e }}" />
1803+ {%- endif %}
1804+{%- endblock %}
1805+{%- block extrahead %} {% endblock %}
1806+ </head>
1807+ <body>
1808+
1809+{%- block header %}
1810+
1811+ <!-- <div id="stickywrapper"> -->
1812+ <!-- <div id="stickycontent"> -->
1813+ <div id="header"><div class="header">
1814+ <div class="logo"><a href="http://www.percona.com/" onfocus="this.blur()"><img src="http://s3.percona.com/ui-logo.png" alt="Percona Performance Consulting Experts" width="240" height="55" /></a></div>
1815+ <div class="right">
1816+ <div class="searchlink"><a onmouseover="SEARCH.Open()"><img id="searchlink-anchor" src="http://s2.percona.com/ui-search.png" alt="" /></a></div>
1817+ <span class="inv"><![CDATA[<noindex>]]></span>
1818+ <div class="navicontainer"><div class="navi">
1819+ <span id="navilink-span-about-us" ><a id="navilink-a-about-us" href="http://www.percona.com/about-us/">About Us</a></span><span id="navilink-span-mysql-consulting" ><a id="navilink-a-mysql-consulting" href="http://www.percona.com/mysql-consulting/">Consulting</a></span><span id="navilink-span-support" ><a id="navilink-a-support" href="http://www.percona.com/mysql-support/">Support</a></span><span id="navilink-span-training" ><a id="navilink-a-training" href="http://www.percona.com/training/">Training</a></span><span id="navilink-span-development" ><a id="navilink-a-development" href="http://www.percona.com/development/">Development</a></span><span id="navilink-span-software" class="selected"><a class="selected" id="navilink-a-software" href="http://www.percona.com/software/">Software</a></span><span id="navilink-span-events" ><a id="navilink-a-events" href="http://www.percona.com/live/">Events</a></span><span id="navilink-span-contact" ><a id="navilink-a-contact" href="http://www.percona.com/contact/">Contact Us</a></span> </div></div>
1820+
1821+ <span class="inv"><![CDATA[</noindex>]]></span>
1822+ <span class="inv"><![CDATA[</noindex>]]></span>
1823+ </div>
1824+ </div></div>
1825+ <div id="stripe"></div>
1826+
1827+{% endblock %}
1828+
1829+ <!-- <div id="stripe"></div> -->
1830+
1831+{%- block content %}
1832+
1833+
1834+
1835+ {%- block sidebar1 %} {# possible location for sidebar #} {% endblock %}
1836+
1837+ <div class="document">
1838+
1839+
1840+
1841+ {%- block document %}
1842+ <div class="documentwrapper">
1843+ {%- if render_sidebar %}
1844+ <div class="bodywrapper">
1845+ {%- endif %}
1846+
1847+ {%- block relbar1 %}{{ relbar() }}{% endblock %}
1848+
1849+ <div class="body">
1850+ {% block body %} {% endblock %}
1851+ </div>
1852+
1853+ {%- block relbar2 %}{{ relbar() }}
1854+
1855+ {%- if render_sidebar %}
1856+ </div>
1857+ {%- endif %}
1858+
1859+
1860+
1861+ </div>
1862+
1863+ {%- endblock %}
1864+
1865+ {%- block sidebar2 %}{{ sidebar() }}{% endblock %}
1866+
1867+ <div class="clearer"></div>
1868+
1869+ {%- if last_updated %}
1870+ {% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
1871+ {%- endif %}
1872+
1873+ <div class="license">
1874+
1875+ {%- if show_copyright %}
1876+ {%- if hasdoc('copyright') %}
1877+ {% trans path=pathto('copyright'), copyright=copyright|e %}&copy; <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
1878+ {%- else %}
1879+ {% trans copyright=copyright|e %}&copy; Copyright {{ copyright }}.{% endtrans %}
1880+ {%- endif %}
1881+ {%- endif %}
1882+
1883+ <br />
1884+ Except where otherwise noted, this documentation is licensed under the following license:
1885+ <br />
1886+ <a class="urlextern" rel="license" href="http://creativecommons.org/licenses/by-sa/2.0/">
1887+ CC Attribution-ShareAlike 2.0 Generic</a><br />
1888+
1889+ {%- if show_sphinx %}
1890+ {% trans sphinx_version=sphinx_version|e %}Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> {{ sphinx_version }}.{% endtrans %}
1891+ {%- endif %}
1892+
1893+ </div>
1894+
1895+ </div>
1896+ {%- endblock %}
1897+
1898+ {% endblock %}
1899+
1900+{%- block footer %}
1901+
1902+ <div class="file-bugs">
1903+ This documentation is developed in Launchpad as part of the <a href="https://code.launchpad.net/percona-toolkit">Percona Toolkit source code</a>.<br/>
1904+ If you spotted innacuracies, errors, don't understood it or you think something is missing or should be improved, please <a href="https://bugs.launchpad.net/percona-toolkit/+filebug?field.tags=doc&amp;field.comment=[In:Percona Toolkit Documentation]&amp;?field.tags=doc&amp;field.title=[DOC] ">file a bug</a>.
1905+
1906+ </div>
1907+
1908+ <div id="support-ribbon" class="vertical" style="z-index: 1;">
1909+ <div id="support-suboptions">
1910+ <ul>
1911+ <li><a title="Contact Me" href="http://form.percona.com/ContactMe.html" style="background: url('http://s2.percona.com/buttons/btn_contact-us.png?1');"><span>Contact Us</span></a></li>
1912+ <li><a title="Customer Portal Log In" href="https://customers.percona.com/" style="background: url('http://s2.percona.com/buttons/btn_customer.png?1');"><span>Customer Portal Log In</span></a></li>
1913+ <li><a title="Attend a Webinar" href="http://percona.com/webinars/" style="background: url('http://s2.percona.com/buttons/btn_attend-a-webinar.png?1');"><span>Attend a Webinar</span></a></li>
1914+ <li><a title="Download Software" href="http://percona.com/downloads/" style="background:url('http://s2.percona.com/buttons/btn_download.png?1');"><span>Download Software</span></a></li>
1915+ <li><a title="Register for Newsletters" href="http://percona.com/subscribe/" style="background: url('http://s2.percona.com/buttons/btn_register.png?1');"><span>Register for Newsletters</span></a></li>
1916+
1917+ </ul>
1918+ </div>
1919+ </div>
1920+
1921+ <div id="footer">
1922+
1923+ <div class="footer">
1924+ <div class="logo"><img width="110" height="25" alt="" src="{{ pathto('_static/ui-footer-logo.png', 1) }}">
1925+ </div>
1926+
1927+ <div class="text">
1928+ <span class="inv"><!--[CDATA[<noindex-->]]&gt;</span>
1929+ Call us: 1-888-316-9775 • <a href="/contact">Contact Us</a><br>
1930+ MySQL and InnoDB are trademarks of Oracle Corp.<br>
1931+ Proudly running <a href="/software/percona-server/">Percona Server<span id="recentServerVersion"></span></a><br>
1932+ Copyright &copy; 2006-2011 Percona Inc.<br>
1933+ <a href="/about-us/policies/">Copyright, Trademark, and Privacy Policy</a> • <a href="/sitemap/">Sitemap</a>
1934+ <span class="inv"><!--[CDATA[</noindex-->]]&gt;</span>
1935+ </div>
1936+ </div>
1937+
1938+ </div>
1939+{%- endblock %}
1940+<span class="inv"><!--[CDATA[<noindex-->]]&gt;</span>
1941+<div id="submenus">
1942+ <div class="navi-dropdown" id="navi-dropdown-about-us">
1943+ <div class="navi-dropdown-header-l"><!-- //--></div>
1944+ <div class="navi-dropdown-content">
1945+ <div class="item"><a href="http://www.percona.com/about-us/our-mission/">Our Mission</a></div>
1946+ <div class="item"><a href="http://www.percona.com/about-us/why-percona/">Why Percona?</a></div>
1947+ <div class="item"><a href="http://www.percona.com/about-us/procedures/">Coordinating with Percona</a></div>
1948+ <div class="item"><a href="http://www.percona.com/about-us/customers/">Customers</a></div>
1949+ <div class="item"><a href="http://www.percona.com/webinars/">Webinars</a></div>
1950+ <div class="item"><a href="http://www.percona.com/about-us/mysql-case-studies/">MySQL Case Studies</a></div>
1951+ <div class="item"><a href="http://www.percona.com/about-us/our-team/">Our Team</a></div>
1952+
1953+ <div class="item"><a href="http://www.percona.com/about-us/books/">Our Books</a></div>
1954+ <div class="item"><a href="http://www.percona.com/about-us/blogs/">Our Blogs</a></div>
1955+ <div class="item"><a href="http://www.percona.com/about-us/mysql-white-papers/">MySQL White Papers</a></div>
1956+ <div class="item"><a href="http://www.percona.com/about-us/conferences/">Conferences</a></div>
1957+ <div class="item"><a href="http://www.percona.com/about-us/presentations/">Presentations</a></div>
1958+ <div class="item"><a href="http://www.percona.com/about-us/newsletters/">Newsletters</a></div>
1959+ <div class="item"><a href="http://www.percona.com/about-us/pressreleases/">Press Releases</a></div>
1960+ <div class="item"><a href="http://www.percona.com/about-us/percona-in-the-news/">In The News</a></div>
1961+ <div class="item"><a href="http://www.percona.com/about-us/careers/">Careers</a></div>
1962+
1963+ </div>
1964+ <div class="navi-dropdown-footer"><!-- //--></div>
1965+ </div>
1966+ <div class="navi-dropdown" id="navi-dropdown-mysql-consulting">
1967+ <div class="navi-dropdown-header-l"><!-- //--></div>
1968+ <div class="navi-dropdown-content">
1969+ <div class="item"><a href="http://www.percona.com/mysql-consulting/overview/">MySQL Consulting Overview</a></div>
1970+ <div class="item"><a href="http://www.percona.com/mysql-consulting/prices/">MySQL Consulting Prices</a></div>
1971+ <div class="item"><a href="http://www.percona.com/mysql-consulting/architecture/">MySQL Architecture &amp; Design</a></div>
1972+ <div class="item"><a href="http://www.percona.com/mysql-consulting/mysql-backups/">MySQL Backups</a></div>
1973+ <div class="item"><a href="http://www.percona.com/mysql-consulting/cloud-computing/">MySQL Cloud Solutions</a></div>
1974+
1975+ <div class="item"><a href="http://www.percona.com/mysql-consulting/cluster/">MySQL Cluster Consulting</a></div>
1976+ <div class="item"><a href="http://www.percona.com/mysql-consulting/data-warehousing/">MySQL Data Warehousing</a></div>
1977+ <div class="item"><a href="http://www.percona.com/mysql-consulting/data-recovery/">MySQL Data Recovery</a></div>
1978+ <div class="item"><a href="http://www.percona.com/mysql-consulting/high-availability/">MySQL High Availability</a></div>
1979+ <div class="item"><a href="http://www.percona.com/mysql-consulting/mysql-monitoring-graphing/">MySQL Monitoring &amp; Graphing</a></div>
1980+ <div class="item"><a href="http://www.percona.com/mysql-consulting/mysql-onsite-consulting/">MySQL Onsite Consulting</a></div>
1981+ <div class="item"><a href="http://www.percona.com/mysql-consulting/performance-audit/">MySQL Performance Audit</a></div>
1982+ <div class="item"><a href="http://www.percona.com/mysql-consulting/remote-dba/">MySQL Remote DBA</a></div>
1983+
1984+ <div class="item"><a href="http://www.percona.com/mysql-consulting/mysql-replication/">MySQL Replication</a></div>
1985+ <div class="item"><a href="http://www.percona.com/mysql-consulting/upgrade/">MySQL Version Upgrades</a></div>
1986+ <div class="item"><a href="http://www.percona.com/mysql-consulting/24x7-emergency/">Emergency 24&times;7 Consulting</a></div>
1987+ <div class="item"><a href="http://www.percona.com/mysql-consulting/migration/">Migration to MySQL</a></div>
1988+ <div class="item"><a href="http://www.percona.com/drizzle-consulting/">Drizzle Consulting</a></div>
1989+ <div class="item"><a href="http://www.percona.com/mysql-consulting/sphinx/">Sphinx Consulting</a></div>
1990+ <div class="item"><a href="http://www.percona.com/mysql-consulting/drbd/">DRBD Consulting</a></div>
1991+ <div class="item"><a href="http://www.percona.com/mysql-consulting/memcached/">Memcached Consulting</a></div>
1992+
1993+ <div class="item"><a href="http://www.percona.com/mysql-consulting/other-services/">Other Consulting Services</a></div>
1994+ </div>
1995+ <div class="navi-dropdown-footer"><!-- //--></div>
1996+ </div>
1997+ <div class="navi-dropdown" id="navi-dropdown-support">
1998+ <div class="navi-dropdown-header-l"><!-- //--></div>
1999+ <div class="navi-dropdown-content">
2000+ <div class="item"><a href="http://www.percona.com/mysql-support/">MySQL Support Overview</a></div>
2001+ <div class="item"><a href="http://www.percona.com/prices/mysql-support/">MySQL Support Prices</a></div>
2002+ <div class="item"><a href="http://www.percona.com/mysql-support/policies/">MySQL Support Policies</a></div>
2003+ <div class="item"><a href="http://www.percona.com/mysql-support/consulting-vs-support/">Consulting vs. Support</a></div>
2004+ <div class="item"><a href="https://customers.percona.com">Customer Portal Login</a></div>
2005+
2006+ </div>
2007+ <div class="navi-dropdown-footer"><!-- //--></div>
2008+ </div>
2009+ <div class="navi-dropdown" id="navi-dropdown-training">
2010+ <div class="navi-dropdown-header-l"><!-- //--></div>
2011+ <div class="navi-dropdown-content">
2012+ <div class="item"><a href="http://www.percona.com/training/">MySQL Training Overview</a></div>
2013+ <div class="item"><a href="http://www.percona.com/prices/training/">MySQL Training Prices</a></div>
2014+ <div class="item"><a href="http://www.percona.com/training/classes/dba/">MySQL DBA Training</a></div>
2015+ <div class="item"><a href="http://www.percona.com/training/classes/developers/">MySQL Developer Training</a></div>
2016+ <div class="item"><a href="http://www.percona.com/training/classes/operations/">MySQL Operations Training</a></div>
2017+ <div class="item"><a href="http://www.percona.com/training/classes/innodb/">InnoDB &amp; XtraDB Training</a></div>
2018+
2019+ <div class="item"><a href="http://www.percona.com/training/classes/custom-onsite/">Custom Onsite Training</a></div>
2020+ </div>
2021+ <div class="navi-dropdown-footer"><!-- //--></div>
2022+ </div>
2023+ <div class="navi-dropdown" id="navi-dropdown-development">
2024+ <div class="navi-dropdown-header-l"><!-- //--></div>
2025+ <div class="navi-dropdown-content">
2026+ <div class="item"><a href="http://www.percona.com/development/mysql/">MySQL Development Overview</a></div>
2027+ <div class="item"><a href="http://www.percona.com/development/prices/">Custom Development Prices</a></div>
2028+ <div class="item"><a href="http://www.percona.com/development/maintenance/">MySQL Support Overview</a></div>
2029+ <div class="item"><a href="http://www.percona.com/development/benchmarking/">Custom Product Evaluation</a></div>
2030+ <div class="item"><a href="http://www.percona.com/development/maatkit/">Custom Maatkit Development</a></div>
2031+
2032+ <div class="item"><a href="http://www.percona.com/development/custom-tools/">Custom Tools Development</a></div>
2033+ </div>
2034+ <div class="navi-dropdown-footer"><!-- //--></div>
2035+ </div>
2036+ <div class="navi-dropdown" id="navi-dropdown-software">
2037+ <div class="navi-dropdown-header-l"><!-- //--></div>
2038+ <div class="navi-dropdown-content">
2039+ <div class="item"><a href="http://www.percona.com/software/">Percona Software for MySQL</a></div>
2040+ <div class="item"><a href="http://www.percona.com/software/percona-server/">Percona Server with XtraDB</a></div>
2041+ <div class="item"><a href="http://www.percona.com/software/percona-xtradb-cluster/">Percona XtraDB Cluster</a></div>
2042+ <div class="item"><a href="http://www.percona.com/software/percona-xtrabackup/">Percona XtraBackup</a></div>
2043+ <div class="item"><a href="http://www.percona.com/software/mysql-innodb-data-recovery-tools/">Data Recovery Toolkit</a></div>
2044+
2045+ <div class="item"><a href="http://www.percona.com/software/percona-xtradb/">Percona XtraDB</a></div>
2046+ <div class="item"><a href="http://www.percona.com/software/percona-toolkit/">Percona Toolkit</a></div>
2047+ <div class="item"><a href="http://www.percona.com/prices/software/">Software Prices</a></div>
2048+ <div class="item"><a href="http://www.percona.com/downloads/">Downloads</a></div>
2049+ <div class="item"><a href="http://www.percona.com/software/repositories/">Repositories</a></div>
2050+ <div class="item"><a href="http://www.percona.com/software/documentation/">Documentation</a></div>
2051+ <div class="item"><a href="http://forum.percona.com">Forum</a></div>
2052+ <div class="item"><a href="http://groups.google.com/group/percona-discussion">Google Discussion</a></div>
2053+ <div class="item"><a href="https://launchpad.net/percona-server">Launchpad</a></div>
2054+
2055+ </div>
2056+ <div class="navi-dropdown-footer"><!-- //--></div>
2057+ </div>
2058+ <div class="navi-dropdown" id="navi-dropdown-events">
2059+ <div class="navi-dropdown-header-r"><!-- //--></div>
2060+ <div class="navi-dropdown-content">
2061+ <div class="item"><a href="http://www.percona.com/live/mysql-conference-2012/">MySQL Conference &amp; Expo 2012</a></div>
2062+ <div class="item"><a href="http://www.percona.com/live/">Previous Percona Live Events</a></div>
2063+ </div>
2064+ <div class="navi-dropdown-footer"><!-- //--></div>
2065+ </div>
2066+
2067+ <div class="navi-dropdown" id="navi-dropdown-contact">
2068+ <div class="navi-dropdown-header-r"><!-- //--></div>
2069+ <div class="navi-dropdown-content">
2070+ <div class="item"><a href="http://www.percona.com/contact/24x7-emergency/">24&times;7 Emergency</a></div>
2071+ <div class="item"><a href="http://www.percona.com/contact/sales/">Sales &amp; General Inquiries</a></div>
2072+ <div class="item"><a href="http://www.percona.com/contact/billing/">Billing Inquiries</a></div>
2073+ <div class="item"><a href="https://customers.percona.com">Customer Portal Login</a></div>
2074+ <div class="item"><a href="http://www.percona.com/contact/phone-directory/">Phone Directory</a></div>
2075+ <div class="item"><a href="http://www.percona.com/subscribe/">Subscribe to Newsletter</a></div>
2076+
2077+ </div>
2078+ <div class="navi-dropdown-footer"><!-- //--></div>
2079+ </div>
2080+ <div id="search-dropdown" class="search-dropdown">
2081+ <div class="search-dropdown-header"><!-- //--></div>
2082+ <div class="search-dropdown-content">
2083+ <div class="search-info">Search Percona.com:</div>
2084+ <form method="get" action="http://search.percona.com/search/" id="search-form">
2085+ <div class="form"><input type="text" id="search-input" name="q" maxlength="100"></div>
2086+ </form>
2087+ </div>
2088+ <div class="search-dropdown-footer"><!-- //--></div>
2089+ </div>
2090+</div>
2091+<div id="stats">
2092+<!-- GA //-->
2093+ <script src="http://www.percona.com/static/js/urchin.js" type="text/javascript"></script>
2094+ <script type="text/javascript">
2095+ _uacct = "UA-343802-3";
2096+ urchinTracker();
2097+ </script>
2098+<!-- /GA //-->
2099+<!-- NAVI //-->
2100+<script type="text/javascript">//<![CDATA[
2101+var navi = [{id:"about-us", direction: "l"},{id:"mysql-consulting", direction: "l"},{id:"support", direction: "l"},{id:"training", direction: "l"},{id:"development", direction: "l"},{id:"software", direction: "l"},{id:"events", direction: "r"},{id:"contact", direction: "r"}];
2102+for(var i = 0, c = navi.length; i < c; i++) {
2103+window.jQuery('#navilink-a-' + navi[i].id).bind('mouseover',{id: navi[i].id, direction:navi[i].direction}, function(e) { NAVI.Open(e.data.id, e.data.direction); } );
2104+}
2105+window.jQuery('#search-form').bind('submit', function() { window.location.href = jQuery('#search-form').attr('action') + jQuery('#search-input').val(); return false; });
2106+//]]></script>
2107+<!-- /NAVI //-->
2108+<script type="text/javascript">
2109+//<![CDATA[
2110+Percona.host = 'www.percona.com';
2111+Percona.getRecentServerVersion('#recentServerVersion');
2112+//]]>
2113+</script>
2114+</div>
2115+ </body>
2116+</html>
2117+
2118+
2119+
2120+{% if theme_collapsiblesidebar|tobool %}
2121+{% set script_files = script_files + ['_static/sidebar.js'] %}
2122+{% endif %}
2123
2124=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/searchbox.html'
2125--- Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/searchbox.html 1970-01-01 00:00:00 +0000
2126+++ Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/searchbox.html 2012-05-08 06:39:22 +0000
2127@@ -0,0 +1,22 @@
2128+{#
2129+ basic/searchbox.html
2130+ ~~~~~~~~~~~~~~~~~~~~
2131+
2132+ Sphinx sidebar template: quick search box.
2133+
2134+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
2135+ :license: BSD, see LICENSE for details.
2136+#}
2137+{%- if pagename != "search" %}
2138+<div id="searchbox" style="display: none; padding: 3px;">
2139+ <h3>{{ _('Quick search') }}</h3>
2140+ <form class="search" action="{{ pathto('search') }}" method="get">
2141+ <input type="text" name="q" size="18" />
2142+ <input type="submit" value="{{ _('Go') }}" />
2143+ <input type="hidden" name="check_keywords" value="yes" />
2144+ <input type="hidden" name="area" value="default" />
2145+ </form>
2146+
2147+</div>
2148+<script type="text/javascript">$('#searchbox').show(0);</script>
2149+{%- endif %}
2150
2151=== added directory 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static'
2152=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/default.css_t'
2153--- Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/default.css_t 1970-01-01 00:00:00 +0000
2154+++ Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/default.css_t 2012-05-08 06:39:22 +0000
2155@@ -0,0 +1,469 @@
2156+/*
2157+ * default.css_t
2158+ * ~~~~~~~~~~~~~
2159+ *
2160+ * Sphinx stylesheet -- default theme.
2161+ *
2162+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
2163+ * :license: BSD, see LICENSE for details.
2164+ *
2165+ */
2166+
2167+@import url("basic.css");
2168+
2169+/* -- page layout ----------------------------------------------------------- */
2170+
2171+body {
2172+ font-family: Arial,Helvetica,sans-serif;
2173+ font-size: 14px;
2174+ background-color: #fff;
2175+ color: #333333;
2176+ line-height: 20px;
2177+ margin: 0;
2178+ padding: 0;
2179+
2180+}
2181+
2182+div.document {
2183+ background-color: #fff;
2184+ margin: 0 auto;
2185+ overflow: hidden;
2186+ padding: 30px 0;
2187+ width: 960px;
2188+}
2189+
2190+div.documentwrapper {
2191+ /* float: left; */
2192+ /* width: 100%; */
2193+
2194+}
2195+
2196+div.bodywrapper {
2197+ margin: 10 0 0 0px;
2198+ width: 660px;
2199+ float:right;
2200+}
2201+
2202+div.body {
2203+ background-color: #fff;
2204+ color: #333333;
2205+ padding: 0 0 20px;
2206+}
2207+
2208+{%- if theme_rightsidebar|tobool %}
2209+div.bodywrapper {
2210+ margin: 0 {{ theme_sidebarwidth }}px 0 0;
2211+}
2212+{%- endif %}
2213+
2214+div.footer {
2215+ /* color: {{ theme_footertextcolor }}; */
2216+ /* width: 100%; */
2217+ /* padding: 9px 0 9px 0; */
2218+ /* text-align: center; */
2219+ /* font-size: 75%; */
2220+ font: 80% "Lucida Grande",Verdana,Lucida,Helvetica,Arial,sans-serif;
2221+ background: none repeat scroll 0 0 #333333;
2222+ border-top: 2px solid #D95200;
2223+ overflow: hidden;
2224+}
2225+
2226+div.footer a {
2227+ color: {{ theme_footertextcolor }};
2228+ text-decoration: underline;
2229+}
2230+
2231+div.related {
2232+ background-color: #ccc;
2233+ line-height: 30px;
2234+ color: #333;
2235+ background: none repeat scroll 0 0 #F8F8F8;
2236+ border: 1px solid #E0E0E0;
2237+ clear: both;
2238+ padding: 10px;
2239+ width: 635px;
2240+ margin-bottom: 5px;
2241+}
2242+
2243+div.related a {
2244+ color: #999;
2245+}
2246+
2247+div.sphinxsidebar {
2248+ margin-left: 0px;
2249+ margin-right: 30px;
2250+ color: #eee;
2251+ font-family: Arial,Helvetica,sans-serif;
2252+ width: 260px;
2253+ {%- if theme_stickysidebar|tobool %}
2254+ top: 30px;
2255+ bottom: 0;
2256+ margin: 0;
2257+ position: fixed;
2258+ overflow: auto;
2259+ height: auto;
2260+ {%- endif %}
2261+ {%- if theme_rightsidebar|tobool %}
2262+ float: right;
2263+ {%- if theme_stickysidebar|tobool %}
2264+ right: 0;
2265+ {%- endif %}
2266+ {%- endif %}
2267+}
2268+
2269+{%- if theme_stickysidebar|tobool %}
2270+/* this is nice, but it it leads to hidden headings when jumping
2271+ to an anchor */
2272+/*
2273+div.related {
2274+ position: fixed;
2275+}
2276+
2277+div.documentwrapper {
2278+ margin-top: 30px;
2279+}
2280+*/
2281+{%- endif %}
2282+
2283+div.sphinxsidebar h3 {
2284+ /* font-family: {{ theme_headfont }}; */
2285+ color: #999;
2286+ font-size: 18px;
2287+ line-height: 15px;
2288+ font-weight: 400;
2289+ margin-left: 5px;
2290+ padding: 0;
2291+}
2292+
2293+div.sphinxsidebar h3 a {
2294+ color: #333;
2295+}
2296+
2297+div.sphinxsidebar a:hover {
2298+ /* color: #333; */
2299+}
2300+
2301+div.sphinxsidebar h4 {
2302+ /* font-family: {{ theme_headfont }}; */
2303+ color: #666;
2304+ font-size: 18px;
2305+ font-weight: normal;
2306+ margin: 5px 0 0 5px;
2307+ padding: 0;
2308+}
2309+
2310+div.sphinxsidebar p {
2311+ color: #333;
2312+ margin-bottom: 5px;
2313+ margin-left: 5px;
2314+}
2315+
2316+div.sphinxsidebar p.topless {
2317+ margin: 5px 10px 10px 10px;
2318+}
2319+
2320+div.sphinxsidebar ul {
2321+ margin: 10px;
2322+ padding-left: 5px;
2323+ color: #333;
2324+}
2325+
2326+div.sphinxsidebar a {
2327+ color: #D12907;
2328+}
2329+
2330+div.sphinxsidebar input {
2331+ border: 1px solid #999;
2332+ font-family: sans-serif;
2333+ font-size: 1em;
2334+}
2335+
2336+{% if theme_collapsiblesidebar|tobool %}
2337+/* for collapsible sidebar */
2338+div#sidebarbutton {
2339+ background-color: {{ theme_sidebarbtncolor }};
2340+}
2341+{% endif %}
2342+
2343+/* -- hyperlink styles ------------------------------------------------------ */
2344+
2345+a {
2346+ color: #D12907;
2347+ text-decoration: underline;
2348+ border: medium none;
2349+ cursor: pointer;
2350+}
2351+
2352+a:visited {
2353+ color: #D12907;
2354+ text-decoration: underline;
2355+}
2356+
2357+a:hover {
2358+ color: #D12907;
2359+ text-decoration: underline;
2360+}
2361+
2362+{% if theme_externalrefs|tobool %}
2363+a.external {
2364+ text-decoration: none;
2365+ border-bottom: 1px dashed {{ theme_linkcolor }};
2366+}
2367+
2368+a.external:hover {
2369+ text-decoration: none;
2370+ border-bottom: none;
2371+}
2372+
2373+a.external:visited {
2374+ text-decoration: none;
2375+ border-bottom: 1px dashed {{ theme_visitedlinkcolor }};
2376+}
2377+{% endif %}
2378+
2379+/* -- body styles ----------------------------------------------------------- */
2380+
2381+div.body h1,
2382+div.body h2,
2383+div.body h3,
2384+div.body h4,
2385+div.body h5,
2386+div.body h6 {
2387+ font-family: Arial,Helvetica,sans-serif;
2388+ background-color: #fff;
2389+ font-weight: 400;
2390+
2391+ /* border-bottom: 1px solid #ccc; */
2392+ /* margin: 20px -20px 10px -20px; */
2393+ /* padding: 0; */
2394+ /* padding: 3px 0 3px 10px; */
2395+ text-decoration: none !important;
2396+
2397+ border-bottom: 1px solid #E0E0E0;
2398+ font-size: 20px;
2399+ line-height: 20px;
2400+ margin: 30px 0 15px;
2401+ padding: 0 0 3px;
2402+ color: #000;
2403+}
2404+
2405+div.body h1 {
2406+ font-size: 32px;
2407+ color: #D12907;
2408+ line-height: 40px;
2409+ margin: 10px 0 20px 0;
2410+ text-decoration: none !important;
2411+ border-bottom: none;
2412+ margin-top: 35px;
2413+}
2414+
2415+div.body h2 { font-size: 150%; }
2416+div.body h3 { font-size: 140%; }
2417+div.body h4 { font-size: 120%; }
2418+div.body h5 { font-size: 110%; }
2419+div.body h6 { font-size: 100%; }
2420+
2421+a.headerlink {
2422+ color: {{ theme_headlinkcolor }};
2423+ font-size: 0.8em;
2424+ padding: 0 4px 0 4px;
2425+ text-decoration: none;
2426+}
2427+
2428+a.headerlink:hover {
2429+ background-color: {{ theme_headlinkcolor }};
2430+ color: white;
2431+}
2432+
2433+div.body dd, div.body li {
2434+ text-align: justify;
2435+}
2436+
2437+div.body dt {
2438+ list-style-type: square;
2439+ /* margin: 8px 0 8px 30px; */
2440+ padding: 0 4px 0 5px;
2441+
2442+}
2443+
2444+div.body p {
2445+ text-align: justify;
2446+/* line-height: 130%;*/
2447+ margin: 10px 0;
2448+}
2449+
2450+/* div.body ul, */
2451+div.body li {
2452+ list-style-type: square;
2453+ margin: 8px 0 8px 30px;
2454+ padding: 0 4px 0 5px;
2455+}
2456+
2457+.reference em {
2458+ font-style: normal;
2459+}
2460+
2461+.std-term {
2462+ font-style: normal;
2463+ font-weight: 400;
2464+ color: #FF7400
2465+}
2466+
2467+div.admonition p.admonition-title + p {
2468+ display: inline;
2469+}
2470+
2471+div.admonition p {
2472+ margin-bottom: 5px;
2473+}
2474+
2475+div.admonition pre {
2476+ margin-bottom: 5px;
2477+}
2478+
2479+div.admonition ul, div.admonition ol {
2480+ margin-bottom: 5px;
2481+}
2482+
2483+div.note {
2484+ background-color: #eee;
2485+ border: 1px solid #ccc;
2486+}
2487+
2488+div.seealso {
2489+ background-color: #ffc;
2490+ border: 1px solid #ff6;
2491+}
2492+
2493+div.topic {
2494+ background-color: #eee;
2495+}
2496+
2497+div.warning {
2498+ background-color: #ffe4e4;
2499+ border: 1px solid #f66;
2500+}
2501+
2502+p.admonition-title {
2503+ display: inline;
2504+}
2505+
2506+p.admonition-title:after {
2507+ content: ":";
2508+}
2509+
2510+pre {
2511+ padding: 10px;
2512+ background-color: #F0E6D9/* {{ theme_codebgcolor }} */;
2513+ color: {{ theme_codetextcolor }};
2514+ line-height: 120%;
2515+ border: 1px dashed #ED9821;
2516+ font-size: 80%;
2517+ overflow: auto;
2518+ /* border-left: none; */
2519+ /* border-right: none; */
2520+}
2521+
2522+tt {
2523+/* background-color: #ecf0f3;
2524+ padding: 0 1px 0 1px;
2525+ font-size: 0.95em;*/
2526+ font-weight: 400;
2527+}
2528+
2529+div.body td {
2530+ text-align: none;
2531+}
2532+
2533+table.docutils th {
2534+ background-color: #DEE7EC;
2535+ border: 1px solid #8CACBB;
2536+ padding: 3px;
2537+ text-align: center;
2538+ font-style: normal;
2539+ font-weight: 400;
2540+}
2541+
2542+table.docutils td {
2543+ border: 1px solid #8CACBB;
2544+ padding: 3px;
2545+ line-height: 16px;
2546+ vertical-align: middle;
2547+}
2548+
2549+.warning tt {
2550+ background: #efc2c2;
2551+}
2552+
2553+.note tt {
2554+ background: #d6d6d6;
2555+}
2556+
2557+.viewcode-back {
2558+ font-family: {{ theme_bodyfont }};
2559+}
2560+
2561+div.viewcode-block:target {
2562+ background-color: #f4debf;
2563+ border-top: 1px solid #ac9;
2564+ border-bottom: 1px solid #ac9;
2565+}
2566+
2567+.file-bugs {
2568+ background: none repeat scroll 0 0 #E8E8E8;
2569+ border: 1px solid #E0E0E0;
2570+ clear: both;
2571+ color: #333333;
2572+ padding: 10px;
2573+ text-align: center;
2574+ font-size: 90%;
2575+}
2576+
2577+div.footer .footer {
2578+ margin: 0 auto;
2579+ overflow: hidden;
2580+ padding: 10px 0;
2581+ width: 960px;
2582+ border-top: none;
2583+}
2584+
2585+div.footer .footer .logo {
2586+ float: left;
2587+ overflow: hidden;
2588+ padding: 17px 0 0;
2589+}
2590+
2591+div.footer .footer .text {
2592+ color: #E0E0E0;
2593+ float: right;
2594+ font-family: Arial,Helvetica,sans-serif;
2595+ font-size: 11px;
2596+ line-height: 15px;
2597+ overflow: hidden;
2598+ text-align: right;
2599+}
2600+
2601+div.license {
2602+ font-size: 80%;
2603+ /* padding: 0.5em; */
2604+ text-align: center;
2605+ margin: 13px 0 -15px;
2606+}
2607+
2608+#sidenavi.noborder {
2609+ border-right: medium none;
2610+ border-top: medium none;
2611+ margin: 0;
2612+}
2613+
2614+#sidenavi {
2615+ color: #333333;
2616+ /* float: left; */
2617+ font-family: Arial,Helvetica,sans-serif;
2618+ font-size: 18px;
2619+ line-height: 25px;
2620+ overflow: hidden;
2621+ padding: 10px 0 8px 0px;
2622+ width: 255px;
2623+}
2624+
2625
2626=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/email-small.png'
2627Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/email-small.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/email-small.png 2012-05-08 06:39:22 +0000 differ
2628=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/jquery.min.js'
2629--- Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/jquery.min.js 1970-01-01 00:00:00 +0000
2630+++ Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/jquery.min.js 2012-05-08 06:39:22 +0000
2631@@ -0,0 +1,154 @@
2632+/*!
2633+ * jQuery JavaScript Library v1.4.2
2634+ * http://jquery.com/
2635+ *
2636+ * Copyright 2010, John Resig
2637+ * Dual licensed under the MIT or GPL Version 2 licenses.
2638+ * http://jquery.org/license
2639+ *
2640+ * Includes Sizzle.js
2641+ * http://sizzlejs.com/
2642+ * Copyright 2010, The Dojo Foundation
2643+ * Released under the MIT, BSD, and GPL Licenses.
2644+ *
2645+ * Date: Sat Feb 13 22:33:48 2010 -0500
2646+ */
2647+(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
2648+e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
2649+j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
2650+"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
2651+true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
2652+Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
2653+(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
2654+a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
2655+"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
2656+function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
2657+c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
2658+L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
2659+"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
2660+a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
2661+d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
2662+a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
2663+!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
2664+true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
2665+var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
2666+parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
2667+false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
2668+s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
2669+applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
2670+else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
2671+a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
2672+w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
2673+cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
2674+i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
2675+" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
2676+this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
2677+e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
2678+c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
2679+a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
2680+function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
2681+k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
2682+C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
2683+null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
2684+e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
2685+f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
2686+if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
2687+fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
2688+d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
2689+"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
2690+a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
2691+isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
2692+{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
2693+if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
2694+e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
2695+"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
2696+d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
2697+!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
2698+toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
2699+u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),
2700+function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
2701+if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
2702+e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
2703+t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
2704+g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
2705+for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
2706+1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
2707+CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
2708+relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
2709+l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
2710+h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
2711+CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
2712+g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
2713+text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
2714+setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
2715+h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
2716+m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
2717+"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
2718+h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
2719+!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
2720+h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
2721+q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
2722+if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
2723+(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
2724+function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
2725+gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
2726+c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
2727+{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
2728+"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
2729+d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
2730+a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
2731+1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
2732+a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
2733+c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
2734+wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
2735+prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
2736+this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
2737+return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
2738+""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
2739+this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
2740+u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
2741+1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
2742+return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
2743+""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
2744+c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
2745+c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
2746+function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
2747+Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
2748+"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
2749+a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
2750+a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
2751+"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
2752+serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
2753+function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
2754+global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
2755+e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
2756+"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
2757+false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
2758+false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
2759+c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
2760+d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
2761+g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
2762+1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
2763+"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
2764+if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
2765+this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
2766+"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
2767+animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
2768+j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
2769+this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
2770+"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
2771+c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
2772+this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
2773+this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
2774+e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
2775+c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
2776+function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
2777+this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
2778+k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
2779+f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
2780+a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
2781+c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
2782+d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
2783+f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
2784+"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
2785+e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
2786
2787=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/percona.com.css'
2788--- Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/percona.com.css 1970-01-01 00:00:00 +0000
2789+++ Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/percona.com.css 2012-05-08 06:39:22 +0000
2790@@ -0,0 +1,271 @@
2791+@charset "utf-8";
2792+/**
2793+ * Support ribbon
2794+ */
2795+#support-ribbon.vertical
2796+{
2797+ position: fixed;
2798+ right:-3px;
2799+ top:145px;
2800+ color: #ffffff;
2801+ width: 153px;
2802+ height: 130px;
2803+ z-index: 1;
2804+}
2805+#support-ribbon.vertical #support-suboptions {
2806+ display: block;
2807+ position:relative;
2808+ right:0px;
2809+ top: 0px;
2810+ width:155px;
2811+ border-bottom: 0;
2812+ z-index: -10;
2813+
2814+}
2815+#support-ribbon.vertical #support-suboptions a {
2816+ margin-bottom:5px;
2817+ display: block;
2818+ opacity: 0.9;
2819+ text-align: center;
2820+ color: #fff;
2821+ height: 33px;
2822+ line-height:33px;
2823+}
2824+#support-suboptions a:hover {
2825+ opacity: 1;
2826+}
2827+#support-suboptions a span { display:none;}
2828+/**
2829+horizontal ribbon
2830+*/
2831+#support-ribbon.horizontal
2832+{
2833+ position: fixed;
2834+ bottom:0;
2835+ left:0;
2836+ color: #ffffff;
2837+ height: 38px;
2838+ z-index: 1;
2839+}
2840+ #support-ribbon.horizontal #support-suboptions {
2841+
2842+ position:relative;
2843+ top: 0px;
2844+ border-bottom: 0;
2845+ z-index: -10;
2846+ margin:auto;
2847+}
2848+#support-ribbon.horizontal #support-suboptions li {
2849+ float: left;
2850+ list-style-type: none;
2851+}
2852+#support-ribbon.horizontal #support-suboptions li a {
2853+ margin-bottom:5px;
2854+ display: block;
2855+ opacity: 0.9;
2856+ text-align: center;
2857+ color: #fff;
2858+ height: 38px;
2859+ line-height:38px;
2860+ width: 145px;
2861+ margin-right:5px;
2862+}
2863+
2864+html{color:#000;background:#FFF;}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:400;}li{list-style:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:400;}q:before,q:after{content:'';}abbr,acronym{border:0;font-variant:normal;}sup{vertical-align:text-top;}sub{vertical-align:text-bottom;}input,textarea,select{font-family:inherit;font-weight:inherit;font-size:100%;}legend{color:#000;}del,ins{text-decoration:none;}body,html{height:100%;margin:0;padding:0}form{display:inline}a{border:none;cursor:pointer}img{border:none}div,img{behavior:url(/static/css/iepngfix.htc)}em{font-style:italic;}del{text-decoration:line-through;}.hidden{display:none}#header{background:#333;height:95px;overflow:hidden;zoom:1}#header .header{height:95px;margin:0 auto;overflow:hidden;width:960px;zoom:1}#header .header .logo{float:left;overflow:hidden;padding:20px 0;width:240px;zoom:1}#header .header .logo{overflow:hidden;zoom:1;float:left;width:240px;padding:20px 0px;}#header .header .right{overflow:hidden;zoom:1;float:left;width:720px;height:35px;padding:30px 0px;}#header .header .right .searchlink{overflow:hidden;zoom:1;width:35px;height:35px;float:right;padding:0px 0px 0px 10px;}#header .header .right .navicontainer{overflow:hidden;zoom:1;float:right;height:35px;background:#ffffff url(ui-navi-l.png) top left no-repeat;}#header .header .right .navi{overflow:hidden;zoom:1;height:27px;padding:4px 10px;background:url(ui-navi-r.png) top right no-repeat;}#header .header .right .navicontainer .navi span{overflow:hidden;zoom:1;height:27px;float:left;margin:0px;}#header .header .right .navicontainer .navi span:hover{background:#f0f0f0 url(ui-navi-hover-l.png) top left no-repeat;}#header .header .right .navicontainer .navi span.selected,#header .header .right .navicontainer .navi span.selected:hover{background:#d5390b url(ui-navi-sel-l.png) top left no-repeat;}#header .header .right .navicontainer .navi span a,#header .header .right .navicontainer .navi span a:visited{display:block;padding:6px 10px 4px 10px;height:17px;font-family:Arial,Helvetica,sans-serif;font-size:14px;line-height:14px;color:#000000;text-decoration:none;}#header .header .right .navicontainer .navi span a:hover{background:url(ui-navi-hover-r.png) top right no-repeat;}#header .header .right .navicontainer .navi span.selected a.selected,#header .header .right .navicontainer .navi span.selected a.selected:visited,#header .header .right .navicontainer .navi span.selected a.selected:hover{background:url(ui-navi-sel-r.png) top right no-repeat;color:#ffffff;}#slogan{overflow:hidden;zoom:1;height:125px;background:#d24300 urk(ui-orange-front.png) bottom center no-repeat;text-align:center;}#stripe{overflow:hidden;zoom:1;height:20px;background:#d24300 url(ui-orange-content.png) top center no-repeat;}#footer{overflow:hidden;zoom:1;background:#333333;border-top:2px #d95200 solid;}#footer .footer{overflow:hidden;zoom:1;width:960px;margin:0px auto;padding:10px 0px;}#footer .footer .logo{overflow:hidden;zoom:1;float:left;padding:17px 0px 0px 0px;}#footer .footer .text{overflow:hidden;zoom:1;float:right;text-align:right;font-family:Arial,Helvetica,sans-serif;font-size:11px;line-height:15px;color:#e0e0e0;}#footer .footer .text a,#footer .footer .text a:visited{color:#e0e0e0;text-decoration:none;}#footer .footer .text a:hover{color:#ffffff;text-decoration:underline;}div.navi-dropdown{display:none;position:absolute;overflow:hidden;zoom:1;width:255px;z-index:900;}div.navi-dropdown .navi-dropdown-header-l{overflow:hidden;zoom:1;width:255px;height:20px;background:url(ui-dropdown-header-l.png) top left no-repeat;}div.navi-dropdown .navi-dropdown-header-r{overflow:hidden;zoom:1;width:255px;height:20px;background:url(ui-dropdown-header-r.png) top left no-repeat;}div.navi-dropdown .navi-dropdown-content{overflow:hidden;zoom:1;width:225px;padding:0px 15px 5px 15px;background:#ffffff url(ui-dropdown-bg.png) repeat-y;font-family:Arial,Helvetica,sans-serif;font-size:14px;line-height:20px;color:#333333;}div.navi-dropdown .navi-dropdown-content .item{padding:3px 0px 1px 0px;}div.navi-dropdown .navi-dropdown-content a,div.navi-dropdown .navi-dropdown-content a:visited{display:block;color:#333333;text-decoration:none;}div.navi-dropdown .navi-dropdown-content a:hover{color:#d12907;text-decoration:underline;}div.navi-dropdown .navi-dropdown-footer{overflow:hidden;zoom:1;width:255px;height:10px;background:url(ui-dropdown-footer.png) top left no-repeat;}div.search-dropdown{display:none;position:absolute;overflow:hidden;zoom:1;width:255px;}div.search-dropdown .search-dropdown-header{overflow:hidden;zoom:1;width:255px;height:20px;background:url(ui-dropdown-header-search.png) top left no-repeat;}div.search-dropdown .search-dropdown-content{overflow:hidden;zoom:1;width:225px;padding:0px 15px 5px 15px;background:#ffffff url(ui-dropdown-bg.png) repeat-y;font-family:Arial,Helvetica,sans-serif;font-size:14px;line-height:20px;color:#333333;}div.search-dropdown .search-dropdown-content .form{padding-top:2px;}div.search-dropdown .search-dropdown-content .form input{border:1px #c0c0c0 solid;padding:4px;width:210px;outline:none;}div.search-dropdown .search-dropdown-content .form input:focus{border:1px #707070 solid;outline:none;}div.search-dropdown .search-dropdown-footer{overflow:hidden;zoom:1;width:255px;height:10px;background:url(ui-dropdown-footer.png) top left no-repeat;}#sidenavi{overflow:hidden;zoom:1;float:left;width:260px;border-top:1px #e0e0e0 solid;border-right:1px #e0e0e0 solid;margin:0px 30px 0px 0px;padding:0px 0px 20px 0px;font-family:Arial,Helvetica,sans-serif;font-size:18px;line-height:25px;color:#333333;}#sidenavi.noborder{border-top:none;border-right:none;margin:0px 31px 0px 0px;}#sidenavi .sidebanner{border-left:1px #e0e0e0 solid;border-bottom:1px #e0e0e0 solid;text-align:center;padding:15px 10px;}#sidenavi.noborder .sidebanner{border-top:1px #e0e0e0 solid;border-right:1px #e0e0e0 solid;}#sidenavi .sidebanner .header{padding:0px 0px 10px 0px;line-height:18px;text-align:center;}#sidenavi .sidebanner .numbers{padding:0px 0px 0px 58px;background:url(phone.png) 5px center no-repeat;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;text-align:left;}#sidenavi #sidefloater{padding-top:10px;}#sidenavi .item{padding:10px 10px 8px 10px;}#sidenavi > .item.selected{background:url(ui-leftnavi-sel.png) top left no-repeat;}#sidenavi a,#sidenavi a:visited{display:block;color:#333333;text-decoration:none;}#sidenavi a:hover{color:#d12907;text-decoration:none;}#sidenavi > .item.selected > a,#sidenavi > .item.selected > a:visited{color:#d12907;text-decoration:none;}#sidenavi .sidesubnavi{overflow:hidden;zoom:1;font-family:Arial,Helvetica,sans-serif;font-size:13px;line-height:17px;color:#333333;}#sidenavi .sidesubnavi .subitem{padding:7px 10px 0px 10px;}#sidenavi .sidesubnavi .subitem.selected a,#sidenavi .sidesubnavi .subitem.selected a:visited{color:#d12907;text-decoration:none;}#contentcontainer{overflow:hidden;zoom:1;width:960px;padding:30px 0px;margin:0px auto;}#content{overflow:hidden;zoom:1;font-family:Arial,Helvetica,sans-serif;font-size:14px;line-height:20px;color:#333333;}#content p{margin:10px 0px;}#content a,#content a:visited{color:#d12907;text-decoration:underline;}#content a:hover{color:#712000;text-decoration:underline;}#content h1{font-family:Arial,Helvetica,sans-serif;font-size:32px;line-height:40px;margin:5px 0px 20px 0px;color:#d12907;}#content h2{font-family:Arial,Helvetica,sans-serif;font-size:20px;line-height:20px;padding:0px 0px 3px 0px;margin:30px 0px 15px 0px;color:#000000;border-bottom:1px #e0e0e0 solid;}#content h3{font-family:Arial,Helvetica,sans-serif;font-weight:bold;font-size:16px;line-height:22px;margin:20px 0px 10px 0px;color:#000000;}#content h4{font-family:Arial,Helvetica,sans-serif;font-size:14px;line-height:14px;font-weight:bold;padding:5px 0px 0px 0px;margin:-16px 0px 20px 0px;color:#000000;border-top:1px #e0e0e0 solid;}#content h4 a,#content h4 a:visited{color:#000000;text-decoration:none;}#content h4 a:hover{color:#d12907;text-decoration:none;}#content dl dt{font-weight:bold;margin-top:10px;margin-bottom:10px;}#content dl dd{padding:0px 0px 0px 30px;}#content ul{list-style-type:square;padding:0px 0px 0px 30px;}#content ul li{list-style-type:square;margin:8px 0px;}#content ol{list-style-type:decimal;padding:0px 0px 0px 30px;}#content ol li{list-style-type:decimal;margin:8px 0px;}#content div.pagecontent{overflow:hidden;zoom:1;}div.contentbox{border:1px #e0e0e0 solid;}div.contentbox div.title{font-size:16px;line-height:20px;font-weight:bold;padding:8px 15px 2px 15px;background:url(ui-leftnavi-sel.png) repeat-x;}div.contentbox div.content{padding:15px;}div.frontpage-p{overflow:hidden;zoom:1;width:960px;margin:0px;margin-bottom:20px;padding:0px;}div.frontpage-p div.frontpage-p-container{overflow:hidden;zoom:1;width:960px;height:200px;padding-bottom:30px;z-index:100;}div.frontpage-p a.nivo-imageLink{position:absolute;top:0px;left:0px;width:960px;height:200px;border:0;padding:0;margin:0;z-index:20;display:none;}div.frontpage-p div.frontpage-p-container div.nivo-directionNav{width:1px;height:1px;display:none !important;z-index:18 !important;}div.frontpage-p div.frontpage-p-container div.nivo-controlNav{position:absolute;top:200px;width:960px;text-align:center;font-size:28px;line-height:25px;}div.frontpage-p div.frontpage-p-container div.nivo-controlNav a{padding:0px 3px;text-decoration:none !important;color:#919191 !important;}div.frontpage-p div.frontpage-p-container div.nivo-controlNav a.active{color:#d12907 !important;}div.frontpage-p div.frontpage-p-selector{overflow:hidden;zoom:1;height:20px;text-align:center;}div.frontpage-main{overflow:hidden;zoom:1;width:960px;margin:20px 0px;padding:0px;}div.frontpage-main div.frontpage-left{overflow:hidden;zoom:1;width:645px;float:left;padding:0px;}div.frontpage-boxes{overflow:hidden;zoom:1;width:645px;margin:25px 0px 0px 0px;padding:0px;}div.frontpage-boxes div.frontpage-boxes-selector{overflow:hidden;zoom:1;width:645px;}div.frontpage-boxes div.frontpage-boxes-selector div.frontpage-boxes-selector-item{overflow:hidden;zoom:1;width:160px;float:left;margin-left:-1px;border-top:1px #cccccc solid;border-left:1px #cccccc solid;border-right:1px #cccccc solid;border-bottom:1px #cccccc solid;text-align:center;margin-top:10px;padding:0px 0px 0px 0px;}div.frontpage-boxes div.frontpage-boxes-selector div.frontpage-boxes-selector-item:first-child{margin-left:0px;}div.frontpage-boxes div.frontpage-boxes-selector div.frontpage-boxes-selector-item.selected{background:url(ui-tab-bg.png) repeat-x;margin-top:0px;border-bottom:none;padding:5px 0px 6px 0px;}div.frontpage-boxes div.frontpage-boxes-selector div.frontpage-boxes-selector-item a{display:block;font-size:20px;line-height:20px;color:#444444 !important;text-decoration:none !important;padding:9px 0px 8px 0px;}div.frontpage-boxes div.frontpage-boxes-container{overflow:hidden;zoom:1;width:603px;height:150px;padding:20px;border-left:1px #cccccc solid;border-right:1px #cccccc solid;border-bottom:1px #cccccc solid;}div.frontpage-boxes div.frontpage-boxes-container div.frontpage-box img{padding:0px 15px 15px 5px;}div.frontpage-main div.frontpage-right{overflow:hidden;zoom:1;width:295px;float:right;margin-left:20px;padding:0px;}div.frontpage-block{overflow:hidden;zoom:1;border:1px #cccccc solid;width:288px;margin:0 0 20px 5px;}div.frontpage-block div.header{text-align:left;padding:15px 15px 0px 15px;background:url(ui-tab-bg.png) repeat-x;font-family:Arial,Helvetica,sans-serif;font-size:20px;line-height:20px;}div.frontpage-block div.content{overflow:hidden;zoom:1;padding:10px 15px 15px 15px;}div.frontpage-block div.content div.call-us{font-size:12px;line-height:17px;}div.frontpage-block div.content div.training{padding:20px;overflow:hidden;zoom:1;font-size:12px;line-height:17px;}div.frontpage-block div.content div.training ul.training-short-list{list-style-type:none !important;margin:0 !important;padding:0 !important;}div.frontpage-block div.content div.training ul.training-short-list li{list-style-type:none !important;}div.frontpage-block div.content div.more{overflow:hidden;zoom:1;text-align:right;padding:15px 0px 0px 0px;font-size:12px;line-height:17px;}.our-team-page h2{clear:both;}div.our-team-item{overflow:hidden;zoom:1;width:162px;margin-left:5px;height:230px;float:left;}div.our-team-item .img img{border:1px #e0e0e0 solid;padding:2px;}table.phonetable{margin-top:1em;border-collapse:collapse;}.phonetable{margin-left:2em;}table.phonetable th,table.phonetable tr{text-align:center;}table.phonetable th{border:1px #e0e0e0 solid;background:#f8f8f8;padding:7px;font-weight:bold;}table.phonetable td{border:1px #e0e0e0 solid;padding:7px;}table.phonetable .label{text-align:left;}table.phonetable td.label{padding-left:2em;}.form-item{clear:both;margin-top:1em;position:relative;}.form-item label{display:block;font-weight:bold;position:absolute;top:0;left:0;width:13em;}.form-required{color:#fa0;font-weight:bold;}.form-item .description{color:#888;font-size:0.85em;line-height:150%;position:relative;left:14em;}#edit-submitbutton{position:relative;left:12em;margin:1em 0;}.form-item input[type=text],.form-item select,.form-item textarea{border:1px solid #CCC;width:493px;position:relative;top:0;left:12em;}.form-item textarea{height:12em;padding:3px;}.form-item-spacer{padding-top:1em;}.form-item #captcha{position:relative;top:0;left:12em;}#edit-submitted-captcha{margin-top:0.5em;width:154px;}fieldset.form-item-set{border:1px solid #ccc;display:block;margin:12px 0;padding:12px;}fieldset.form-item-set legend{border:none;display:block;padding:0 2px;}div.error{background:#fff;border:solid 1px #c52020;color:#C52020;padding:5px;}div.messages{margin:5px 20px;font-size:11px;}div.messages ul,div.messages ul li{list-style-image:none;list-style-type:none;}div.messages ul li{padding:0 0 0.2em 0;}.form-item .error{background-color :#fdd;}#emergency-contacts .node-field-name{text-align:right;font-weight:bold;padding-right:1em;}#emergency-contacts .node-field-value-phone{font-weight:bold;color:#137F00;}#emergency-contacts .node-field-help{font-weight:bold;}#compact_footer{width:auto !important;}#compact_contentcontainer{overflow:hidden;zoom:1;width:auto;padding:30px 0px;margin:0px 20px;}.custlogo img{padding:20px;border:1px solid white;}.custlogo img:hover{border:1px solid gray;}table.formtable{border-collapse:collapse;}table.formtable th{font-weight:normal;white-space:nowrap;padding:4px 20px 4px 0px;}table.formtable td{padding:4px 0px 4px 0px;}table.formtable td input[type='text'],table.formtable td select{border:1px #e0e0e0 solid;padding:4px;width:400px;}table.formtable td.submit{padding:10px 0px 0px 0px;text-align:center;}table.datatable{margin-top:1em;border-collapse:collapse;}.datatable{margin-left:2em;}table.datatable th,table.datatable tr{text-align:center;}table.datatable th{border:1px #e0e0e0 solid;background:#f8f8f8;padding:7px;font-weight:bold;}table.datatable td{border:1px #e0e0e0 solid;padding:7px;}table.datatable .label{text-align:left;}table.datatable td.label{padding-left:2em;}.frontpage-sidebar .header{padding:0px 0px 10px 0px;font-size:18px;font-weight:normal;text-align:center;}.frontpage-sidebar .header.link{padding:13px 0px 10px 4px;text-align:left;}.frontpage-sidebar .header a,.frontpage-sidebar .header a:visited{color:#333333 !important;text-decoration:none !important;}.frontpage-sidebar .header a:hover{color:#d12907 !important;text-decoration:none !important;}.frontpage-sidebar .header.bloglink{font-size:16px;padding:0px 0px 10px 10px;text-align:center;}.frontpage-sidebar .header.blogheader{font-weight:normal;text-align:center;font-size:15px;padding:13px 10px 10px 0px;}.frontpage-sidebar .header a.email{padding:13px 10px 10px 40px;background:url(email-small.png) left center no-repeat;}.frontpage-sidebar .call-us .numbers{padding:0px 0px 0px 38px;background:url(phone-small.png) 2px center no-repeat;font-family:Arial,Helvetica,sans-serif;font-size:11px;line-height:18px;text-align:left;}.frontpage-sidebar .eventum a,.frontpage-sidebar .eventum a:visited{padding:0px 2px 0px 55px;font-size:12px;line-height:18px;text-align:left;background:url(support-small.png) left center no-repeat;display:block;color:#333333 !important;text-decoration:none !important;}.frontpage-sidebar .eventum a:hover{color:#d12907 !important;text-decoration:underline !important;}div.presentation{border-top:1px #e0e0e0 dotted;padding:15px 0px;}div.presentation:first-child{margin-top:0;border:none;}div.presentation table.presentation{border-collapse:collapse;}div.presentation table.presentation td div.bordered-image-screenshot{border:1px #e0e0e0 solid;background:#f8f8f8;padding:5px;}div.presentation table.presentation td.presentations-descr{padding-left:15px;}div.presentation table.presentation td.presentations-descr h4{font-size:18px;font-weight:bold;}.customer-vote{width:412px;text-align:justify;}strong{font-weight:bold;}html,body{height:100%;}#stickywrapper{position:relative;min-height:100%;}* html #stickywrapper{height:100%;}#stickycontent{padding-bottom:102px;}#stickyfooter{position:relative;margin:-97px auto 0 auto;}a.links{font-style:oblique;text-decoration:underline;}span.subpart{font-weight:bold;}div.software-info-container{overflow:hidden;zoom:1;float:right;padding:0px 0px 25px 25px;}table.software-info-container{width:240px;border-collapse:collapse;}table.software-info-container td{border:1px #e0e0e0 solid;padding:10px 10px 10px 10px;}table.software-info-container td.latest{padding:10px 10px 10px 62px;background:url(software-latest.png) 15px center no-repeat;min-height:32px;font-size:16px;line-height:24px;}table.software-info-container td.download a{font-weight:bold;}table.software-info-container td.download{padding:15px 62px 15px 20px;background:url(software-download.png) 195px center no-repeat;min-height:32px;font-size:18px;line-height:24px;}table.software-info-container td.links{text-align:left;padding:4px 10px 4px 20px;}table.software-info-container td.links div{margin:10px 0px;}.inv{display:none;}table.downloadstable{margin-top:20px;border-collapse:collapse;}table.downloadstable th{border:1px #e0e0e0 solid;background:#f8f8f8;padding:7px;font-weight:bold;}table.downloadstable td{border:1px #e0e0e0 solid;padding:7px;}table.downloadstable td.file{width:90%;text-align:left;}table.downloadstable td.modified{width:5%;text-align:center;white-space:nowrap;}table.downloadstable td.size{width:5%;text-align:right;white-space:nowrap;}div.downloads-maintenance-promo,div.downloads-warning{border:1px #e0e0e0 solid;padding:15px 20px 15px 150px;margin:30px 0px;background:url(shield.png) 35px center no-repeat;}div.downloads-maintenance-promo > .close-button{float:right;clear:right;margin-top:-10px;margin-right:-15px;cursor:pointer;cursor:hand;}div.downloads-warning{background:url(warning.png) 35px center no-repeat;}div.downloads-version{border-top:1px #e0e0e0 solid;margin-top:-10px;padding-top:10px;text-align:right;font-size:14px;line-height:14px;font-weight:bold;}div.downloads-anchors{font-size:12px;line-height:15px;margin:20px 0px;}div.downloads-backtotop{font-size:12px;line-height:15px;padding-top:8px;}.downloadsignupdialog .ui-dialog-titlebar{display:none;}#downloadsignup h2{font-family:Arial,Helvetica,sans-serif;font-size:22px;line-height:22px;margin:10px 0px 20px 0px;color:#d12907;}#downloadsignup .intro{margin:10px 0px 15px 0px;}#downloadsignup .form .field{overflow:hidden;zoom:1;margin:10px 0px;}#downloadsignup .form .field .label{overflow:hidden;zoom:1;width:150px;float:left;padding-top:5px;}#downloadsignup .form .field .element{overflow:hidden;zoom:1;width:410px;float:left;}#downloadsignup .form .field .element input,#downloadsignup .form .field .element select{width:400px;border:1px #cccccc solid;padding:3px;outline:none;}#downloadsignup .form .field .element input:focus,#downloadsignup .form .field .element select:focus{border:1px #333333 solid;background:#f8f8f8;outline:none;}#downloadsignup .form .field .radiolist{overflow:hidden;zoom:1;display:block;padding:0;margin:0;}#downloadsignup .form .field table.radiolist{width:100%;}#downloadsignup .form .field .radiolist td{width:25%;}#downloadsignup .form .field div.radiolist label{display:block;min-width:55px;float:left;zoom:1;padding:8px 10px 2px 24px !important;text-indent:-24px;overflow:auto;}#downloadsignup .form .field table.radiolist label{padding:8px 15px 2px 0px !important;zoom:1;display:block;}#downloadsignup .form .field .radiolist label input{margin:0px 7px 0px 3px !important;}.schedule td{padding:3px;border:1px solid #eeeeee;padding-left:10px;font-size:16px;}.tdmini{font-weight:bold;font-size:10px !important;}.tdbreak{background-color:#ffeeee;text-align:center;}.trhead td{background-color:#d12907;color:#ffffff;font-weight:bold;}.speaker{font-size:10px;}table.left-headers th{font-weight:bold;text-align:right;padding:5px 12px;vertical-align:top;border-right:1px solid black;}table.left-headers td{padding:5px 12px;}.training-list tr th{font-weight:bold;}.training-list tr td{padding-right:15px;}a.interwiki{background:transparent url(/docs/wiki/lib/images/interwiki.png) 0px 1px no-repeat;padding-left:16px;}a.iw_wp{background-image:url(/docs/wiki/lib/images/interwiki/wp.gif)}a.iw_wpfr{background-image:url(/docs/wiki/lib/images/interwiki/wpfr.gif)}a.iw_wpde{background-image:url(/docs/wiki/lib/images/interwiki/wpde.gif)}a.iw_wpes{background-image:url(/docs/wiki/lib/images/interwiki/wpes.gif)}a.iw_wppl{background-image:url(/docs/wiki/lib/images/interwiki/wppl.gif)}a.iw_wpjp{background-image:url(/docs/wiki/lib/images/interwiki/wpjp.gif)}a.iw_wpmeta{background-image:url(/docs/wiki/lib/images/interwiki/wpmeta.gif)}a.iw_doku{background-image:url(/docs/wiki/lib/images/interwiki/doku.gif)}a.iw_dokubug{background-image:url(/docs/wiki/lib/images/interwiki/dokubug.gif)}a.iw_amazon{background-image:url(/docs/wiki/lib/images/interwiki/amazon.gif)}a.iw_amazon_de{background-image:url(/docs/wiki/lib/images/interwiki/amazon.de.gif)}a.iw_amazon_uk{background-image:url(/docs/wiki/lib/images/interwiki/amazon.uk.gif)}a.iw_phpfn{background-image:url(/docs/wiki/lib/images/interwiki/phpfn.gif)}a.iw_coral{background-image:url(/docs/wiki/lib/images/interwiki/coral.gif)}a.iw_sb{background-image:url(/docs/wiki/lib/images/interwiki/sb.gif)}a.iw_google{background-image:url(/docs/wiki/lib/images/interwiki/google.gif)}a.iw_meatball{background-image:url(/docs/wiki/lib/images/interwiki/meatball.gif)}a.iw_wiki{background-image:url(/docs/wiki/lib/images/interwiki/wiki.gif)}a.mediafile{background:transparent url(/docs/wiki/lib/images/fileicons/file.png) 0px 1px no-repeat;padding-left:18px;padding-bottom:1px;}a.mf_txt{background-image:url(/docs/wiki/lib/images/fileicons/txt.png)}a.mf_sxi{background-image:url(/docs/wiki/lib/images/fileicons/sxi.png)}a.mf_tgz{background-image:url(/docs/wiki/lib/images/fileicons/tgz.png)}a.mf_wav{background-image:url(/docs/wiki/lib/images/fileicons/wav.png)}a.mf_jpg{background-image:url(/docs/wiki/lib/images/fileicons/jpg.png)}a.mf_sxd{background-image:url(/docs/wiki/lib/images/fileicons/sxd.png)}a.mf_js{background-image:url(/docs/wiki/lib/images/fileicons/js.png)}a.mf_ps{background-image:url(/docs/wiki/lib/images/fileicons/ps.png)}a.mf_conf{background-image:url(/docs/wiki/lib/images/fileicons/conf.png)}a.mf_swf{background-image:url(/docs/wiki/lib/images/fileicons/swf.png)}a.mf_xml{background-image:url(/docs/wiki/lib/images/fileicons/xml.png)}a.mf_py{background-image:url(/docs/wiki/lib/images/fileicons/py.png)}a.mf_cpp{background-image:url(/docs/wiki/lib/images/fileicons/cpp.png)}a.mf_css{background-image:url(/docs/wiki/lib/images/fileicons/css.png)}a.mf_jpeg{background-image:url(/docs/wiki/lib/images/fileicons/jpeg.png)}a.mf_odi{background-image:url(/docs/wiki/lib/images/fileicons/odi.png)}a.mf_pptx{background-image:url(/docs/wiki/lib/images/fileicons/pptx.png)}a.mf_doc{background-image:url(/docs/wiki/lib/images/fileicons/doc.png)}a.mf_bz2{background-image:url(/docs/wiki/lib/images/fileicons/bz2.png)}a.mf_png{background-image:url(/docs/wiki/lib/images/fileicons/png.png)}a.mf_ogg{background-image:url(/docs/wiki/lib/images/fileicons/ogg.png)}a.mf_xls{background-image:url(/docs/wiki/lib/images/fileicons/xls.png)}a.mf_tar{background-image:url(/docs/wiki/lib/images/fileicons/tar.png)}a.mf_pl{background-image:url(/docs/wiki/lib/images/fileicons/pl.png)}a.mf_mp3{background-image:url(/docs/wiki/lib/images/fileicons/mp3.png)}a.mf_pdf{background-image:url(/docs/wiki/lib/images/fileicons/pdf.png)}a.mf_audio{background-image:url(/docs/wiki/lib/images/fileicons/audio.png)}a.mf_rtf{background-image:url(/docs/wiki/lib/images/fileicons/rtf.png)}a.mf_java{background-image:url(/docs/wiki/lib/images/fileicons/java.png)}a.mf_cs{background-image:url(/docs/wiki/lib/images/fileicons/cs.png)}a.mf_odt{background-image:url(/docs/wiki/lib/images/fileicons/odt.png)}a.mf_c{background-image:url(/docs/wiki/lib/images/fileicons/c.png)}a.mf_rpm{background-image:url(/docs/wiki/lib/images/fileicons/rpm.png)}a.mf_docx{background-image:url(/docs/wiki/lib/images/fileicons/docx.png)}a.mf_ppt{background-image:url(/docs/wiki/lib/images/fileicons/ppt.png)}a.mf_odp{background-image:url(/docs/wiki/lib/images/fileicons/odp.png)}a.mf_html{background-image:url(/docs/wiki/lib/images/fileicons/html.png)}a.mf_gz{background-image:url(/docs/wiki/lib/images/fileicons/gz.png)}a.mf_zip{background-image:url(/docs/wiki/lib/images/fileicons/zip.png)}a.mf_gif{background-image:url(/docs/wiki/lib/images/fileicons/gif.png)}a.mf_htm{background-image:url(/docs/wiki/lib/images/fileicons/htm.png)}a.mf_sql{background-image:url(/docs/wiki/lib/images/fileicons/sql.png)}a.mf_rar{background-image:url(/docs/wiki/lib/images/fileicons/rar.png)}a.mf_rb{background-image:url(/docs/wiki/lib/images/fileicons/rb.png)}a.mf_csv{background-image:url(/docs/wiki/lib/images/fileicons/csv.png)}a.mf_odc{background-image:url(/docs/wiki/lib/images/fileicons/odc.png)}a.mf_odf{background-image:url(/docs/wiki/lib/images/fileicons/odf.png)}a.mf_deb{background-image:url(/docs/wiki/lib/images/fileicons/deb.png)}a.mf_ods{background-image:url(/docs/wiki/lib/images/fileicons/ods.png)}a.mf_xlsx{background-image:url(/docs/wiki/lib/images/fileicons/xlsx.png)}a.mf_lua{background-image:url(/docs/wiki/lib/images/fileicons/lua.png)}a.mf_sxc{background-image:url(/docs/wiki/lib/images/fileicons/sxc.png)}a.mf_odg{background-image:url(/docs/wiki/lib/images/fileicons/odg.png)}a.mf_7z{background-image:url(/docs/wiki/lib/images/fileicons/7z.png)}a.mf_sxw{background-image:url(/docs/wiki/lib/images/fileicons/sxw.png)}a.mf_php{background-image:url(/docs/wiki/lib/images/fileicons/php.png)}div.clearer{clear:both;line-height:0;height:0;overflow:hidden;}div.no{display:inline;margin:0;padding:0;}.hidden{display:none;}div.error{background:#fcc url(/docs/wiki/lib/styles/../images/error.png) 0.5em 0px no-repeat;color:#000;border-bottom:1px solid #faa;font-size:90%;margin:0;padding-left:3em;overflow:hidden;}div.info{background:#ccf url(/docs/wiki/lib/styles/../images/info.png) 0.5em 0px no-repeat;color:#000;border-bottom:1px solid #aaf;font-size:90%;margin:0;padding-left:3em;overflow:hidden;}div.success{background:#cfc url(/docs/wiki/lib/styles/../images/success.png) 0.5em 0px no-repeat;color:#000;border-bottom:1px solid #afa;font-size:90%;margin:0;padding-left:3em;overflow:hidden;}div.notify{background:#ffc url(/docs/wiki/lib/styles/../images/notify.png) 0.5em 0px no-repeat;color:#000;border-bottom:1px solid #ffa;font-size:90%;margin:0;padding-left:3em;overflow:hidden;}.medialeft{float:left;}.mediaright{float:right;}.mediacenter{display:block;margin-left:auto;margin-right:auto;}.leftalign{text-align:left;}.centeralign{text-align:center;}.rightalign{text-align:right;}em.u{font-style:normal;text-decoration:underline;}em em.u{font-style:italic;}.code .br0{color:#6c6;}.code .co0{color:#808080;font-style:italic;}.code .co1{color:#808080;font-style:italic;}.code .co2{color:#808080;font-style:italic;}.code .co3{color:#808080;}.code .coMULTI{color:#808080;font-style:italic;}.code .es0{color:#009;font-weight:bold;}.code .kw1{color:#b1b100;}.code .kw2{color:#000;font-weight:bold;}.code .kw3{color:#006;}.code .kw4{color:#933;}.code .kw5{color:#00f;}.code .me1{color:#060;}.code .me2{color:#060;}.code .nu0{color:#c6c;}.code .re0{color:#00f;}.code .re1{color:#00f;}.code .re2{color:#00f;}.code .re3{color:#f33;font-weight:bold;}.code .re4{color:#099;}.code .st0{color:#f00;}.code .sy0{color:#6c6;}div#acl_manager div#acl__tree{font-size:90%;width:25%;height:300px;float:left;overflow:auto;border:1px solid #8cacbb;text-align:left;}div#acl_manager div#acl__tree a.cur{background-color:#ff9;font-weight:bold;}div#acl_manager div#acl__tree ul{list-style-type:none;margin:0;padding:0;}div#acl_manager div#acl__tree li{padding-left:1em;}div#acl_manager div#acl__tree ul img{margin-right:0.25em;cursor:pointer;}div#acl_manager div#acl__detail{width:73%;height:300px;float:right;overflow:auto;}div#acl_manager div#acl__detail fieldset{width:90%;}div#acl_manager div#acl__detail div#acl__user{border:1px solid #8cacbb;padding:0.5em;margin-bottom:0.6em;}div#acl_manager table.inline{width:100%;margin:0;}div#acl_manager .aclgroup{background:transparent url(/docs/wiki/lib/plugins/acl/pix/group.png) 0px 1px no-repeat;padding:1px 0px 1px 18px;}div#acl_manager .acluser{background:transparent url(/docs/wiki/lib/plugins/acl/pix/user.png) 0px 1px no-repeat;padding:1px 0px 1px 18px;}div#acl_manager .aclpage{background:transparent url(/docs/wiki/lib/plugins/acl/pix/page.png) 0px 1px no-repeat;padding:1px 0px 1px 18px;}div#acl_manager .aclns{background:transparent url(/docs/wiki/lib/plugins/acl/pix/ns.png) 0px 1px no-repeat;padding:1px 0px 1px 18px;}div#acl_manager label.disabled{color:#666!important;}#acl_manager label{text-align:left;font-weight:normal;display:inline;}#acl_manager table{margin-left:10%;width:80%;}#acl_manager table tr{background-color:inherit;}#acl_manager table tr:hover{background-color:#dee7ec;}div.toolbar #tool__bar_table button.selected{background:#fff url(/docs/wiki/lib/plugins/edittable/images/buttonshadow_toggled.png) repeat-x bottom;}div.toolbar #tool__bar_table button.disabled{background:#fff url(/docs/wiki/lib/plugins/edittable/images/buttonshadow_toggled2.png) repeat-x bottom;opacity:0.4;}div.toolbar #tool__bar_table button.separator{margin-left:0.5em;}div.toolbar #tool__bar_table{margin-bottom:0.5em;}#dw__editform #edit__wrap{margin-top:1.5em;overflow:auto;border:1px solid #8cacbb;}div.dokuwiki table.edit{margin:-1px;}div.dokuwiki table.edit th,div.dokuwiki table.edit td{min-width:5em;}div.dokuwiki table.edit input{border:none;background:transparent;font:inherit;width:100%;}html>body div.dokuwiki table.edit th,html>body div.dokuwiki table.edit td{background-image:url(/docs/wiki/lib/plugins/edittable/images/inputshadow.png);background-repeat:repeat-x;background-position:top;}div.dokuwiki table.edit td.handle{color:#666;background-color:#f5f5f5;padding:0;vertical-align:bottom;position:relative;}div.dokuwiki table.edit td.rowhandle{width:3em;}div.dokuwiki table.edit td.handle{cursor:move;}div.dokuwiki table.edit td.curhandle{background-color:#dee7ec;}div.dokuwiki table.edit td.disabledhandle{background-image:none;background-color:#c0c0c0;cursor:no-drop;}html>body div.dokuwiki table.edit td.handle{background-image:url(/docs/wiki/lib/plugins/edittable/images/buttonshadow.png);background-repeat:repeat-x;background-position:bottom;}#table__dragmarker{display:block;height:100%;width:100%;position:relative;}#table__dragmarker .dragmarker_topright{position:absolute;top:-0.5em;right:0px;}#table__dragmarker .dragmarker_bottomright{position:absolute;top:0.5em;right:0px;}#table__dragmarker .dragmarker_bottomleft{position:absolute;top:0.5em;left:0px;}.handle .handle_dropdown{float:right;margin-top:3px;}.handle .handle_dropdown img{padding:4px 2px 1px;cursor:pointer;}#dw__editform .handle .handle_dropdown div{position:absolute;z-index:25;}#dw__editform .handle .handle_dropdown div ul{background:#fff none repeat scroll 0 0;border:1px solid;list-style-image:none;list-style-position:outside;list-style-type:none;opacity:0.9;padding:0.3em;margin:0;cursor:auto;font-size:0.9em;}#dw__editform .handle .handle_dropdown div ul li{width:100%;text-align:left;}#dw__editform .handle .handle_dropdown div ul li a{width:100%;display:block;cursor:pointer;}#dw__editform .handle .handle_dropdown div ul li a:hover{background:#dee7ec;}div.dokuwiki div.editbutton_table{margin-top:-1em;}div.dokuwiki div.editbutton_table form input.button{float:none;margin-left:0.6em;padding:0 0.3em;background-image:none;border-top:none;border-bottom-right-radius:0.5em;-moz-border-radius-bottomright:0.5em;-webkit-border-bottom-right-radius:0.5em;border-bottom-left-radius:0.5em;-moz-border-radius-bottomleft:0.5em;-webkit-border-bottom-left-radius:0.5em;}div.dokuwiki div.section_highlight table{background-color:#dee7ec;}div.dokuwiki div.table.section_highlight{background-color:transparent !important;}.noteredirect{margin:1em;margin-left:auto;margin-right:auto;width:70% !important;min-height:18px;clear:both;text-align:justify;vertical-align:middle;border-collapse:collapse;padding:7px 10px 5px 32px;background-position:10px 50%;background-repeat:no-repeat;-moz-border-radius:10px;-khtml-border-radius:10px;border-radius:10px;background-color:#B5E0FF;background-image:url(/docs/wiki/lib/plugins/pageredirect/images/important_small.png);}#user__manager tr.disabled{color:#6f6f6f;background:#e4e4e4;}#user__manager tr.user_info{vertical-align:top;}#user__manager div.edit_user{width:46%;float:left;}#user__manager table{margin-bottom:1em;}#user__manager input.button[disabled]{color:#ccc!important;border-color:#ccc!important;}#plugin__manager h2{margin-left:0;}#plugin__manager form{display:block;margin:0;padding:0;}#plugin__manager legend{display:none;}#plugin__manager fieldset{width:auto;}#plugin__manager .button{margin:0;}#plugin__manager p,#plugin__manager label{text-align:left;}#plugin__manager .hidden{display:none;}#plugin__manager .new{background:#dee7ec;}#plugin__manager input[disabled]{color:#ccc;border-color:#ccc;}#plugin__manager .pm_menu,#plugin__manager .pm_info{margin-left:0;text-align:left;}#plugin__manager .pm_menu{float:left;width:48%;}#plugin__manager .pm_info{float:right;width:50%;}#plugin__manager .common fieldset{margin:0;padding:0 0 1.0em 0;text-align:left;border:none;}#plugin__manager .common label{padding:0 0 0.5em 0;}#plugin__manager .common input.edit{width:24em;margin:0.5em;}#plugin__manager .plugins fieldset{color:#000;background:#fff;text-align:right;border-top:none;border-right:none;border-left:none;}#plugin__manager .plugins fieldset.protected{background:#fdd;color:#000;}#plugin__manager .plugins fieldset.disabled{background:#e0e0e0;color:#a8a8a8;}#plugin__manager .plugins .legend{color:#000;background:inherit;display:block;margin:0;padding:0;font-size:1em;line-height:1.4em;font-weight:normal;text-align:left;float:left;padding:0;clear:none;}#plugin__manager .plugins .button{font-size:95%;}#plugin__manager .plugins fieldset.buttons{border:none;}#plugin__manager .plugins fieldset.buttons .button{float:left;}#plugin__manager .pm_info h3{margin-left:0;}#plugin__manager .pm_info dl{margin:1em 0;padding:0;}#plugin__manager .pm_info dt{width:6em;float:left;clear:left;margin:0;padding:0;}#plugin__manager .pm_info dd{margin:0 0 0 7em;padding:0;background:none;}#plugin__manager .plugins .enable{float:left;width:auto;margin-right:0.5em;}.dokuwiki #plugin__captcha_wrapper img{margin:1px;vertical-align:bottom;border:1px solid #8cacbb;}#config__manager div.success,#config__manager div.error,#config__manager div.info{background-position:0.5em;padding:0.5em;text-align:center;}#config__manager fieldset{margin:1em;width:auto;margin-bottom:2em;background-color:#dee7ec;color:#000;padding:0 1em;}#config__manager legend{font-size:1.25em;}#config__manager form{}#config__manager table{margin:1em 0;width:100%;}#config__manager fieldset td{text-align:left;}#config__manager fieldset td.value{width:31em;}#config__manager td.label{padding:0.8em 0 0.6em 1em;vertical-align:top;}#config__manager td.label label{clear:left;display:block;}#config__manager td.label img{padding:0 10px;vertical-align:middle;float:right;}#config__manager td.label span.outkey{font-size:70%;margin-top:-1.7em;margin-left:-1em;display:block;background-color:#fff;color:#666;float:left;padding:0 0.1em;position:relative;z-index:1;}#config__manager td input.edit{width:30em;}#config__manager td .input{width:30.8em;}#config__manager td select.edit{}#config__manager td textarea.edit{width:27.5em;height:4em;}#config__manager tr .input,#config__manager tr input,#config__manager tr textarea,#config__manager tr select{background-color:#fff;color:#000;}#config__manager tr.default .input,#config__manager tr.default input,#config__manager tr.default textarea,#config__manager tr.default select,#config__manager .selectiondefault{background-color:#cdf;color:#000;}#config__manager tr.protected .input,#config__manager tr.protected input,#config__manager tr.protected textarea,#config__manager tr.protected select,#config__manager tr.protected .selection{background-color:#fcc!important;color:#000 !important;}#config__manager td.error{background-color:red;color:#000;}#config__manager .selection{width:14.8em;float:left;margin:0 0.3em 2px 0;}#config__manager .selection label{float:right;width:14em;font-size:90%;}* html #config__manager .selection label{padding-top:2px;}#config__manager .selection input.checkbox{padding-left:0.7em;}#config__manager .other{clear:both;padding-top:0.5em;}#config__manager .other label{padding-left:2px;font-size:90%;}div.noteclassic,div.noteimportant,div.notewarning,div.notetip{margin:2em;margin-left:auto;margin-right:auto;width:70% !important;min-height:40px;clear:both;text-align:justify;vertical-align:middle;border-collapse:collapse;padding:15px 20px 15px 80px;background-position:20px 50%;background-repeat:no-repeat;-moz-border-radius:20px;-khtml-border-radius:20px;border-radius:20px;}div.noteclassic{background-color:#eef;background-image:url(/docs/wiki/lib/plugins/note/images/note.png);}div.noteimportant{background-color:#ffc;background-image:url(/docs/wiki/lib/plugins/note/images/important.png);}div.notewarning{background-color:#fdd;background-image:url(/docs/wiki/lib/plugins/note/images/warning.png);}div.notetip{background-color:#dfd;background-image:url(/docs/wiki/lib/plugins/note/images/tip.png);}.dtree{font-family:Verdana,Geneva,Arial,Helvetica,sans-serif;font-size:11px;color:#000;white-space:nowrap;line-height:normal;}.dtree img{border:0px;vertical-align:top;}.dtree a{color:#090;text-decoration:none;}.dtree a.node,.dtree a.nodeSel a.navSel{white-space:nowrap;padding:1px 2px 1px 2px;}.dtree a.nodeSel{background-color:#dee7ec;}.dtree a.navSel{background-color:#ff9;}.indexmenu_nojs{display:block;}div.li a.indexmenu_idx{color:#f30 !important;text-decoration:none !important;font-weight:bold;}div.li a.indexmenu_idx_head{font-weight:bold;}div.dokuwiki div.indexmenu_list_themes{clear:both;border-top:2px solid #8cacbb;padding-left:1em;}.dtree a.nodeFdUrl:hover,.dtree a.nodeSel:hover,a.navSel:hover,.dtree a.nodeUrl:hover{color:#090;text-decoration:underline;background-color:#dee7ec;}.dtree a.node:hover{text-decoration:none;}.dtree .indexmenu_tocbullet{position:absolute;background:transparent url(/docs/wiki/lib/plugins/indexmenu/images/toc_bullet.gif) no-repeat scroll;vertical-align:middle;width:11px;height:11px;}.dtree .indexmenu_larrow{position:absolute;filter:alpha(opacity=60);-moz-opacity:.60;opacity:.60;background:transparent url(/docs/wiki/lib/plugins/indexmenu/images/larrow.gif) repeat-y scroll;padding-left:22px;z-index:100;}.indexmenu_toc{font-size:80%;line-height:1.2em;white-space:normal;overflow:hidden;width:200px !important;z-index:100 !important;word-wrap:break-word;}.indexmenu_toc .indexmenu_toc_inside{border:1px solid #8cacbb;background-color:#fff;text-align:left;padding:0.5em 0 0.7em 0;max-height:300px;height:expression( this.scrollHeight > 300 ? "300px":"auto" );overflow:auto;}.dtree .indexmenu_rarrow{position:absolute;background:white url(/docs/wiki/lib/plugins/indexmenu/images/rarrow.gif) no-repeat scroll;width:11px;height:15px;}.indexmenu_rmenu{position:absolute;z-index:100;background-color:#fff;border:1px solid black;font-size:80%;line-height:100%;padding-bottom:5px;}.indexmenu_rmenuhead{background:#CFC url(/docs/wiki/lib/plugins/indexmenu/images/close.gif) no-repeat scroll;border-bottom:1px solid #000;color:#000;font-size:90%;margin:0pt;text-align:left;padding:1px 15px;vertical-align:middle;overflow:hidden;width:80px;}.indexmenu_rmenu ul,.indexmenu_rmenu li{list-style-type:none !important;list-style-image:none !important;color:#000 !important;margin:2px !important;text-align:center;}.indexmenu_rmenu a:hover{background-color:#000 !important;color:#fff !important;}.indexmenu_opts{font-size:80%;}.dtree .emptynode{background:transparent url(/docs/wiki/lib/plugins/indexmenu/images/empty.gif) no-repeat scroll;display:inline;padding:1px 8px;width:16px;height:16px;vertical-align:top;zoom:1;}div.dokuwiki .header{padding:3px 0 0 2px;}div.dokuwiki .pagename{float:left;font-size:200%;font-weight:bolder;color:#dee7ec;text-align:left;vertical-align:middle;}div.dokuwiki .pagename a{color:#436976 !important;text-decoration:none !important;}div.dokuwiki .logo{float:right;font-size:220%;font-weight:bolder;text-align:right;vertical-align:middle;}div.dokuwiki .logo a{color:#dee7ec !important;text-decoration:none !important;font-variant:small-caps;letter-spacing:2pt;}div.dokuwiki .bar{border:1px #e0e0e0 solid;background:#f8f8f8;padding:10px;clear:both;}div.dokuwiki .bar-left{float:left;}div.dokuwiki .bar-right{float:right;text-align:right;}div.dokuwiki #bar__bottom{margin-bottom:3px;}div.dokuwiki .bar-tools{display:none;border-left:1px #e0e0e0 solid;border-right:1px #e0e0e0 solid;border-bottom:1px #e0e0e0 solid;background:#f8f8f8;padding:10px;clear:both;}div.dokuwiki div.meta{clear:both;margin:20px 0px 0px 0px;color:#638c9c;font-size:70%;}div.dokuwiki div.meta div.user{float:left;}div.dokuwiki div.meta div.doc{text-align:right;}*{padding:0;margin:0;}body{font:80% "Lucida Grande",Verdana,Lucida,Helvetica,Arial,sans-serif;background-color:#fff;color:#000;}div.dokuwiki div.page{text-align:justify;}div.dokuwiki table{font-size:100%;}div.dokuwiki tr,div.dokuwiki td,div.dokuwiki th{}div.dokuwiki img{border:0;}div.dokuwiki p,div.dokuwiki blockquote,div.dokuwiki table,div.dokuwiki pre{margin:0 0 1.0em 0;}div.dokuwiki hr{border:0px;border-top:1px solid #8cacbb;text-align:center;height:0px;}div.dokuwiki div.nothing{text-align:center;margin:2em;}div.dokuwiki form{border:none;display:inline;}div.dokuwiki label.block{display:block;text-align:right;font-weight:bold;}div.dokuwiki label.simple{display:block;text-align:left;font-weight:normal;}div.dokuwiki label.block input.edit{width:50%;}div.dokuwiki fieldset{width:300px;text-align:center;border:1px solid #8cacbb;padding:0.5em;margin:auto;}div.dokuwiki textarea.edit{font-family:monospace;font-size:14px;color:#000;background-color:#fff;border:1px solid #8cacbb;padding:0.3em 0 0 0.3em;width:100%;}html>body div.dokuwiki textarea.edit{background:#fff url(/docs/wiki/lib/tpl/default/images/inputshadow.png) repeat-x top;}div.dokuwiki input.edit,div.dokuwiki select.edit{font-size:100%;border:1px solid #8cacbb;color:#000;background-color:#fff;vertical-align:middle;margin:1px;padding:0.20em 0.3em;display:inline;}html>body div.dokuwiki input.edit,html>body div.dokuwiki select.edit{background:#fff url(/docs/wiki/lib/tpl/default/images/inputshadow.png) repeat-x top;}div.dokuwiki select.edit{padding:0.1em 0;}div.dokuwiki input.missing{font-size:100%;border:1px solid #8cacbb;color:#000;background-color:#fcc;vertical-align:middle;margin:1px;padding:0.20em 0.3em;display:inline;}div.dokuwiki textarea.edit[disabled],div.dokuwiki textarea.edit[readonly],div.dokuwiki input.edit[disabled],div.dokuwiki input.edit[readonly],div.dokuwiki input.button[disabled],div.dokuwiki select.edit[disabled]{background-color:#f5f5f5!important;color:#666!important;}div.dokuwiki div.toolbar,div.dokuwiki div#wiki__editbar{margin:2px 0;text-align:left;}div.dokuwiki div#size__ctl{float:right;width:60px;height:2.7em;}div.dokuwiki #size__ctl img{cursor:pointer;}div.dokuwiki div#wiki__editbar div.editButtons{float:left;padding:0 1.0em 0.7em 0;}div.dokuwiki div#wiki__editbar div.summary{float:left;}div.dokuwiki .nowrap{white-space:nowrap;}div.dokuwiki div#draft__status{float:right;color:#638c9c;}div.dokuwiki div.license{padding:0.5em;font-size:90%;text-align:center;}div.dokuwiki form#dw__editform div.license{clear:left;font-size:90%;}div.dokuwiki input.button,div.dokuwiki button.button{border:1px solid #8cacbb;color:#000;background-color:#fff;vertical-align:middle;text-decoration:none;font-size:100%;cursor:pointer;margin:1px;padding:0.125em 0.4em;}html>body div.dokuwiki input.button,html>body div.dokuwiki button.button{background:#fff url(/docs/wiki/lib/tpl/default/images/buttonshadow.png) repeat-x bottom;}* html div.dokuwiki input.button,* html div.dokuwiki button.button{height:1.8em;}div.dokuwiki div.secedit input.button{border:1px solid #8cacbb;color:#000;background-color:#fff;vertical-align:middle;text-decoration:none;margin:0;padding:0;font-size:10px;cursor:pointer;float:right;display:inline;}div.dokuwiki div.pagenav{margin:1em 0 0 0;}div.dokuwiki div.pagenav-prev{text-align:right;float:left;width:49%}div.dokuwiki div.pagenav-next{text-align:left;float:right;width:49%}div.dokuwiki a:link,div.dokuwiki a:visited{color:#436976;text-decoration:none;}div.dokuwiki a:hover,div.dokuwiki a:active{color:#000;text-decoration:underline;}div.dokuwiki h1 a{text-decoration:none !important;}div.dokuwiki h2 a,div.dokuwiki h3 a,div.dokuwiki h4 a,div.dokuwiki h5 a,div.dokuwiki a.nolink{color:#000 !important;text-decoration:none !important;}div.dokuwiki a.interwiki{}div.dokuwiki a.media{}div.dokuwiki a.mail{background:transparent url(/docs/wiki/lib/tpl/default/images/mail_icon.gif) 0px 1px no-repeat;padding:1px 0px 1px 16px;}div.dokuwiki a.wikilink2{text-decoration:none !important;border-bottom:dashed 1px #f30 !important;}div.dokuwiki div.preview{background-color:#f5f5f5;margin:0 0 0 2em;padding:4px;border:1px dashed #000;}div.dokuwiki div.breadcrumbs{background:url(http://s0.percona.com/ui-tab-bg.png) -14px left repeat-x;color:#999;font-size:11px;font-style:italic;padding:7px 0 15px 12px;}div.dokuwiki div.breadcrumbs a,div.dokuwiki div.breadcrumbs a:visited{color:#999 !important;border-color:#999 !important;}div.dokuwiki div.breadcrumbs a:hover{color:#d12907 !important;border-color:#d12907 !important;}div.dokuwiki span.user{color:#ccc;font-size:90%;}div.dokuwiki li.minor{color:#666;font-style:italic;}div.dokuwiki img.media{margin:3px;}div.dokuwiki img.medialeft{border:0;float:left;margin:0 1.5em 0 0;}div.dokuwiki img.mediaright{border:0;float:right;margin:0 0 0 1.5em;}div.dokuwiki img.mediacenter{border:0;display:block;margin:0 auto;}div.dokuwiki img.middle{vertical-align:middle;}div.dokuwiki acronym{cursor:help;border-bottom:1px dotted #000;}div.dokuwiki li.open{list-style-image:url(/docs/wiki/lib/tpl/default/images/open.gif);}div.dokuwiki li.closed{list-style-image:url(/docs/wiki/lib/tpl/default/images/closed.gif);}div.dokuwiki blockquote{border-left:2px solid #8cacbb;padding-left:3px;}div.dokuwiki pre{font-size:80%;padding:10px;border:1px dashed #8cacbb;color:#000;overflow:auto;}div.dokuwiki pre.pre{background-color:#f7f9fa;}div.dokuwiki pre.code{background-color:#f7f9fa;}div.dokuwiki pre.file{background-color:#dee7ec;}div.dokuwiki dl.file,div.dokuwiki dl.code{margin-top:2em;margin-bottom:2.5em;}div.dokuwiki dl.file dt,div.dokuwiki dl.code dt{border:1px dashed #8cacbb;display:inline;padding:0.1em 1em;margin-left:2em;}div.dokuwiki dl.code dt a,div.dokuwiki dl.file dt a{color:#000;}div.dokuwiki dl.code dt{background-color:#f7f9fa;border-bottom:1px solid #f7f9fa;}div.dokuwiki dl.file dt{background-color:#dee7ec;border-bottom:1px solid #dee7ec;}div.dokuwiki table.inline{background-color:#fff;border-spacing:0px;border-collapse:collapse;}div.dokuwiki table.inline th{padding:3px;border:1px solid #8cacbb;background-color:#dee7ec;}div.dokuwiki table.inline td{padding:3px;border:1px solid #8cacbb;}#toc{width:258px;font-size:12px;line-height:16px;clear:both;border:1px #e0e0e0 solid;background:#fff url(http://s1.percona.com/ui-tab-bg.png) top left repeat-x;}#toc div.tocheader{text-align:left;font-weight:bold;padding:7px 10px;margin-bottom:2px;font-size:16px;}#toc div.tocheader a,#toc div.tocheader a:visited{color:#000 !important;text-decoration:none !important;}#toc div.tocheader a:hover{color:#d12907 !important;text-decoration:none !important;}#toc span.toc_open,#toc span.toc_close{float:right;display:block;margin:0.4em 3px 0 0;}#toc span.toc_open span,#toc span.toc_close span{display:none;}#toc span.toc_open{margin-top:0.4em;border-top:0.4em solid #000;}#toc span.toc_close{margin-top:0;border-bottom:0.4em solid #000;}#toc #toc__inside{text-align:left;padding:1px 15px 15px 13px;}#toc ul.toc{list-style-type:none;padding-left:0px !important;margin:0;}#toc ul.toc ul{padding-left:15px !important;}#toc ul.toc li{margin:5px 0px !important;}#toc ul.toc li.clear{padding-left:0;}#toc a.toc:link,#toc a.toc:visited{color:#d12907;text-decoration:underline;}#toc a.toc:hover,#toc a.toc:active{color:#712000;text-decoration:underline;}div.dokuwiki table.diff{background-color:#fff;width:100%;}div.dokuwiki td.diff-blockheader{font-weight:bold;}div.dokuwiki table.diff th{border-bottom:1px solid #8cacbb;font-size:110%;width:50%;font-weight:normal;text-align:left;}div.dokuwiki table.diff th a{font-weight:bold;}div.dokuwiki table.diff th span.user{color:#000;font-size:80%;}div.dokuwiki table.diff th span.sum{font-size:80%;font-weight:bold;}div.dokuwiki table.diff th.minor{font-style:italic;}div.dokuwiki table.diff td{font-family:monospace;font-size:100%;}div.dokuwiki td.diff-addedline{background-color:#dfd;}div.dokuwiki td.diff-deletedline{background-color:#ffb;}div.dokuwiki td.diff-context{background-color:#f5f5f5;}div.dokuwiki table.diff td.diff-addedline strong,div.dokuwiki table.diff td.diff-deletedline strong{color:red;}div.dokuwiki div.footnotes{clear:both;border-top:1px solid #8cacbb;padding-left:1em;margin-top:1em;}div.dokuwiki div.fn{font-size:90%;}div.dokuwiki a.fn_bot{font-weight:bold;}div.insitu-footnote{font-size:80%;line-height:1.2em;border:1px solid #8cacbb;background-color:#f7f9fa;text-align:left;padding:4px;max-width:40%;}* html .insitu-footnote pre.code,* html .insitu-footnote pre.file{padding-bottom:18px;}div.dokuwiki .search_result{margin-bottom:6px;padding:0 10px 0 30px;}div.dokuwiki .search_snippet{color:#ccc;font-size:12px;margin-left:20px;}div.dokuwiki .search_sep{color:#000;}div.dokuwiki .search_hit{color:#000;background-color:#ff9;}div.dokuwiki strong.search_hit{font-weight:normal;}div.dokuwiki div.search_quickresult{margin:0 0 15px 30px;padding:0 10px 10px 0;border-bottom:1px dashed #8cacbb;}div.dokuwiki div.search_quickresult h3{margin:0 0 1.0em 0;font-size:1em;font-weight:bold;}div.dokuwiki ul.search_quickhits{margin:0 0 0.5em 1.0em;}div.dokuwiki ul.search_quickhits li{margin:0 1.0em 0 1.0em;float:left;width:30%;}div.dokuwiki div.section_highlight{background-color:#dee7ec;}div.footerinc{text-align:center;}.footerinc a img{opacity:0.5;border:0;}.footerinc a:hover img{opacity:1;}div.dokuwiki div.ajax_qsearch{position:absolute;right:237px;;width:200px;opacity:0.9;display:none;font-size:80%;line-height:1.2em;border:1px solid #8cacbb;background-color:#f7f9fa;text-align:left;padding:4px;}button.toolbutton{background-color:#fff;padding:0px;margin:0 1px 0 0;border:1px solid #8cacbb;cursor:pointer;}html>body button.toolbutton{background:#fff url(/docs/wiki/lib/tpl/default/images/buttonshadow.png) repeat-x bottom;}div.picker{width:250px;border:1px solid #8cacbb;background-color:#dee7ec;}div.pk_hl{width:125px;}button.pickerbutton{padding:0px;margin:0 1px 1px 0;border:0;background-color:transparent;font-size:80%;cursor:pointer;}div.dokuwiki div.img_big{float:left;margin-right:0.5em;}div.dokuwiki dl.img_tags dt{font-weight:bold;background-color:#dee7ec;}div.dokuwiki dl.img_tags dd{background-color:#f5f5f5;}div.dokuwiki div.imagemeta{color:#666;font-size:70%;line-height:95%;}div.dokuwiki div.imagemeta img.thumb{float:left;margin-right:0.1em;}div.dokuwiki h4{border-top:none !important;margin:20px 0px 20px 0px !important;}#media__manager{height:100%;overflow:hidden;}#media__left{width:30%;border-right:solid 1px #8cacbb;height:100%;overflow:auto;position:absolute;left:0;}#media__right{width:69.7%;height:100%;overflow:auto;position:absolute;right:0;}#media__manager h1{margin:0;padding:0;margin-bottom:0.5em;}#media__tree img{float:left;padding:0.5em 0.3em 0 0;}#media__tree ul{list-style-type:none;list-style-image:none;margin-left:1.5em;}#media__tree li{clear:left;list-style-type:none;list-style-image:none;}*+html #media__tree li,* html #media__tree li{border:1px solid #fff;}#media__opts{padding-left:1em;margin-bottom:0.5em;}#media__opts input{float:left;display:block;margin-top:4px;position:absolute;}*+html #media__opts input,* html #media__opts input{position:static;}#media__opts label{display:block;float:left;margin-left:20px;margin-bottom:4px;}*+html #media__opts label,* html #media__opts label{margin-left:10px;}#media__opts br{clear:left;}#media__content img.load{margin:1em auto;}#media__content #scroll__here{border:1px dashed #8cacbb;}#media__content .odd{background-color:#f7f9fa;padding:0.4em;}#media__content .even{padding:0.4em;}#media__content a.mediafile{margin-right:1.5em;font-weight:bold;}#media__content div.detail{padding:0.3em 0 0.3em 2em;}#media__content div.detail div.thumb{float:left;width:130px;text-align:center;margin-right:0.4em;}#media__content img.btn{vertical-align:text-bottom;}#media__content div.example{color:#666;margin-left:1em;}#media__content div.upload{font-size:90%;padding:0 0.5em 0.5em 0.5em;}#media__content form#dw__upload,#media__content div#dw__flashupload{display:block;border-bottom:solid 1px #8cacbb;padding:0 0.5em 1em 0.5em;}#media__content form#dw__upload fieldset{padding:0;margin:0;border:none;width:auto;}#media__content form#dw__upload p{text-align:left;padding:0.25em 0;margin:0;line-height:1.0em;}#media__content form#dw__upload label.check{float:none;width:auto;margin-left:11.5em;}#media__content form.meta{display:block;padding:0 0 1em 0;}#media__content form.meta label{display:block;width:25%;float:left;font-weight:bold;margin-left:1em;clear:left;}#media__content form.meta .edit{font:100% "Lucida Grande",Verdana,Lucida,Helvetica,Arial,sans-serif;float:left;width:70%;padding-right:0;padding-left:0.2em;margin:2px;}#media__content form.meta textarea.edit{height:8em;}#media__content form.meta div.metafield{clear:left;}#media__content form.meta div.buttons{clear:left;margin-left:20%;padding-left:1em;}#media__popup{background-color:#fff;display:none;border:1px solid #8cacbb;position:absolute;width:270px;}#media__popup h1{text-align:center;font-weight:normal;background-color:#dee7ec;height:16px;margin-bottom:5px;font-size:12px;border-bottom:0;}#media__popup p{display:block;line-height:14pt;margin:0.5em;}#media_nolink{padding:4px 0;}#media__popup label{float:left;width:9em;}#media__popup .button{margin-left:auto;margin-right:auto;}#media__popup .btnlbl{text-align:center;}#media__popup .btnlbl input{margin:0 1em;}#media__closeimg{float:right;}#media__linkopts label,#media__nolnk{width:80px;float:left;margin-left:10px;}#media__linkopts label{line-height:20px;}#media__nolnk,#media__linkopts label.long{margin-bottom:8px;line-height:12px;}#media__linkopts label.long{width:150px;float:none;}#media__linkopts br{clear:both;}#media__linkopts select{width:60px;margin-left:10px;}#media__linkopts input.edit{width:50px;margin-left:10px;}#media__linkopts #media__title{width:150px;}#admin__version{clear:left;float:right;color:#666;}.dokuwiki ul.admin_tasks{font-size:115%;float:left;width:40%;list-style-type:none;}.dokuwiki ul.admin_tasks li{line-height:22px;padding-left:35px;margin:1em 0;background:transparent none no-repeat scroll 0 0;text-align:left;}.dokuwiki ul.admin_tasks li div.li{font-weight:bold;}.dokuwiki ul.admin_tasks li.admin_acl{background-image:url(/docs/wiki/lib/tpl/default/../../images/admin/acl.png);}.dokuwiki ul.admin_tasks li.admin_usermanager{background-image:url(/docs/wiki/lib/tpl/default/../../images/admin/usermanager.png);}.dokuwiki ul.admin_tasks li.admin_plugin{background-image:url(/docs/wiki/lib/tpl/default/../../images/admin/plugin.png);}.dokuwiki ul.admin_tasks li.admin_config{background-image:url(/docs/wiki/lib/tpl/default/../../images/admin/config.png);}.dokuwiki ul.admin_tasks li.admin_revert{background-image:url(/docs/wiki/lib/tpl/default/../../images/admin/revert.png);}.dokuwiki ul.admin_tasks li.admin_popularity{background-image:url(/docs/wiki/lib/tpl/default/../../images/admin/popularity.png);}#link__wiz{position:absolute;display:block;z-index:99;width:300px;height:250px;padding:0;margin:0;overflow:hidden;border:1px solid #8cacbb;background-color:#f5f5f5;text-align:center;}#link__wiz_header{background-color:#dee7ec;height:16px;margin-bottom:5px;}#link__wiz_close{cursor:pointer;margin:0;}#link__wiz_result{background-color:#fff;width:293px;height:193px;overflow:auto;border:1px solid #8cacbb;margin:3px auto;text-align:left;}#link__wiz_result div.type_u{padding:3px 3px 3px 22px;background:transparent url(/docs/wiki/lib/tpl/default/../../images/up.png) 3px 3px no-repeat;}#link__wiz_result div.type_f{padding:3px 3px 3px 22px;background:transparent url(/docs/wiki/lib/tpl/default/../../images/page.png) 3px 3px no-repeat;}#link__wiz_result div.type_d{padding:3px 3px 3px 22px;background:transparent url(/docs/wiki/lib/tpl/default/../../images/ns.png) 3px 3px no-repeat;}#link__wiz_result div.even{background-color:#f5f5f5;}#link__wiz_result div.selected{background-color:#dee7ec;}#link__wiz_result span{display:block;color:#666;}.ondrag{cursor:move;opacity:0.8;}form#subscribe__form{display:block;width:300px;text-align:center;}form#subscribe__form fieldset{text-align:left;margin:0.5em 0;}form#subscribe__form label{display:block;margin:0 0.5em 0.5em;}
2865+
2866+
2867+
2868+/***
2869+ * side style buttons
2870+*/
2871+.a-btn-container {
2872+ overflow:hidden;
2873+ border-radius:4px;
2874+}
2875+.a-btn, .a-btn-green, .a-btn-red{
2876+
2877+ width: 245px;
2878+ background:#f2aa2e;
2879+ background:-webkit-gradient(linear,left top,left bottom,color-stop(##f2aa2e,0),color-stop(##c7401e,1));
2880+ background:-webkit-linear-gradient(top, #f2aa2e 0%, #c7401e 100%);
2881+ background:-moz-linear-gradient(top, #f2aa2e 0%, #c7401e 100%);
2882+ background:-o-linear-gradient(top, #f2aa2e 0%, #c7401e 100%);
2883+ background:linear-gradient(top, #f2aa2e 0%, #c7401e 100%);
2884+ filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#f2aa2e', endColorstr='#c7401e',GradientType=0 );
2885+ border:1px solid #f5b74e;
2886+ border-color:#f5b74e #e5a73e #d6982f;
2887+ -webkit-box-shadow:0 1px 1px #d3d3d3, inset 0 1px 0 #fee395;
2888+ -moz-box-shadow:0 1px 1px #d3d3d3, inset 0 1px 0 #fee395;
2889+ box-shadow:0 1px 1px #d3d3d3, inset 0 1px 0 #fee395;
2890+ padding:0px;
2891+ height:65px;
2892+ display:inline-block;
2893+ position:relative;
2894+ -webkit-border-radius:4px;
2895+ -moz-border-radius:4px;
2896+ border-radius:4px;
2897+ float:left;
2898+ overflow:hidden;
2899+ -webkit-transition:all 0.3s linear;
2900+ -moz-transition:all 0.3s linear;
2901+ -o-transition:all 0.3s linear;
2902+ transition:all 0.3s linear;
2903+ text-decoration: none !important;
2904+}
2905+.a-btn-green{
2906+ background:#a1de78;
2907+ background:-webkit-gradient(linear,left top,left bottom,color-stop(##a1de78,0),color-stop(##a1de78,1));
2908+ background:-webkit-linear-gradient(top, #00e05a 0%, #006127 100%);
2909+ background:-moz-linear-gradient(center top , #00e05a 0%, #006127 130%);
2910+ background:-o-linear-gradient(top, #00e05a 0%, #006127 100%);
2911+ background:linear-gradient(top, #00e05a 0%, #006127 100%);
2912+ filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#00e05a', endColorstr='#444444',GradientType=0 );
2913+ border:1px solid #f5b74e;
2914+ border-color:#00ba4b #009A00 #007A31;
2915+ -webkit-box-shadow:0 1px 1px #d3d3d3, inset 0 1px 0 #00ED5F;
2916+ -moz-box-shadow:0 1px 1px #d3d3d3, inset 0 1px 0 #00ED5F;
2917+ box-shadow:0 1px 1px #d3d3d3, inset 0 1px 0 #00ED5F;
2918+}
2919+
2920+.a-btn-red{
2921+ background:#e31300;
2922+ background:-webkit-gradient(linear,left top,left bottom,color-stop(##e31300,0),color-stop(##6b0900,1));
2923+ background:-webkit-linear-gradient(top, #e31300 0%, #6b0900 100%);
2924+ background:-moz-linear-gradient(center top , #e31300 0%, #6b0900 130%);
2925+ background:-o-linear-gradient(top, #e31300 0%, #6b0900 100%);
2926+ background:linear-gradient(top, #e31300 0%, #6b0900 100%);
2927+ filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#e31300', endColorstr='#444444',GradientType=0 );
2928+ border:1px solid #ff2d19;
2929+ border-color:#e85345 #b00f00 #63241e;
2930+ -webkit-box-shadow:0 1px 1px #d3d3d3, inset 0 1px 0 #fa430c;
2931+ -moz-box-shadow:0 1px 1px #d3d3d3, inset 0 1px 0 #fa430c;
2932+ box-shadow:0 1px 1px #d3d3d3, inset 0 1px 0 #fa430c;
2933+}
2934+
2935+
2936+.a-btn-text{
2937+ padding-left:15px;
2938+ padding-top:10px;
2939+ display:block;
2940+ font-size:18px;
2941+ white-space:nowrap;
2942+ color: #f5f1ea;
2943+ text-shadow:0 1px 0 #000;
2944+ -webkit-transition:all 0.3s linear;
2945+ -moz-transition:all 0.3s linear;
2946+ -o-transition:all 0.3s linear;
2947+ transition:all 0.3s linear;
2948+
2949+}
2950+.a-btn-green .a-btn-text {
2951+ color: #fff;
2952+}
2953+
2954+.a-btn-slide-text, .a-btn-fixed-slide-text {
2955+ position:absolute;
2956+ top:35px;
2957+ left:0px;
2958+ width:auto;
2959+ right:52px;
2960+ height:0px;
2961+ background:#fff;
2962+ color:#996633;
2963+ font-size:13px;
2964+ white-space:nowrap;
2965+ font-family:Georgia, serif;
2966+ font-style:italic;
2967+ text-indent:15px;
2968+ overflow:hidden;
2969+ line-height:30px;
2970+ -webkit-box-shadow:-1px 0px 1px rgba(255,255,255,0.4), 1px 1px 1px rgba(0,0,0,0.5) inset;
2971+ -moz-box-shadow:-1px 0px 1px rgba(255,255,255,0.4), 1px 1px 1px rgba(0,0,0,0.5) inset;
2972+ box-shadow:-1px 0px 1px rgba(255,255,255,0.4), 1px 1px 1px rgba(0,0,0,0.5) inset;
2973+ -webkit-transition:height 0.3s linear;
2974+ -moz-transition:height 0.3s linear;
2975+ -o-transition:height 0.3s linear;
2976+ transition:height 0.3s linear;
2977+}
2978+.a-btn-fixed-slide-text{
2979+ height: 30px;
2980+}
2981+
2982+.a-btn-icon-right{
2983+ position:absolute;
2984+
2985+ right:0px;
2986+ top:0px;
2987+ height:100%;
2988+ width:52px;
2989+ border-left:1px solid #f5b74e;
2990+ -webkit-box-shadow:1px 0px 1px rgba(255,255,255,0.4) inset;
2991+ -moz-box-shadow:1px 0px 1px rgba(255,255,255,0.4) inset;
2992+ box-shadow:1px 0px 1px rgba(255,255,255,0.4) inset;
2993+}
2994+.a-btn-red .a-btn-icon-right {
2995+ border-left: 1px solid #fa430c;
2996+}
2997+.a-btn-icon-right span{
2998+ width:38px;
2999+ height:38px;
3000+
3001+ position:absolute;
3002+ left:50%;
3003+ top:50%;
3004+ margin:-20px 0px 0px -20px;
3005+ background:transparent url(/static/images/software-download-white-brdr.png) no-repeat 50% 55%;
3006+ -webkit-transition:all 0.3s linear;
3007+ -moz-transition:all 0.3s linear;
3008+ -o-transition:all 0.3s linear;
3009+ transition:all 0.3s linear;
3010+
3011+}
3012+.a-btn-green .a-btn-icon-right span {
3013+ background:transparent url(/static/images/software-download-white-brdr-green3.png) no-repeat 50% 55%;
3014+}
3015+.a-btn-red .a-btn-icon-right span {
3016+
3017+ background:transparent url(/static/images/software-download-white-brdr-red.png) no-repeat 50% 55%;
3018+}
3019+.a-btn:hover{
3020+ height:65px;
3021+ -webkit-box-shadow:0px 1px 1px rgba(255,255,255,0.8) inset, 1px 1px 5px rgba(0,0,0,0.4);
3022+ -moz-box-shadow:0px 1px 1px rgba(255,255,255,0.8) inset, 1px 1px 5px rgba(0,0,0,0.4);
3023+ box-shadow:0px 1px 1px rgba(255,255,255,0.8) inset, 1px 1px 5px rgba(0,0,0,0.4);
3024+}
3025+.a-btn:hover .a-btn-text{
3026+
3027+ text-shadow:0 1px 0 #000;
3028+ color:#fff;
3029+}
3030+.a-btn:hover .a-btn-slide-text:hover{
3031+ height:30px;
3032+}
3033+.a-btn:hover .a-btn-icon-right span{
3034+ opacity:1;
3035+ /**
3036+ -webkit-transform:rotate(-45deg);
3037+ -moz-transform:rotate(-45deg);
3038+ -ms-transform:rotate(-45deg);
3039+ -o-transform:rotate(-45deg);
3040+ transform:rotate(-45deg);
3041+ */
3042+}
3043+.a-btn:active{
3044+ position:relative;
3045+ top:1px;
3046+ background:#fec354;
3047+ background:-webkit-gradient(linear,left top,left bottom,color-stop(#fec354,0),color-stop(#fecd61,1));
3048+ background:-webkit-linear-gradient(top, #fec354 0%, #fecd61 100%);
3049+ background:-moz-linear-gradient(top, #fec354 0%, #fecd61 100%);
3050+ background:-o-linear-gradient(top, #fec354 0%, #fecd61 100%);
3051+ background:linear-gradient(top, #fec354 0%, #fecd61 100%);
3052+ filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#fec354', endColorstr='#fecd61',GradientType=0 );
3053+ border-color:#d29a3a #cc9436 #c89133;
3054+ text-shadow:0 1px 0 #fee1a0;
3055+ -webkit-box-shadow:0 1px 1px #d4d4d4, inset 0 1px 0 #fed17e;
3056+ -moz-box-shadow:0 1px 1px #d4d4d4, inset 0 1px 0 #fed17e;
3057+ box-shadow:0 1px 1px #d4d4d4, inset 0 1px 0 #fed17e;
3058+}
3059+.body .section blockquote {
3060+ margin-left: 25px;
3061+}
3062
3063=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/percona.com.js'
3064--- Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/percona.com.js 1970-01-01 00:00:00 +0000
3065+++ Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/percona.com.js 2012-05-08 06:39:22 +0000
3066@@ -0,0 +1,269 @@
3067+window.jQuery(function($) {
3068+
3069+
3070+
3071+function setCookie(c_name, value, expiredays)
3072+{
3073+ var exdate = new Date();
3074+ exdate.setDate(exdate.getDate() + expiredays);
3075+ document.cookie = c_name + "=" + escape(value) + ((expiredays == null) ? "" : ";path=/;expires=" + exdate.toUTCString());
3076+}
3077+
3078+function getCookie(c_name)
3079+{
3080+ if (document.cookie.length > 0)
3081+ {
3082+ c_start = document.cookie.indexOf(c_name + "=");
3083+ if (c_start != -1)
3084+ {
3085+ c_start = c_start + c_name.length+1;
3086+ c_end = document.cookie.indexOf(";",c_start);
3087+ if (c_end == -1)
3088+ {
3089+ c_end = document.cookie.length;
3090+ }
3091+ return unescape(document.cookie.substring(c_start, c_end));
3092+ }
3093+ }
3094+ return "";
3095+}
3096+
3097+
3098+NAVI = new Object();
3099+
3100+NAVI.CloseTimer = null;
3101+
3102+NAVI.Open = function ( menu_tag, dir )
3103+{
3104+ NAVI_CancelTimer();
3105+ NAVI_Close();
3106+ SEARCH_CancelTimer();
3107+ SEARCH_Close();
3108+ if ('h' == dir)
3109+ {
3110+ return;
3111+ }
3112+ var pos = $("#navilink-span-"+menu_tag).offset();
3113+ if (dir=='r')
3114+ {
3115+ $("#navi-dropdown-"+menu_tag).css( { "position": "absolute", "left": (pos.left + ($("#navilink-span-"+menu_tag).width()) + 2 - ($("#navi-dropdown-"+menu_tag).width())) + "px", "top": (pos.top + 32) + "px" } );
3116+ }
3117+ else
3118+ {
3119+ $("#navi-dropdown-"+menu_tag).css( { "position": "absolute", "left": (pos.left) + "px", "top": (pos.top + 32) + "px" } );
3120+ }
3121+ $("#navi-dropdown-"+menu_tag).show();
3122+ $("#navilink-span-"+menu_tag).bind('mouseover',NAVI_CancelTimer);
3123+ $("#navilink-span-"+menu_tag).bind('mouseout',NAVI_Timer);
3124+ $("#navi-dropdown-"+menu_tag).bind('mouseover',NAVI_CancelTimer);
3125+ $("#navi-dropdown-"+menu_tag).bind('mouseout',NAVI_Timer);
3126+};
3127+
3128+function NAVI_Close()
3129+{
3130+ $(".navi-dropdown").hide();
3131+ $("#menu div").unbind('mouseover');
3132+ $(".dropdown").unbind('mouseover');
3133+ $(".dropdown").unbind('mouseout');
3134+
3135+ $("#search-dropdown").hide();
3136+ $("#searchlink-anchor").unbind('mouseover');
3137+ $("#searchlink-anchor").unbind('mouseout');
3138+ $("#search-dropdown").unbind('mouseover');
3139+ $("#search-dropdown").unbind('mouseout');
3140+}
3141+
3142+function NAVI_CancelTimer()
3143+{
3144+ if (NAVI.CloseTimer!=null)
3145+ {
3146+ window.clearTimeout(NAVI.CloseTimer);
3147+ NAVI.CloseTimer = null;
3148+ }
3149+}
3150+
3151+function NAVI_Timer()
3152+{
3153+ if (NAVI.CloseTimer==null)
3154+ {
3155+ NAVI.CloseTimer = window.setTimeout(NAVI_Close, 300);
3156+ }
3157+}
3158+
3159+
3160+SUBNAVI = new Object();
3161+
3162+SUBNAVI.Open = function ( menu_tag )
3163+{
3164+ if ($("#sidesubnavi-" + menu_tag + ':hidden').length)
3165+ {
3166+ $(".sidesubnavi").hide();
3167+ $("#sidesubnavi-"+menu_tag).show();
3168+ return false;
3169+ } else {
3170+ return true;
3171+ }
3172+};
3173+
3174+
3175+SEARCH = new Object();
3176+
3177+SEARCH.CloseTimer = null;
3178+
3179+SEARCH.Open = function()
3180+{
3181+ NAVI_CancelTimer();
3182+ NAVI_Close();
3183+ SEARCH_CancelTimer();
3184+ SEARCH_Close();
3185+ var pos = $("#searchlink-anchor").offset();
3186+ $("#search-dropdown").css( { "position": "absolute", "left": (pos.left - ($("#search-dropdown").width()) + 40) + "px", "top": (pos.top + 36) + "px" } );
3187+ $("#search-dropdown").show();
3188+ $("#searchlink-anchor").bind('mouseover',NAVI_CancelTimer);
3189+ $("#searchlink-anchor").bind('mouseout',NAVI_Timer);
3190+ $("#search-dropdown").bind('mouseover',NAVI_CancelTimer);
3191+ $("#search-dropdown").bind('mouseout',NAVI_Timer);
3192+ $("#search-input")[0].focus();
3193+};
3194+
3195+function SEARCH_Close()
3196+{
3197+ $(".navi-dropdown").hide();
3198+ $("#menu div").unbind('mouseover');
3199+ $(".dropdown").unbind('mouseover');
3200+ $(".dropdown").unbind('mouseout');
3201+
3202+ $("#search-dropdown").hide();
3203+ $("#searchlink-anchor").unbind('mouseover');
3204+ $("#searchlink-anchor").unbind('mouseout');
3205+ $("#search-dropdown").unbind('mouseover');
3206+ $("#search-dropdown").unbind('mouseout');
3207+}
3208+
3209+
3210+function SEARCH_CancelTimer()
3211+{
3212+ if (SEARCH.CloseTimer!=null)
3213+ {
3214+ window.clearTimeout(SEARCH.CloseTimer);
3215+ SEARCH.CloseTimer = null;
3216+ }
3217+}
3218+
3219+function SEARCH_Timer()
3220+{
3221+ if (SEARCH.CloseTimer==null)
3222+ {
3223+ SEARCH.CloseTimer = window.setTimeout(SEARCH_Close, 300);
3224+ }
3225+}
3226+
3227+menuImg1 = new Image(); menuImg1.src = 'http://s1.percona.com/ui-dropdown-header-l.png';
3228+menuImg2 = new Image(); menuImg2.src = 'http://s2.percona.com/ui-dropdown-header-r.png';
3229+menuImg3 = new Image(); menuImg3.src = 'http://s3.percona.com/ui-dropdown-header-search.png';
3230+menuImg4 = new Image(); menuImg4.src = 'http://s0.percona.com/ui-dropdown-bg.png';
3231+menuImg5 = new Image(); menuImg5.src = 'http://s1.percona.com/ui-dropdown-footer.png';
3232+
3233+
3234+});
3235+
3236+
3237+var Percona = {
3238+ ssl: false,
3239+ host: 'www.percona.com'
3240+};
3241+/**
3242+ * @param string selector jQuery selector string
3243+ */
3244+Percona.getRecentServerVersion = function(selector)
3245+{
3246+ if ('string' != typeof(selector))
3247+ {
3248+ alert('Percona.getRecentServerVersion: missed or wrong selector!');
3249+ }
3250+ /* Localize jQuery variable */
3251+ var jQuery;
3252+ /******** Load jQuery if not present *********/
3253+ if (window.jQuery === undefined || window.jQuery.fn.jquery !== '1.4.2')
3254+ {
3255+ var script_tag = document.createElement('script');
3256+ script_tag.setAttribute("type","text/javascript");
3257+ script_tag.setAttribute('src', 'http' + (Percona.ssl ? 's' : '') + ':/' + '/ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js');
3258+ script_tag.onload = scriptLoadHandler;
3259+ script_tag.onreadystatechange = function () /* Same thing but for IE */
3260+ {
3261+ if (this.readyState == 'complete' || this.readyState == 'loaded')
3262+ {
3263+ scriptLoadHandler();
3264+ }
3265+ };
3266+ /* Try to find the head, otherwise default to the documentElement */
3267+ (document.getElementsByTagName("head")[0] || document.documentElement).appendChild(script_tag);
3268+ } else {
3269+ /* The jQuery version on the window is the one we want to use */
3270+ jQuery = window.jQuery;
3271+ main();
3272+ }
3273+ var scriptLoadHandler_counter = 0;
3274+ /******** Called once jQuery has loaded ******/
3275+ function scriptLoadHandler()
3276+ {
3277+ if (++scriptLoadHandler_counter > 1)
3278+ {
3279+ return;
3280+ }
3281+ /* Restore $ and window.jQuery to their previous values and store the
3282+ new jQuery in our local jQuery variable */
3283+ jQuery = window.jQuery.noConflict(true);
3284+ /* Call our main function */
3285+ main(jQuery);
3286+ }
3287+ /******** Our main function ********/
3288+ function main($)
3289+ {
3290+ var fillRecentServerVersion = function($)
3291+ {
3292+ if ($(selector).get(0))
3293+ {
3294+ $.get('http' + (Percona.ssl ? 's' : '') + ':/' + '/' + Percona.host + '/ajax/server-version/?callback=?', {}, function(json)
3295+ {
3296+ if ('object' == typeof(json) && 'string' == typeof(json.recentServerVersion))
3297+ {
3298+ $(selector).text(' ' + json.recentServerVersion);
3299+ }
3300+ }, 'jsonp');
3301+ }
3302+ };
3303+ $(document).ready(function()
3304+ {
3305+ fillRecentServerVersion(jQuery);
3306+ });
3307+ }
3308+};
3309+
3310+$(document).ready(function(){
3311+ $(window).bind("resize", resizeWindow);
3312+ resizeWindow();
3313+ function resizeWindow() {
3314+ var win_w = $(window).width();
3315+ var ribon = $("#support-ribbon");
3316+ if(win_w < 1265){
3317+ if(/mobile/i.test(navigator.userAgent)){
3318+ ribon.hide();
3319+ }else{
3320+ if(ribon.hasClass("vertical")){
3321+ ribon.removeClass("vertical");
3322+ ribon.addClass("horizontal");
3323+ }
3324+ ribon.css({"left":'50%', "margin-left": '-'+(ribon.width() / 2)+'px'});
3325+ }
3326+ }else{
3327+ if(ribon.hasClass("horizontal")){
3328+ ribon.addClass("vertical");
3329+ ribon.removeClass("horizontal");
3330+ ribon.removeAttr("style");
3331+ }
3332+
3333+ }
3334+ }
3335+});
3336\ No newline at end of file
3337
3338=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/phone-small.png'
3339Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/phone-small.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/phone-small.png 2012-05-08 06:39:22 +0000 differ
3340=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/phone.png'
3341Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/phone.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/phone.png 2012-05-08 06:39:22 +0000 differ
3342=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/shield.png'
3343Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/shield.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/shield.png 2012-05-08 06:39:22 +0000 differ
3344=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/sidebar.js'
3345--- Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/sidebar.js 1970-01-01 00:00:00 +0000
3346+++ Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/sidebar.js 2012-05-08 06:39:22 +0000
3347@@ -0,0 +1,151 @@
3348+/*
3349+ * sidebar.js
3350+ * ~~~~~~~~~~
3351+ *
3352+ * This script makes the Sphinx sidebar collapsible.
3353+ *
3354+ * .sphinxsidebar contains .sphinxsidebarwrapper. This script adds
3355+ * in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton
3356+ * used to collapse and expand the sidebar.
3357+ *
3358+ * When the sidebar is collapsed the .sphinxsidebarwrapper is hidden
3359+ * and the width of the sidebar and the margin-left of the document
3360+ * are decreased. When the sidebar is expanded the opposite happens.
3361+ * This script saves a per-browser/per-session cookie used to
3362+ * remember the position of the sidebar among the pages.
3363+ * Once the browser is closed the cookie is deleted and the position
3364+ * reset to the default (expanded).
3365+ *
3366+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
3367+ * :license: BSD, see LICENSE for details.
3368+ *
3369+ */
3370+
3371+$(function() {
3372+ // global elements used by the functions.
3373+ // the 'sidebarbutton' element is defined as global after its
3374+ // creation, in the add_sidebar_button function
3375+ var bodywrapper = $('.bodywrapper');
3376+ var sidebar = $('.sphinxsidebar');
3377+ var sidebarwrapper = $('.sphinxsidebarwrapper');
3378+
3379+ // for some reason, the document has no sidebar; do not run into errors
3380+ if (!sidebar.length) return;
3381+
3382+ // original margin-left of the bodywrapper and width of the sidebar
3383+ // with the sidebar expanded
3384+ var bw_margin_expanded = bodywrapper.css('margin-left');
3385+ var ssb_width_expanded = sidebar.width();
3386+
3387+ // margin-left of the bodywrapper and width of the sidebar
3388+ // with the sidebar collapsed
3389+ var bw_margin_collapsed = '.8em';
3390+ var ssb_width_collapsed = '.8em';
3391+
3392+ // colors used by the current theme
3393+ var dark_color = $('.related').css('background-color');
3394+ var light_color = $('.document').css('background-color');
3395+
3396+ function sidebar_is_collapsed() {
3397+ return sidebarwrapper.is(':not(:visible)');
3398+ }
3399+
3400+ function toggle_sidebar() {
3401+ if (sidebar_is_collapsed())
3402+ expand_sidebar();
3403+ else
3404+ collapse_sidebar();
3405+ }
3406+
3407+ function collapse_sidebar() {
3408+ sidebarwrapper.hide();
3409+ sidebar.css('width', ssb_width_collapsed);
3410+ bodywrapper.css('margin-left', bw_margin_collapsed);
3411+ sidebarbutton.css({
3412+ 'margin-left': '0',
3413+ 'height': bodywrapper.height()
3414+ });
3415+ sidebarbutton.find('span').text('»');
3416+ sidebarbutton.attr('title', _('Expand sidebar'));
3417+ document.cookie = 'sidebar=collapsed';
3418+ }
3419+
3420+ function expand_sidebar() {
3421+ bodywrapper.css('margin-left', bw_margin_expanded);
3422+ sidebar.css('width', ssb_width_expanded);
3423+ sidebarwrapper.show();
3424+ sidebarbutton.css({
3425+ 'margin-left': ssb_width_expanded-12,
3426+ 'height': bodywrapper.height()
3427+ });
3428+ sidebarbutton.find('span').text('«');
3429+ sidebarbutton.attr('title', _('Collapse sidebar'));
3430+ document.cookie = 'sidebar=expanded';
3431+ }
3432+
3433+ function add_sidebar_button() {
3434+ sidebarwrapper.css({
3435+ 'float': 'left',
3436+ 'margin-right': '0',
3437+ 'width': ssb_width_expanded - 28
3438+ });
3439+ // create the button
3440+ sidebar.append(
3441+ '<div id="sidebarbutton"><span>&laquo;</span></div>'
3442+ );
3443+ var sidebarbutton = $('#sidebarbutton');
3444+ light_color = sidebarbutton.css('background-color');
3445+ // find the height of the viewport to center the '<<' in the page
3446+ var viewport_height;
3447+ if (window.innerHeight)
3448+ viewport_height = window.innerHeight;
3449+ else
3450+ viewport_height = $(window).height();
3451+ sidebarbutton.find('span').css({
3452+ 'display': 'block',
3453+ 'margin-top': (viewport_height - sidebar.position().top - 20) / 2
3454+ });
3455+
3456+ sidebarbutton.click(toggle_sidebar);
3457+ sidebarbutton.attr('title', _('Collapse sidebar'));
3458+ sidebarbutton.css({
3459+ 'color': '#FFFFFF',
3460+ 'border-left': '1px solid ' + dark_color,
3461+ 'font-size': '1.2em',
3462+ 'cursor': 'pointer',
3463+ 'height': bodywrapper.height(),
3464+ 'padding-top': '1px',
3465+ 'margin-left': ssb_width_expanded - 12
3466+ });
3467+
3468+ sidebarbutton.hover(
3469+ function () {
3470+ $(this).css('background-color', dark_color);
3471+ },
3472+ function () {
3473+ $(this).css('background-color', light_color);
3474+ }
3475+ );
3476+ }
3477+
3478+ function set_position_from_cookie() {
3479+ if (!document.cookie)
3480+ return;
3481+ var items = document.cookie.split(';');
3482+ for(var k=0; k<items.length; k++) {
3483+ var key_val = items[k].split('=');
3484+ var key = key_val[0];
3485+ if (key == 'sidebar') {
3486+ var value = key_val[1];
3487+ if ((value == 'collapsed') && (!sidebar_is_collapsed()))
3488+ collapse_sidebar();
3489+ else if ((value == 'expanded') && (sidebar_is_collapsed()))
3490+ expand_sidebar();
3491+ }
3492+ }
3493+ }
3494+
3495+ add_sidebar_button();
3496+ var sidebarbutton = $('#sidebarbutton');
3497+ set_position_from_cookie();
3498+});
3499
3500=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/software-download.png'
3501Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/software-download.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/software-download.png 2012-05-08 06:39:22 +0000 differ
3502=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/software-latest.png'
3503Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/software-latest.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/software-latest.png 2012-05-08 06:39:22 +0000 differ
3504=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/support-small.png'
3505Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/support-small.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/support-small.png 2012-05-08 06:39:22 +0000 differ
3506=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-dropdown-bg.png'
3507Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-dropdown-bg.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-dropdown-bg.png 2012-05-08 06:39:22 +0000 differ
3508=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-dropdown-footer.png'
3509Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-dropdown-footer.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-dropdown-footer.png 2012-05-08 06:39:22 +0000 differ
3510=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-dropdown-header-l.png'
3511Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-dropdown-header-l.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-dropdown-header-l.png 2012-05-08 06:39:22 +0000 differ
3512=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-dropdown-header-r.png'
3513Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-dropdown-header-r.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-dropdown-header-r.png 2012-05-08 06:39:22 +0000 differ
3514=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-dropdown-header-search.png'
3515Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-dropdown-header-search.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-dropdown-header-search.png 2012-05-08 06:39:22 +0000 differ
3516=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-footer-logo.png'
3517Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-footer-logo.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-footer-logo.png 2012-05-08 06:39:22 +0000 differ
3518=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-leftnavi-sel.png'
3519Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-leftnavi-sel.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-leftnavi-sel.png 2012-05-08 06:39:22 +0000 differ
3520=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-logo.png'
3521Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-logo.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-logo.png 2012-05-08 06:39:22 +0000 differ
3522=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-navi-hover-l.png'
3523Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-navi-hover-l.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-navi-hover-l.png 2012-05-08 06:39:22 +0000 differ
3524=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-navi-hover-r.png'
3525Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-navi-hover-r.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-navi-hover-r.png 2012-05-08 06:39:22 +0000 differ
3526=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-navi-l.png'
3527Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-navi-l.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-navi-l.png 2012-05-08 06:39:22 +0000 differ
3528=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-navi-r.png'
3529Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-navi-r.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-navi-r.png 2012-05-08 06:39:22 +0000 differ
3530=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-navi-sel-l.png'
3531Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-navi-sel-l.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-navi-sel-l.png 2012-05-08 06:39:22 +0000 differ
3532=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-navi-sel-r.png'
3533Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-navi-sel-r.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-navi-sel-r.png 2012-05-08 06:39:22 +0000 differ
3534=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-orange-content.png'
3535Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-orange-content.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-orange-content.png 2012-05-08 06:39:22 +0000 differ
3536=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-orange-front.png'
3537Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-orange-front.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-orange-front.png 2012-05-08 06:39:22 +0000 differ
3538=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-search.png'
3539Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-search.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-search.png 2012-05-08 06:39:22 +0000 differ
3540=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-tab-bg.png'
3541Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-tab-bg.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/ui-tab-bg.png 2012-05-08 06:39:22 +0000 differ
3542=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/warning.png'
3543Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/warning.png 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/static/warning.png 2012-05-08 06:39:22 +0000 differ
3544=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/theme.conf'
3545--- Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/theme.conf 1970-01-01 00:00:00 +0000
3546+++ Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona-theme/theme.conf 2012-05-08 06:39:22 +0000
3547@@ -0,0 +1,32 @@
3548+[theme]
3549+inherit = default
3550+stylesheet = default.css
3551+pygments_style = sphinx
3552+
3553+[options]
3554+rightsidebar = false
3555+stickysidebar = false
3556+collapsiblesidebar = false
3557+externalrefs = false
3558+
3559+footerbgcolor = #11303d
3560+footertextcolor = #ffffff
3561+sidebarbgcolor = #1c4e63
3562+sidebarbtncolor = #3c6e83
3563+sidebartextcolor = #ffffff
3564+sidebarlinkcolor = #98dbcc
3565+relbarbgcolor = #133f52
3566+relbartextcolor = #ffffff
3567+relbarlinkcolor = #ffffff
3568+bgcolor = #ffffff
3569+textcolor = #000000
3570+headbgcolor = #f2f2f2
3571+headtextcolor = #20435c
3572+headlinkcolor = #c60f0f
3573+linkcolor = #355f7c
3574+visitedlinkcolor = #355f7c
3575+codebgcolor = #eeffcc
3576+codetextcolor = #333333
3577+
3578+bodyfont = sans-serif
3579+headfont = 'Arial', 'Helvetica' sans-serif
3580
3581=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona_favicon.ico'
3582Binary files Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona_favicon.ico 1970-01-01 00:00:00 +0000 and Percona-Server/plugin/percona-pam-for-mysql/doc/source/percona_favicon.ico 2012-05-08 06:39:22 +0000 differ
3583=== added file 'Percona-Server/plugin/percona-pam-for-mysql/doc/source/release-notes.rst'
3584--- Percona-Server/plugin/percona-pam-for-mysql/doc/source/release-notes.rst 1970-01-01 00:00:00 +0000
3585+++ Percona-Server/plugin/percona-pam-for-mysql/doc/source/release-notes.rst 2012-05-08 06:39:22 +0000
3586@@ -0,0 +1,8 @@
3587+============================================================
3588+ |Percona| PAM authentication plugin for MySQL Release Notes
3589+============================================================
3590+
3591+Preview Release
3592+===============
3593+
3594+Initial public release
3595
3596=== added directory 'Percona-Server/plugin/percona-pam-for-mysql/m4'
3597=== added directory 'Percona-Server/plugin/percona-pam-for-mysql/src'
3598=== added file 'Percona-Server/plugin/percona-pam-for-mysql/src/Makefile.am'
3599--- Percona-Server/plugin/percona-pam-for-mysql/src/Makefile.am 1970-01-01 00:00:00 +0000
3600+++ Percona-Server/plugin/percona-pam-for-mysql/src/Makefile.am 2012-05-08 06:39:22 +0000
3601@@ -0,0 +1,37 @@
3602+# (C) 2011 Percona Inc.
3603+#
3604+# This program is free software; you can redistribute it and/or modify
3605+# it under the terms of the GNU General Public License as published by
3606+# the Free Software Foundation; version 2 of the License.
3607+#
3608+# This program is distributed in the hope that it will be useful,
3609+# but WITHOUT ANY WARRANTY; without even the implied warranty of
3610+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3611+# GNU General Public License for more details.
3612+#
3613+# You should have received a copy of the GNU General Public License
3614+# along with this program; if not, write to the Free Software
3615+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
3616+#
3617+
3618+plugindir = @PLUGINDIR@
3619+
3620+plugin_LTLIBRARIES = auth_pam.la auth_pam_compat.la test_auth_pam_client.la dialog.la
3621+plugin_CPPFLAGS = -DMYSQL_DYNAMIC_PLUGIN
3622+plugin_LDFLAGS = -module -avoid-version -shared
3623+
3624+auth_pam_la_SOURCES = auth_pam_common.c auth_pam.c lib_auth_pam_client.h lib_auth_pam_client.c auth_mapping.c
3625+auth_pam_la_CPPFLAGS = $(plugin_CPPFLAGS)
3626+auth_pam_la_LDFLAGS = $(plugin_LDFLAGS) $(AUTH_PAM_LIBS)
3627+
3628+auth_pam_compat_la_SOURCES = auth_pam_common.c auth_pam_compat.c lib_auth_pam_client.h lib_auth_pam_client.c auth_mapping.c
3629+auth_pam_compat_la_CPPFLAGS = $(plugin_CPPFLAGS)
3630+auth_pam_compat_la_LDFLAGS = $(plugin_LDFLAGS) $(AUTH_PAM_LIBS)
3631+
3632+test_auth_pam_client_la_SOURCES = test_auth_pam_client.c \
3633+ lib_auth_pam_client.h lib_auth_pam_client.c
3634+test_auth_pam_client_la_LDFLAGS = $(plugin_LDFLAGS)
3635+
3636+dialog_la_SOURCES = dialog.c
3637+dialog_la_CPPFLAGS = $(plugin_CPPFLAGS)
3638+dialog_la_LDFLAGS = $(plugin_LDFLAGS) $(DIALOG_LIBS)
3639
3640=== added file 'Percona-Server/plugin/percona-pam-for-mysql/src/auth_mapping.c'
3641--- Percona-Server/plugin/percona-pam-for-mysql/src/auth_mapping.c 1970-01-01 00:00:00 +0000
3642+++ Percona-Server/plugin/percona-pam-for-mysql/src/auth_mapping.c 2012-05-08 06:39:22 +0000
3643@@ -0,0 +1,249 @@
3644+/*
3645+(C) 2012 Percona Inc.
3646+
3647+This program is free software; you can redistribute it and/or modify
3648+it under the terms of the GNU General Public License as published by
3649+the Free Software Foundation; version 2 of the License.
3650+
3651+This program is distributed in the hope that it will be useful,
3652+but WITHOUT ANY WARRANTY; without even the implied warranty of
3653+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3654+GNU General Public License for more details.
3655+
3656+You should have received a copy of the GNU General Public License
3657+along with this program; if not, write to the Free Software
3658+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
3659+*/
3660+
3661+#include "auth_mapping.h"
3662+#include <pwd.h>
3663+#include <grp.h>
3664+#include <string.h>
3665+#include <stdlib.h>
3666+#include <ctype.h>
3667+
3668+#define MIN(X,Y) ((X) < (Y) ? (X) : (Y))
3669+
3670+/** The maximum length of buffer for storing NSS record. NSS will store in
3671+ buffer the whole result of lookup request including user name,
3672+ gecos, etc. */
3673+enum { max_nss_name_len = 10240 };
3674+
3675+/** Token representation:
3676+ token type, string repr, length of token */
3677+struct token
3678+{
3679+ enum { tok_id, tok_comma, tok_eq, tok_eof } token_type;
3680+ const char *token;
3681+ int token_len;
3682+};
3683+
3684+/** Iterator in key-value mapping:
3685+ position and length of key,
3686+ position and length of value,
3687+ current position in string */
3688+struct mapping_iter {
3689+ const char *key;
3690+ int key_len;
3691+ const char *value;
3692+ int value_len;
3693+ const char *ptr;
3694+};
3695+
3696+
3697+/** Lookup NSS database for group name by specified user name.
3698+ On sucess user_group returned, otherwise NULL */
3699+char *lookup_user_group (const char *user_name,
3700+ char *user_group, int user_group_len)
3701+{
3702+ struct passwd pwd, *pwd_result;
3703+ struct group grp, *grp_result;
3704+ char *buf;
3705+ int error;
3706+
3707+ buf= malloc(max_nss_name_len);
3708+ if (buf == NULL)
3709+ return NULL;
3710+
3711+ error= getpwnam_r(user_name, &pwd, buf, max_nss_name_len, &pwd_result);
3712+ if (error != 0 || pwd_result == NULL)
3713+ {
3714+ free(buf);
3715+ return NULL;
3716+ }
3717+
3718+ error= getgrgid_r(pwd_result->pw_gid,
3719+ &grp, buf, max_nss_name_len, &grp_result);
3720+ if (error != 0 || grp_result == NULL)
3721+ {
3722+ free(buf);
3723+ return NULL;
3724+ }
3725+
3726+ strncpy(user_group, grp_result->gr_name, user_group_len);
3727+ user_group[user_group_len]= '\0';
3728+ free(buf);
3729+
3730+ return user_group;
3731+}
3732+
3733+/** Get next token from buf. Returns new buf position. */
3734+static const char *get_token(struct token *token,
3735+ const char *buf)
3736+{
3737+ const char *ptr= buf;
3738+
3739+ while (*ptr && isspace(*ptr))
3740+ ++ptr;
3741+
3742+ token->token= ptr;
3743+ switch (*ptr)
3744+ {
3745+ case '\0':
3746+ token->token_type= tok_eof;
3747+ break;
3748+ case ',':
3749+ token->token_len= 1;
3750+ token->token_type = tok_comma;
3751+ ++ptr;
3752+ break;
3753+ case '=':
3754+ token->token_len= 1;
3755+ token->token_type = tok_eq;
3756+ ++ptr;
3757+ break;
3758+ default:
3759+ token->token_len= 0;
3760+ while (*ptr && !isspace(*ptr) && *ptr != ',' && *ptr != '=')
3761+ {
3762+ ++token->token_len;
3763+ ++ptr;
3764+ }
3765+ token->token_type= tok_id;
3766+ }
3767+
3768+ return ptr;
3769+}
3770+
3771+/** Create iterator through mapping string.
3772+ Initially iterator set to position before first
3773+ key-value pair. On success non-NULL pointer returned, otherwise NULL */
3774+struct mapping_iter *mapping_iter_new(const char *mapping_string)
3775+{
3776+ struct mapping_iter *it= malloc(sizeof(struct mapping_iter));
3777+ struct token token;
3778+ if (it != NULL)
3779+ {
3780+ it->key= NULL;
3781+ it->value= NULL;
3782+ /* eat up service name and move to (, key = value)* part */
3783+ it->ptr= get_token(&token, mapping_string);
3784+ }
3785+ return it;
3786+}
3787+
3788+/** Move iterator to next key-value pair.
3789+ On success pointer to key position in string returned,
3790+ otherwise NULL */
3791+const char *mapping_iter_next(struct mapping_iter *it)
3792+{
3793+ struct token token[4];
3794+
3795+ /* read next 4 tokens */
3796+ it->ptr= get_token(token + 3,
3797+ get_token(token + 2,
3798+ get_token(token + 1,
3799+ get_token(token, it->ptr))));
3800+
3801+ /* was it ", id = id"? */
3802+ if (!((token[0].token_type == tok_comma) &&
3803+ (token[1].token_type == tok_id) &&
3804+ (token[2].token_type == tok_eq) &&
3805+ (token[3].token_type == tok_id)))
3806+ {
3807+ /* we got something inconsistent */
3808+ return NULL;
3809+ }
3810+
3811+ /* set key */
3812+ it->key= token[1].token;
3813+ it->key_len= token[1].token_len;
3814+
3815+ /* set value */
3816+ it->value= token[3].token;
3817+ it->value_len= token[3].token_len;
3818+
3819+ return it->key;
3820+}
3821+
3822+/** Finish iteration and release iterator */
3823+void mapping_iter_free(struct mapping_iter *it)
3824+{
3825+ free(it);
3826+}
3827+
3828+/** Get value by given key. On success value_buf returned,
3829+ otherwise NULL */
3830+char *mapping_get_value(const char *key, char *value_buf, int value_buf_len,
3831+ const char *mapping_string)
3832+{
3833+ struct mapping_iter *it= mapping_iter_new(mapping_string);
3834+ int key_len= strlen(key);
3835+
3836+ if (it == NULL)
3837+ return NULL;
3838+
3839+ while (mapping_iter_next(it))
3840+ {
3841+ if (key_len == it->key_len && strncmp(key, it->key, key_len) == 0)
3842+ {
3843+ memcpy(value_buf, it->value, MIN(value_buf_len, it->value_len));
3844+ value_buf[MIN(value_buf_len, it->value_len)]= '\0';
3845+ mapping_iter_free(it);
3846+ return value_buf;
3847+ }
3848+ }
3849+ mapping_iter_free(it);
3850+
3851+ return NULL;
3852+}
3853+
3854+/** Get key in current iterator pos. On success buf returned,
3855+ otherwise NULL */
3856+char *mapping_iter_get_key(struct mapping_iter *it, char *buf, int buf_len)
3857+{
3858+ if (it->key == NULL)
3859+ return NULL;
3860+ memcpy(buf, it->key, MIN(buf_len, it->key_len));
3861+ buf[MIN(buf_len, it->key_len)]= '\0';
3862+ return buf;
3863+}
3864+
3865+/** Get value in current iterator pos. On success buf returned,
3866+ otherwise NULL */
3867+char *mapping_iter_get_value(struct mapping_iter *it, char *buf, int buf_len)
3868+{
3869+ if (it->value == NULL)
3870+ return NULL;
3871+ memcpy(buf, it->value, MIN(buf_len, it->value_len));
3872+ buf[MIN(buf_len, it->value_len)]= '\0';
3873+ return buf;
3874+}
3875+
3876+/** Get value by key. On success pointer to service_name
3877+ returned, otherwise NULL */
3878+char *mapping_get_service_name(char *buf, int buf_len,
3879+ const char *mapping_string)
3880+{
3881+ struct token token;
3882+
3883+ get_token(&token, mapping_string);
3884+ if (token.token_type == tok_id)
3885+ {
3886+ memcpy(buf, token.token, MIN(buf_len, token.token_len));
3887+ buf[MIN(buf_len, token.token_len)]= '\0';
3888+ return buf;
3889+ }
3890+
3891+ return NULL;
3892+}
3893
3894=== added file 'Percona-Server/plugin/percona-pam-for-mysql/src/auth_mapping.h'
3895--- Percona-Server/plugin/percona-pam-for-mysql/src/auth_mapping.h 1970-01-01 00:00:00 +0000
3896+++ Percona-Server/plugin/percona-pam-for-mysql/src/auth_mapping.h 2012-05-08 06:39:22 +0000
3897@@ -0,0 +1,74 @@
3898+#ifndef AUTH_MAPPING_INCLUDED
3899+#define AUTH_MAPPING_INCLUDED
3900+/*
3901+ (C) 2012 Percona Inc.
3902+
3903+ This program is free software; you can redistribute it and/or modify
3904+ it under the terms of the GNU General Public License as published by
3905+ the Free Software Foundation; version 2 of the License.
3906+
3907+ This program is distributed in the hope that it will be useful,
3908+ but WITHOUT ANY WARRANTY; without even the implied warranty of
3909+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3910+ GNU General Public License for more details.
3911+
3912+ You should have received a copy of the GNU General Public License
3913+ along with this program; if not, write to the Free Software
3914+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
3915+*/
3916+
3917+/**
3918+ @file
3919+
3920+ PAM authentication for MySQL, interface for user mapping.
3921+
3922+*/
3923+
3924+#ifdef __cplusplus
3925+extern "C" {
3926+#endif
3927+
3928+/** Mapping iterator. It's not exposed outsude */
3929+struct mapping_iter;
3930+
3931+/** Lookup NSS database for group name by specified user name.
3932+ On sucess user_group returned, otherwise NULL */
3933+char *lookup_user_group (const char *user_name,
3934+ char *user_group, int user_group_len);
3935+
3936+/** Create iterator through mapping string.
3937+ Initially iterator set to position before first
3938+ key-value pair. On success non-NULL pointer returned, otherwise NULL */
3939+struct mapping_iter *mapping_iter_new(const char *mapping_string);
3940+
3941+/** Move iterator to next key-value pair.
3942+ On success pointer to key position in string returned,
3943+ otherwise NULL */
3944+const char *mapping_iter_next(struct mapping_iter *it);
3945+
3946+/** Finish iteration and release iterator */
3947+void mapping_iter_free(struct mapping_iter *it);
3948+
3949+/** Get key at current iterator position. On success buf returned,
3950+ otherwise NULL */
3951+char *mapping_iter_get_key(struct mapping_iter *it, char *buf, int buf_len);
3952+
3953+/** Get value at current iterator position. On success buf returned,
3954+ otherwise NULL */
3955+char *mapping_iter_get_value(struct mapping_iter *it, char *buf, int buf_len);
3956+
3957+/** Get value by given key. On success value_buf returned,
3958+ otherwise NULL */
3959+char *mapping_get_value(const char *key, char *value_buf, int value_buf_len,
3960+ const char *mapping_string);
3961+
3962+/** Get service name for auth_string. On success buf returned,
3963+ otherwise NULL */
3964+char *mapping_get_service_name(char *buf, int buf_len,
3965+ const char *mapping_string);
3966+
3967+#ifdef __cplusplus
3968+}
3969+#endif
3970+
3971+#endif
3972
3973=== added file 'Percona-Server/plugin/percona-pam-for-mysql/src/auth_pam.c'
3974--- Percona-Server/plugin/percona-pam-for-mysql/src/auth_pam.c 1970-01-01 00:00:00 +0000
3975+++ Percona-Server/plugin/percona-pam-for-mysql/src/auth_pam.c 2012-05-08 06:39:22 +0000
3976@@ -0,0 +1,175 @@
3977+/*
3978+(C) 2012 Percona Inc.
3979+
3980+This program is free software; you can redistribute it and/or modify
3981+it under the terms of the GNU General Public License as published by
3982+the Free Software Foundation; version 2 of the License.
3983+
3984+This program is distributed in the hope that it will be useful,
3985+but WITHOUT ANY WARRANTY; without even the implied warranty of
3986+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3987+GNU General Public License for more details.
3988+
3989+You should have received a copy of the GNU General Public License
3990+along with this program; if not, write to the Free Software
3991+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
3992+*/
3993+
3994+/**
3995+ @file
3996+
3997+ PAM authentication for MySQL, server-side plugin for the
3998+ production use.
3999+
4000+ A general-purpose PAM authentication plugin for MySQL. Acts as a mediator
4001+ between the MySQL server, the MySQL client, and the PAM backend. Dialog plugin
4002+ used as client plugin.
4003+
4004+ The server plugin requests authentication from the PAM backend, forwards any
4005+ requests and messages from the PAM backend over the wire to the client (in
4006+ cleartext) and reads back any replies for the backend.
4007+
4008+ This plugin does not encrypt the communication channel in any way. If this is
4009+ required, a SSL connection should be used.
4010+
4011+ To install this plugin, copy the .so file to the plugin directory and do
4012+
4013+ INSTALL PLUGIN auth_pam SONAME 'auth_pam.so';
4014+
4015+ To use this plugin for one particular user, specify it at user's creation time
4016+ (TODO: tested with localhost only):
4017+
4018+ CREATE USER 'username'@'hostname' IDENTIFIED WITH auth_pam;
4019+
4020+ Alternatively UPDATE the mysql.user table to set the plugin value for an
4021+ existing user.
4022+
4023+ Also it is possible to use this plugin to authenticate anonymous users:
4024+
4025+ CREATE USER ''@'hostname' IDENTIFIED WITH auth_pam;
4026+
4027+*/
4028+
4029+#ifdef HAVE_CONFIG_H
4030+#include "config.h"
4031+#endif
4032+
4033+#include "auth_pam_common.h"
4034+
4035+/** The maximum length of buffered PAM messages, i.e. any messages up to the
4036+ next PAM reply-requiring message. 10K should be more than enough by order
4037+ of magnitude. */
4038+enum { max_pam_buffered_msg_len = 10240 };
4039+
4040+struct pam_msg_buf {
4041+ unsigned char buf[max_pam_buffered_msg_len];
4042+ unsigned char* ptr;
4043+};
4044+
4045+static char pam_msg_style_to_char (int pam_msg_style)
4046+{
4047+ /* Magic byte for the dialog plugin, '\2' is defined as ORDINARY_QUESTION
4048+ and '\4' as PASSWORD_QUESTION there. */
4049+ return (pam_msg_style == PAM_PROMPT_ECHO_ON) ? '\2' : '\4';
4050+}
4051+
4052+int auth_pam_client_talk_init(void **talk_data)
4053+{
4054+ struct pam_msg_buf *msg_buf= calloc(1, sizeof(struct pam_msg_buf));
4055+ *talk_data= (void*)msg_buf;
4056+ if (msg_buf != NULL)
4057+ {
4058+ msg_buf->ptr= msg_buf->buf + 1;
4059+ return PAM_SUCCESS;
4060+ }
4061+ return PAM_BUF_ERR;
4062+}
4063+
4064+void auth_pam_client_talk_finalize(void *talk_data)
4065+{
4066+ free(talk_data);
4067+}
4068+
4069+int auth_pam_talk_perform(const struct pam_message *msg,
4070+ struct pam_response *resp,
4071+ struct pam_conv_data *data,
4072+ void *talk_data)
4073+{
4074+ struct pam_msg_buf *msg_buf= (struct pam_msg_buf*)talk_data;
4075+
4076+ /* Append the PAM message or prompt to the unsent message buffer */
4077+ if (msg->msg)
4078+ {
4079+ unsigned char *last_buf_pos = msg_buf->buf + max_pam_buffered_msg_len - 1;
4080+ if (msg_buf->ptr + strlen(msg->msg) >= last_buf_pos)
4081+ {
4082+ /* Cannot happen: the PAM message buffer too small. */
4083+ MY_ASSERT_UNREACHABLE();
4084+ return PAM_CONV_ERR;
4085+ }
4086+ memcpy(msg_buf->ptr, msg->msg, strlen(msg->msg));
4087+ msg_buf->ptr+= strlen(msg->msg);
4088+ *(msg_buf->ptr)++= '\n';
4089+ }
4090+
4091+ if (msg->msg_style == PAM_PROMPT_ECHO_OFF
4092+ || msg->msg_style == PAM_PROMPT_ECHO_ON)
4093+ {
4094+ int pkt_len;
4095+ unsigned char *pkt;
4096+
4097+ msg_buf->buf[0]= pam_msg_style_to_char(msg->msg_style);
4098+
4099+ /* Write the message. */
4100+ if (data->vio->write_packet(data->vio, msg_buf->buf,
4101+ msg_buf->ptr - msg_buf->buf - 1))
4102+ return PAM_CONV_ERR;
4103+
4104+ /* Read the answer */
4105+ if ((pkt_len= data->vio->read_packet(data->vio, &pkt))
4106+ < 0)
4107+ return PAM_CONV_ERR;
4108+
4109+ resp->resp= malloc(pkt_len + 1);
4110+ if (resp->resp == NULL)
4111+ return PAM_BUF_ERR;
4112+
4113+ strncpy(resp->resp, (char *)pkt, pkt_len);
4114+ resp->resp[pkt_len]= '\0';
4115+
4116+ if (msg->msg_style == PAM_PROMPT_ECHO_OFF)
4117+ data->info->password_used= PASSWORD_USED_YES;
4118+
4119+ msg_buf->ptr= msg_buf->buf + 1;
4120+ }
4121+
4122+ return PAM_SUCCESS;
4123+}
4124+
4125+static struct st_mysql_auth pam_auth_handler=
4126+{
4127+ MYSQL_AUTHENTICATION_INTERFACE_VERSION,
4128+ "dialog",
4129+ &authenticate_user_with_pam_server
4130+};
4131+
4132+mysql_declare_plugin(auth_pam)
4133+{
4134+ MYSQL_AUTHENTICATION_PLUGIN,
4135+ &pam_auth_handler,
4136+ "auth_pam",
4137+ "Percona, Inc.",
4138+ "PAM authentication plugin",
4139+ PLUGIN_LICENSE_GPL,
4140+ NULL,
4141+ NULL,
4142+ 0x0001,
4143+ NULL,
4144+ NULL,
4145+ NULL
4146+#if MYSQL_PLUGIN_INTERFACE_VERSION >= 0x103
4147+ ,
4148+ 0
4149+#endif
4150+}
4151+mysql_declare_plugin_end;
4152
4153=== added file 'Percona-Server/plugin/percona-pam-for-mysql/src/auth_pam_common.c'
4154--- Percona-Server/plugin/percona-pam-for-mysql/src/auth_pam_common.c 1970-01-01 00:00:00 +0000
4155+++ Percona-Server/plugin/percona-pam-for-mysql/src/auth_pam_common.c 2012-05-08 06:39:22 +0000
4156@@ -0,0 +1,190 @@
4157+/*
4158+(C) 2011 Percona Inc.
4159+
4160+This program is free software; you can redistribute it and/or modify
4161+it under the terms of the GNU General Public License as published by
4162+the Free Software Foundation; version 2 of the License.
4163+
4164+This program is distributed in the hope that it will be useful,
4165+but WITHOUT ANY WARRANTY; without even the implied warranty of
4166+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4167+GNU General Public License for more details.
4168+
4169+You should have received a copy of the GNU General Public License
4170+along with this program; if not, write to the Free Software
4171+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
4172+*/
4173+
4174+#ifdef HAVE_CONFIG_H
4175+#include "config.h"
4176+#endif
4177+
4178+#include "auth_pam_common.h"
4179+#include "auth_mapping.h"
4180+
4181+/* The server plugin */
4182+
4183+/** The MySQL service name for PAM configuration */
4184+static const char* service_name_default= "mysqld";
4185+
4186+static int valid_pam_msg_style (int pam_msg_style)
4187+{
4188+ switch (pam_msg_style)
4189+ {
4190+ case PAM_PROMPT_ECHO_OFF:
4191+ case PAM_PROMPT_ECHO_ON:
4192+ case PAM_ERROR_MSG:
4193+ case PAM_TEXT_INFO:
4194+ return 1;
4195+ default:
4196+ return 0;
4197+ }
4198+}
4199+
4200+/** The maximum length of service name. It shouldn't be too long as it's
4201+ filename in pam.d directory also */
4202+enum { max_pam_service_name_len = 64 };
4203+
4204+static void free_pam_response (struct pam_response ** resp, int n)
4205+{
4206+ int i;
4207+ for (i = 0; i < n; i++)
4208+ {
4209+ free((*resp)[i].resp);
4210+ }
4211+ free(*resp);
4212+ *resp= NULL;
4213+}
4214+
4215+static int vio_server_conv (int num_msg, const struct pam_message **msg,
4216+ struct pam_response ** resp, void *appdata_ptr)
4217+{
4218+ int i;
4219+ int error;
4220+ void *talk_data;
4221+ struct pam_conv_data *data= (struct pam_conv_data *)appdata_ptr;
4222+
4223+ if (data == NULL)
4224+ {
4225+ MY_ASSERT_UNREACHABLE();
4226+ return PAM_CONV_ERR;
4227+ }
4228+
4229+ *resp = calloc (sizeof (struct pam_response), num_msg);
4230+ if (*resp == NULL)
4231+ return PAM_BUF_ERR;
4232+
4233+ error= auth_pam_client_talk_init(&talk_data);
4234+ if (error != PAM_SUCCESS)
4235+ {
4236+ free_pam_response(resp, 0);
4237+ return error;
4238+ }
4239+
4240+ for (i = 0; i < num_msg; i++)
4241+ {
4242+ if (!valid_pam_msg_style(msg[i]->msg_style))
4243+ {
4244+ auth_pam_client_talk_finalize(talk_data);
4245+ free_pam_response(resp, i);
4246+ return PAM_CONV_ERR;
4247+ }
4248+
4249+ error= auth_pam_talk_perform(msg[i], resp[i], data, talk_data);
4250+ if (error != PAM_SUCCESS)
4251+ {
4252+ auth_pam_client_talk_finalize(talk_data);
4253+ free_pam_response(resp, i);
4254+ return error;
4255+ }
4256+ }
4257+ auth_pam_client_talk_finalize(talk_data);
4258+ return PAM_SUCCESS;
4259+}
4260+
4261+int authenticate_user_with_pam_server (MYSQL_PLUGIN_VIO *vio,
4262+ MYSQL_SERVER_AUTH_INFO *info)
4263+{
4264+ pam_handle_t *pam_handle;
4265+ struct pam_conv_data data= { vio, info };
4266+ struct pam_conv conv_func_info= { &vio_server_conv, &data };
4267+ int error;
4268+ char *pam_mapped_user_name;
4269+ char user_group[MYSQL_USERNAME_LENGTH];
4270+ char service_name[max_pam_service_name_len];
4271+
4272+ /* Set service name as specified in auth_string. If no auth_string
4273+ provided or parsing error occurs, then keep default value */
4274+ strcpy(service_name, service_name_default);
4275+ if (info->auth_string)
4276+ mapping_get_service_name(service_name, sizeof(service_name), info->auth_string);
4277+
4278+ info->password_used= PASSWORD_USED_NO_MENTION;
4279+
4280+ error= pam_start(service_name,
4281+ info->user_name,
4282+ &conv_func_info, &pam_handle);
4283+ if (error != PAM_SUCCESS)
4284+ return CR_ERROR;
4285+
4286+ error= pam_set_item(pam_handle, PAM_RUSER, info->user_name);
4287+ if (error != PAM_SUCCESS)
4288+ {
4289+ pam_end(pam_handle, error);
4290+ return CR_ERROR;
4291+ }
4292+
4293+ error= pam_set_item(pam_handle, PAM_RHOST, info->host_or_ip);
4294+ if (error != PAM_SUCCESS)
4295+ {
4296+ pam_end(pam_handle, error);
4297+ return CR_ERROR;
4298+ }
4299+
4300+ error= pam_authenticate(pam_handle, 0);
4301+ if (error != PAM_SUCCESS)
4302+ {
4303+ pam_end(pam_handle, error);
4304+ return CR_ERROR;
4305+ }
4306+
4307+ error= pam_acct_mgmt(pam_handle, 0);
4308+ if (error != PAM_SUCCESS)
4309+ {
4310+ pam_end(pam_handle, error);
4311+ return CR_ERROR;
4312+ }
4313+
4314+ /* Get the authenticated user name from PAM */
4315+ error= pam_get_item(pam_handle, PAM_USER, (void *)&pam_mapped_user_name);
4316+ if (error != PAM_SUCCESS)
4317+ {
4318+ pam_end(pam_handle, error);
4319+ return CR_ERROR;
4320+ }
4321+
4322+ /* Check if user name from PAM is the same as provided for MySQL. If
4323+ different, use the new user name for MySQL authorization and as
4324+ CURRENT_USER() value. */
4325+ if (strcmp(info->user_name, pam_mapped_user_name))
4326+ {
4327+ strncpy(info->authenticated_as, pam_mapped_user_name,
4328+ MYSQL_USERNAME_LENGTH);
4329+ info->authenticated_as[MYSQL_USERNAME_LENGTH]= '\0';
4330+ }
4331+
4332+ /* If auth_string specified, then lookup user group,
4333+ get mapped MySQL user name and use it as CURRENT_USER() value */
4334+ if (info->auth_string &&
4335+ lookup_user_group(pam_mapped_user_name, user_group, sizeof(user_group)))
4336+ {
4337+ mapping_get_value(user_group, info->authenticated_as,
4338+ MYSQL_USERNAME_LENGTH, info->auth_string);
4339+ }
4340+
4341+ error= pam_end(pam_handle, error);
4342+ if (error != PAM_SUCCESS)
4343+ return CR_ERROR;
4344+
4345+ return CR_OK;
4346+}
4347
4348=== added file 'Percona-Server/plugin/percona-pam-for-mysql/src/auth_pam_common.h'
4349--- Percona-Server/plugin/percona-pam-for-mysql/src/auth_pam_common.h 1970-01-01 00:00:00 +0000
4350+++ Percona-Server/plugin/percona-pam-for-mysql/src/auth_pam_common.h 2012-05-08 06:39:22 +0000
4351@@ -0,0 +1,71 @@
4352+#ifndef AUTH_PAM_COMMON_INCLUDED
4353+#define AUTH_PAM_COMMON_INCLUDED
4354+/*
4355+ (C) 2012 Percona Inc.
4356+
4357+ This program is free software; you can redistribute it and/or modify
4358+ it under the terms of the GNU General Public License as published by
4359+ the Free Software Foundation; version 2 of the License.
4360+
4361+ This program is distributed in the hope that it will be useful,
4362+ but WITHOUT ANY WARRANTY; without even the implied warranty of
4363+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4364+ GNU General Public License for more details.
4365+
4366+ You should have received a copy of the GNU General Public License
4367+ along with this program; if not, write to the Free Software
4368+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
4369+*/
4370+
4371+/**
4372+ @file
4373+
4374+ PAM authentication for MySQL, common definitions for side plugins.
4375+
4376+ For the general description, see the top comment in auth_pam_common.c.
4377+*/
4378+
4379+/* Define these macros ourselves, so we don't have to include my_global.h and
4380+can compile against unconfigured MySQL source tree. */
4381+#define STDCALL
4382+
4383+#include <security/pam_appl.h>
4384+#include <security/pam_modules.h>
4385+#include <security/pam_misc.h>
4386+
4387+#include <mysql/plugin.h>
4388+#include <mysql/plugin_auth.h>
4389+#include <mysql/client_plugin.h>
4390+
4391+#include <assert.h>
4392+
4393+#define MY_ASSERT_UNREACHABLE() assert(0)
4394+
4395+#ifdef __cplusplus
4396+extern "C" {
4397+#endif
4398+
4399+struct pam_conv_data {
4400+ MYSQL_PLUGIN_VIO *vio;
4401+ MYSQL_SERVER_AUTH_INFO *info;
4402+};
4403+
4404+/** Define following three functions for your specific client plugin */
4405+
4406+int auth_pam_client_talk_init(void **talk_data);
4407+
4408+int auth_pam_talk_perform(const struct pam_message *msg,
4409+ struct pam_response *resp,
4410+ struct pam_conv_data *data,
4411+ void *talk_data);
4412+
4413+void auth_pam_client_talk_finalize(void *talk_data);
4414+
4415+int authenticate_user_with_pam_server (MYSQL_PLUGIN_VIO *vio,
4416+ MYSQL_SERVER_AUTH_INFO *info);
4417+
4418+#ifdef __cplusplus
4419+}
4420+#endif
4421+
4422+#endif
4423
4424=== added file 'Percona-Server/plugin/percona-pam-for-mysql/src/auth_pam_compat.c'
4425--- Percona-Server/plugin/percona-pam-for-mysql/src/auth_pam_compat.c 1970-01-01 00:00:00 +0000
4426+++ Percona-Server/plugin/percona-pam-for-mysql/src/auth_pam_compat.c 2012-05-08 06:39:22 +0000
4427@@ -0,0 +1,131 @@
4428+/*
4429+(C) 2012 Percona Inc.
4430+
4431+This program is free software; you can redistribute it and/or modify
4432+it under the terms of the GNU General Public License as published by
4433+the Free Software Foundation; version 2 of the License.
4434+
4435+This program is distributed in the hope that it will be useful,
4436+but WITHOUT ANY WARRANTY; without even the implied warranty of
4437+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4438+GNU General Public License for more details.
4439+
4440+You should have received a copy of the GNU General Public License
4441+along with this program; if not, write to the Free Software
4442+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
4443+*/
4444+
4445+/**
4446+ @file
4447+
4448+ PAM authentication for MySQL, server-side plugin for the
4449+ production use.
4450+
4451+ Oracle MySQL-compatible plugin. Acts as a mediator
4452+ between the MySQL server, the MySQL client, and the PAM backend.
4453+
4454+ The server plugin requests authentication from the PAM backend, and reads one
4455+ phrase from client plugin. mysql_clear_password plugin used as client plugin.
4456+
4457+ This plugin does not encrypt the communication channel in any way. If this is
4458+ required, a SSL connection should be used.
4459+
4460+ To install this plugin, copy the .so file to the plugin directory and do
4461+
4462+ INSTALL PLUGIN auth_pam SONAME 'auth_pam_compat.so';
4463+
4464+ To use this plugin for one particular user, specify it at user's creation time
4465+ (TODO: tested with localhost only):
4466+
4467+ CREATE USER 'username'@'hostname' IDENTIFIED WITH auth_pam_compat;
4468+
4469+ Alternatively UPDATE the mysql.user table to set the plugin value for an
4470+ existing user.
4471+
4472+ Also it is possible to use this plugin to authenticate anonymous users:
4473+
4474+ CREATE USER ''@'hostname' IDENTIFIED WITH auth_pam_compat;
4475+
4476+*/
4477+
4478+#ifdef HAVE_CONFIG_H
4479+#include "config.h"
4480+#endif
4481+
4482+#include "auth_pam_common.h"
4483+
4484+int auth_pam_client_talk_init(void **talk_data)
4485+{
4486+ int *num_talks= calloc(1, sizeof(int));
4487+ *talk_data= (void*)num_talks;
4488+ return (num_talks != NULL) ? PAM_SUCCESS : PAM_BUF_ERR;
4489+}
4490+
4491+void auth_pam_client_talk_finalize(void *talk_data)
4492+{
4493+ free(talk_data);
4494+}
4495+
4496+int auth_pam_talk_perform(const struct pam_message *msg,
4497+ struct pam_response *resp,
4498+ struct pam_conv_data *data,
4499+ void *talk_data)
4500+{
4501+ int pkt_len;
4502+ unsigned char *pkt;
4503+ int *num_talks= (int*)talk_data;
4504+
4505+ if (msg->msg_style == PAM_PROMPT_ECHO_OFF
4506+ || msg->msg_style == PAM_PROMPT_ECHO_ON)
4507+ {
4508+ /* mysql_clear_password plugin has support for only single phrase */
4509+ if (*num_talks > 1)
4510+ return PAM_CONV_ERR;
4511+
4512+ /* Read the answer */
4513+ if ((pkt_len= data->vio->read_packet(data->vio, &pkt))
4514+ < 0)
4515+ return PAM_CONV_ERR;
4516+
4517+ resp->resp= malloc(pkt_len + 1);
4518+ if (resp->resp == NULL)
4519+ return PAM_BUF_ERR;
4520+
4521+ strncpy(resp->resp, (char *)pkt, pkt_len);
4522+ resp->resp[pkt_len]= '\0';
4523+
4524+ /* we could only guess whether password was used or not */
4525+ data->info->password_used= PASSWORD_USED_NO_MENTION;
4526+ ++(*num_talks);
4527+ }
4528+
4529+ return PAM_SUCCESS;
4530+}
4531+
4532+static struct st_mysql_auth pam_auth_handler=
4533+{
4534+ MYSQL_AUTHENTICATION_INTERFACE_VERSION,
4535+ "mysql_clear_password",
4536+ &authenticate_user_with_pam_server
4537+};
4538+
4539+mysql_declare_plugin(auth_pam)
4540+{
4541+ MYSQL_AUTHENTICATION_PLUGIN,
4542+ &pam_auth_handler,
4543+ "auth_pam_compat",
4544+ "Percona, Inc.",
4545+ "PAM authentication plugin",
4546+ PLUGIN_LICENSE_GPL,
4547+ NULL,
4548+ NULL,
4549+ 0x0001,
4550+ NULL,
4551+ NULL,
4552+ NULL
4553+#if MYSQL_PLUGIN_INTERFACE_VERSION >= 0x103
4554+ ,
4555+ 0
4556+#endif
4557+}
4558+mysql_declare_plugin_end;
4559
4560=== added file 'Percona-Server/plugin/percona-pam-for-mysql/src/dialog.c'
4561--- Percona-Server/plugin/percona-pam-for-mysql/src/dialog.c 1970-01-01 00:00:00 +0000
4562+++ Percona-Server/plugin/percona-pam-for-mysql/src/dialog.c 2012-05-08 06:39:22 +0000
4563@@ -0,0 +1,351 @@
4564+/* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
4565+
4566+ This program is free software; you can redistribute it and/or
4567+ modify it under the terms of the GNU General Public License as
4568+ published by the Free Software Foundation; version 2 of the
4569+ License.
4570+
4571+ This program is distributed in the hope that it will be useful,
4572+ but WITHOUT ANY WARRANTY; without even the implied warranty of
4573+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4574+ GNU General Public License for more details.
4575+
4576+ You should have received a copy of the GNU General Public License
4577+ along with this program; if not, write to the Free Software
4578+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
4579+
4580+/**
4581+ @file
4582+
4583+ dialog client authentication plugin with examples
4584+
4585+ dialog is a general purpose client authentication plugin, it simply
4586+ asks the user the question, as provided by the server and reports
4587+ the answer back to the server. No encryption is involved,
4588+ the answers are sent in clear text.
4589+
4590+ Two examples are provided: two_questions server plugin, that asks
4591+ the password and an "Are you sure?" question with a reply "yes, of course".
4592+ It demonstrates the usage of "password" (input is hidden) and "ordinary"
4593+ (input can be echoed) questions, and how to mark the last question,
4594+ to avoid an extra roundtrip.
4595+
4596+ And three_attempts plugin that gives the user three attempts to enter
4597+ a correct password. It shows the situation when a number of questions
4598+ is not known in advance.
4599+*/
4600+#if defined (WIN32) && !defined (RTLD_DEFAULT)
4601+# define RTLD_DEFAULT GetModuleHandle(NULL)
4602+#endif
4603+
4604+#include <my_global.h>
4605+#include <mysql.h>
4606+#include <mysql/plugin_auth.h>
4607+#include <mysql/client_plugin.h>
4608+#include <string.h>
4609+#include <stdio.h>
4610+#include <stdlib.h>
4611+
4612+#if !defined (_GNU_SOURCE)
4613+# define _GNU_SOURCE /* for RTLD_DEFAULT */
4614+#endif
4615+
4616+/**
4617+ first byte of the question string is the question "type".
4618+ It can be an "ordinary" or a "password" question.
4619+ The last bit set marks a last question in the authentication exchange.
4620+*/
4621+#define ORDINARY_QUESTION "\2"
4622+#define LAST_QUESTION "\3"
4623+#define PASSWORD_QUESTION "\4"
4624+#define LAST_PASSWORD "\5"
4625+
4626+/********************* SERVER SIDE ****************************************/
4627+
4628+/**
4629+ dialog demo with two questions, one password and one, the last, ordinary.
4630+*/
4631+static int two_questions(MYSQL_PLUGIN_VIO *vio, MYSQL_SERVER_AUTH_INFO *info)
4632+{
4633+ unsigned char *pkt;
4634+ int pkt_len;
4635+
4636+ /* send a password question */
4637+ if (vio->write_packet(vio, (const unsigned char *) PASSWORD_QUESTION "Password, please:", 18))
4638+ return CR_ERROR;
4639+
4640+ /* read the answer */
4641+ if ((pkt_len= vio->read_packet(vio, &pkt)) < 0)
4642+ return CR_ERROR;
4643+
4644+ info->password_used= PASSWORD_USED_YES;
4645+
4646+ /* fail if the password is wrong */
4647+ if (strcmp((const char *) pkt, info->auth_string))
4648+ return CR_ERROR;
4649+
4650+ /* send the last, ordinary, question */
4651+ if (vio->write_packet(vio, (const unsigned char *) LAST_QUESTION "Are you sure ?", 15))
4652+ return CR_ERROR;
4653+
4654+ /* read the answer */
4655+ if ((pkt_len= vio->read_packet(vio, &pkt)) < 0)
4656+ return CR_ERROR;
4657+
4658+ /* check the reply */
4659+ return strcmp((const char *) pkt, "yes, of course") ? CR_ERROR : CR_OK;
4660+}
4661+
4662+static struct st_mysql_auth two_handler=
4663+{
4664+ MYSQL_AUTHENTICATION_INTERFACE_VERSION,
4665+ "dialog", /* requires dialog client plugin */
4666+ two_questions
4667+};
4668+
4669+/* dialog demo where the number of questions is not known in advance */
4670+static int three_attempts(MYSQL_PLUGIN_VIO *vio, MYSQL_SERVER_AUTH_INFO *info)
4671+{
4672+ unsigned char *pkt;
4673+ int pkt_len, i;
4674+
4675+ for (i= 0; i < 3; i++)
4676+ {
4677+ /* send the prompt */
4678+ if (vio->write_packet(vio,
4679+ (const unsigned char *) PASSWORD_QUESTION "Password, please:", 18))
4680+ return CR_ERROR;
4681+
4682+ /* read the password */
4683+ if ((pkt_len= vio->read_packet(vio, &pkt)) < 0)
4684+ return CR_ERROR;
4685+
4686+ info->password_used= PASSWORD_USED_YES;
4687+
4688+ /*
4689+ finish, if the password is correct.
4690+ note, that we did not mark the prompt packet as "last"
4691+ */
4692+ if (strcmp((const char *) pkt, info->auth_string) == 0)
4693+ return CR_OK;
4694+ }
4695+
4696+ return CR_ERROR;
4697+}
4698+
4699+static struct st_mysql_auth three_handler=
4700+{
4701+ MYSQL_AUTHENTICATION_INTERFACE_VERSION,
4702+ "dialog", /* requires dialog client plugin */
4703+ three_attempts
4704+};
4705+
4706+mysql_declare_plugin(dialog)
4707+{
4708+ MYSQL_AUTHENTICATION_PLUGIN,
4709+ &two_handler,
4710+ "two_questions",
4711+ "Sergei Golubchik",
4712+ "Dialog plugin demo 1",
4713+ PLUGIN_LICENSE_GPL,
4714+ NULL,
4715+ NULL,
4716+ 0x0100,
4717+ NULL,
4718+ NULL,
4719+ NULL,
4720+ 0,
4721+},
4722+{
4723+ MYSQL_AUTHENTICATION_PLUGIN,
4724+ &three_handler,
4725+ "three_attempts",
4726+ "Sergei Golubchik",
4727+ "Dialog plugin demo 2",
4728+ PLUGIN_LICENSE_GPL,
4729+ NULL,
4730+ NULL,
4731+ 0x0100,
4732+ NULL,
4733+ NULL,
4734+ NULL,
4735+ 0,
4736+}
4737+mysql_declare_plugin_end;
4738+
4739+/********************* CLIENT SIDE ***************************************/
4740+/*
4741+ This plugin performs a dialog with the user, asking questions and
4742+ reading answers. Depending on the client it may be desirable to do it
4743+ using GUI, or console, with or without curses, or read answers
4744+ from a smartcard, for example.
4745+
4746+ To support all this variety, the dialog plugin has a callback function
4747+ "authentication_dialog_ask". If the client has a function of this name
4748+ dialog plugin will use it for communication with the user. Otherwise
4749+ a default fgets() based implementation will be used.
4750+*/
4751+
4752+/**
4753+ type of the mysql_authentication_dialog_ask function
4754+
4755+ @param mysql mysql
4756+ @param type type of the input
4757+ 1 - ordinary string input
4758+ 2 - password string
4759+ @param prompt prompt
4760+ @param buf a buffer to store the use input
4761+ @param buf_len the length of the buffer
4762+
4763+ @retval a pointer to the user input string.
4764+ It may be equal to 'buf' or to 'mysql->password'.
4765+ In all other cases it is assumed to be an allocated
4766+ string, and the "dialog" plugin will free() it.
4767+*/
4768+typedef char *(*mysql_authentication_dialog_ask_t)(struct st_mysql *mysql,
4769+ int type, const char *prompt, char *buf, int buf_len);
4770+
4771+static mysql_authentication_dialog_ask_t ask;
4772+
4773+static char *builtin_ask(MYSQL *mysql __attribute__((unused)),
4774+ int type __attribute__((unused)),
4775+ const char *prompt,
4776+ char *buf, int buf_len)
4777+{
4778+ fputs(prompt, stdout);
4779+ fputc(' ', stdout);
4780+
4781+ if (type == 2) /* password */
4782+ {
4783+ char *password;
4784+ password= get_tty_password("");
4785+ strncpy(buf, password, buf_len-1);
4786+ buf[buf_len-1]= 0;
4787+ free(password);
4788+ }
4789+ else
4790+ {
4791+ if (!fgets(buf, buf_len-1, stdin))
4792+ buf[0]= 0;
4793+ else
4794+ {
4795+ int len= strlen(buf);
4796+ if (len && buf[len-1] == '\n')
4797+ buf[len-1]= 0;
4798+ }
4799+ }
4800+
4801+ return buf;
4802+}
4803+
4804+/**
4805+ The main function of the dialog plugin.
4806+
4807+ Read the prompt, ask the question, send the reply, repeat until
4808+ the server is satisfied.
4809+
4810+ @note
4811+ 1. this plugin shows how a client authentication plugin
4812+ may read a MySQL protocol OK packet internally - which is important
4813+ where a number of packets is not known in advance.
4814+ 2. the first byte of the prompt is special. it is not
4815+ shown to the user, but signals whether it is the last question
4816+ (prompt[0] & 1 == 1) or not last (prompt[0] & 1 == 0),
4817+ and whether the input is a password (not echoed).
4818+ 3. the prompt is expected to be sent zero-terminated
4819+*/
4820+static int perform_dialog(MYSQL_PLUGIN_VIO *vio, MYSQL *mysql)
4821+{
4822+ unsigned char *pkt, cmd= 0;
4823+ int pkt_len, res;
4824+ char reply_buf[1024], *reply;
4825+ int first = 1;
4826+
4827+ do
4828+ {
4829+ /* read the prompt */
4830+ pkt_len= vio->read_packet(vio, &pkt);
4831+ if (pkt_len < 0)
4832+ return CR_ERROR;
4833+
4834+ if (pkt == 0 && first)
4835+ {
4836+ /*
4837+ in mysql_change_user() the client sends the first packet, so
4838+ the first vio->read_packet() does nothing (pkt == 0).
4839+
4840+ We send the "password", assuming the client knows what it's doing.
4841+ (in other words, the dialog plugin should be only set as a default
4842+ authentication plugin on the client if the first question
4843+ asks for a password - which will be sent in clear text, by the way)
4844+ */
4845+ reply= mysql->passwd;
4846+ }
4847+ else
4848+ {
4849+ cmd= *pkt++;
4850+
4851+ /* is it MySQL protocol packet ? */
4852+ if (cmd == 0 || cmd == 254)
4853+ return CR_OK_HANDSHAKE_COMPLETE; /* yes. we're done */
4854+
4855+ /*
4856+ asking for a password in the first packet mean mysql->password, if it's set
4857+ otherwise we ask the user and read the reply
4858+ */
4859+ if ((cmd >> 1) == 2 && first && mysql->passwd[0])
4860+ reply= mysql->passwd;
4861+ else
4862+ reply= ask(mysql, cmd >> 1, (const char *) pkt,
4863+ reply_buf, sizeof(reply_buf));
4864+ if (!reply)
4865+ return CR_ERROR;
4866+ }
4867+ /* send the reply to the server */
4868+ res= vio->write_packet(vio, (const unsigned char *) reply,
4869+ strlen(reply)+1);
4870+
4871+ if (reply != mysql->passwd && reply != reply_buf)
4872+ free(reply);
4873+
4874+ if (res)
4875+ return CR_ERROR;
4876+
4877+ /* repeat unless it was the last question */
4878+ first= 0;
4879+ } while ((cmd & 1) != 1);
4880+
4881+ /* the job of reading the ok/error packet is left to the server */
4882+ return CR_OK;
4883+}
4884+
4885+/**
4886+ initialization function of the dialog plugin
4887+
4888+ Pick up the client's authentication_dialog_ask() function, if exists,
4889+ or fall back to the default implementation.
4890+*/
4891+
4892+static int init_dialog(char *unused1 __attribute__((unused)),
4893+ size_t unused2 __attribute__((unused)),
4894+ int unused3 __attribute__((unused)),
4895+ va_list unused4 __attribute__((unused)))
4896+{
4897+ void *sym= dlsym(RTLD_DEFAULT, "mysql_authentication_dialog_ask");
4898+ ask= sym ? (mysql_authentication_dialog_ask_t) sym : builtin_ask;
4899+ return 0;
4900+}
4901+
4902+mysql_declare_client_plugin(AUTHENTICATION)
4903+ "dialog",
4904+ "Sergei Golubchik",
4905+ "Dialog Client Authentication Plugin",
4906+ {0,1,0},
4907+ "GPL",
4908+ NULL,
4909+ init_dialog,
4910+ NULL,
4911+ NULL,
4912+ perform_dialog
4913+mysql_end_client_plugin;
4914+
4915
4916=== added file 'Percona-Server/plugin/percona-pam-for-mysql/src/lib_auth_pam_client.c'
4917--- Percona-Server/plugin/percona-pam-for-mysql/src/lib_auth_pam_client.c 1970-01-01 00:00:00 +0000
4918+++ Percona-Server/plugin/percona-pam-for-mysql/src/lib_auth_pam_client.c 2012-05-08 06:39:22 +0000
4919@@ -0,0 +1,80 @@
4920+/*
4921+ (C) 2011 Percona Inc.
4922+
4923+ This program is free software; you can redistribute it and/or modify
4924+ it under the terms of the GNU General Public License as published by
4925+ the Free Software Foundation; version 2 of the License.
4926+
4927+ This program is distributed in the hope that it will be useful,
4928+ but WITHOUT ANY WARRANTY; without even the implied warranty of
4929+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4930+ GNU General Public License for more details.
4931+
4932+ You should have received a copy of the GNU General Public License
4933+ along with this program; if not, write to the Free Software
4934+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
4935+*/
4936+
4937+/**
4938+ @file
4939+
4940+ PAM authentication for MySQL, common code for client-side plugins.
4941+
4942+ For the general description, see the top comment in auth_pam.c.
4943+*/
4944+#ifdef HAVE_CONFIG_H
4945+#include "config.h"
4946+#endif
4947+
4948+#include "lib_auth_pam_client.h"
4949+
4950+#include <assert.h>
4951+#include <string.h>
4952+
4953+#define MY_ASSERT_UNREACHABLE() assert(0)
4954+
4955+int authenticate_user_with_pam_client_common (MYSQL_PLUGIN_VIO *vio,
4956+ struct st_mysql *mysql __attribute__((unused)),
4957+ prompt_fn echoless_prompt_fn,
4958+ prompt_fn echo_prompt_fn,
4959+ info_fn show_error_fn,
4960+ info_fn show_info_fn)
4961+{
4962+ do {
4963+ char *buf;
4964+ int pkt_len;
4965+
4966+ if ((pkt_len= vio->read_packet(vio, (unsigned char **)&buf)) < 0)
4967+ return CR_ERROR;
4968+
4969+ /* The first byte is the message type, followed by the message itself. */
4970+
4971+ if (buf[0] == '\2' || buf[0] == '\3')
4972+ {
4973+ /* '\2' - PAM_PROMPT_ECHO_OFF, '\3' - PAM_PROMPT_ECHO_ON */
4974+ char *reply = (buf[0] == '\2')
4975+ ? echoless_prompt_fn(&buf[1]) : echo_prompt_fn(&buf[1]);
4976+ if (!reply)
4977+ return CR_ERROR;
4978+ if (vio->write_packet(vio, (unsigned char *)reply, strlen(reply) + 1))
4979+ {
4980+ free(reply);
4981+ return CR_ERROR;
4982+ }
4983+ free(reply);
4984+ }
4985+ else if (buf[0] == '\4') /* PAM_ERROR_MSG */
4986+ show_error_fn(&buf[1]);
4987+ else if (buf[0] == '\5') /* PAM_TEXT_INFO */
4988+ show_info_fn(&buf[1]);
4989+ else if (buf[0] == '\0') /* end-of-authorization */
4990+ return CR_OK;
4991+ else
4992+ return CR_ERROR; /* Unknown! */
4993+ }
4994+ while (1);
4995+
4996+ /* Should not come here */
4997+ MY_ASSERT_UNREACHABLE();
4998+ return CR_ERROR;
4999+}
5000
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches