pax_global_header00006660000000000000000000000064150446436350014524gustar00rootroot0000000000000052 comment=13861c327c5dd232287b5c8ce5c1ba454aafc646 mediawiki2latex-8.29/000077500000000000000000000000001504464363500145515ustar00rootroot00000000000000mediawiki2latex-8.29/.gitignore000066400000000000000000000000151504464363500165350ustar00rootroot00000000000000dist/* *.pdf mediawiki2latex-8.29/AUTHORS000066400000000000000000000011301504464363500156140ustar00rootroot00000000000000Authors: Dirk Hünniger Contributors: Daniel Mlot Pierre Neidhardt Henning Thielemann Jürgen Thomas This project is based on the wiki2pdf project by Stephan Walter. The original wiki2pdf code was written by Stephan Walter Forest Timothy Gregg Lexor Andi Albrecht but nothing of their code is still present in the current version, since the program was rewritten in Haskell using entirely different algorithms. mediawiki2latex-8.29/ChangeLog000066400000000000000000000534771504464363500163430ustar00rootroot00000000000000Version 8.29 *src The source code documentation has been significantly improved by adding a large amount of comments where needed. Some superfluous functions and record fields have been remove. Test cases have be enabled and a command line option to run the tests has been added. Some support for HTML tags which look like an opening XML tag but are in fact directly self closing was added. The deprecated source tag has been removed. Support for characters above the 16 bit Unicode range has been added using Gnu Unifont. The typesetting of chess diagrams has been added. CJK fonts are vector fonts again. Version 8.28 *src Gnu Unifont is now used as fallback font everywhere. Nested structures of images inside image captions a now flattened. Table cells can now have colored background. Removing content is style tag with display: none; attribute. Math formulas in Wikipedia articles works again. Version 8.27 *src Space characters in URLs are now encoded as underscores. Style tags are now passed trough from the HTML input to the chromium browser for rendering complex structures. If an invalid HTML color name is requested it is replaced by grey. Fonts are now correctly switched even inside links. In line breaks in math mode the uni mu is converted to the unit em with a conversion factor of 1/18. Version 8.26 *src The database for automated font choices has been updated. The contributors of articles with more than 5000 edits are now fully listed. Version 8.25 *src Removed buggy compile time dependency on libghc-http-conduit-dev and add libghc-http-client-tls-dev instead. Version 8.24 *src Fixed a bug about infinite loops for tables with very many columns. Chunk size for table column precompilation now increased to 100, causing mediawiki2latex to run faster. Removing outdated pdftex option when loading graphicx in latex code. Removing duplicate article headings in English Wikipedia. Version 8.23 *src Switching table rendering back form tabularray to longtable. Making musical scores as well as timelines work. Allowing for maps directly below root level in parse tree. Removing table rows with style attribute display:none from output. Version 8.22 *src Removing an infinite loop when processing image maps. Fixing improper % escaping of umlauts Version 8.21 *src Excluding div tags with style attribute display:none. Colored boxes in map keys work properly now. Images inside tables rendered with chromium are properly attributed in the list of figures. Version 8.20 *src Reactivating output of span tags in html generation. Removing figure and figurecaption output in html ouput to make position maps work properly in chromium rendering. Fixing a bug about wrong table column width in LaTeX documents containing sturcetures rendered with chromium. Making inner nested tables in LaTeX output small enough not to exceed the size of the outer table. Version 8.19 *src Allow for html character entites inside tables rendered with chromium. cladograms work again. Subprocesses are now run without busy waiting for their results. Column precompilation now uses maximum number of available cpus. Tables containing a class attribute containing the string wikitable are not rendered with rules in LaTeX. The fontsize parameter in the style tag of tables is now used to set the fontsize inside tables. A bug causing wrong table column widths in documents containing non-table-html-elements which are rendered with chromium is now fixed. Version 8.18 *src open street map wiki now works with standard template expansion. inter language wiki links removed from output. Links to nonexistent users on Wikimedia commons work now. footnote in preamble of list of figures now properly points to licenses chapter. added cc-by-sa austrian license to list of detectable licenses. Making mediawiki2latex compile on latest Debian sid by adding import of Control.Monad where needed. Version 8.17 *src site title now included as first chapter heading in LaTeX document. Footnotes inside captions of images now properly numbered. page internal references now work in HTML mode. Version 8.16 *src making footnotes in list of figures work again. Making links pointing to wikimedia commons releativly point to wikimedia commons absolutly. Links in wiki without protocol now translates as links using the https protocol. Version 8.15 *src solving bug about overwritten text in table of contents for large books. making latex source zip file output work again. Version 8.14 *src the downscaling of nested inner tables has been removed. Footnotes inside tables work again. Version 8.13 *src table columns are now precompiled in chunks 10 to reduce memory consumption. html color 6 nibble hex codes work again. font changes are disabled for the spaceindented teletyper font environment. html named colors work again. made german wikibook on pathology compile again Version 8.12 *src all remaining compiler warnings have been fixed. named colors in the background of tables cells now work again. fixed a bug about the automatted determination of column width because of an incomplete transition to the tabularray package. fixed a compile time bug about the visiblity of the toStrict funtion in the lazy bytestring module. Version 8.11 *src table rendering in LaTeX now done with the tabularry. Heavily nested tables now rendered with chromium. Vertical and horzontal lines in tables now display if rules=all given in html input. Version 8.10 *src multicolumn cell in tables are now also considered when calculating the column width of the tables automatically tables of class wikitable zebra are now displayed with horizontal and vertical rules. A type has been fixed in the web interface, developed instead of devolved. Line breaks are now also allowed before the pipe character. Exif tags are now stripped from jpeg files to allow latex to process them correctly. Html tables as well as html div tags which contain position definitions are now rendered with chromium browser if tables rendering with chromium is requested by the user. Tables with don't contain position definitions are rendered by latex even if the user requests tables to be rendered by latex. Version 8.9 * src tables with more then 10 columns now displayed more correctly. relative smaller font by small html tag now possible inside tables. font now larger inside tables with many columns. cells with rowspan with a parameter of 1 now rendered as cells with now rowspan at all. navboxes and infoboxes not shrinked anymore. Inner nested tables now smaller. rules on sortable wikitables now drawn. line break now allowed in front of any bullet character. license "lizenz freie kunst" can now be detected and will be referred to in the list of figures if found Version 8.8 * src chars encoded with the single char html tag now correctly trigger font changes if needed. lang parameter now allowed in image references. poem tag added. poem inside tables now allowed. formulas inside figure captions now allowed. formulas inside image galleries work now. chromium rendering now with --nosandbox parameter. Allow for images inside captions of images, arbitrary nesting. hbar character now works after changing inclusion order of the packages mathptmx and amssymb in latex header. Allow for paragraph breaks outside image captions added license detection for licenses cc-by-sa 2.0 German and cc-by 4.0. Disallowed space indented verbatim environment inside tables. Adding templates English wikibook on introduction to engineering chemistry. Added templates for books on Minecraft Speedrunnning and Java. Resolving a bug about attribute encoded plus sign in image file URLs causing German Wikipedia Article on Berin to compile correctly Version 8.7 * src images containing a question mark character work again broken pdfs are fixed by pdftk before inclusion rendering of svg switched back from imagemagick to rsvg colored boxes are not allowed to auto-page-break anymore Version 8.6 * src maps are now rendered, if mediawiki2latex runs inside wmf site, otherwise maps turn into broken images, xelatex has been replaced by lualatex unifont.ttf replaced with unifont.otf added cc-by-1.0 and cc public domain as possible image license, double circumflex now correctly escaped in LaTeX, %27 url now properly convertet to ', djvu files can now use pageref, svg rastering now done by imagemagick, more tolerant to incorrect svgs, the inclusion of templates refering each other recursively is now stopped after one iteration, corrected a bug about inclusion of subpages with {{:mypage}} at deep nesting level. Version 8.5 * src typos discovered by Debian lintian fixed. State serialization now by cereal. latex rendering of tables works again in bookmode page title heading now transferred into latex document Version 8.4 * src authors of images inside html tables now propperly attibuted http status code 429 now excessivy retried Version 8.3 * src tables are now transferred verbatim when chromium renderig is requested chromium rendering is by default enabled in the browser and disabled in the webinterface. It can be enabled by -a command line switch and disabled by the -e command line switch. Output of cromium and pdfcrop is now suppressed fixing a problem when rendering large books from the webinterface Version 8.2 * src improved image author and license determination add wbr html tag fixed a bug about missing colors of boxes that caused LaTeX compilation to fail tables are now rendered by chromium curl now does five retries when downloading data Version 8.1 * src improved image author and license determination Version 8.0 * src downloads of images and relateed information now use curl http2 multiplexing and compression list of figures now as html code in html output mediawiki2latex runs a factor of 4 to 5 faster Version 7.53 * src fixing empty document error on wiki pages that contained an empty toc in the lower left corner of the webpage Version 7.52 * src image desciptions in html mode now work with new wikipedia website layout Version 7.51 * src fixing latex error message for no line here to end in citations inside lists removing superflous tables removal of superfluous content introduced by new wikipedia website layout added link and img tags be allowed to also closed with > instead of /> Version 7.50 * src removal of superfluous content introduced by new wikipedia website layout Version 7.49 * src removal of superfluous content introduced by new wikipedia website layout Version 7.48 * src fix for figure processing in german wikibooks Version 7.47 * src removal of superfluous content introduced by new wikipedia website layout Version 7.46 * src new tag "templatestyles" added to parser fixed bug about wrongly intermixed latex in html output fixed bug about rowspan in tables for latex output Version 7.45 * src remove navigation toolsbars Version 7.44 * src user agent header added to https requests html intermediate output improved (links and tabletag attributes). footer tag processed in html input. Version 7.43 * src corrected error due to leftover from tocstype removal Version 7.42 * src removed dependency to deprecated latex package tocstyle Version 7.41 * src optional dependency to libre office and calibe documented Version 7.40 * src removing dependency to depricated highlighting-kate Version 7.39 * src using scrlayer-scrpage instead of scrheadings Version 7.39 * src linesbreaks in Urls can now be insterted on hyphens. Images in the Gimp format xcf can now be processed. Same for webp images. p html tags now cause new paragraphs. images and as well as rasterized formulars are now properly included in odt documents and not just referred to. Version 7.38 * src the tachyon subproject has been started. Its goal is to demostrate the maximum possible speed of a mediawiki to latex conversion see folder tachyon. djvu files are now processed correctly. list of contributors is faster by removing lazy evaluation. Source codes which contain high unicode codepoint character are not not highlighted anymore and thus don't cause LaTeX compiler aborts anymore. Some seldom occuring bug in the processing of complex tables have been fixed. highlighting environment now begin with a newline to make sure they compile in LaTeX. A an addition mode has been added to allow for loading all pages from a toc page but only those which are children of the toc page with respect to the url paths. If a cell in a table itself contains multiple tables, those inner tables are limited in width to half of the width of the outer cell. A bug that prohibited --bookmode together with --epub was fixed. A bug on nested lists / enumerations / itemizations was fixed. If vector graphcis is requested, the svg images are not rasterized in epub but instead kept as svg in epub output. Quationsmakes and numeric html entities are now correcty coverted from the parse tree to plain text causing them to appear correctly when typesetting source codes. url fed in to mediawiki2latex from the command line of the web interface may does not longer need to be escaped in url escaping. stl 3d graphics files are kicked out entirely. It is possible to use a source code in the caption of an image. Version 7.37 * src the bug introduced in 7.36 that caused the list of contributors to be incomplete was fixed. a new faster but less memory efficient parser is used to extract the list of contributors from the history pages on the wiki. The same applies to the list of figures. This causes mediawiki2latex to run roughly 30% faster altogether. Version 7.36 * src let a be the fact that mediawiki2latex is asked to gernerate a PDF file or a zip file with the corresponding latex source (which is equivalent to the fact that neigther of the options -b, -d, --epub, --odt are present). let b be the fact that the input is a book or collection (which is equivalent to the fact that -k or --bookmode command line option is present). if both a and b a are true then the memory consumption is reduced by usually at least an order of magnitue. This is why the server now supports up to four requests in parallel and up to four hours per request. Version 7.35 * src table column precompilation now happens in a single LaTeX run. This increases speed. Server can run bookmode again. Formulars inside captions of images galleries work now. Navboxes are now displayed collapsed. Support for "track" hmtl tag. Support von "source" tag with empty string inside. Links to cateories not displayed anymore. Version 7.34 * src memory consumption with -k signifikantly reduced due to exchange of serialization library message displayed in server mode which points users where to look for the downloaded files some fixes that allows use with edutech wiki from the univeristy of Geneva the following combinations of parameters are now also possible -k -m as well as -k -i as well as -k -t -k works with -b. The combination of -k -d is bascially possible but might fail due to a bug in libreoffice at large documents Version 7.33 * src amperand and "<" and ">" now work in sourcecode received via html some more toplevel function are now documented server now displayes running at wmflabs server now warns about time limit of one hour formulas inside image caption received of html work man page update source code pretty printed Version 7.32 * src tables now work with formulas inside them also webserver now links to installation instructions Version 7.31 * src tables now work again and superfloues mediawiki internal html elements removed Version 7.30 * src making it compile on debian buster Version 7.29 * src making server mode work again Version 7.28 * src wikipedia "Book" namespace mode added. ram usage optimized in this mode Version 7.27 * src xelatex compiler change, ttf file extension no more written out Version 7.26 * src added two new output formats: epub and odt Version 7.25 * src replaced deprecated call to parseUrl by call to parseRequest Version 7.24 * src bdi tags in list of figures as well as contributors removed Version 7.23 * src German Wikibook Mathe für nicht Freaks does compile now. Formulas now work with Wikipedias new mathml markup. Version 7.22 * src English Bourne Shell Wikiboook and German Wikibook on complex numbers do compile now Version 7.21 * src Wikipedia does now only allow https but no more https. This bug was fixed with this release. Now mediawiki2latex only uses https request but does not support http anymore Version 7.20 * src mediawiki changed its html output concerning internal links. This caused a bug in mediawiki2latex causing wrong display of links in the pdf and latex documents generated. This bug has been fixed Version 7.19 * src server mode website now W3C validated HTML5. font scaling for tables which would not fit on a page otherwise optimized. superfluses values, needed only internaly for sorting in normal webbrowsers, in sortable tables removed accoriding to span style dispaly none Version 7.18 * src tables optimized. scalefactor for width correction by spacing between column is not back to normal again. At most two columns of a table may be wraped, the fontssize of the table is reduced otherwise now. Tables with contain nested tables are now always typeset in landscape mode Version 7.17 * src avoid problems with limits on the number of handels on stderr and stdout streams of subprocesses. Version 7.16 * src some templates for german wikibooks have been added the maximum number of treads has been limited to 200 in order to avoid problems with limits on the number of file and socket handles. Version 7.15 * src on linux the maximum length of a line in a latex document has been increased chars outside 16 bit unicode range are using font for space character test on 2700 features articles on the english wikipedia resulted in only one failiure namely Chess Version 7.14 * src server properly reads subprocess pipes now, so the don't overrun anymore varwidth environments now properly closed when doing latex runs to calculate optimized column width stub for selftesting added but no functionally implemented yet Version 7.13 * src Webserver now does time out if processing takes to long Article on New Jouralsim compiles aganin This solved by packing table cell in varwidth minipages for column width calculation html fallback. If a server does not seem to be running mediawiki html is processes as fallback Version 7.12 * src Web server got a professionally looking web interface new Formulas on the German Wikipedia work again Version 7.11 * src progress strings are now printed to allow precise progress indication Version 7.10 * src alternative LaTeX headers can be supplied by the user Version 7.5 * src books can now have an index Version 7.4 * src -c command line option also on Windows use of more that one cpus core by runtime system enabled Version 7.3 * src Using multiple OS threads. Speedup by a faktor of two due to IO parallelism Version 7.2 * src images and list of figures works for even more non wikimedia wikis fonts now switched during latex run so full 16 bit unicode support on debian included server added Version 7.1 * src mediawiki urls in default configuration, that is with index.php in between work relative pathnames for -c command line option work gui added table of contents is only procuded once per document Version 6.6 * src Added command line option for using megafont ttf files if requested Version 6.5 * Makefile: A lot of improvements int the building process. Should be easily packageable now. Using 'install' instead of 'cp' to make sure file access is right. Generate man page. * mediawiki2latex.1: Completed man page. * INSTALL: Listed most dependencies. Needs to be polished. * .: Removed useless files and folders. Removed backup files. Version 6.4 ... mediawiki2latex-8.29/INSTALL000066400000000000000000000034651504464363500156120ustar00rootroot00000000000000================================================================================ Requirements ================================================================================ Compile-time dependencies: cabal ghc Runtime TeX dependencies: amscls amsmath babel bbding bbm-macros colortbl ec euenc fancyvrb fontspec fourier framed graphics helvetic hyperref kastrup keystroke koma-script l3kernel l3packages latex latexconfig latex-fonts lm marvosym mdwtools metalogo ms multirow oberdiek paralist parskip psnfss realscripts rsfs skull symbol times tipa tools ulem url wasy wasysym xcolor xetex xetexconfig xetex-def xltxtra xunicode zapfding ================================================================================ Compilation on Linux ================================================================================ Switch to the source folder and run $ make $ make install or $ make deps You can change the installation destination with the PREFIX variable (/usr/local by default). $ make PREFIX=/usr install ================================================================================ Compilation on Win64 ================================================================================ Install "The Haskell Platform" first Switch to the source folder and run cabal install #this will fail but it will correcty install the build dependencies cd src ghc --make mediawiki2latex Download the MediaWikiToLaTeX.zip file from the sourceforge site. Install the file mediawiki2latex.exe you just readed into the directory trunk/bin. Change directroy to that folder an run from there. The program have got runtime depencies to pdflatex and so on with are given as relative pathnames based on trunk/bin. mediawiki2latex-8.29/LICENSE000066400000000000000000000432541504464363500155660ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. mediawiki2latex-8.29/Makefile000066400000000000000000000017641504464363500162210ustar00rootroot00000000000000PREFIX ?= /usr BINDIR = $(PREFIX)/bin SHAREDIR = $(PREFIX)/share MANDIR = $(SHAREDIR)/man MAN1DIR = $(MANDIR)/man1 VERSION = $(shell awk '/^Version/ {print $$2 ; exit}' mediawiki2latex.cabal) all: mediawiki2latex docs mediawiki2latex: Setup.lhs runhaskell Setup.lhs configure runhaskell Setup.lhs build docs: mediawiki2latex.1.gz mediawiki2latex.1.gz: mediawiki2latex.1 @gzip -c $< > $@ mediawiki2latex.1: mediawiki2latex.1.in @sed "s/MEDIAWIKI2LATEXVERSION/$(VERSION)/" $< > $@ install: all install -dm755 "$(DESTDIR)$(BINDIR)" install -m755 dist/build/mediawiki2latex/mediawiki2latex "$(DESTDIR)$(BINDIR)" install -dm755 "$(DESTDIR)$(MAN1DIR)" install -m644 mediawiki2latex.1.gz "$(DESTDIR)$(MAN1DIR)" install -dm755 "$(DESTDIR)$(SHAREDIR)/mediawiki2latex/latex" install -m644 latex/* "$(DESTDIR)$(SHAREDIR)/mediawiki2latex/latex" clean: rm -rf mediawiki2latex Setup Setup.hi Setup.o ./dist/ mediawiki2latex.1.gz mediawiki2latex.1 deps-update: cabal update deps-install: cabal install mediawiki2latex-8.29/NEWS000066400000000000000000000003511504464363500152470ustar00rootroot00000000000000As of Appril 2014, the issues caused by the major rewrite have been reoslved: * There is a GUI again. * Fonts are switched during the LaTeX run such that full 16 bit Unicode is supported again. * The are releases for Windows again. mediawiki2latex-8.29/README000066400000000000000000000030231504464363500154270ustar00rootroot00000000000000MediaWiki to LaTeX A Wikibooks to LaTeX or PDF converter. Copyright (C) 2008, 2013 Dirk Hünniger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ================================================================================ MediaWiki to LaTeX is a simple tool that will fetch a MediaWiki article including all its content recursively (subpages, pictures, etc.) and will generate a LaTeX article from it. By default it will call a LaTeX compiler if available to generate a PDF. This process can be controlled with command-line parameters. See the man page. The LaTeX output is customizable with templates. See the man page for examples. This software is written in Haskell and requires the ghc collection for building. Note that whereas the compile-time requirements are quite demanding (ghc is huge!), these are not needed for runtime. In fact, the tool is quite lightweight as it has virtually no dependency. mediawiki2latex-8.29/Setup.lhs000077500000000000000000000001151504464363500163610ustar00rootroot00000000000000#!/usr/bin/env runhaskell > import Distribution.Simple > main = defaultMain mediawiki2latex-8.29/TODO000066400000000000000000000012421504464363500152400ustar00rootroot00000000000000* Test URL http://en.wikibooks.org/wiki/Regular_Expressions/Print_version http://en.wikibooks.org/wiki/Inkscape/Print_version http://en.wikibooks.org/wiki/Engineering_Thermodynamics/Print_version http://en.wikibooks.org/wiki/Internet_Technologies/Print_version http://en.wikibooks.org/wiki/GENtle/Print_version http://en.wikibooks.org/wiki/JavaScript http://en.wikibooks.org/wiki/GLPK * Fonts * Testing How is the 'test' folder meant to be used? * Website https://sourceforge.net/projects/wb2pdf/ ** Create a real home-page for the project. ** Additional Project Details SourgeForge will not update it. Why? User Interface Console/Terminal, Tk mediawiki2latex-8.29/cabal.licenses000066400000000000000000000014541504464363500173460ustar00rootroot00000000000000Checking from http://packdeps.haskellers.com/licenses bytestring BSD3 process BSD3 temporary BSD3 file-embed BSD3 url BSD3 hxt-http states BDS3 and MIT and Other License where Other License for hxt-charproperties hxt-unicode but inspecition of the file LICENSE shipped with each of them shows that it is litral MIT. As found here http://de.wikipedia.org/wiki/MIT-Lizenz hxt same as hxt-http utf8-string BSD3 parsec BSD3 HTTP BDS3 regex-compat BSD3 split BSD3 containers BSD3 base BSD3 highlighting-kate BSD3 GPL utility-ht BSD3 transformers BSD3 directory BSD3 blaze-html BSD3 mtl BSD3 regex-pcre-builtin BSD3 network BSD3 curl BSD3 mediawiki2latex-8.29/document/000077500000000000000000000000001504464363500163675ustar00rootroot00000000000000mediawiki2latex-8.29/document/headers/000077500000000000000000000000001504464363500200025ustar00rootroot00000000000000mediawiki2latex-8.29/document/headers/commands.tex000066400000000000000000000165251504464363500223360ustar00rootroot00000000000000% Syntax Highlightling %\DefineShortVerb[commandchars=\\\{\}]{\|} \DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}} % Add ',fontsize=\small' for more characters per line \newenvironment{Shaded}{\begin{scriptsize}}{\end{scriptsize}} \newcommand{\VerbBar}{|} \newcommand{\VERB}{\Verb[commandchars=\\\{\}]} \DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}} % Add ',fontsize=\small' for more characters per line \newcommand{\KeywordTok}[1]{\textbf{{#1}}} \newcommand{\DataTypeTok}[1]{\underline{{#1}}} \newcommand{\DecValTok}[1]{{#1}} \newcommand{\BaseNTok}[1]{{#1}} \newcommand{\FloatTok}[1]{{#1}} \newcommand{\ConstantTok}[1]{{#1}} \newcommand{\CharTok}[1]{{#1}} \newcommand{\SpecialCharTok}[1]{{#1}} \newcommand{\StringTok}[1]{{#1}} \newcommand{\VerbatimStringTok}[1]{{#1}} \newcommand{\SpecialStringTok}[1]{{#1}} \newcommand{\ImportTok}[1]{{#1}} \newcommand{\CommentTok}[1]{\textit{{#1}}} \newcommand{\DocumentationTok}[1]{\textit{{#1}}} \newcommand{\AnnotationTok}[1]{\textit{{#1}}} \newcommand{\CommentVarTok}[1]{\textit{{#1}}} \newcommand{\OtherTok}[1]{{#1}} \newcommand{\FunctionTok}[1]{{#1}} \newcommand{\VariableTok}[1]{{#1}} \newcommand{\ControlFlowTok}[1]{\textbf{{#1}}} \newcommand{\OperatorTok}[1]{{#1}} \newcommand{\BuiltInTok}[1]{{#1}} \newcommand{\ExtensionTok}[1]{{#1}} \newcommand{\PreprocessorTok}[1]{\textbf{{#1}}} \newcommand{\AttributeTok}[1]{{#1}} \newcommand{\RegionMarkerTok}[1]{{#1}} \newcommand{\InformationTok}[1]{\textit{{#1}}} \newcommand{\WarningTok}[1]{\textit{{#1}}} \newcommand{\AlertTok}[1]{\textbf{{#1}}} \newcommand{\ErrorTok}[1]{\textbf{{#1}}} \newcommand{\NormalTok}[1]{{#1}} \newcommand{\myfigurewithoutcaption}[1]{{\bfseries \myfigurebabel{ }#1}} \newcommand{\myfigurewithcaption}[2]{{\bfseries \myfigurebabel{ }#1{\quad}}#2} \renewcommand{\iff}{\Longleftrightarrow} % Definition der Fussnoten % ------------------------ %\KOMAoptions{footnotes=multiple} \DeclareTextSymbol{\textlongs}{TS1}{115} \deffootnote[2.2em]{2.2em}{0em}{\makebox[2.2em][l]{\thefootnotemark}} \newcommand{\badchar}[1] {\textbf{?}} \newcommand{\myplainurl}[1] {{\ttfamily \url{#1}}} \newcommand{\myfnhref}[2] {{#2} \^{}{\{\ttfamily \url{#1}\}} } \newcommand{\mymchref}[2] {} \newcommand{\mycontributorhref}[2] {{#2}\protect\footnote{ \begin{minipage}{\fnwidth} \ttfamily \url{#1} \end{minipage}}} \newcommand{\mylofref}[2] {#1\protect\footnote{\mychapterbabel {$\text{}$} \ref{#2} \mypagebabel {$\text{}$} \pageref{#2}}} \newcommand{\mytabhref}[2] {{#2}\protect\footnote{\ttfamily \url{#1} }} %{\textsc{#2}} \newcommand{\myfnlref}[2] {{#2} \^{}\{\mychapterbabel \ref{#1} \mypagebabel {$\text{}$} \pageref{#1}\}} \newlength{\fnwidth} \setlength{\fnwidth}{\linewidth} \addtolength{\fnwidth}{-10mm} \newcommand{\myhref}[2] {\protect\footnotetext[#1]{ \begin{minipage}{\fnwidth} \ttfamily \url{#2} \end{minipage}}} \newcommand{\mylref}[2] {\protect\footnotetext[#1]{\mychapterbabel {$\text{}$} \ref{#2} \mypagebabel {$\text{}$} \pageref{#2}}} \newcommand{\myfnref}[2] {#2\\^{}\{\text{#1} \}} \newcommand{\myref}[2] {\protect\footnotetext[#1]{#2}} \newcommand{\myfnsref}[2] {\text{#2} \^{}\{\text{#1} \}} \newcommand{\mysref}[2] {\text{#2}\protect\footnote{#1}} \newcommand{\TickYes}{\checkmark} % Kompatibilität, damit myfootnote nichts ins Leere läuft \newcommand{\myfootnote}[1] %{\footnote{\quad{}#1}} {\footnote{#1}} % Auflistungen % ------------ % Standardvorschlag für itemize %\newenvironment{myitemize}{\begin{itemize}}{\end{itemize}} %\newenvironment{myenumerate}{\begin{enumerate}}{\end{enumerate}} \newenvironment{myquote}{\begin{itemize}[{}]}{\end{itemize}} \newenvironment{myblockquote}{\begin{itemize}[{\quad}]}{\end{itemize}} \newenvironment{mydescription}{ \begin{inparablank}}{\end{inparablank}} % Alternativen ohne Einrückung \newenvironment{myitemize}{\begin{compactitem}[\textbullet]}{\end{compactitem}} \newenvironment{myenumerate}{\begin{compactenum}}{\end{compactenum}} % einige weitere Festlegungen % --------------------------- % \breakslash is used for URLs to allow linebreaking \newcommand{\mybreakslash}{\discretionary{/}{}{/}} \newlength{\mylength} \newlength{\myhight} \newlength{\myshadingheight} \newcommand{\myoverline}[1] {\settowidth{\mylength}{#1} \settoheight{\myhight}{#1} \makebox[-3pt][l]{#1} \rule[\myhight+1pt]{\mylength}{0.15mm}} % Teile von Büchern \newcommand{\mypart}[1] %{\part{#1}} {\addtocontents{toc}{\protect\vspace{7.5mm} \textbf{\Large {#1}}}} % minitoc vorbereiten, aber standardmäßig unterdrücken \newcommand{\myminitoc}{} % Haupttitel % ---------- %\newcommand{\mymaintitle}[1] %{\definecolor{shadecolor}{gray}{0.9}\begin{shaded} %\begin{center} %\Huge \bfseries %#1 %\end{center} %\end{shaded}} %\newcommand{\mysubtitle}[1] %{\begin{center} %\LARGE \bfseries %#1 %\end{center}} \newcommand{\mysubtitle}[1]{\subtitle{#1}} \newcommand{\mymaintitle}[1]{\title{#1}} \newcommand{\myauthor}[1]{\author{#1}} % this is for getting rid of a lintian complaint about % the German translation of the English word resolution which % I can not represent here literally according to lintian \newcommand{\resdhunlongstring}[0]{Res} \newcommand{\sourcedhunlongstring}[0]{source} \newcommand{\redshunlongstringsource}[0]{\resdhunlongstring\sourcedhunlongstring} % Metadaten % --------- \newcommand{\fetchurlcaption}[0] {\mysref{In den Metadaten erläutert unter: {\itshape Adresse der elektronischen \redshunlongstringsource zur Abholung (O)}.}{URL zur Abholung}} \newcommand{\bookcaption}[0] {\mysref{In den Metadaten erläutert unter: {\itshape Adresse der elektronischen \redshunlongstringsource (O)}.}{Buch (Hauptseite)}} \newcommand{\functionalgroupcaption}[0] {\mysref{In den Metadaten erläutert unter: {\itshape Angaben zum Inhalt: DDC-Sachgruppe der Deutschen Nationalbibliografie oder Warengruppen-Systematik des Deutschen Buchhandels (O)}.}{Sachgruppe(n)} } \newcommand{\futhertopicscaption}[0] {\mysref{In den Metadaten erläutert unter: {\itshape Angaben zum Inhalt: weitere Klassifikationen / Thesauri (F)}.}{Weitere Themen}} \newcommand{\mainauthorscaption}[0] {Hauptautor(en)} \newcommand{\projecttexniciancaption}[0] {Betreuer} \newcommand{\organizationscaptions}[0] {\mysref{In den Metadaten erläutert unter: {\itshape Beteiligte Organisationen (F)}.}{Organisation(en)}} \newcommand{\datecaption}[0] {Erscheinungsdatum} \newcommand{\issuecaption}[0] {Ausgabebezeichnung} \newcommand{\standardcodecaption}[0] {Standardnummer } \newcommand{\maintitlecaption}[0] {Haupttitel} \newcommand{\publishercaption}[0] {\mysref{In den Metadaten erläutert unter: {\itshape Verlag / Verlegende Stelle (O)}.}{Verlegende Stelle} } \newcommand{\publishercitycaption}[0] {Verlagsort} \newcommand{\shelfcaption}[0] {Wikibooks-Regal} \newcommand{\sizecaption}[0] {Umfang} \newcommand{\Alpha}{\mathrm{A}} \newcommand{\Beta}{\mathrm{B}} \newcommand{\Epsilon}{\mathrm{E}} \newcommand{\Zeta}{\mathrm{Z}} \newcommand{\Eta}{\mathrm{H}} \newcommand{\Iota}{\mathrm{I}} \newcommand{\Kappa}{\mathrm{K}} \newcommand{\Mu}{\mathrm{M}} \newcommand{\Nu}{\mathrm{N}} \newcommand{\Rho}{\mathrm{P}} \newcommand{\Tau}{\mathrm{T}} \newcommand{\Chi}{\mathrm{X}} \ExplSyntaxOn \newcommand\dhuncolwidth[1] { \dim_eval:n { \fp_eval:n { ( \dim_to_decimal:n{\linewidth} - \dim_to_decimal:n{2\tabcolsep+\arrayrulewidth} )*#1 } pt } } \ExplSyntaxOff mediawiki2latex-8.29/document/headers/defaultcolors.tex000066400000000000000000000445071504464363500234040ustar00rootroot00000000000000\definecolor{AliceBlue}{rgb}{0.941176470588,0.972549019608,1.0} \definecolor{aliceblue}{rgb}{0.941176470588,0.972549019608,1.0} \definecolor{AntiqueWhite}{rgb}{0.980392156863,0.921568627451,0.843137254902} \definecolor{antiquewhite}{rgb}{0.980392156863,0.921568627451,0.843137254902} \definecolor{Aqua}{rgb}{0.0,1.0,1.0} \definecolor{aqua}{rgb}{0.0,1.0,1.0} \definecolor{Aquamarine}{rgb}{0.498039215686,1.0,0.83137254902} \definecolor{aquamarine}{rgb}{0.498039215686,1.0,0.83137254902} \definecolor{Azure}{rgb}{0.941176470588,1.0,1.0} \definecolor{azure}{rgb}{0.941176470588,1.0,1.0} \definecolor{Beige}{rgb}{0.960784313725,0.960784313725,0.862745098039} \definecolor{beige}{rgb}{0.960784313725,0.960784313725,0.862745098039} \definecolor{Bisque}{rgb}{1.0,0.894117647059,0.76862745098} \definecolor{bisque}{rgb}{1.0,0.894117647059,0.76862745098} \definecolor{Black}{rgb}{0.0,0.0,0.0} \definecolor{black}{rgb}{0.0,0.0,0.0} \definecolor{BlanchedAlmond}{rgb}{1.0,0.921568627451,0.803921568627} \definecolor{blanchedalmond}{rgb}{1.0,0.921568627451,0.803921568627} \definecolor{Blue}{rgb}{0.0,0.0,1.0} %\definecolor{blue}{rgb}{0.0,0.0,1.0} \definecolor{BlueViolet}{rgb}{0.541176470588,0.16862745098,0.886274509804} \definecolor{blueviolet}{rgb}{0.541176470588,0.16862745098,0.886274509804} \definecolor{Brown}{rgb}{0.647058823529,0.164705882353,0.164705882353} \definecolor{brown}{rgb}{0.647058823529,0.164705882353,0.164705882353} \definecolor{BurlyWood}{rgb}{0.870588235294,0.721568627451,0.529411764706} \definecolor{burlywood}{rgb}{0.870588235294,0.721568627451,0.529411764706} \definecolor{CadetBlue}{rgb}{0.372549019608,0.619607843137,0.627450980392} \definecolor{cadetblue}{rgb}{0.372549019608,0.619607843137,0.627450980392} \definecolor{Chartreuse}{rgb}{0.498039215686,1.0,0.0} \definecolor{chartreuse}{rgb}{0.498039215686,1.0,0.0} \definecolor{Chocolate}{rgb}{0.823529411765,0.411764705882,0.117647058824} \definecolor{chocolate}{rgb}{0.823529411765,0.411764705882,0.117647058824} \definecolor{Coral}{rgb}{1.0,0.498039215686,0.313725490196} \definecolor{coral}{rgb}{1.0,0.498039215686,0.313725490196} \definecolor{CornflowerBlue}{rgb}{0.392156862745,0.58431372549,0.929411764706} \definecolor{cornflowerblue}{rgb}{0.392156862745,0.58431372549,0.929411764706} \definecolor{Cornsilk}{rgb}{1.0,0.972549019608,0.862745098039} \definecolor{cornsilk}{rgb}{1.0,0.972549019608,0.862745098039} \definecolor{Crimson}{rgb}{0.862745098039,0.078431372549,0.235294117647} \definecolor{crimson}{rgb}{0.862745098039,0.078431372549,0.235294117647} \definecolor{Cyan}{rgb}{0.0,1.0,1.0} %\definecolor{cyan}{rgb}{0.0,1.0,1.0} \definecolor{DarkBlue}{rgb}{0.0,0.0,0.545098039216} \definecolor{darkblue}{rgb}{0.0,0.0,0.545098039216} \definecolor{DarkCyan}{rgb}{0.0,0.545098039216,0.545098039216} \definecolor{darkcyan}{rgb}{0.0,0.545098039216,0.545098039216} \definecolor{DarkGoldenRod}{rgb}{0.721568627451,0.525490196078,0.043137254902} \definecolor{darkgoldenrod}{rgb}{0.721568627451,0.525490196078,0.043137254902} \definecolor{DarkGray}{rgb}{0.662745098039,0.662745098039,0.662745098039} \definecolor{darkgray}{rgb}{0.662745098039,0.662745098039,0.662745098039} \definecolor{DarkGreen}{rgb}{0.0,0.392156862745,0.0} \definecolor{darkgreen}{rgb}{0.0,0.392156862745,0.0} \definecolor{DarkKhaki}{rgb}{0.741176470588,0.717647058824,0.419607843137} \definecolor{darkkhaki}{rgb}{0.741176470588,0.717647058824,0.419607843137} \definecolor{DarkMagenta}{rgb}{0.545098039216,0.0,0.545098039216} \definecolor{darkmagenta}{rgb}{0.545098039216,0.0,0.545098039216} \definecolor{DarkOliveGreen}{rgb}{0.333333333333,0.419607843137,0.18431372549} \definecolor{darkolivegreen}{rgb}{0.333333333333,0.419607843137,0.18431372549} \definecolor{Darkorange}{rgb}{1.0,0.549019607843,0.0} \definecolor{darkorange}{rgb}{1.0,0.549019607843,0.0} \definecolor{DarkOrchid}{rgb}{0.6,0.196078431373,0.8} \definecolor{darkorchid}{rgb}{0.6,0.196078431373,0.8} \definecolor{DarkRed}{rgb}{0.545098039216,0.0,0.0} \definecolor{darkred}{rgb}{0.545098039216,0.0,0.0} \definecolor{DarkSalmon}{rgb}{0.913725490196,0.588235294118,0.478431372549} \definecolor{darksalmon}{rgb}{0.913725490196,0.588235294118,0.478431372549} \definecolor{DarkSeaGreen}{rgb}{0.560784313725,0.737254901961,0.560784313725} \definecolor{darkseagreen}{rgb}{0.560784313725,0.737254901961,0.560784313725} \definecolor{DarkSlateBlue}{rgb}{0.282352941176,0.239215686275,0.545098039216} \definecolor{darkslateblue}{rgb}{0.282352941176,0.239215686275,0.545098039216} \definecolor{DarkSlateGray}{rgb}{0.18431372549,0.309803921569,0.309803921569} \definecolor{darkslategray}{rgb}{0.18431372549,0.309803921569,0.309803921569} \definecolor{DarkTurquoise}{rgb}{0.0,0.807843137255,0.819607843137} \definecolor{darkturquoise}{rgb}{0.0,0.807843137255,0.819607843137} \definecolor{DarkViolet}{rgb}{0.580392156863,0.0,0.827450980392} \definecolor{darkviolet}{rgb}{0.580392156863,0.0,0.827450980392} \definecolor{DeepPink}{rgb}{1.0,0.078431372549,0.576470588235} \definecolor{deeppink}{rgb}{1.0,0.078431372549,0.576470588235} \definecolor{DeepSkyBlue}{rgb}{0.0,0.749019607843,1.0} \definecolor{deepskyblue}{rgb}{0.0,0.749019607843,1.0} \definecolor{DimGray}{rgb}{0.411764705882,0.411764705882,0.411764705882} \definecolor{dimgray}{rgb}{0.411764705882,0.411764705882,0.411764705882} \definecolor{DodgerBlue}{rgb}{0.117647058824,0.564705882353,1.0} \definecolor{dodgerblue}{rgb}{0.117647058824,0.564705882353,1.0} \definecolor{FireBrick}{rgb}{0.698039215686,0.133333333333,0.133333333333} \definecolor{firebrick}{rgb}{0.698039215686,0.133333333333,0.133333333333} \definecolor{FloralWhite}{rgb}{1.0,0.980392156863,0.941176470588} \definecolor{floralwhite}{rgb}{1.0,0.980392156863,0.941176470588} \definecolor{ForestGreen}{rgb}{0.133333333333,0.545098039216,0.133333333333} \definecolor{forestgreen}{rgb}{0.133333333333,0.545098039216,0.133333333333} \definecolor{Fuchsia}{rgb}{1.0,0.0,1.0} \definecolor{fuchsia}{rgb}{1.0,0.0,1.0} \definecolor{Gainsboro}{rgb}{0.862745098039,0.862745098039,0.862745098039} \definecolor{gainsboro}{rgb}{0.862745098039,0.862745098039,0.862745098039} \definecolor{GhostWhite}{rgb}{0.972549019608,0.972549019608,1.0} \definecolor{ghostwhite}{rgb}{0.972549019608,0.972549019608,1.0} \definecolor{Gold}{rgb}{1.0,0.843137254902,0.0} \definecolor{gold}{rgb}{1.0,0.843137254902,0.0} \definecolor{GoldenRod}{rgb}{0.854901960784,0.647058823529,0.125490196078} \definecolor{goldenrod}{rgb}{0.854901960784,0.647058823529,0.125490196078} \definecolor{Gray}{rgb}{0.501960784314,0.501960784314,0.501960784314} \definecolor{gray}{rgb}{0.501960784314,0.501960784314,0.501960784314} \definecolor{Green}{rgb}{0.0,0.501960784314,0.0} %\definecolor{green}{rgb}{0.0,0.501960784314,0.0} \definecolor{GreenYellow}{rgb}{0.678431372549,1.0,0.18431372549} \definecolor{greenyellow}{rgb}{0.678431372549,1.0,0.18431372549} \definecolor{HoneyDew}{rgb}{0.941176470588,1.0,0.941176470588} \definecolor{honeydew}{rgb}{0.941176470588,1.0,0.941176470588} \definecolor{HotPink}{rgb}{1.0,0.411764705882,0.705882352941} \definecolor{hotpink}{rgb}{1.0,0.411764705882,0.705882352941} \definecolor{IndianRed}{rgb}{0.803921568627,0.360784313725,0.360784313725} \definecolor{indianred}{rgb}{0.803921568627,0.360784313725,0.360784313725} \definecolor{Indigo}{rgb}{0.294117647059,0.0,0.509803921569} \definecolor{indigo}{rgb}{0.294117647059,0.0,0.509803921569} \definecolor{Ivory}{rgb}{1.0,1.0,0.941176470588} \definecolor{ivory}{rgb}{1.0,1.0,0.941176470588} \definecolor{Khaki}{rgb}{0.941176470588,0.901960784314,0.549019607843} \definecolor{khaki}{rgb}{0.941176470588,0.901960784314,0.549019607843} \definecolor{Lavender}{rgb}{0.901960784314,0.901960784314,0.980392156863} \definecolor{lavender}{rgb}{0.901960784314,0.901960784314,0.980392156863} \definecolor{LavenderBlush}{rgb}{1.0,0.941176470588,0.960784313725} \definecolor{lavenderblush}{rgb}{1.0,0.941176470588,0.960784313725} \definecolor{LawnGreen}{rgb}{0.486274509804,0.988235294118,0.0} \definecolor{lawngreen}{rgb}{0.486274509804,0.988235294118,0.0} \definecolor{LemonChiffon}{rgb}{1.0,0.980392156863,0.803921568627} \definecolor{lemonchiffon}{rgb}{1.0,0.980392156863,0.803921568627} \definecolor{LightBlue}{rgb}{0.678431372549,0.847058823529,0.901960784314} \definecolor{lightblue}{rgb}{0.678431372549,0.847058823529,0.901960784314} \definecolor{LightCoral}{rgb}{0.941176470588,0.501960784314,0.501960784314} \definecolor{lightcoral}{rgb}{0.941176470588,0.501960784314,0.501960784314} \definecolor{LightCyan}{rgb}{0.878431372549,1.0,1.0} \definecolor{lightcyan}{rgb}{0.878431372549,1.0,1.0} \definecolor{LightGoldenRodYellow}{rgb}{0.980392156863,0.980392156863,0.823529411765} \definecolor{lightgoldenrodyellow}{rgb}{0.980392156863,0.980392156863,0.823529411765} \definecolor{LightGrey}{rgb}{0.827450980392,0.827450980392,0.827450980392} \definecolor{lightgrey}{rgb}{0.827450980392,0.827450980392,0.827450980392} \definecolor{LightGreen}{rgb}{0.564705882353,0.933333333333,0.564705882353} \definecolor{lightgreen}{rgb}{0.564705882353,0.933333333333,0.564705882353} \definecolor{LightPink}{rgb}{1.0,0.713725490196,0.756862745098} \definecolor{lightpink}{rgb}{1.0,0.713725490196,0.756862745098} \definecolor{LightSalmon}{rgb}{1.0,0.627450980392,0.478431372549} \definecolor{lightsalmon}{rgb}{1.0,0.627450980392,0.478431372549} \definecolor{LightSeaGreen}{rgb}{0.125490196078,0.698039215686,0.666666666667} \definecolor{lightseagreen}{rgb}{0.125490196078,0.698039215686,0.666666666667} \definecolor{LightSkyBlue}{rgb}{0.529411764706,0.807843137255,0.980392156863} \definecolor{lightskyblue}{rgb}{0.529411764706,0.807843137255,0.980392156863} \definecolor{LightSlateGray}{rgb}{0.466666666667,0.533333333333,0.6} \definecolor{lightslategray}{rgb}{0.466666666667,0.533333333333,0.6} \definecolor{LightSteelBlue}{rgb}{0.690196078431,0.76862745098,0.870588235294} \definecolor{lightsteelblue}{rgb}{0.690196078431,0.76862745098,0.870588235294} \definecolor{LightYellow}{rgb}{1.0,1.0,0.878431372549} \definecolor{lightyellow}{rgb}{1.0,1.0,0.878431372549} \definecolor{Lime}{rgb}{0.0,1.0,0.0} \definecolor{lime}{rgb}{0.0,1.0,0.0} \definecolor{LimeGreen}{rgb}{0.196078431373,0.803921568627,0.196078431373} \definecolor{limegreen}{rgb}{0.196078431373,0.803921568627,0.196078431373} \definecolor{Linen}{rgb}{0.980392156863,0.941176470588,0.901960784314} \definecolor{linen}{rgb}{0.980392156863,0.941176470588,0.901960784314} \definecolor{Magenta}{rgb}{1.0,0.0,1.0} %\definecolor{magenta}{rgb}{1.0,0.0,1.0} \definecolor{Maroon}{rgb}{0.501960784314,0.0,0.0} \definecolor{maroon}{rgb}{0.501960784314,0.0,0.0} \definecolor{MediumAquaMarine}{rgb}{0.4,0.803921568627,0.666666666667} \definecolor{mediumaquamarine}{rgb}{0.4,0.803921568627,0.666666666667} \definecolor{MediumBlue}{rgb}{0.0,0.0,0.803921568627} \definecolor{mediumblue}{rgb}{0.0,0.0,0.803921568627} \definecolor{MediumOrchid}{rgb}{0.729411764706,0.333333333333,0.827450980392} \definecolor{mediumorchid}{rgb}{0.729411764706,0.333333333333,0.827450980392} \definecolor{MediumPurple}{rgb}{0.576470588235,0.439215686275,0.847058823529} \definecolor{mediumpurple}{rgb}{0.576470588235,0.439215686275,0.847058823529} \definecolor{MediumSeaGreen}{rgb}{0.235294117647,0.701960784314,0.443137254902} \definecolor{mediumseagreen}{rgb}{0.235294117647,0.701960784314,0.443137254902} \definecolor{MediumSlateBlue}{rgb}{0.482352941176,0.407843137255,0.933333333333} \definecolor{mediumslateblue}{rgb}{0.482352941176,0.407843137255,0.933333333333} \definecolor{MediumSpringGreen}{rgb}{0.0,0.980392156863,0.603921568627} \definecolor{mediumspringgreen}{rgb}{0.0,0.980392156863,0.603921568627} \definecolor{MediumTurquoise}{rgb}{0.282352941176,0.819607843137,0.8} \definecolor{mediumturquoise}{rgb}{0.282352941176,0.819607843137,0.8} \definecolor{MediumVioletRed}{rgb}{0.780392156863,0.0823529411765,0.521568627451} \definecolor{mediumvioletred}{rgb}{0.780392156863,0.0823529411765,0.521568627451} \definecolor{MidnightBlue}{rgb}{0.0980392156863,0.0980392156863,0.439215686275} \definecolor{midnightblue}{rgb}{0.0980392156863,0.0980392156863,0.439215686275} \definecolor{MintCream}{rgb}{0.960784313725,1.0,0.980392156863} \definecolor{mintcream}{rgb}{0.960784313725,1.0,0.980392156863} \definecolor{MistyRose}{rgb}{1.0,0.894117647059,0.882352941176} \definecolor{mistyrose}{rgb}{1.0,0.894117647059,0.882352941176} \definecolor{Moccasin}{rgb}{1.0,0.894117647059,0.709803921569} \definecolor{moccasin}{rgb}{1.0,0.894117647059,0.709803921569} \definecolor{NavajoWhite}{rgb}{1.0,0.870588235294,0.678431372549} \definecolor{navajowhite}{rgb}{1.0,0.870588235294,0.678431372549} \definecolor{Navy}{rgb}{0.0,0.0,0.501960784314} \definecolor{navy}{rgb}{0.0,0.0,0.501960784314} \definecolor{OldLace}{rgb}{0.992156862745,0.960784313725,0.901960784314} \definecolor{oldlace}{rgb}{0.992156862745,0.960784313725,0.901960784314} \definecolor{Olive}{rgb}{0.501960784314,0.501960784314,0.0} \definecolor{olive}{rgb}{0.501960784314,0.501960784314,0.0} \definecolor{OliveDrab}{rgb}{0.419607843137,0.556862745098,0.137254901961} \definecolor{olivedrab}{rgb}{0.419607843137,0.556862745098,0.137254901961} \definecolor{OliveGreen}{rgb}{0.0,0.6,0.0} \definecolor{olivegreen}{rgb}{0.0,0.6,0.0} \definecolor{Orange}{rgb}{1.0,0.647058823529,0.0} \definecolor{orange}{rgb}{1.0,0.647058823529,0.0} \definecolor{OrangeRed}{rgb}{1.0,0.270588235294,0.0} \definecolor{orangered}{rgb}{1.0,0.270588235294,0.0} \definecolor{Orchid}{rgb}{0.854901960784,0.439215686275,0.839215686275} \definecolor{orchid}{rgb}{0.854901960784,0.439215686275,0.839215686275} \definecolor{PaleGoldenRod}{rgb}{0.933333333333,0.909803921569,0.666666666667} \definecolor{palegoldenrod}{rgb}{0.933333333333,0.909803921569,0.666666666667} \definecolor{PaleGreen}{rgb}{0.596078431373,0.98431372549,0.596078431373} \definecolor{palegreen}{rgb}{0.596078431373,0.98431372549,0.596078431373} \definecolor{PaleTurquoise}{rgb}{0.686274509804,0.933333333333,0.933333333333} \definecolor{paleturquoise}{rgb}{0.686274509804,0.933333333333,0.933333333333} \definecolor{PaleVioletRed}{rgb}{0.847058823529,0.439215686275,0.576470588235} \definecolor{palevioletred}{rgb}{0.847058823529,0.439215686275,0.576470588235} \definecolor{PapayaWhip}{rgb}{1.0,0.937254901961,0.835294117647} \definecolor{papayawhip}{rgb}{1.0,0.937254901961,0.835294117647} \definecolor{PeachPuff}{rgb}{1.0,0.854901960784,0.725490196078} \definecolor{peachpuff}{rgb}{1.0,0.854901960784,0.725490196078} \definecolor{Peru}{rgb}{0.803921568627,0.521568627451,0.247058823529} \definecolor{peru}{rgb}{0.803921568627,0.521568627451,0.247058823529} \definecolor{Pink}{rgb}{1.0,0.752941176471,0.796078431373} \definecolor{pink}{rgb}{1.0,0.752941176471,0.796078431373} \definecolor{Plum}{rgb}{0.866666666667,0.627450980392,0.866666666667} \definecolor{plum}{rgb}{0.866666666667,0.627450980392,0.866666666667} \definecolor{PowderBlue}{rgb}{0.690196078431,0.878431372549,0.901960784314} \definecolor{powderblue}{rgb}{0.690196078431,0.878431372549,0.901960784314} \definecolor{Purple}{rgb}{0.501960784314,0.0,0.501960784314} \definecolor{purple}{rgb}{0.501960784314,0.0,0.501960784314} \definecolor{Red}{rgb}{1.0,0.0,0.0} %\definecolor{red}{rgb}{1.0,0.0,0.0} \definecolor{RosyBrown}{rgb}{0.737254901961,0.560784313725,0.560784313725} \definecolor{rosybrown}{rgb}{0.737254901961,0.560784313725,0.560784313725} \definecolor{RoyalBlue}{rgb}{0.254901960784,0.411764705882,0.882352941176} \definecolor{royalblue}{rgb}{0.254901960784,0.411764705882,0.882352941176} \definecolor{SaddleBrown}{rgb}{0.545098039216,0.270588235294,0.0745098039216} \definecolor{saddlebrown}{rgb}{0.545098039216,0.270588235294,0.0745098039216} \definecolor{Salmon}{rgb}{0.980392156863,0.501960784314,0.447058823529} \definecolor{salmon}{rgb}{0.980392156863,0.501960784314,0.447058823529} \definecolor{SandyBrown}{rgb}{0.956862745098,0.643137254902,0.376470588235} \definecolor{sandybrown}{rgb}{0.956862745098,0.643137254902,0.376470588235} \definecolor{SeaGreen}{rgb}{0.180392156863,0.545098039216,0.341176470588} \definecolor{seagreen}{rgb}{0.180392156863,0.545098039216,0.341176470588} \definecolor{SeaShell}{rgb}{1.0,0.960784313725,0.933333333333} \definecolor{seashell}{rgb}{1.0,0.960784313725,0.933333333333} \definecolor{Sienna}{rgb}{0.627450980392,0.321568627451,0.176470588235} \definecolor{sienna}{rgb}{0.627450980392,0.321568627451,0.176470588235} \definecolor{Silver}{rgb}{0.752941176471,0.752941176471,0.752941176471} \definecolor{silver}{rgb}{0.752941176471,0.752941176471,0.752941176471} \definecolor{SkyBlue}{rgb}{0.529411764706,0.807843137255,0.921568627451} \definecolor{skyblue}{rgb}{0.529411764706,0.807843137255,0.921568627451} \definecolor{SlateBlue}{rgb}{0.41568627451,0.352941176471,0.803921568627} \definecolor{slateblue}{rgb}{0.41568627451,0.352941176471,0.803921568627} \definecolor{SlateGray}{rgb}{0.439215686275,0.501960784314,0.564705882353} \definecolor{slategray}{rgb}{0.439215686275,0.501960784314,0.564705882353} \definecolor{Snow}{rgb}{1.0,0.980392156863,0.980392156863} \definecolor{snow}{rgb}{1.0,0.980392156863,0.980392156863} \definecolor{SpringGreen}{rgb}{0.0,1.0,0.498039215686} \definecolor{springgreen}{rgb}{0.0,1.0,0.498039215686} \definecolor{SteelBlue}{rgb}{0.274509803922,0.509803921569,0.705882352941} \definecolor{steelblue}{rgb}{0.274509803922,0.509803921569,0.705882352941} \definecolor{Tan}{rgb}{0.823529411765,0.705882352941,0.549019607843} \definecolor{tan}{rgb}{0.823529411765,0.705882352941,0.549019607843} \definecolor{Teal}{rgb}{0.0,0.501960784314,0.501960784314} \definecolor{teal}{rgb}{0.0,0.501960784314,0.501960784314} \definecolor{Thistle}{rgb}{0.847058823529,0.749019607843,0.847058823529} \definecolor{thistle}{rgb}{0.847058823529,0.749019607843,0.847058823529} \definecolor{Tomato}{rgb}{1.0,0.388235294118,0.278431372549} \definecolor{tomato}{rgb}{1.0,0.388235294118,0.278431372549} \definecolor{Turquoise}{rgb}{0.250980392157,0.878431372549,0.81568627451} \definecolor{turquoise}{rgb}{0.250980392157,0.878431372549,0.81568627451} \definecolor{Violet}{rgb}{0.933333333333,0.509803921569,0.933333333333} \definecolor{violet}{rgb}{0.933333333333,0.509803921569,0.933333333333} \definecolor{Wheat}{rgb}{0.960784313725,0.870588235294,0.701960784314} \definecolor{wheat}{rgb}{0.960784313725,0.870588235294,0.701960784314} \definecolor{White}{rgb}{1.0,1.0,1.0} %\definecolor{white}{rgb}{1.0,1.0,1.0} \definecolor{WhiteSmoke}{rgb}{0.960784313725,0.960784313725,0.960784313725} \definecolor{whitesmoke}{rgb}{0.960784313725,0.960784313725,0.960784313725} \definecolor{Yellow}{rgb}{1.0,1.0,0.0} %\definecolor{yellow}{rgb}{1.0,1.0,0.0} \definecolor{YellowGreen}{rgb}{0.603921568627,0.803921568627,0.196078431373} \definecolor{yellowgreen}{rgb}{0.603921568627,0.803921568627,0.196078431373} \definecolor{shadecolor}{gray}{0.9} \definecolor{mydarkgreen}{rgb}{0.0,0.5625,0.0} mediawiki2latex-8.29/document/headers/formattings.tex000066400000000000000000000013451504464363500230640ustar00rootroot00000000000000% PDF-Links vorbereiten \hypersetup{%a5paper, linkcolor=black, % Für Links in der gleichen Seite urlcolor=black, % Für Links auf URLs breaklinks=true, % Links dürfen umgebrochen werden colorlinks=false, citebordercolor=0 0 0, % Farbe für \cite filebordercolor=0 0 0, linkbordercolor=0 0 0, menubordercolor=0 0 0, urlbordercolor=0 0 0, pdfhighlight=/I, pdfborder=0 0 0, % keine Box um die Links! bookmarksopen=true, bookmarksnumbered=true, frenchlinks=false } % nicht zu viele Silbentrennungen \sloppy % Waisen, Hurenkinder \clubpenalty = 10000 \widowpenalty = 10000 \displaywidowpenalty = 10000 % verschiedene Einstellungen \addtolength{\skip\footins}{2ex} % Länge zwischen Fußnotenbereich und Text mediawiki2latex-8.29/document/headers/hyphenation.tex000066400000000000000000000015361504464363500230570ustar00rootroot00000000000000\hyphenation{NASA} \hyphenation{Unter-schenkel-vorder-innen-seite} \hyphenation{Unter-schenkel-vorder-au\ss en-seite} \hyphenation{Auge} \hyphenation{ohne} \hyphenation{eine} \hyphenation{come} \hyphenation{zero} \hyphenation{also} \hyphenation{five} \hyphenation{many} \hyphenation{copy} \hyphenation{year} \hyphenation{same} \hyphenation{make} \hyphenation{time} \hyphenation{made} \hyphenation{glei-che} \hyphenation{Zucker-wasser} \hyphenation{Makro-phagen-stimulation} \hyphenation{Revo-lution} \hyphenation{Reich} \hyphenation{Gebiet} \hyphenation{ethnische} \hyphenation{Sow-jet-uni-on} \hyphenation{NATO} \hyphenation{Amts-sprache} \hyphenation{Amts-sprachen} \hyphenation{Otto} \hyphenation{Ab-sorptions-ko-effizient} \hyphenation{Reich} \hyphenation{Trier} \hyphenation{Butter-worth} \hyphenation{Agar-kulturen} \hyphenation{Rausch-unter-dr\"uckung} mediawiki2latex-8.29/document/headers/imageheader.tex000066400000000000000000000053441504464363500227650ustar00rootroot00000000000000\begin{small} Auf den folgenden Seiten stehen für alle Bilder die Quellen, Autoren und Lizenzen. Das Verzeichnis wurde erstellt mit Hilfe der \myhref{http://de.wikipedia.org/wiki/MediaWiki}{Wikimedia-Software} und an Layout und Gliederung dieses Buches angepasst. Zu den Lizenzen gibt es hier weitere Informationen: \begin{itemize} \item GNU Free Documentation License (GFDL). Text dieser Lizenz: \newline{}\url{http://www.gnu.org/licenses/old-licenses/gpl-1.0.txt} \item GNU General Public License Version 2 (GPL). Text dieser Lizenz: \newline{}\url{http://www.gnu.org/licenses/gpl-2.0.txt} \item Creative Commons Attribution ShareAlike 1.0 License (cc-by-sa-1.0). Text dieser Lizenz: \newline{}\url{http://creativecommons.org/licenses/by-sa/1.0/} \item Creative Commons Attribution ShareAlike 2.0 License (cc-by-sa-2.0). Damit werden auch die Versionen f\"ur andere Sprachen bezeichnet. Text der englischen Version: \newline{}\url{http://creativecommons.org/licenses/by-sa/2.0/} \item Creative Commons Attribution ShareAlike 2.5 License (cc-by-sa-2.5). Text dieser Lizenz:\newline{}\url{http://creativecommons.org/licenses/by-sa/2.5/} \item Creative Commons Attribution ShareAlike 3.0 License (cc-by-sa-3.0). Text dieser Lizenz:\newline{}\url{http://creativecommons.org/licenses/by-sa/3.0/} \item Creative Commons Attribution ShareAlike 4.0 License (cc-by-sa-4.0). Text dieser Lizenz:\newline{}\url{https://creativecommons.org/licenses/by-sa/4.0/deed.de} \item Creative Commons Attribution 2.0 License (cc-by-2.0). Damit werden auch die Versionen f\"ur andere Sprachen bezeichnet. Text der englischen Version:\newline{}\url{http://creativecommons.org/licenses/by/2.0/} \item Creative Commons Attribution 2.5 License (cc-by-2.5). Text dieser Lizenz:\newline{}\url{http://creativecommons.org/licenses/by/2.5/deed.en} \item Creative Commons Attribution 3.0 License (cc-by-3.0). Text dieser Lizenz:\newline{}\url{http://creativecommons.org/licenses/by/2.5/deed.en} \item Public Domain (PD): This image is in the public domain. Dieses Bild ist gemeinfrei. \item ATTR: The copyright holder of this file allows anyone to use it for any purpose, provided that the copyright holder is properly attributed. Redistribution, derivative work, commercial use, and all other use is permitted. \item EURO: This is the common (reverse) face of a euro coin. The copyright on the design of the common face of the euro coins belongs to the European Commission. Authorised is reproduction in a format without relief (drawings, paintings, films) provided they are not detrimental to the image of the euro. \end{itemize} Den an weiteren Einzelheiten interessierten Leser verweisen wir auf die Onlineversion dieses Buches und die Beschreibungsseiten der Dateien. \end{small} \pagebreak mediawiki2latex-8.29/document/headers/license.tex000066400000000000000000000030711504464363500221470ustar00rootroot00000000000000\chapter{Zu diesem Buch} \section{Hinweise zu den Lizenzen} \label{Lizenzhinweise} Dieses Werk ist entstanden bei \myhref{http://de.wikibooks.org/wiki/Einf\%C3\%BChrung_in_SQL}{Wikibooks}, einer Online-Bibliothek im Internet mit Lehr-, Sach- und Fachbüchern. Jeder kann und darf diese Bücher frei nutzen und bearbeiten. Alle Inhalte stehen unter den Lizenzen „Creative Commons Attribution/Share-Alike“ (CC-BY-SA 3.0) und GNU-Lizenz für freie Dokumentation (GFDL). Das Konvertierungsprogramm \myhref{http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/wb2pdf}{wb2pdf} steht unter GNU General Public License (GPL). Das Textsatzprogramm \myhref{http://de.wikipedia.org/wiki/LaTeX} {\LaTeX{}} steht unter der LaTeX Project Public License (LPPL). Hinweise zur Nutzung und für Zitate sind zu finden unter: \begin{itemize} \item Originalversion der Lizenz CC-BY-SA 3.0 \newline \url{http://creativecommons.org/licenses/by-sa/3.0} \item Deutsche Version der Lizenz mit Ergänzungen \newline{} \url{http://creativecommons.org/licenses/by-sa/3.0/deed.de} \item Originalversion der Lizenz GFDL \newline{} \url{http://www.gnu.org/copyleft/fdl.html} \item Originalversion der Lizenz GPL \newline{} \url{http://www.gnu.org/licenses/gpl-3.0.html} \item Version der LaTeX PPL \newline{} \url{http://www.opensource.org/licenses/lppl} \item Nutzungsbedingungen der Wikimedia Foundation (deutsch) \newline{} \url{http://wikimediafoundation.org/wiki/Nutzungsbedingungen} \item Zitieren aus Wikibooks \newline{} \url{http://de.wikibooks.org/wiki/Hilfe:Zitieren#Zitieren_aus_Wikibooks} \end{itemize} mediawiki2latex-8.29/document/headers/options.tex000066400000000000000000000121521504464363500222200ustar00rootroot00000000000000% Festlegungen für minitoc % \renewcommand{\myminitoc}{\minitoc} % \renewcommand{\mtctitle}{Überblick} % \setcounter{minitocdepth}{1} % \dominitoc % diese Zeile aktiviert das Erstellen der minitocs, sie muss vor \tableofcontents kommen % Seitenformat % ------------ %\KOMAoption{paper}{A5} % zulässig: letter, legal, executive; A-, B-, C-, D-Reihen \KOMAoption{open}{right} % zulässig: right (jedes Kapitel beginnt rechts), left, any \KOMAoption{numbers}{auto} % Satzspiegel jetzt neu berechnen, damit er bei Kopf- und Fußzeilen beachtet wird \KOMAoptions{DIV=13} % Kopf- und Fusszeilen % -------------------- % Breite und Trennlinie %\setheadwidth[-6mm]{textwithmarginpar} %\setheadsepline[textwithmarginpar]{0.4pt} \setheadwidth{text} \setheadsepline[text]{0.4pt} % Variante 1: Kopf: links Kapitel, rechts Abschnitt (ohne Nummer); Fuß: außen die Seitenzahl \ohead{\headmark} \renewcommand{\chaptermark}[1]{\markleft{#1}{}} \renewcommand{\sectionmark}[1]{\markright{#1}{}} \ofoot[\pagemark]{\pagemark} % Variante 2: Kopf außen die Seitenzahl, Fuß nichts %\ohead{\pagemark} %\ofoot{} % Standardschriften % ----------------- %\KOMAoption{fontsize}{18pt} \addtokomafont{disposition}{\rmfamily} \addtokomafont{title}{\rmfamily} \setkomafont{pageheadfoot}{\normalfont\rmfamily\mdseries} % vertikaler Ausgleich % -------------------- % nein -> \raggedbottom % ja -> \flushbottom aber ungeeignet bei Fußnoten %\raggedbottom \flushbottom % Tiefe des Inhaltsverzeichnisses bestimmen % ----------------------------------------- % -1 nur \part{} % 0 bis \chapter{} % 1 bis \section{} % 2 bis \subsection{} usw. \newcommand{\mytocdepth}{1} % mypart - Teile des Buches und Inhaltsverzeichnis % ------------------------------------------------ % Standard: nur im Inhaltsverzeichnis, zusätzlicher Eintrag ohne Seitenzahl % Variante: nur im Inhaltsverzeichnis, zusätzlicher Eintrag mit Seitenzahl %\renewcommand{\mypart}[1]{\addcontentsline{toc}{part}{#1}} % Variante: mit eigener Seite vor dem ersten Kapitel, mit Eintrag und Seitenzahl im Inhaltsverzeichnis \renewcommand{\mypart}[1]{\part{#1}} % maketitle % ----------------------------------------------- % Bestandteile des Innentitels %\title{Einführung in SQL} %\author{Jürgen Thomas} %\subtitle{Datenbanken bearbeiten} \date{} % Bestandteile von Impressum und CR % Bestandteile von Impressum und CR \uppertitleback{ %Detaillierte Daten zu dieser Publikation sind bei Wikibooks zu erhalten:\newline{} \url{http://de.wikibooks.org/} %Diese Publikation ist bei der Deutschen Nationalbibliothek registriert. Detaillierte Daten sind im Internet zu erhalten: \newline{}\url{https://portal.d-nb.de/opac.htm?method=showSearchForm#top} %Diese Publikation ist bei der Deutschen Nationalbibliothek registriert. Detaillierte Daten sind im Internet unter der Katalog-Nr. 1008575860 zu erhalten: \newline{}\url{http://d-nb.info/1008575860} %Namen von Programmen und Produkten sowie sonstige Angaben sind häufig geschützt. Da es auch freie Bezeichnungen gibt, wird das Symbol \textregistered{} nicht verwendet. %Erstellt am \today{} } \lowertitleback{ {\footnotesize On the 28th of April 2012 the contents of the English as well as German Wikibooks and Wikipedia projects were licensed under Creative Commons Attribution-ShareAlike 3.0 Unported license. A URI to this license is given in the list of figures on page \pageref{ListOfFigures}. If this document is a derived work from the contents of one of these projects and the content was still licensed by the project under this license at the time of derivation this document has to be licensed under the same, a similar or a compatible license, as stated in section 4b of the license. The list of contributors is included in chapter Contributors on page \pageref{Contributors}. The licenses GPL, LGPL and GFDL are included in chapter Licenses on page \pageref{Licenses}, since this book and/or parts of it may or may not be licensed under one or more of these licenses, and thus require inclusion of these licenses. The licenses of the figures are given in the list of figures on page \pageref{ListOfFigures}. This PDF was generated by the \LaTeX{} typesetting software. The \LaTeX{} source code is included as an attachment ({\tt source.7z.txt}) in this PDF file. To extract the source from the PDF file, you can use the \texttt{pdfdetach} tool including in the \texttt{poppler} suite, or the \url{http://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/} utility. Some PDF viewers may also let you save the attachment to a file. After extracting it from the PDF file you have to rename it to {\tt source.7z}. To uncompress the resulting archive we recommend the use of \url{http://www.7-zip.org/}. The \LaTeX{} source itself was generated by a program written by Dirk Hünniger, which is freely available under an open source license from \url{http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/wb2pdf}. }} \renewcommand{\mysubtitle}[1]{} \renewcommand{\mymaintitle}[1]{} \renewcommand{\myauthor}[1]{} \newenvironment{myshaded}{% \def\FrameCommand{ \hskip-2pt \fboxsep=\FrameSep \colorbox{shadecolor}}% \MakeFramed {\advance\hsize-\width \FrameRestore}}% {\endMakeFramed} mediawiki2latex-8.29/document/headers/packages1.tex000066400000000000000000000006041504464363500223630ustar00rootroot00000000000000% Standard für Formatierung %\usepackage[utf8]{inputenc} % use \usepackage[utf8]{inputenc} for tex4ht \usepackage[usenames]{color} \usepackage{textcomp} \usepackage{parskip} \usepackage[normalem]{ulem} \usepackage[hyphens]{url} \usepackage[unicode=true]{hyperref} \usepackage[defblank]{paralist} \usepackage{trace} % Minitoc %\usepackage{minitoc} % Keystroke \usepackage{keystroke} mediawiki2latex-8.29/document/headers/packages2.tex000066400000000000000000000022241504464363500223640ustar00rootroot00000000000000% für Zeichensätze %replacemnt for pslatex \usepackage[scaled=.92]{helvet} \usepackage{courier} \usepackage[T1]{fontenc} % disable this line for tex4ht % für Tabellen \usepackage{multirow} \usepackage{multicol} \usepackage{array,ragged2e} \usepackage{longtable} % für Kopf- und Fußzeilen, Fußnoten \usepackage{scrlayer-scrpage} \usepackage{footnote} % für Rahmen \usepackage{verbatim} \usepackage{framed} % für Symbole \usepackage{amsmath} \usepackage{amssymb} \usepackage{amsfonts} %replacemnt for pslatex \usepackage{mathptmx} % für Symbole \usepackage{pifont} \usepackage{marvosym} \let\Cross\undefined \usepackage{fourier-orns} % disable this line for tex4ht % für weitere Logos, z.B. \danger % für Grafik-Einbindung \usepackage{graphicx} \usepackage{wasysym} \let\Square\undefined % unklare Verwendung \usepackage{bbm} \usepackage{skull} \usepackage{fancyvrb} \usepackage{bbding} \usepackage{textcomp} \usepackage[table]{xcolor} %\usepackage{microtype} disabled for xelatex \usepackage{lscape} \usepackage{amsthm} \usepackage{index} \usepackage{scalefnt} \usepackage{relsize} \usepackage{array} \renewcommand\RSsmallest{1pt} \makeindex mediawiki2latex-8.29/document/headers/templates-chemie.tex000066400000000000000000000051071504464363500237550ustar00rootroot00000000000000\newcommand{\TemplateEnergieerhaltung}[1]{ \begin{longtable}{|>{\RaggedRight}p{\linewidth}|} \hline {\bfseries Gesetz von der Erhaltung der Energie}\\ \hline {\bfseries Albert Einstein (14.3. 1879 - 18.4.1955)}: Umwandlung von Energie in Masse und von Masse in Energie ist möglich.\\ $E = m \cdot c^2$ (c = Lichtgeschwindigkeit = 300.000 km/s)\\ \hline {\bfseries Bei einer chemischen Reaktion ist die Summe aus Masse und Energie der Ausgangsstoffe gleich der Summe aus Masse und Energie der Endstoffe. }\\\hline Wird Energie frei, tritt ein unwägbar kleiner Massenverlust auf. Wird Energie investiert, tritt Massenzunahme auf. Dieses kann allerdings mit herkömmlichen Waagen nicht gemessen werden. \\ \hline \end{longtable} } \newcommand{\TemplatePeriodensystem}[1]{ Hier sollte das Periodensystem stehen. Ein solches wird sehr wahrscheinlich von Orlando Camargo Rodriguez frei zur Verfügung gestellt werden. Dateiname: tabela_periodica.tex ist bereits online. Lizenz aber noch nicht genau genug definiert. } \newcommand{\TemplateMassenerhaltung}[1]{ \begin{longtable}{|>{\RaggedRight}p{\linewidth}|} \hline {\bfseries Gesetz von der Erhaltung der Masse}\\ \hline {\bfseries Antoine Lavoisier (1743 - 1794)}: Rien ne se perd, rien ne se crée\\ Die Gesamtmasse ändert sich bei chemischen Reaktionen (im Rahmen der Messgenauigkeiten) nicht.\\ \hline Masse der Ausgangsstoffe=Masse der Produkte \\ \hline \end{longtable} } \newcommand{\TemplateDaltonsAtomhyposthese}[1]{ \begin{longtable}{|>{\RaggedRight}p{\linewidth}|} \hline \begin{enumerate} \item Materie besteht aus extrem kleinen, bei Reaktion ungeteilt bleibenden Teilchen, den Atomen. \item Die Masse der Atome eines bestimmten Elements sind gleich (alle Atome eines Elements sind gleich). Die Atome verschiedener Elemente unterscheiden sich in ihren Eigenschaften (zum Beispiel in Größe, Masse, usw.). \item Es existieren so viele Atomsorten wie Elemente. \item Bei chemischen Reaktionen werden Atome in neuer Kombination vereinigt oder voneinander getrennt. \item Eine bestimmte Verbindung wird von den Atomen der betreffenden Elemente in einem bestimmten, einfachen Zahlenverhältnis gebildet. \end{enumerate} \\ \hline \end{longtable} } \newcommand{\TemplateUnveraenderlicheMassenverhaeltnisse}[1]{ \begin{longtable}{|>{\RaggedRight}p{\linewidth}|} \hline {\bfseries Gesetz der unveränderlichen Massenverhältnisse}\\ \hline Louis Proust (1799) \\ \hline Bei chemischen Reaktionen, also Vereinigung beziehungsweise Zersetzung, reagieren die Reinstoffe immer in einem von der Natur vorgegebenen festen Verhältnis miteinander. \\ \hline \end{longtable} } mediawiki2latex-8.29/document/headers/templates-dirk.tex000066400000000000000000000024251504464363500234540ustar00rootroot00000000000000\newenvironment{TemplateCodeInside}[6] { \def\leftbox{#5} \def\rightbox{} \def\framecolor{shadecolor} \ifstr{#4}{e}{ \def\framecolor{red} \def\rightbox{Falsch} } {} \ifstr{#4}{v}{ \def\framecolor{mydarkgreen} \def\rightbox{Richtig} } {} \begin{scriptsize} \begin{framed} \ttfamily \ifstr{\leftbox} {} { % Ausgabe nur, wenn rechte Box Inhalt hat, dann links mit Standardtext \ifstr{\rightbox}{}{} { \fbox{Quelltext} \hfill \textbf{\color{\framecolor} \fcolorbox{black}{white}{\rightbox} } } } { \fbox{\leftbox} % und bei Bedarf zusätzlich rechts die zweite Box \ifstr{\rightbox}{}{} { \hfill \textbf{\color{\framecolor} \fcolorbox{black}{white}{\rightbox} } } } \begin{flushleft} } % Ende der begin-Anweisungen, es folgen die end-Anweisungen {\end{flushleft}\end{framed}\end{scriptsize} } \newcommand{\TemplateCode}[9] % ************************************************** { \ifstr{#1}{}{~}{ \minisec{\normalfont \scriptsize \centering \textbf{\textit{#1}} \medskip } } \begin{scriptsize} % Code-Abschnitt mit #4 \begin{TemplateCodeInside} {} {0pt} {0pt} {#3} {#5} {} #6 \end{TemplateCodeInside} % Ausgabetext mit #4 #4 % #2 Fußzeile ausgeben, sofern vorgesehen \ifstr{#2} {} {} { \centering \textit{#2} \medskip \\ } \end{scriptsize} } mediawiki2latex-8.29/document/headers/templates.tex000066400000000000000000000540731504464363500225330ustar00rootroot00000000000000\newcommand{\LaTeXJa}{Ja} \newcommand{\LaTeXNein}{Nein} \newcommand{\wbtempcolora}{white} \newcommand{\wbtempcolorb}{white} \newcommand{\wbtempcolorc}{white} \newcommand{\wbtemptexta}{} \newcommand{\wbtemptextb}{} \newcommand{\wbtemptextc}{} \newlength{\wbtemplengtha} \setlength{\wbtemplengtha}{0pt} \newlength{\wbtemplengthb} \setlength{\wbtemplengthb}{0pt} \newlength{\wbtemplengthc} \setlength{\wbtemplengthc}{0pt} \newlength{\wbtemplengthd} \setlength{\wbtemplengthd}{0pt} \newlength{\wbtemplengthe} \setlength{\wbtemplengthe}{0pt} \newcount\wbtempcounta \wbtempcounta=0 \newcount\wbtempcountb \wbtempcountb=0 \newcount\wbtempcountc \wbtempcountc=0 \newcommand{\CPPAuthorsTemplate}[4]{ \LaTeXZeroBoxTemplate{ The following people are authors to this book: #3 You can verify who has contributed to this book by examining the history logs at Wikibooks (http://en.wikibooks.org/). Acknowledgment is given for using some contents from other works like #1, as from the authors #2. The above authors release their work under the following license: This work is licensed under the Creative Commons Attribution-Share Alike 3.0 Unported license. In short: you are free to share and to make derivatives of this work under the conditions that you appropriately attribute it, and that you only distribute it under the same, similar or a compatible license. Any of the above conditions can be waived if you get permission from the copyright holder. Unless otherwise noted, #4 used in this book have their own copyright, may use different licenses than the one used here, and were not created by the above authors. The authors, contributors, and licenses used should be acknowledged separately.} } \newcommand{\NFFallunterscheidung}[8]{ {\bfseries Fall 1:} #1 \\ #2 \\ {\bfseries Fall 2:} #3 \\ #4 \\ {\bfseries Fall 3:} #5 \\ #6 \\ {\bfseries Fall 4:} #7 \\ #8 \\ } \newcommand{\NFAufgabe}[2]{ {\bfseries Aufgabe:}\\ #1 \\ {\bfseries Lösung:}\\ #2 \\ } \newcommand{\tlTemplate}[1]{{\{\{{\ttfamily #1}\}\}}} \newcommand{\LaTeXQuelleLink}[3]{(#1 #2 #3)} \newcommand{\matrixdimTemplate}[1]{ \definecolor{shadecolor}{gray}{0.9} \begin{myshaded} {\bfseries Matrix Dimensions: }\\ A: $p \times p$ \\ B: $p \times q$\\ C: $r \times p$\\ D: $r \times q$\\ \end{myshaded} } \newcommand{\matlabTemplate}[1]{ \definecolor{shadecolor}{gray}{0.9} \begin{myshaded} This operation can be performed using this MATLAB command: {\ttfamily #1} \end{myshaded}} \newcommand{\PrintUnitPage}[3]{\pagebreak \begin{flushleft} {\bfseries \Large #1} \end{flushleft} \begin{longtable}{>{\RaggedRight}p{0.5\linewidth}>{\RaggedRight}p{0.5\linewidth}} & #2 \end{longtable}} \newcommand{\LaTeXCodeTipTemplate}[3]{ \definecolor{shadecolor}{gray}{0.9} \begin{myshaded} #1 \\ #2 \\ #3 \end{myshaded} } \newcommand{\DisassemblySyntax}[1]{ \definecolor{shadecolor}{gray}{0.9} \begin{myshaded} This code example uses #1 Syntax \end{myshaded}} \newcommand{\LaTeXDeutschTemplate}[1]{ {\bfseries deutsch:} #1 } \newcommand{\LaTeXNullTemplate}[1]{} \newcommand{\LaTeXAppendixTemplate}[1]{\appendix} \newcommand{\LaTeXEquals}[1]{=} \newcommand{\LaTeXJavaEnumTemplate}[1]{\textbf{enum}} \newcommand{\LaTeXJavaStringTemplate}[1]{\texttt{\textbf{#1}}} \newcommand{\LaTeXAccentTemplate}[1]{'} \newcommand{\LaTeXJavaEBNFTemplate}[1]{Extended Backus-Naur Form} \newcommand{\LatexSymbol}[1]{\LaTeX} \newcommand{\LaTeXDoubleBoxTemplate}[2]{ \begin{minipage}{\linewidth}\definecolor{shadecolor}{gray}{0.9}\begin{myshaded}{\bfseries #1} \\ #2 \end{myshaded} \end{minipage} } \newcommand{\NFHinweis}[1]{ \begin{minipage}{\linewidth}\definecolor{shadecolor}{gray}{0.9}\begin{myshaded}{ \begin{flushleft} \begin{Large} {\Huge \textcircled{\LARGE !}} \ Hinweis \end{Large} \end{flushleft}} \medskip #1 \end{myshaded} \end{minipage} } \newcommand{\LaTeXSimpleBoxTemplate}[2]{ {\bfseries #1} \\ #2 } \newcommand{\SolutionBoxTemplate}[2]{ #2 } \newcommand{\LaTeXDoubleBoxOpenTemplate}[2]{ \definecolor{shadecolor}{gray}{0.9}\begin{myshaded}{\bfseries #1} \\ \end{myshaded} #2 } \newcommand{\Loesungsweg}[2]{ \definecolor{shadecolor}{gray}{0.9}\begin{myshaded}{\bfseries Wie kommt man auf den Beweis? #1} \\ #2 \end{myshaded} } \newcommand{\LaTeXInduktion}[6]{ \definecolor{shadecolor}{gray}{0.9}\begin{myshaded}{\bfseries Aussageform, deren Allgemeingültigkeit für #1 bewiesen werden soll:} \\ #2 {\newline \bfseries 1. Induktionsanfang} #3 {\newline \bfseries 2. Induktionsschritt} {\newline \bfseries 2a. Induktionsvoraussetzung} #4 {\newline \bfseries 2b. Induktionsbehauptung} #5 {\newline \bfseries 2c. Beweis des Induktionsschritts} #6 \end{myshaded} } \newcommand{\LaTeXLatinExerciseTemplate}[3]{ \definecolor{shadecolor}{gray}{0.9}\begin{myshaded}{\bfseries Exercise: #1} \\ #2 \\ {\bfseries Solution} #3 \end{myshaded} } \newcommand{\LaTeXShadedColorBoxTemplate}[2]{ \begin{minipage}{\linewidth} #1\begin{myshaded} #2 \end{myshaded} \end{minipage} } \newcommand{\PGP}[1]{PGP:#1} \newcommand{\DETAILS}[1]{For more details on this topic, see #1} \newcommand{\ADAFile}[1]{\LaTeXZeroBoxTemplate{File: #1}} \newcommand{\ADASample}[1]{\LaTeXZeroBoxTemplate{This code sample is also available in #1}} \newcommand{\LaTeXZeroBoxTemplate}[1]{ \begin{minipage}{\linewidth}\definecolor{shadecolor}{gray}{0.9}\begin{myshaded} #1 \end{myshaded} \end{minipage} } \newcommand{\LaTeXZeroBoxOpenTemplate}[1]{ \definecolor{shadecolor}{gray}{0.9}\begin{myshaded} #1 \end{myshaded} } \newcommand{\PDFLink}[1]{ \textbf{PDF} #1 } \newcommand{\Lysippos}[1]{Lysippos} \newcommand{\SonnensystemFakten}[3]{ #1 \\ \definecolor{shadecolor}{gray}{0.9}\begin{myshaded}{\bfseries #2} \\ #3 \\ \end{myshaded} } \newcommand{\VorlageReferenzenEintrag}[3]{ \begin{longtable}{p{0.2\linewidth}p{0.8\linewidth}} {[\bfseries #1]} & {\itshape #2} #3 \\ \end{longtable} } \newcommand{\MBOX}[2]{\definecolor{shadecolor}{gray}{0.9} \begin{myshaded} \begin{longtable}{p{0.2\linewidth}p{0.7\linewidth}} #1 & #2 \\ \end{longtable} \end{myshaded}} \newcommand{\LaTeXIdentityTemplate}[1]{#1 } \newcommand{\Doppellizenz}[1]{Dieser Text ist sowohl unter GFDL als auch CC BY-SA 3.0 lizenziert. Wenn der Text unter CC BY-SA 3.0 genutzt wird, kann entsprechend Abschnitt 4b als Autor „Wikibooks“ genannt werden.} \newcommand{\AdaRM}[3]{\myfnhref{http://www.adaic.org/resources/add_content/standards/05rm/html/RM-#1-#2.html}{#1.#2 #3}} \newcommand{\AdaEightThreeRM}[2]{\myfnhref{http://archive.adaic.com/standards/83lrm/html/lrm-#1.html}{Annex #1: #2}} \newcommand{\AdaRMThree}[4]{\myfnhref{http://www.adaic.org/resources/add_content/standards/05rm/html/RM-#1-#2-#3.html}{#1.#2.#3 #4}} \newcommand{\AdaRMAThree}[4]{\myfnhref{http://www.adaic.org/resources/add_content/standards/05rm/html/RM-#1-#2-#3.html}{Annex #1.#2.#3 #4}} \newcommand{\AdaRMATwo}[3]{\myfnhref{http://www.adaic.org/resources/add_content/standards/05rm/html/RM-#1-#2.html}{Annex #1.#2 #3}} \newcommand{\AdaNiveFiveRMThree}[4]{\myfnhref{http://www.adaic.org/resources/add_content/standards/95lrm/ARM_HTML/RM-#1-#2-#3.html}{#1.#2.#3 #4}} \newcommand{\AdaSGThree}[4]{\myfnhref{http://www.adaic.org/resources/add_content/docs/95style/html/sec_#1/#1-#2-#3.html}{#1.#2.#3 #4}} \newcommand{\AdaSGTwo}[3]{\myfnhref{http://www.adaic.org/resources/add_content/docs/95style/html/sec_#1/#1-#2.html}{#1.#2 #3}} \newcommand{\AdaSGOne}[2]{\myfnhref{http://www.adaic.org/resources/add_content/docs/95style/html/sec_#1/}{Chapter #1: #2}} \newcommand{\AdaRMNineFive}[3]{\myfnhref{http://www.adaic.org/resources/add_content/standards/95lrm/ARM_HTML/RM-#1-#2.html}{#1.#2 #3}} \newcommand{\AdaRMCiteFive}[7]{\myfnhref{http://www.adaic.org/resources/add_content/standards/05rm/html/RM-#1-#2-#3.html}{ISO/IEC 8652:2007. #1.#2.#3 #4 (#5). Ada 2005 Reference Manual. #7 }} \newcommand{\AdaTwentyZeroFive}[1]{{\itshape This language feature is only available in Ada 2005}} \newcommand{\ADANFAI}[2]{\myfnhref{http://www.ada-auth.org/cgi-bin/cvsweb.cgi/AIs/AI-00#1.TXT}{AI95-00#1-01 #2}} \newcommand{\ADARMAONE}[2]{\myfnhref{http://www.adaic.org/resources/add_content/standards/05rm/html/RM-#1.html}{Annex #1 #2}} \newcommand{\ADARMONE}[2]{\myfnhref{http://www.adaic.org/resources/add_content/standards/05rm/html/RM-#1.html}{Section #1: #2}} \newcommand{\ADANiveFiveRMONE}[2]{\myfnhref{http://www.adaic.org/resources/add_content/standards/95lrm/ARM_HTML/RM-#1.html}{Section #1: #2}} \newcommand{\AdaNiveFiveRMAThree}[4]{\myfnhref{http://www.adaic.org/resources/add_content/standards/95lrm/ARM_HTML/RM-#1-#2-#3.html}{Annex #1.#2-#3 #4}} \newcommand{\AdaNiveFiveRMATwo}[4]{\myfnhref{http://www.adaic.org/resources/add_content/standards/95lrm/ARM_HTML/RM-#1-#2.html}{Annex #1.#2 #3}} \newcommand{\AdaNiveFiveR}[3]{\myfnhref{http://www.adaic.org/resources/add_content/standards/95rat/rat95html/rat95-p#3-#1.html}{#1 #2}} \newcommand{\AdaNiveFiveRTwo}[4]{\myfnhref{http://www.adaic.org/resources/add_content/standards/95rat/rat95html/rat95-p#4-#1.html}{#1.#2 #3}} \newcommand{\AdaPragma}[1]{\LaTeXTTBF{pragma} } \newcommand{\yes}[1]{yes} \newcommand{\no}[1]{no} \newcommand{\BlenderRepo}[1]{\myfnhef{https://developer.blender.org/diffusion/B/browse/master/#1}{#1}} \newcommand{\TychoBrahe}[1]{Tycho Brahe} \newcommand{\BlenderAlignedView}[1]{This tutorial relies on objects being created so that they are aligned to the view that you’re looking through. Versions 2.48 and above have changed the way this works. Visit \myfnhref{https://en.wikibooks.org/wiki/Blender_3D:_Noob_to_Pro/Aligned_to_view_issue}{Aligned} to view issue to understand the settings that need to be changed.} \newcommand{\LaTeXPlainBoxTemplate}[1]{ \begin{minipage}{\linewidth}\definecolor{shadecolor}{gray}{0.9}\begin{myshaded} #1 \end{myshaded} \end{minipage} } \newcommand{\Hinweis}[1]{ \begin{TemplateInfo}{{\Huge \textcircled{\LARGE !}}}{Hinweis} #1 \end{TemplateInfo}} \newcommand{\LaTexInfoTemplateOne}[1]{ \begin{TemplateInfo}{\Info}{Information} #1 \end{TemplateInfo}} \newcommand{\EqnTemplate}[1]{ \begin{flushright} \textbf{[#1]} \end{flushright}} \newcommand{\RefTemplate}[1]{[#1]} \newcommand{\LaTeXGCCTakeTemplate}[1]{ \LaTeXDoubleBoxTemplate{Take home:}{#1} } \newcommand{\LaTeXProblemTemplate}[1]{ \LaTeXDoubleBoxTemplate{Problem:}{#1} } \newcommand{\LaTeXEditorNote}[1]{\LaTeXDoubleBoxTemplate{Editor's note}{#1}} \newcommand{\BNPForVersion}[1]{ \LaTeXInfoTemplateOne{Applicable Blender version: #1} } \newcommand{\LaTeXInfoTemplateOne}[1]{ \begin{TemplateInfo}{\Info}{Information} #1 \end{TemplateInfo} } \newcommand{\LaTexHelpFulHintTemplate}[1]{ \LaTeXDoubleBoxTemplate{Helpful Hint:}{#1} } \newcommand{\MyLaTeXTemplate}[3]{ \LaTeXDoubleBoxTemplate{MyLaTeXTemplate1:}{#1 \\ #2 \\ #3} } \newcommand{\TemplatePreformat}[1]{ \par \begin{scriptsize} %\setlength{\baselineskip}{0.9\baselineskip} \ttfamily #1 \par \end{scriptsize} } \newcommand{\TemplateSpaceIndent}[1]{ \begin{scriptsize} \begin{framed} \ttfamily #1 \end{framed} \end{scriptsize} } \newcommand{\GenericColorBox}[2] { \newline \begin{tabular}[t]{p{0.6cm}p{4cm}} #1\\ \end{tabular} } \newcommand{\legendNamedColorBox}[2] { \GenericColorBox{ \parbox[t]{0.5\linewidth}{ \textsuperscript{ \fcolorbox{black}{#1}{ \Huge{\,\,} } } } }{ #2 } } \newcommand{\legendColorBox}[2] { \GenericColorBox{ \definecolor{tempColor}{rgb}{#1} \parbox[t]{0.5\linewidth}{ \textsuperscript{ \fcolorbox{black}{tempColor}{ \Huge{\,\,} } } } }{ #2 } } %\newcommand{\ubung} {{\LARGE $\triangleright$}} \newcommand{\ubung}{\ding{228} \textbf{Aufgabe:}\,} \newcommand{\TemplateSource}[1] { %\begin{TemplateCodeInside}{}{\baselineskip}{\baselineskip}{}{}{true} \begin{scriptsize} \begin{myshaded}\ttfamily #1 \end{myshaded} \end{scriptsize} %\end{TemplateCodeInside} } \newenvironment{TemplateInfo}[2] % no more parameters %**************************************************** % Template Info % Kasten mit Logo, Titelzeile, Text % kann für folgende Wiki-Vorlagen benutzt werden: % Vorlage:merke, Vorlage:Achtung u.ä. % % #1 Logo (optional) default: \Info % #2 Titel (optional) default: Information; könnte theoretisch auch leer sein, % das ist aber wegen des Logos nicht sinnvoll %**************************************************** { % Definition des Kastens mit Standardwerten % u.U. ist linewidth=1pt erorderlich \begin{framed} % linksbündig ist besser, weil es in der Regel wenige Zeilen sind, die teilweise kurz sind \begin{flushleft} % Überschrift größer darstellen \begin{Large} % #1 wird als Logo verwendet, Vorgabe ist \Info aus marvosym % für andere Logos muss ggf. das Package eingebunden werden % das Logo kann auch mit einer Größe verbunden werden, z.B. \LARGE\danger als #1 {#1 } \ % #2 wird als Titelzeile verwendet, Vorgabe ist 'Information' {\bfseries #2} \medskip \end{Large} \\ } % Ende der begin-Anweisungen, es folgenden die end-Anweisungen { \end{flushleft}\end{framed} } \newcommand{\TemplateHeaderExercise}[3] % no more parameters %**************************************************** % Template Header Exercise % Rahmen als minisec mit Nummer der Aufgabe und Titel und grauem Hintergrund % ist gedacht für folgende Wiki-Vorlage: % Vorlage:Übung4 % kann genauso für den Aufgaben-Teil folgender Vorlagen verwendet werden: % Vorlage:Übung (wird zz. nur einmal benutzt) % Vorlage:Übung2 (wird zz. gar nicht benutzt) % Vorlage:Übung3 (wird zz. in 2 Büchern häufig benutzt) % C++-Programmierung/ Vorlage:Aufgabe (wird zz. nur selten benutzt, % ist in LatexRenderer.hs schon erledigt) % % #1 Text (optional) 'Aufgabe' oder 'Übung', kann auch leer sein % #2 Nummer (Pflicht) könnte theoretisch auch leer sein, aber dann sieht die Zeile % seltsam aus; oder die if-Abfragen wären unnötig komplex % #3 Titel (optional) Inhaltsangabe der Aufgabe, kann auch leer sein %**************************************************** { \minisec{\normalfont \fcolorbox{black}{shadecolor}{\large \, #1 #2 \ifx{#3}{}{}\else{-- #3}\fi \,} \medskip } } \newcommand{\TemplateHeaderSolution}[3] % no more parameters %**************************************************** % Template Header Solution % Rahmen als minisec mit Nummer der Aufgabe und Titel und grauem Hintergrund % % ist gedacht für den Lösungen-Teil der Vorlagen und wird genauso % verwendet wie \TemplateHeaderExercise %**************************************************** { \minisec{\normalfont \fcolorbox{black}{shadecolor}{\large \, Lösung zu #1 #2 \ifx{#3}{}{}\else{-- #3}\fi \,} \medskip } } \newcommand{\TemplateUbungDrei}[4] { \TemplateHeaderExercise{Übung}{#1}{#2} #3 \TemplateHeaderSolution{Übung}{#1}{#2} #4 } \newcommand{\Mywrapfigure}[2] { \begin{wrapfigure}{r}{#1\textwidth} \begin{center} #2 \end{center} \end{wrapfigure} } \newcommand{\Mymakebox}[2] { \begin{minipage}{#1\textwidth} #2 \end{minipage} } \newcommand{\MyBlau}[1]{ \textcolor{darkblue}{#1} } \newcommand{\MyRot}[1]{ \textcolor{red}{#1} } \newcommand{\MyGrun}[1]{ \textcolor{mydarkgreen}{#1} } \newcommand{\MyBg}[2]{ \fcolorbox{#1}{#1}{#2} } \newcommand{\BNPModule}[1]{ the "#1" module } \newcommand{\LaTeXMerkeZweiTemplate}[1]{\LaTeXDoubleBoxTemplate{Merke}{#1}} \newcommand{\LaTeXDefinitionTemplate}[1]{\LaTeXDoubleBoxTemplate{Definition}{#1}} \newcommand{\LaTeXAnorganischeChemieFuerSchuelerVorlageMerksatzTemplate}[1]{\LaTeXDoubleBoxTemplate{Merksatz}{#1}} \newcommand{\LaTeXTextTemplate}[1]{\LaTeXDoubleBoxTemplate{}{#1}} \newcommand{\LaTeXExampleTemplate}[1]{\LaTeXDoubleBoxTemplate{Example:}{#1}} \newcommand{\HaskellExampleTemplate}[2]{\LaTeXDoubleBoxTemplate{Example: #1}{#2}} \newcommand{\LaTeXexampleTemplate}[1]{\LaTeXDoubleBoxTemplate{Example:}{#1}} \newcommand{\LaTeXNoteTemplate}[1]{\LaTeXDoubleBoxTemplate{Note:}{#1}} \newcommand{\LaTeXConsoleTemplate}[1]{\LaTeXDoubleBoxTemplate{Console:}{#1}} \newcommand{\LaTeXPTPBoxTemplate}[1]{\LaTeXDoubleBoxTemplate{Points to ponder:}{#1}} \newcommand{\LaTeXNOTETemplate}[2]{\LaTeXDoubleBoxTemplate{Note:}{#1 #2}} \newcommand{\LaTeXNotizTemplate}[1]{\LaTeXDoubleBoxTemplate{Notiz:}{#1}} \newcommand{\LaTeXbodynoteTemplate}[1]{\LaTeXDoubleBoxTemplate{Note:}{#1}} \newcommand{\DarcsPatchProperty}[1]{\LaTeXDoubleBoxTemplate{Patch property:}{#1}} \newcommand{\LaTeXecebcite}[1]{\textsuperscript{[#1]}} \newcommand{\LaTeXmainpage}[1]{{\itshape Main Page: #1}} \newcommand{\LaTeXAsof}[1]{As of #1} \newcommand{\LaTeXasof}[1]{as of #1} \newcommand{\LaTeXAPDIPpreface}[1]{ Roberto R. Romulo \newline Chairman (2000-2002) \newline e-ASEAN Task Force \newline Manila, Philippines \newline $\text{ }$\newline Shahid Akhtar \newline Program Coordinator\newline UNDP-APDIP \newline Kuala Lumpur, Malaysia\newline http://www.apdip.net\newline} \newcommand{\LaTeXcquoteTemplate}[1]{\LaTeXDoubleBoxTemplate{Quote:}{#1}} \newcommand{\LaTeXCquoteTemplate}[1]{\LaTeXDoubleBoxTemplate{Quote:}{#1}} \newcommand{\LaTeXSideNoteTemplate}[1]{\LaTeXDoubleBoxTemplate{Note:}{#1}} \newcommand{\LaTeXsideNoteTemplate}[1]{\LaTeXDoubleBoxTemplate{Note:}{#1}} \newcommand{\LaTeXExercisesTemplate}[1]{\LaTeXDoubleBoxTemplate{Exercises:}{#1}} \newcommand{\LaTeXCppProgrammierungVorlageTippTemplate}[1]{\LaTeXDoubleBoxTemplate{Tip}{#1}} \newcommand{\LaTeXTipTemplate}[1]{\LaTeXDoubleBoxTemplate{Tip}{#1}} \newcommand{\LaTeXUnknownTemplate}[1]{unknown} \newcommand{\LaTeXCppProgrammierungVorlageHinweisTemplate}[1]{\LaTeXDoubleBoxTemplate{Hinweis}{#1}} \newcommand{\LaTeXCppProgrammierungVorlageSpaeterImBuchTemplate}[1]{\LaTeXDoubleBoxTemplate{Thema wird später näher erläutert...}{#1}} \newcommand{\SGreen}[1]{This page uses material from Dr. Sheldon Green's Hypertext Help with LaTeX.} \newcommand{\ARoberts}[1]{This page uses material from Andy Roberts' Getting to grips with LaTeX with permission from the author.} \newcommand{\LaTeXCppProgrammierungVorlageAnderesBuchTemplate}[1]{\LaTeXDoubleBoxTemplate{Buchempfehlung}{#1}} \newcommand{\LaTeXCppProgrammierungVorlageNichtNaeherBeschriebenTemplate}[1]{\LaTeXDoubleBoxTemplate{Nicht Thema dieses Buches...}{#1}} \newcommand{\LaTeXPythonUnterLinuxVorlagenVorlageDetailsTemplate}[1]{\LaTeXDoubleBoxTemplate{Details}{#1}} \newcommand{\LaTeXChapterTemplate}[1]{\chapter{#1} \myminitoc } \newcommand{\Sample}[2]{ \begin{longtable}{|p{\linewidth}|} \hline #1 \\ \hline #2 \\ \hline \end{longtable} } \newcommand{\Syntax}[1]{ \LaTeXDoubleBoxTemplate{Syntax}{#1}} \newcommand{\LaTeXTT}[1]{{\ttfamily #1}} \newcommand{\LaTeXBF}[1]{{\bfseries #1}} \newcommand{\ADAPK}[3]{{#1.#2}} \newcommand{\LaTeXTTBF}[1]{{\bfseries \ttfamily #1}} \newcommand{\LaTeXIT}[1]{{\itshape #1}} \newcommand{\ADACOM}[1]{{\itshape -{}-#1}} \newcommand{\LaTeXCenter}[1]{ \begin{center} #1 \end{center}} \newcommand{\BNPManual}[2]{The Blender Manual page on #1 at \url{http://wiki.blender.org/index.php/Doc:Manual/#1}} \newcommand{\BNPWeb}[2]{#1 at \url{#2}} \newcommand{\Noframecenter}[2]{ \begin{tablular}{p{\linewidth}} #2\\ #1 \end{tabluar} } \newcommand{\LaTeXTTUlineTemplate}[1]{{\ttfamily \uline{#1}} } \newcommand{\PythonUnterLinuxDenulltails}[1]{ \begin{tabular}{|p{\linewidth}|}\hline \textbf{Denulltails} \\ \hline #1 \\ \hline \end{tabular}} \newcommand{\GNURTip}[1]{ \begin{longtable}{|p{\linewidth}|}\hline \textbf{Tip} \\ \hline #1 \\ \hline \end{longtable}} \newcommand{\PerlUebung}[1]{ \begin{longtable}{|p{0.9\linewidth}|}\hline #1 \\ \hline \end{longtable}} \newcommand{\PerlNotiz}[1]{ \begin{table}{|p{\linewidth}|}\hline #1 \\ \hline \end{table}} \newcommand{\ACFSZusatz}[1]{\textbf{ Zusatzinformation }} \newcommand{\ACFSVorlageB}[1]{\textbf{ Beobachtung }} \newcommand{\ACFSVorlageV}[1]{\textbf{ Versuchsbeschreibung }} \newcommand{\TemplateHeaderSolutionUebung}[2]{\TemplateHeaderSolution{Übung}{#1}{#2}} \newcommand{\TemplateHeaderExerciseUebung}[2]{\TemplateHeaderExercise{Übung}{#1}{#2}} \newcommand{\ChemTemplate}[9]{\texttt{ #1#2#3#4#5#6#7#8#9}} \newcommand{\QED}[1]{\square} \newcommand{\WaningTemplate}[1]{ \begin{TemplateInfo}{\danger}{Warning} #1 \end{TemplateInfo}} \newcommand{\WarnungTemplate}[1]{ \begin{TemplateInfo}{\danger}{Warnung} #1 \end{TemplateInfo}} \newcommand{\BlenderAlignedToViewIssue}[1]{ \begin{TemplateInfo}{\danger}{Blender3d Aligned to view issue} This tutorial relies on objects being created so that they are aligned to the view that you’re looking through. Versions 2.48 and above have changed the way this works. Visit Aligned (\url{http://en.wikibooks.org/wiki/Blender_3D:_Noob_to_Pro/Aligned_to_view_issue}) to view issue to understand the settings that need to be changed. \end{TemplateInfo}} \newcommand{\BlenderVersion}[1]{ {\itshape Diese Seite bezieht sich auf }{\bfseries \quad Blender Version #1}} \newcommand{\Literal}[1]{{\itshape #1}} \newcommand{\JavaIllustration}[3]{ \begin{tablular} {Figure #1: #2} \\ #3 \end{ltablular} } \newcommand{\Ja}[1]{\Checkmark {\bfseries Ja}} \newcommand{\Nein}[1]{\XSolidBrush {\bfseries Nein}} \newcommand{\SVGVersions}[8]{ {\scriptsize \begin{tabular}{|p{0.45\linewidth}|p{0.13\linewidth}|}\hline Squiggle (Batik) & #1 \\ \hline Opera (Presto) & #2 \\ \hline Firefox (Gecko; auch SeaMonkey, Iceape, Iceweasel etc) & #3 \\ \hline Konqueror (KSVG) & #4 \\ \hline Safari (Webkit) & #5 \\ \hline Chrome (Webkit) & #6 \\ \hline Microsoft Internet Explorer (Trident) & #7 \\ \hline librsvg & #8 \\\hline \end{tabular}} } \theoremstyle{plain} \newtheorem{satz}{Satz} \newtheorem{beweis}{Beweis} \newtheorem{beispiel}{Beispiel} \theoremstyle{definition} \newtheorem{mydef}{Definition} \newcommand{\NFSatz}[2]{\begin{satz}#1\end{satz}#2} \newcommand{\NFDef}[2]{\begin{mydef}#1\end{mydef}#2} \newcommand{\NFBeweis}[2]{\begin{beweis}#1\end{beweis}#2} \newcommand{\NFBeweisschritt}[2]{{\bfseries Beweisschritt} #1 \\ #2} \newcommand{\Smiley}[1]{$\ddot\smile$} \newcommand{\NFBeispiel}[2]{\begin{beweis}#1\end{beweis}#2} \newcommand{\NFFrage}[3]{ \definecolor{shadecolor}{gray}{0.9}\begin{myshaded}{\itshape \uline{#1}: #2} \\ #3 \end{myshaded} } \newcommand{\NFFrageB}[2]{ \definecolor{shadecolor}{gray}{0.9}\begin{myshaded}{\itshape \uline{Frage}: #1} \\ #2 \end{myshaded} } \newcommand{\NFVertiefung}[1]{ {\bfseries Vertiefung:} \\ Der Inhalt des folgenden Abschnitts ist eine Vertiefung des Stoffes. Für die nächsten Kapitel ist es nicht notwendig, dass du dieses Kapitel gelesen hast. } mediawiki2latex-8.29/document/headers/unicodes.tex000066400000000000000000000003221504464363500223320ustar00rootroot00000000000000 \newcommand{\R}{\ensuremath{\mathbb{R}}} \newcommand{\N}{\ensuremath{\mathbb{N}}} \newcommand{\Z}{\ensuremath{\mathbb{Z}}} \newcommand{\Q}{\ensuremath{\mathbb{Q}}} \renewcommand{\C}{\ensuremath{\mathbb{C}}} mediawiki2latex-8.29/latex/000077500000000000000000000000001504464363500156665ustar00rootroot00000000000000mediawiki2latex-8.29/latex/coverfrontpage.tex000066400000000000000000000004761504464363500214430ustar00rootroot00000000000000\begin{LARGE} \begin{center} \textbf{\Huge Jürgen Thomas} \bigskip \parbox[t]{1.0\linewidth}{ \includegraphics[width=1.00000\linewidth,height=6.5in,keepaspectratio]{SQL-Titelbild.png} }\vspace{0.75cm} \textbf{\Huge Datenbanken bearbeiten} \bigskip \begin{shaded} Wikibooks \\ \end{shaded} \end{center} \end{LARGE}mediawiki2latex-8.29/latex/my-head.tex000066400000000000000000000025401504464363500177350ustar00rootroot00000000000000\RequirePackage{hyphsubst} \documentclass[fontsize=11pt,paper=A4,BCOR=12mm,DIV=13,open=any,listof=totoc,toc=flat]{scrbook} \input{../headers/paper} \input{../headers/packages1} \input{../headers/babel} \input{../headers/svg} \input{../headers/packages2} \input{../headers/defaultcolors} \input{../headers/hyphenation} \input{../headers/commands} \input{../headers/title} \input{../headers/options} \input{../headers/formattings} \input{../headers/unicodes} \input{../headers/templates} \input{../headers/templates-dirk} \input{../headers/templates-chemie} \usepackage{lmodern} \usepackage{xltxtra} \usepackage{fontspec} \directlua {luaotfload.add_fallback ("myfallback", { "unifont:mode=harf;" } ) } \setmainfont[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]{cmunbx.ttf} \setmonofont[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]{cmunbx.ttf} \begin{document} \allowdisplaybreaks \raggedbottom \thispagestyle{empty} \pagestyle{empty} %\include{coverfrontpage} %\cleardoublepage \pagenumbering{Roman} \maketitle \pagestyle{scrheadings} \setcounter{tocdepth}{\mytocdepth} \tableofcontents %\cleardoublepage \pagenumbering{arabic} %\include{kap-vorwort} mediawiki2latex-8.29/latex/my-tabhead.tex000066400000000000000000000021401504464363500204200ustar00rootroot00000000000000\RequirePackage{hyphsubst} \documentclass[fontsize=11pt,paper=A4,BCOR=12mm,DIV=13,open=any,listof=totoc]{scrbook} \input{../headers/paper} \input{../headers/packages1} \input{../headers/babel} \input{../headers/svg} \input{../headers/packages2} \input{../headers/defaultcolors} \input{../headers/hyphenation} \input{../headers/commands} \input{../headers/title} \input{../headers/options} \input{../headers/formattings} \input{../headers/unicodes} \input{../headers/templates} \input{../headers/templates-dirk} \input{../headers/templates-chemie} \usepackage{type1ec} \usepackage{xltxtra} \usepackage{fontspec} \usepackage{varwidth} \directlua {luaotfload.add_fallback ("myfallback", { "unifont:mode=harf;" } ) } \setmainfont[ UprightFont=FreeSerif, BoldFont=FreeSerifBold, ItalicFont=FreeSerifItalic, BoldItalicFont=FreeSerifItalic, ]{FreeSerif} \setmonofont[ UprightFont=FreeMono, BoldFont=FreeMonoBold, ItalicFont=FreeMonoOblique, BoldItalicFont=FreeMonoBoldOblique ]{FreeMono} \begin{document} \thispagestyle{empty} \newsavebox{\mybox} \sbox{\mybox}{ mediawiki2latex-8.29/latex/my-tabtail.tex000066400000000000000000000000411504464363500204460ustar00rootroot00000000000000} \the\wd\mybox, \end{document} mediawiki2latex-8.29/latex/my-tail.tex000066400000000000000000001774631504464363500200060ustar00rootroot00000000000000\pagebreak \printindex \KOMAoptions{fontsize=9pt,DIV=90,BCOR=0pt} \pagebreak \chapter{Licenses} \label{Licenses} {\tiny \section {GNU GENERAL PUBLIC LICENSE} \begin{multicols}{4} Version 3, 29 June 2007 Copyright © 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. “This License” refers to version 3 of the GNU General Public License. “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. “The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. A “covered work” means either the unmodified Program or a work based on the Program. To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: * a) The work must carry prominent notices stating that you modified it, and giving a relevant date. * b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”. * c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. * d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: * a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. * b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. * c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. * d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. * e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: * a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or * b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or * c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or * d) Limiting the use for publicity purposes of names of licensors or authors of the material; or * e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or * f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”. A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . \end{multicols} \section{GNU Free Documentation License} \begin{multicols}{4} Version 1.3, 3 November 2008 Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque". Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. The "publisher" means any person or entity that distributes copies of the Document to the public. A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: * A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. * B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. * C. State on the Title page the name of the publisher of the Modified Version, as the publisher. * D. Preserve all the copyright notices of the Document. * E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. * F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. * G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. * H. Include an unaltered copy of this License. * I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. * J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. * K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. * L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. * M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. * N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. * O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties—for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements". 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License. However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document. 11. RELICENSING "Massive Multiauthor Collaboration Site" (or "MMC Site") means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A "Massive Multiauthor Collaboration" (or "MMC") contained in the site means any set of copyrightable works thus published on the MMC site. "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization. "Incorporate" means to publish or republish a Document, in whole or in part, as part of another Document. An MMC is "eligible for relicensing" if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. ADDENDUM: How to use this License for your documents To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (C) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with … Texts." line with this: with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. \end{multicols} \section{GNU Lesser General Public License} \begin{multicols}{4} GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright © 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, “this License” refers to version 3 of the GNU Lesser General Public License, and the “GNU GPL” refers to version 3 of the GNU General Public License. “The Library” refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An “Application” is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A “Combined Work” is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the “Linked Version”. The “Minimal Corresponding Source” for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The “Corresponding Application Code” for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: * a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or * b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: * a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. * b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: * a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. * b) Accompany the Combined Work with a copy of the GNU GPL and this license document. * c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. * d) Do one of the following: o 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. o 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. * e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: * a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. * b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. \end{multicols} } \pagebreak \end{document} mediawiki2latex-8.29/latex/preamble.tex000066400000000000000000000052521504464363500202030ustar00rootroot00000000000000\listoffigures \label{ListOfFigures} \begin{itemize} \item GFDL: Gnu Free Documentation License. \url{http://www.gnu.org/licenses/fdl.html} \item cc-by-sa-4.0: Creative Commons Attribution ShareAlike 4.0 License. \url{https://creativecommons.org/licenses/by-sa/4.0/deed.en} \item cc-by-sa-3.0: Creative Commons Attribution ShareAlike 3.0 License. \url{http://creativecommons.org/licenses/by-sa/3.0/} \item cc-by-sa-2.5: Creative Commons Attribution ShareAlike 2.5 License. \url{http://creativecommons.org/licenses/by-sa/2.5/} \item cc-by-sa-2.0: Creative Commons Attribution ShareAlike 2.0 License. \url{http://creativecommons.org/licenses/by-sa/2.0/} \item cc-by-sa-1.0: Creative Commons Attribution ShareAlike 1.0 License. \url{http://creativecommons.org/licenses/by-sa/1.0/} \item cc-by-1.0: Creative Commons Attribution 1.0 License. \url{https://creativecommons.org/licenses/by/1.0/deed.en} \item cc-by-2.0: Creative Commons Attribution 2.0 License. \url{http://creativecommons.org/licenses/by/2.0/} \item cc-by-2.5: Creative Commons Attribution 2.5 License. \url{http://creativecommons.org/licenses/by/2.5/deed.en} \item cc-by-3.0: Creative Commons Attribution 3.0 License. \url{http://creativecommons.org/licenses/by/3.0/deed.en} \item cc-by-4.0: Creative Commons Attribution 4.0 License. \url{https://creativecommons.org/licenses/by/4.0/deed.de} \item GPL: GNU General Public License. \url{http://www.gnu.org/licenses/gpl-2.0.txt} \item LGPL: GNU Lesser General Public License. \url{http://www.gnu.org/licenses/lgpl.html} \item PD: This image is in the public domain. \item ATTR: The copyright holder of this file allows anyone to use it for any purpose, provided that the copyright holder is properly attributed. Redistribution, derivative work, commercial use, and all other use is permitted. \item EURO: This is the common (reverse) face of a euro coin. The copyright on the design of the common face of the euro coins belongs to the European Commission. Authorised is reproduction in a format without relief (drawings, paintings, films) provided they are not detrimental to the image of the euro. \item LFK: Lizenz Freie Kunst. \url{http://artlibre.org/licence/lal/de} \item CFR: Copyright free use. \item EPL: Eclipse Public License. \url{http://www.eclipse.org/org/documents/epl-v10.php} \end{itemize} Copies of the GPL, the LGPL as well as a GFDL are included in chapter \mylofref{Licenses}{Licenses}. Please note that images in the public domain do not require attribution. You may click on the image numbers in the following table to open the webpage of the images in your webbrower. \pagebreak \small \begin{longtable}{|p{0.05\textwidth}|p{0.6\textwidth}|p{0.15\textwidth}|} \hline mediawiki2latex-8.29/latex/templates.user000066400000000000000000000650371504464363500205770ustar00rootroot00000000000000[ ["mywikitemplate1","MyLaTeXTemplate","paramx","3","paramy"], ["NPOV","LaTeXNullTemplate"], ["Print version cover","LaTeXNullTemplate"], ["Engineering Acoustics","LaTeXNullTemplate"], ["navigation","LaTeXNullTemplate"], ["Pathologie: Vorlage:Abb","LaTeXNullTemplate"], ["DISPLAYTITLE:UV Archiv Blender bis Version 2.45","LaTeXNullTemplate"], ["Blender3D: Vorlage:clr","LaTeXNullTemplate"], ["Mathe f\252r Nicht-Freaks: Vorlage:Navigation Oben","LaTeXNullTemplate"], ["Mathe f\252r Nicht-Freaks: Vorlage:Navigation Unten","LaTeXNullTemplate"], ["Aufgabensammlung: Vorlage:Infobox","LaTeXNullTemplate"], ["Druckversion","LaTeXNullTemplate"], ["Vorlage:Auszeichnung BdM","LaTeXNullTemplate"], ["TOCright","LaTeXNullTemplate"], ["Hinweis PDF","LaTeXNullTemplate"], ["Referenzen Hinweis","LaTeXNullTemplate"], ["Referenzen Hinweis","LaTeXNullTemplate"], ["Vorlage:StatusBuch","LaTeXNullTemplate"], ["Band","LaTeXNullTemplate"], ["Im Buchkatalog","LaTeXNullTemplate"], ["msg:EngTherm","LaTeXNullTemplate"], ["noprint","LaTeXNullTemplate"], ["msg:stub","LaTeXNullTemplate"], ["EngTherm","LaTeXNullTemplate"], ["Nav","LaTeXNullTemplate"], ["bookcat","LaTeXNullTemplate"], ["book title","LaTeXNullTemplate"], ["Clr","LaTeXNullTemplate"], ["java:string","LaTeXJavaStringTemplate","1"], ["java:EBNF","LaTeXJavaEBNFTemplate"], ["Data Structures/ChapNav","LaTeXNullTemplate"], ["yes","yes"], ["no","no"], ["B3D:N2P/RepoMain","BlenderRepo","1"], ["Wikifizieren","LaTeXNullTemplate"], ["#ifeq:{{{include","LaTeXNullTemplate"], ["Sammlung","LaTeXNullTemplate"], ["Wie_mein_Buch_auf_die_Welt_kommt/_Vorlage:Nav_ZVo","LaTeXNullTemplate"], ["Mathe f\252r Nicht-Freaks: Vorlage:Klapptext","LaTeXDoubleBoxOpenTemplate","kopf","inhalt"], ["Aufgabensammlung: Vorlage:Klapptext","LaTeXDoubleBoxOpenTemplate","kopf","inhalt"], ["DS:ADT","LaTeXDoubleBoxOpenTemplate","1","2"], ["Mathe f\252r Nicht-Freaks: Vorlage:Beweisschritt","NFBeweisschritt","ziel","beweisschritt"], ["Mathe f\252r Nicht-Freaks: Vorlage:Beweis","NFBeweis","titel","beweis"], ["Mathe f\252r Nicht-Freaks: Vorlage:Definition","NFDef","titel","definition"], ["mathe f\252r Nicht-Freaks: Vorlage:Definition","NFDef","titel","definition"], ["Mathe f\252r Nicht-Freaks: Vorlage:Satz","NFSatz","titel","satz"], ["Mathe f\252r Nicht-Freaks: Vorlage:Beispiel","NFBeispiel","titel","beispiel"], ["Mathe f\252r Nicht-Freaks: Vorlage:Hinweis","NFHinweis","1"], ["Mathe f\252r Nicht-Freaks: Vorlage:Warnung","WarnungTemplate","1"], ["Mathe f\252r Nicht-Freaks: Vorlage:Aufgabe","NFAufgabe","aufgabe","l\246sung"], ["Mathe f\252r Nicht-Freaks: Vorlage:Fallunterscheidung","NFFallunterscheidung","fall1","fall1-beweis","fall2","fall2-beweis","fall3","fall3-beweis","fall4","fall4-beweis"], ["Mathe f\252r Nicht-Freaks: Vorlage:Vertiefung","NFVertiefung"], ["Smiley","Smiley"], ["Hidden end","LaTeXNullTemplate"], ["Versteckt","LaTeXNullTemplate"], ["Doppellizenz CC by-sa Wikibooks","Doppellizenz"], ["TJa","LaTeXJa"], ["TNein","LaTeXNein"], ["overline","myoverline","1"], ["Overline","myoverline","1"], ["Java/Hidden begin","LaTeXNullTemplate"], ["Nicht l\246schen","LaTeXNullTemplate"], ["Blender3D:_Vorlage:clr","LaTeXNullTemplate"], ["Blender3D:_Vorlage:Nav_ZVu","LaTeXNullTemplate"], ["Blender3D:_Vorlage:Nav_ZVu","LaTeXNullTemplate"], ["GLSL Programming BottomNav","LaTeXNullTemplate"], ["x86 Disassembly/Page","LaTeXNullTemplate"], ["TopNav","LaTeXNullTemplate"], ["x86 Disassembly/Syntax","DisassemblySyntax","1"], ["x86 Disassembly/Stub","LaTeXNullTemplate"], ["Navigation zur\252ckhoch","LaTeXNullTemplate"], ["Hide in print","LaTeXNullTemplate"], ["decistage","LaTeXNullTemplate"], ["Control Systems/Nav","LaTeXNullTemplate"], ["...","LaTeXNullTemplate"], ["print unit page","LaTeXNullTemplate"], ["LDTOC","LaTeXNullTemplate"], ["LDAppTOC","LaTeXNullTemplate"], ["Toplink","LaTeXNullTemplate"], ["PaleoIntro","LaTeXNullTemplate"], ["navbar","LaTeXNullTemplate"], ["tl","tlTemplate","1"], ["Control Systems/Stub","LaTeXNullTemplate"], ["Control Systems/Page","LaTeXNullTemplate"], ["Control Systems Page","LaTeXNullTemplate"], ["Control Systems Page","LaTeXNullTemplate"], ["MATLAB CMD","matlabTemplate","1"], ["=","LaTeXEquals"], ["Control Systems/Matrix Dim","matrixdimTemplate"], ["Control Systems/Nav","LaTeXNullTemplate"], ["Python Programming/Navigation","LaTeXNullTemplate"], ["S-Green","SGreen"], ["Code:Tip","LaTeXCodeTipTemplate","1","2","3"], ["C Programming/Navigation","LaTeXNullTemplate"], ["C Programming/Navigation Start","LaTeXNullTemplate"], ["move","LaTeXNullTemplate"], ["LaTeX/Bottom","LaTeXNullTemplate"], ["C Programming","LaTeXNullTemplate"], ["Mathe f\252r Nicht-Freaks: Vorlage:L\246sungsweg","Loesungsweg","titel","l\246sungsweg"], ["Special Relativity","LaTeXNullTemplate"], ["Formel","LaTeXIdentityTemplate","1"], ["C Programming/Navigation End","LaTeXNullTemplate"], ["Vorlage:Referenzen Start","LaTeXNullTemplate"], ["Vorlage:Referenzen Ende","LaTeXNullTemplate"], ["Vorlage:Referenzen Eintrag","VorlageReferenzenEintrag","1","2","3"], ["Referenzen Start","LaTeXNullTemplate"], ["Referenzen Ende","LaTeXNullTemplate"], ["Symbol","LaTeXIdentityTemplate","1"], ["Referenzen Eintrag","VorlageReferenzenEintrag","1","2","3"], ["Soziologische Klassiker/ Vorlage:Unvollst\228ndig","LaTeXNullTemplate"], ["Soziologische Klassiker/ Vorlage:AbsatzGel\246scht","LaTeXNullTemplate"], ["Navigation zur\252ckhochvor","LaTeXNullTemplate"], ["Creator:Tycho Brahe","TychoBrahe"], ["Belege","LaTeXNullTemplate"], ["DISPLAYTITLE","LaTeXNullTemplate"], ["Aufgabensammlung: Vorlage:Vollst\228ndige Induktion","LaTeXInduktion","erfuellungsmenge","aussageform","induktionsanfang","induktionsvoraussetzung","induktionsbehauptung","beweis_induktionsschritt"], ["B3D:N2P/NAV","LaTeXNullTemplate"], ["displaytitle","LaTeXNullTemplate"], ["Template:B3D:N2P/Prerelease","LaTeXNullTemplate"], ["compactTOC","LaTeXNullTemplate"], ["Template:Attention","LaTeXNullTemplate"], ["subject","LaTeXNullTemplate"], ["PDFlink","PDFLink","1"], ["Blender3d_Aligned_to_view_issue","BlenderAlignedToViewIssue"], ["AltBookCat","LaTeXNullTemplate"], ["expand","LaTeXNullTemplate"], ["attention","LaTeXNullTemplate"], ["Editor note","LaTeXEditorNote","1"], ["B3D:N2P/Manual","BNPManual","1","2"], ["B3D:N2P/Web","BNPWeb","1","url"], ["center","LaTeXCenter","1"], ["A-Roberts","ARoberts"], ["todo","LaTeXNullTemplate"], ["status","LaTeXNullTemplate"], ["under construction","LaTeXNullTemplate"], ["Cleanup","LaTeXNullTemplate"], ["B3D:N2P/Hidden begin","LaTeXNullTemplate"], ["Anchor","LaTeXNullTemplate"], ["Authors","CPPAuthorsTemplate","works","prevauthors","authors","what"], ["C++ Programming/kw","LaTeXTT","1"], ["Cpp","LaTeXTT","1"], ["Ada/op","LaTeXTT","1"], ["SAMPLE","Sample","sampletext","caption"], ["C++ Programming/Syntax","Syntax","1"], ["CompactTOC8","LaTeXNullTemplate"], ["LaTeX/Parameter","LaTeXTT","1"], ["B3D:N2P/FirstUse","LaTeXBF","1"], ["subject definition","LaTeXBF","1"], ["Tip","LaTeXTipTemplate","1"], ["LaTeX/Package","LaTeXTT","1"], ["LaTeX/Environment","LaTeXTT","1"], ["LaTeX/LaTeX","LaTeXTT","code"], ["unknown","LaTeXUnknownTemplate"], ["Noframecenter","Noframecenter","1","2"], ["LaTeX/Example","LaTeXExample","code"], ["B3D:N2P/Module","BNPModule","1"], ["Green","MyGrun","1"], ["Red","MyRot","1"], ["Blue","MyBlau","1"], ["mergeto","LaTeXNullTemplate"], ["Modulesplit","LaTeXNullTemplate"], ["blender3d_Aligned_to_view_issue","BlenderAlignedView"], ["Blender3D:_Vorlage:Nav_ZVo","LaTeXNullTemplate"], ["TOC right","LaTeXNullTemplate"], ["Navigation","LaTeXNullTemplate"], ["Blender3D:_Vorlage:Tip","LaTeXTipTemplate","1"], ["Blender3D:_Vorlage:Version","BlenderVersion","1"], ["Blender3D: Vorlage:Version","BlenderVersion","1"], ["Blender3D:_Vorlage:KEY","keystroke","1"], ["B3D:N2P/Key","keystroke","1"], ["keypress","keystroke","1"], ["'","LaTeXAccentTemplate"], ["kbd","keystroke","1"], ["Solution","LaTeXDoubleBoxOpenTemplate","title","text"], ["Klappbox","LaTeXDoubleBoxOpenTemplate","1","2"], ["SVG/ Vorlage/ Versionen","SVGVersions","batik","opera","firefox","konqueror","safari","chrome","ie","rsvg"], ["Java/Illustration","JavaIllustration","number","caption","image"], ["Blender3D:_Vorlage:Difficulty","WaningTemplate","1"], ["Blender3D: Vorlage:Difficulty","WaningTemplate","1"], ["Blender3D:_Vorlage:Note","LaTeXNotizTemplate","1"], ["Blender3D: Vorlage:Note","LaTeXNotizTemplate","1"], ["Blender3D:_Vorlage:ColNum","fbox","1"], ["Blender3D: Vorlage:Version hist","BlenderVersion","1"], ["Blender3D:_Vorlage:Version_hist","BlenderVersion","1"], ["Blender3D:_Vorlage:Version_sH","BlenderVersion","1"], ["Blender3D:_Vorlage:Version_Archiv","BlenderVersion","1"], ["Blender3D:_Vorlage:Note2","LaTeXDoubleBoxTemplate","1","2"], ["Code:Basic","LaTeXDoubleBoxTemplate","1","2"], ["code:Basic","LaTeXDoubleBoxTemplate","1","2"], ["GLSL Programming Expandable Box","LaTeXDoubleBoxOpenTemplate","1","2"], ["Blender3D:_Vorlage:Nav_Anfang_o","LaTeXNullTemplate"], ["Blender3D: Vorlage:Nav_Anfang_o","LaTeXNullTemplate"], ["Blender3D: Vorlage:Nav Anfang o","LaTeXNullTemplate"], ["de","LaTeXDeutschTemplate","1"], ["Navigation Regal Reihe Buch","LaTeXNullTemplate"], ["Blender3D: Vorlage:Nav RefU","LaTeXNullTemplate"], ["Blender3D: Vorlage:Nav RefO","LaTeXNullTemplate"], ["Todo","LaTeXNullTemplate"], ["Blender3D:_Vorlage:Nav ZVo","LaTeXNullTemplate"], ["Blender3D: Vorlage:Nav_ZVo","LaTeXNullTemplate"], ["Blender3D: Vorlage:Nav_ZVu","LaTeXNullTemplate"], ["Blender3D:_Vorlage:Nav ZVu","LaTeXNullTemplate"], ["Blender3D: Vorlage:Nav_Anfang_u","LaTeXNullTemplate"], ["Blender3D:_Vorlage:Nav_Anfang_u","LaTeXNullTemplate"], ["Blender3D: Vorlage:Nav_Ende_o","LaTeXNullTemplate"], ["Blender3D: Vorlage:Nav_Ende_u","LaTeXNullTemplate"], ["Navigation hochvor buch","LaTeXNullTemplate"], ["Navigation_hochvor_buch","LaTeXNullTemplate"], ["prognav","LaTeXNullTemplate"], ["chapter-nav","LaTeXNullTemplate"], ["chapter navigation","LaTeXNullTemplate"], ["Latin","LaTeXNullTemplate"], ["Latin/Exercise","LaTeXLatinExerciseTemplate","1","2","3"], ["Ruby Programming/TopNav","LaTeXNullTemplate"], ["Navigation_hoch","LaTeXNullTemplate"], ["Navigation zurückhochvor buch","LaTeXNullTemplate"], ["Navigation_zurückhochvor_buch","LaTeXNullTemplate"], ["Navigation_zurückhoch_buch","LaTeXNullTemplate"], ["Navigation zurückhoch buch","LaTeXNullTemplate"], ["Chapter navigation","LaTeXNullTemplate"], ["ANN/Page","LaTeXNullTemplate"], ["anchor","LaTeXNullTemplate"], ["Artificial Neural Networks/Page","LaTeXNullTemplate"], ["dubious","LaTeXNullTemplate"], ["bookCat","LaTeXNullTemplate"], ["FOSS Licensing","LaTeXNullTemplate"], ["Non-Programmer's Tutorial for Python 2.6/Navigation","LaTeXNullTemplate"], ["recentism","LaTeXNullTemplate"], ["../Navigation","LaTeXNullTemplate"], ["Basic Computing Using Windows/Table of Contents","LaTeXNullTemplate"], ["Non-Programmer's Tutorial for Python 2.0/Navigation","LaTeXNullTemplate"], ["mbox","MBOX","image","text"], ["quote","LaTeXZeroBoxTemplate","1"], ["Quote","LaTeXZeroBoxTemplate","1"], ["quotation","LaTeXZeroBoxTemplate","1"], ["TextBox","LaTeXZeroBoxOpenTemplate","1"], ["details","DETAILS","1"], ["chapnav","LaTeXNullTemplate"], ["featured book","LaTeXNullTemplate"], ["Book Search","LaTeXNullTemplate"], ["auto navigation","LaTeXNullTemplate"], ["Creator:Lysippos","Lysippos"], ["auto category","LaTeXNullTemplate"], ["Learning Theories/Navigation","LaTeXNullTemplate"], ["chapter-stub","LaTeXNullTemplate"], ["chapter stub","LaTeXNullTemplate"], ["Featured book","LaTeXNullTemplate"], ["C sharp/Navigation","LaTeXNullTemplate"], ["PDF version","LaTeXNullTemplate"], ["print version","LaTeXNullTemplate"], ["Print version","LaTeXNullTemplate"], ["alphabetical","LaTeXNullTemplate"], ["navigate","LaTeXNullTemplate"], ["Navigate","LaTeXNullTemplate"], ["Newpage","LaTeXNullTemplate"], ["Subjects","LaTeXNullTemplate"], ["C sharp/Keywords","LaTeXNullTemplate"], ["C sharp/Windows controls","LaTeXNullTemplate"], ["C sharp/kw","LaTeXBF","1"], ["Java-lang","LaTeXTTBF","1"], ["C-lang","LaTeXTTBF","1"], ["C sharp","LaTeXTT","1"], ["pp-vandalism","LaTeXNullTemplate"], ["Circuit Theory/Page","LaTeXNullTemplate"], ["Think Python/Page","LaTeXNullTemplate"], ["Circuit Theory Stub","LaTeXNullTemplate"], ["Serial Programming","LaTeXNullTemplate"], ["Ada/Navigation","LaTeXNullTemplate"], ["Serial_Data_CommunicationsTOC","LaTeXNullTemplate"], ["Demystifying Depression navbar","LaTeXNullTemplate"], ["Stub","LaTeXNullTemplate"], ["Ada/kw","LaTeXBF","1"], ["ada/kw","LaTeXBF","1"], ["Ada/SG1","AdaSGOne","1","2"], ["Ada/95/AI","ADANFAI","1","2"], ["Ada/keyword","LaTeXBF","1"], ["Ada/attribute","LaTeXIT","1"], ["Ada/at","LaTeXIT","1"], ["Ada/pragma","AdaPragma","1"], ["Ada/pragma name","AdaPragma","1"], ["Ada/pk","ADAPK","1","2"], ["Ada/package","LaTeXIdentityTemplate","1"], ["math","LaTeXIdentityTemplate","1"], ["Ada/operator","LaTeXIdentityTemplate","1"], ["Ada/comment","ADACOM","1"], ["Ada/--","ADACOM","1"], ["ada/comment","ADACOM","1"], ["Ada/RM","AdaRM","1","2","title"], ["Ada/83/RM","AdaEightThreeRM","1","title"], ["Ada/2005/RM2","AdaRM","1","2","3"], ["Ada/RM2","AdaRM","1","2","3"], ["Ada/SG3","AdaSGThree","1","2","3","4"], ["Ada/SG2","AdaSGTwo","1","2","3"], ["Ada/SG1","AdaSGOne","1","2"], ["Ada/95/SG1","AdaSGOne","1","2"], ["Ada/RM3","AdaRMThree","1","2","3","4"], ["Ada/2005/RMA3","AdaRMAThree","1","2","3","4"], ["Ada/95/RM3","AdaNiveFiveRMThree","1","2","3","4"], ["Ada/2005/RM3","AdaRMThree","1","2","3","4"], ["Ada/95/RM2","AdaRMNineFive","1","2","3"], ["Ada/2005","AdaTwentyZeroFive"], ["Ada/RMA1","ADARMAONE","1","2"], ["Ada/2005/RMA1","ADARMAONE","1","2"], ["Ada/2005/RMA2","ADARMATWO","1","2","3"], ["Ada/RM1","ADARMONE","1","2"], ["Ada/95/RMA3","AdaNiveFiveRMAThree","1","2","3","4"], ["Ada/95/RMA2","AdaNiveFiveRMATwo","1","2","3"], ["Ada/95/RM1","ADANiveFiveRMONE","1","2"], ["Ada/2005/RM1","ADARMONE","1","2"], ["Ada/95/R1","AdaNineFiveR","1","2","part"], ["Ada/95/R2","AdaNineFiveRTwo","1","2","3","part"], ["Ada/2005/Cite RM","AdaRMCiteFive","1","2","3","title","par","id","quote"], ["Ada/Sourceforge","ADAFile","1"], ["Algorithms/Sample","ADASample","1"], ["dynamic navigation","LaTeXDoubleBoxOpenTemplate","title","body"], ["Fact","LaTeXNullTemplate"], ["PGP","PGP"], ["Appendix","LaTeXAppendixTemplate"], ["relevance","LaTeXNullTemplate"], ["problem","LaTeXProblemTemplate","1"], ["Problem","LaTeXProblemTemplate","1"], ["Citation needed","LaTeXNullTemplate"], ["Human Physiology","LaTeXNullTemplate"], ["RightHalf","LaTeXZeroBoxTemplate","1"], ["print version cover","LaTeXNullTemplate"], ["GenBioTOC","LaTeXNullTemplate"], ["GenBioTOC2","LaTeXNullTemplate"], ["Print chapter heading","chapter","1"], ["Print unit page","LaTeXNullTemplate"], ["Python unter Linux: Vorlagen:VorlageDetails","LaTeXPythonUnterLinuxVorlagenVorlageDetailsTemplate","1"], ["Python_unter_Linux: Vorlagen:VorlageDetails","LaTeXPythonUnterLinuxVorlagenVorlageDetailsTemplate","1"], ["msg:GeneralChemTOC","LaTeXNullTemplate"], ["GeneralChemTOC","LaTeXNullTemplate"], ["citation needed","LaTeXNullTemplate"], ["stub","LaTeXNullTemplate"], ["CompactTOC","LaTeXNullTemplate"], ["stage short","LaTeXNullTemplate"], ["Calculus/Top Nav","LaTeXNullTemplate"], ["Calculus/TOC","LaTeXNullTemplate"], ["Reflist","LaTeXNullTemplate"], ["Wikijunior_Alte_Zivilisationen/_Vorlage/_G","textsc","1"], ["Wikijunior Alte Zivilisationen/ Vorlage/ G","textsc","1"], ["Wikijunior Alte Zivilisationen/ Vorlage/ P","textsc","1"], ["hidden begin","LaTeXNullTemplate"], ["hidden end","LaTeXNullTemplate"], ["col-begin","LaTeXNullTemplate"], ["col-end","LaTeXNullTemplate"], ["Calculus/Stub","LaTeXNullTemplate"], ["Calculus Stub","LaTeXNullTemplate"], ["subpages","LaTeXNullTemplate"], ["Communication Systems Page","LaTeXNullTemplate"], ["Communication Systems/Page","LaTeXNullTemplate"], ["Vom Druck ausschlie\223en","LaTeXNullTemplate"], ["RenderPNG","LaTeXNullTemplate"], ["Buchsuche","LaTeXNullTemplate"], ["Wikijunior Sonnensystem/ Vorlage:Fakten","SonnensystemFakten","1","2","3"], ["Communication Networks/Page","LaTeXNullTemplate"], ["L\195\164nge","LaTeXNullTemplate"], ["Regal","LaTeXNullTemplate"], ["clear","LaTeXNullTemplate"], ["clr","LaTeXNullTemplate"], ["B3D:N2P/ForVersion","BNPForVersion","1"], ["Clear","LaTeXNullTemplate"], ["Blender3D: Vorlage:Video-OGG","LaTeXNullTemplate"], ["Blender3D:_Vorlage:Literal","Literal","1"], ["Blender3D: Vorlage:Glossar-Navigation","LaTeXNullTemplate"], ["TOC","LaTeXNullTemplate"], ["PDF-Link","PDFLink","1"], ["Vom Druck ausschlie\195\159en","LaTeXNullTemplate"], ["Status2","LaTeXNullTemplate"], ["Vorlage:Referenzbox Start","LaTeXNullTemplate"], ["Vorlage:Referenzbox Ende","LaTeXNullTemplate"], ["Referenzbox Start","LaTeXNullTemplate"], ["Referenzbox Ende","LaTeXNullTemplate"], ["Vorlage:Druckversionsnotiz","LaTeXNullTemplate"], ["Anker","LaTeXNullTemplate"], ["anker","LaTeXNullTemplate"], ["Alpha Centauri","LaTeXNullTemplate"], ["\195\156bersetzen","LaTeXNullTemplate"], ["\195\156bersetzt","LaTeXNullTemplate"], ["\220bersetzen","LaTeXNullTemplate"], ["\220bersetzt","LaTeXNullTemplate"], ["PDF-Hinweis","LaTeXNullTemplate"], ["Vorlage:Navigation Buch","LaTeXNullTemplate"], ["Navigation Buch","LaTeXNullTemplate"], ["User:Arunreginald/Page Navigation","LaTeXNullTemplate"], ["Java Programming/LanguageFundamentalsTopic/Nav","LaTeXNullTemplate"], ["Java/Nav","LaTeXNullTemplate"], ["TODO","LaTeXNullTemplate"], ["Java Programming/Nav","LaTeXNullTemplate"], ["Java Programming/CollectionsTopic/Nav","LaTeXNullTemplate"], ["Java Programming/ExceptionsTopic/Nav","LaTeXNullTemplate"], ["Java Programming/GettingStartedTopic/Nav","LaTeXNullTemplate"], ["Fu\223noten","LaTeXNullTemplate"], ["Fu\195\159noten","LaTeXNullTemplate"], ["BookCat","LaTeXNullTemplate"], ["Java Programming:Classes and Objects","LaTeXNullTemplate"], ["Java Programming","LaTeXNullTemplate"], ["sect-stub","LaTeXNullTemplate"], ["cleanup","LaTeXNullTemplate"], ["mergefrom","LaTeXNullTemplate"], ["print version notice","LaTeXNullTemplate"], ["fact","LaTeXNullTemplate"], ["reflist","LaTeXNullTemplate"], ["Auto category","LaTeXNullTemplate"], ["FULLCHAPTERNAME","LaTeXNullTemplate"], ["Quelle-Link","LaTeXQuelleLink","1","text","name"], ["Quelle-Beleg","LaTeXNullTemplate"], ["Haskell/Navigation","LaTeXNullTemplate"], ["sectstub","LaTeXNullTemplate"], ["Haskell navigation","LaTeXNullTemplate"], ["Haskell import Haskell wiki","LaTeXNullTemplate"], ["Haskell stub","LaTeXNullTemplate"], ["Haskell minitoc","LaTeXNullTemplate"], ["Simple Page Navigation","LaTeXNullTemplate"], ["refbegin","LaTeXNullTemplate"], ["refend","LaTeXNullTemplate"], ["Haskell/Interlanguage","LaTeXNullTemplate"], ["Haskell/NotesSection","LaTeXNullTemplate"], ["SUBPAGENAME","LaTeXNullTemplate"], ["Print version notice","LaTeXNullTemplate"], ["Fortran:Vorlage: NavigationUS" ,"LaTeXNullTemplate"], ["Fortran:Vorlage: NavigationMain" ,"LaTeXNullTemplate"], ["Vorlage:Navigationsleiste Alphabet"], ["Info","LaTexInfoTemplateOne","1"], ["Ambox","LaTexInfoTemplateOne","text"], ["SideBox","LaTeXPlainBoxTemplate","1"], ["Calculus/Def","LaTeXDoubleBoxTemplate","title","text"], ["DropBox","LaTeXDoubleBoxTemplate","1","2"], ["Helpful hint","LaTexHelpFulHintTemplate","hint"], ["GCC_take_home","LaTeXGCCTakeTemplate","1"], ["\195\156bung3","TemplateUbungDrei","1","2","Aufgabe","L\195\182sung"], ["\220bung3","TemplateUbungDrei","1","2","Aufgabe","L\246sung"], ["Latex Wrapfigure","Mywrapfigure","width","image"], ["Latex Makebox","Mymakebox","width","content"], ["Latex Identity","LaTeXNullTemplate"], ["blau","MyBlau","1"], ["rot","MyRot","1"], ["gr\252n","MyGrun","1"], ["Merke2", "LaTeXMerkeZweiTemplate", "1"], ["Definition", "LaTeXDefinitionTemplate", "1"], ["Anorganische Chemie f\252r Sch\252ler: Vorlage: Merksatz", "LaTeXAnorganischeChemieFuerSchuelerVorlageMerksatzTemplate", "Text"], ["Anorganische Chemie f\195\188r Sch\195\188ler: Vorlage: Merksatz", "LaTeXAnorganischeChemiefuerSchuelerVorlageMerksatzTemplate", "Text"], ["Text", "LaTeXTextTemplate", "1"], ["Example", "LaTeXExampleTemplate", "1"], ["HaskellExample", "HaskellExampleTemplate", "1","2"], ["example", "LaTeXexampleTemplate", "1"], ["XExample", "LaTeXexampleTemplate", "1"], ["small/top", "LaTeXNullTemplate"], ["small/end", "LaTeXNullTemplate"], ["Reflist", "LaTeXNullTemplate"], ["Status", "LaTeXNullTemplate"], ["XNote", "LaTeXNoteTemplate", "1"], ["XConsole", "LaTeXConsoleTemplate", "1"], ["java:enum", "LaTeXJavaEnumTemplate"], ["PTPBox", "LaTeXPTPBoxTemplate", "1"], ["NOTE", "LaTeXNOTETemplate", "1", "note"], ["B3D:N2P/Note", "LaTeXNOTETemplate", "1", "note"], ["body note", "LaTeXbodynoteTemplate", "1"], ["Body note", "LaTeXbodynoteTemplate", "1"], ["cquote", "LaTeXcquoteTemplate", "1"], ["Cquote", "LaTeXCquoteTemplate", "1"], ["Python Programming/Note", "LaTeXSideNoteTemplate", "1"], ["Side note", "LaTeXSideNoteTemplate", "1"], ["side note", "LaTeXsideNoteTemplate", "1"], ["Exercises", "LaTeXExercisesTemplate", "1"], ["C++-Programmierung/ Vorlage:Tipp", "LaTeXCppProgrammierungVorlageTippTemplate", "1"], ["C++-Programmierung/ Vorlage:Hinweis", "LaTeXCppProgrammierungVorlageHinweisTemplate", "1"], ["C++-Programmierung/ Vorlage:Sp\195\164ter im Buch", "LaTeXCppProgrammierungVorlageSpaeterImBuchTemplate", "1"], ["C++-Programmierung/ Vorlage:Sp\228ter im Buch", "LaTeXCppProgrammierungVorlageSpaeterImBuchTemplate", "1"], ["C++-Programmierung/ Vorlage:Anderes Buch", "LaTeXCppProgrammierungVorlageAnderesBuchTemplate", "1"], ["C++-Programmierung/ Vorlage:Nicht n\195\164her beschrieben", "LaTeXCppProgrammierungVorlageNichtNaeherBeschriebenTemplate", "1"], ["Nicht trennen","mbox","1"], ["nowrap","mbox","1"], ["PDF-Version Gliederung","mypart","1"], ["Druckversion Kapitel","LaTeXChapterTemplate"], ["Python_unter_Linux: Vorlagen:VorlageDateiname","LaTeXTTUlineTemplate","1"], ["Python unter Linux: Vorlagen:VorlageDateiname","LaTeXTTUlineTemplate","1"], ["Python unter Linux: Vorlagen:VorlageTastatureingabe","LaTeXTTUlineTemplate","1"], ["Anorganische Chemie f\252r Sch\252ler: Vorlage: unver\228nderliche Massenverh\228ltnisse","TemplateUnveraenderlicheMassenverhaeltnisse"], ["Anorganische Chemie f\195\188r Sch\195\188ler: Vorlage: unver\195\164nderliche Massenverh\195\164ltnisse","TemplateUnveraenderlicheMassenverhaeltnisse"], ["Anorganische Chemie f\252r Sch\252ler/ Vorlage:Periodensystem","TemplatePeriodensystem"], ["Anorganische Chemie f\195\188r Sch\195\188ler/ Vorlage:Periodensystem","TemplatePeriodensystem"], ["Anorganische Chemie f\252r Sch\252ler: Vorlage: Daltons Atomhypothese","TemplateDaltonsAtomhyposthese"], ["Anorganische Chemie f\195\188r Sch\195\188ler: Vorlage: Daltons Atomhypothese","TemplateDaltonsAtomhyposthese"], ["Anorganische Chemie f\252r Sch\252ler: Vorlage: Erhaltung der Energie","TemplateEnergieerhaltung"], ["Anorganische Chemie f\195\188r Sch\195\188ler: Vorlage: Erhaltung der Energie","TemplateEnergieerhaltung"], ["Anorganische Chemie f\252r Sch\252ler: Vorlage: Erhaltung der Masse","TemplateMassenerhaltung"], ["Anorganische Chemie f\195\188r Sch\195\188ler: Vorlage: Erhaltung der Masse","TemplateMassenerhaltung"], ["Anorganische Chemie f\252r Sch\252ler: Vorlage: Kasten","LaTeXZeroBoxTemplate"], ["Anorganische Chemie f\195\188r Sch\195\188ler: Vorlage: Kasten","LaTeXZeroBoxTemplate"], ["\195\156berschriftensimulation 1","chapter*","1"], ["\195\156berschriftensimulation 2","section*","1"], ["\195\156berschriftensimulation 3","subsection*","1"], ["\195\156berschriftensimulation 4","subsubsection*","1"], ["\195\156berschriftensimulation 5","minisec","1"], ["\220berschriftensimulation 1","chapter*","1"], ["\220berschriftensimulation 2","section*","1"], ["\220berschriftensimulation 3","subsection*","1"], ["\220berschriftensimulation 4","subsubsection*","1"], ["\220berschriftensimulation 5","minisec","1"], ["Navigationsleiste","LaTeXDoubleBoxTemplate","titel","inhalt"], ["Python unter Linux: Vorlagen:VorlageDenulltails","PythonUnterLinuxDenulltails","1"], ["Python_unter_Linux: Vorlagen:VorlageDenulltails","PythonUnterLinuxDenulltails","1"], ["GNU R: Vorlage: Tip","GNURTip","Text"], [":GNU R: Vorlage: Tip","GNURTip","Text"], ["Perl-Programmierung: Vorlagen: \195\156bung","PerlUebung","1"], ["Perl-Programmierung: Vorlagen: \220bung","PerlUebung","1"], ["Perl-Programmierung: Vorlagen: Notiz","PerlNotiz","1"], ["Anorganische Chemie f\252r Sch\252ler: Vorlage: Zusatz","ACFSZusatz"], ["Anorganische Chemie f\195\188r Sch\195\188ler: Vorlage: Zusatz","ACFSZusatz"], ["Anorganische Chemie f\252r Sch\252ler: Vorlage: B","ACFSVorlageB"], ["Anorganische Chemie f\195\188r Sch\195\188ler: Vorlage: B","ACFSVorlageB"], ["Anorganische Chemie f\252r Sch\252ler: Vorlage: V","ACFSVorlageV"], ["Anorganische Chemie f\195\188r Sch\195\188ler: Vorlage: V","ACFSVorlageV"], ["Anorganische Chemie f\252r Sch\252ler: Vorlage: S","ACFSVorlageS"], ["Anorganische Chemie f\195\188r Sch\195\188ler: Vorlage: S","ACFSVorlageS"], ["Taste","keystroke","1"], ["QED","QED"], ["Register","fbox","1"], ["\220bung4 L\246sung","TemplateHeaderSolutionUebung","1","2"], ["\195\156bung4 L\195\182sung","TemplateHeaderSolutionUebung","1","2"], ["\220bung4","TemplateHeaderExerciseUebung","1","2"], ["\195\156bung4","TemplateHeaderExerciseUebung","1","2"], ["Yellow Warning","WaningTemplate","1"], ["XWarning","WaningTemplate","1"], ["Warnung","WarnungTemplateTemplate","1"], ["element cell-p","LaTeXIdentityTemplate","3"], ["Ada/dl","LaTeXIdentityTemplate","1"], ["Ada/delimiter","LaTeXIdentityTemplate","1"], ["Ada/Integer subtypes diagram","LaTeXNullTemplate"], ["Using Wikibooks/Page","LaTeXNullTemplate"], ["Intro to LIS","LaTeXNullTemplate"], ["#invoke:Mathe für Nicht-Freaks/Seite","LaTeXNullTemplate"], ["Aufgabensammlung: Vorlage:Symbol","LaTeXNullTemplate"], ["intro to LIS","LaTeXNullTemplate"], ["Windows Programming Stub","LaTeXNullTemplate"], ["Astronomy/Header","LaTeXNullTemplate"], ["Astronomy/Footer","LaTeXNullTemplate"], ["Find Employment Page","LaTeXNullTemplate"], ["Find Employment","LaTeXNullTemplate"], ["How to Pass a Course","LaTeXNullTemplate"], ["rename","LaTeXNullTemplate"], ["merge","LaTeXNullTemplate"], ["split","LaTeXNullTemplate"], ["nowrap begin","LaTeXNullTemplate"], ["nowrap end","LaTeXNullTemplate"], ["Darcs patch property","DarcsPatchProperty","1"], ["Auto navigation","LaTeXNullTemplate"], ["Microprocessor Design","LaTeXNullTemplate"], ["GFDL","LaTeXNullTemplate"], ["Electronics","LaTeXNullTemplate"], ["General Mechanics","LaTeXNullTemplate"], ["ambox","LaTeXNullTemplate"], ["dn","LaTeXNullTemplate"], ["Main","LaTeXmainpage","1"], ["As of","LaTeXAsof","1"], ["as of","LaTeXasof","1"], ["E-Commerce and E-Business","LaTeXNullTemplate"], ["Unreferenced","LaTeXNullTemplate"], ["VBClassicNav1","LaTeXNullTemplate"], ["Only in print","LaTeXIdentityTemplate","1"], ["IPA","LaTeXIdentityTemplate","1"], ["u","LaTeXIdentityTemplate","1"], ["ecebcite","LaTeXecebcite","1"], ["APDIPpreface","LaTeXAPDIPpreface"], ["eqn","EqnTemplate","1"], ["Eqn","EqnTemplate","1"], ["LaTeX","LatexSymbol"], ["ref","RefTemplate","1"], ["note","RefTemplate","1"], ["chem","ChemTemplate","1","2","3","4","5","6","7","8","9"], ["Ja","Ja"], ["Nein","Nein"], ["ja","Ja"], ["nein","Nein"], ["bg","MyBg","1","2"] ] mediawiki2latex-8.29/mediawiki2latex.1.in000066400000000000000000000125731504464363500203330ustar00rootroot00000000000000.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\" Mediawiki2LaTeX man page. .\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .ds appname MediaWiki to LaTeX .ds cmdname mediawiki2latex .ds manname MEDIAWIKI2LATEX .ds version MEDIAWIKI2LATEXVERSION .ds year 2013 .ds date \*[year]-12-25 .ds appauthors Dirk Hünniger .ds manauthors Pierre Neidhardt . .\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TH \*[manname] 1 "\*[date]" "\*[appname] \*[version]" "User Commands" . .\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH NAME \*[appname] - compile MediaWiki pages via LaTeX to PDF . .\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH SYNOPSIS . .SY \*[cmdname] .RI [ OPTION ] "" " -o " FILE " -u " URL .YS . .\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH DESCRIPTION \*[appname] will fetch MediaWiki pages from a URL. It will fetch all its content recursively, i.e. subpages and pictures. Then the source code is converted to LaTeX, using the user template .I MAP if specified, or a default template otherwise. The LaTeX output is stored in .I LATEXTREE if provided. Finally a PDF if generated from the LaTeX source code if an appropriate LaTeX compiler is found. Note that it will automatically run several times to make sure all references are resolved. . All steps can be controlled with command-line options. . .\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH OPTIONS .TP .BR -c ", " --copy = \fILATEXTREE\fR Write all generated LaTeX files to the specified folder. .TP .BR -g ", " --vector Keep vector graphics in vector form. .TP .BR -h ", " --html Use mediaWiki generated HTML as input (default). .TP .BR -z ", " --zip Output LaTeX Source Archive. .TP .BR -b ", " --epub Output epub file. Only works if packages latex2rtf and calibre are installed additionally. .TP .BR -d ", " --odt Output odt file. Open Document Text (for wordprocessors). Only works if packages latex2rtf and libreoffice are installed additionally. .TP .BR -i ", " --internal Use internal template definitions. .TP .BR -x ", " --hex = \fICONFIG\fR Take configuration data from hex encoded string given on the command line. This is only needed to avoid malicious shell injecion via the web form of the server .TP .BR -m ", " --mediawiki Use mediaWiki to expand the templates. .TP .BR -k ", " --bookmode Use book-namespace mode for expansion. That means: Follow all links but not recursively. .TP .BR -o ", " --output = \fIFILE\fR Specify the PDF output file. .TP .BR -p ", " --paper = \fISIZE\fR Set the paper size. Possible values are \fIA4\fR, \fIA5\fR, \fIB5\fR, \fIletter\fR, \fIlegal\fR, \fIexecutive\fR. .TP .BR -r ", " --resolution = \fIDPI\fR Set the maximum image reolution in dot-per-inch. The argument should be an integer. .TP .BR -s ", " --server = \fIPORT\fR Run as server. Listen on PORT .TP .BR -t ", " --templates = \fIMAP\fR Specify the user template map file. Usually called templates.user. .TP .BR -l ", " --headers = \fHEADERSPATH\fR The the path to the LaTeX headers, which should be used. May be omitted. Useful in combination -t. .TP .BR -u ", " --url = \fIURL\fR The input URI. It should point to a MediaWiki page. .TP .BR -? ", " -v ", " --version ", " --help Show help options together with version number. . .\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH TEMPLATES MediaWiki features a powerful template system which will control the appearance of specific parts in the text. This system can be used to our advantage to further control the appearance of the resulting PDF. You can tell MediaWiki to LaTeX to use the host site template result directly in the PDF, or you can use a custom template of yours. See the \fI$XDG_DATA_DIRS/mediawiki2latex/latex\fR for a template example. . .\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH LATEX TREE All the downloaded files are kept into memory, so there will not be any MediaWiki files remaining on disk after the process. However, the generated LaTeX files -- the `LaTeX tree' -- need to be written on disk in order to produce the PDF. These files are written to \fI/tmp/MediaWiki$$\fR by default. This folder will be removed when the program exits. .P However you may want to keep the generated LaTeX tree on disk for LaTeX customiwation and to fasten future builds. If you use the \fB-c\fR option to set the LaTeX tree folder, the program will not remove it on exit so you can continue to use it. . .TP The LaTeX tree is made of three folders: .TP .I header A folder containing the LaTeX options, the special pages, the package loading, etc. .TP .I images All the original picture files used in the article. .TP .I main The complete LaTeX version of the source document is stored in \fImain.tex\fR. .P To compile the PDF file yourself, simply run `xelatex' on the \fImain.tex\fR file. For instance: .IP .EX xelatex LaTeX-tree/main/main.tex .EE .P You may need to run it several times to make sure all references are resolved. . .\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH AUTHORS \*[appname] was mainly developed by \*[appauthors]. Other contributors are listed in the .I AUTHORS file. . .P This man page was written by \*[manauthors]. mediawiki2latex-8.29/mediawiki2latex.cabal000066400000000000000000000075651504464363500206350ustar00rootroot00000000000000Name: mediawiki2latex Version: 8.29 License: GPL License-File: LICENSE Author: Dirk Hünniger Maintainer: Dirk Hünniger Homepage: http://sourceforge.net/projects/wb2pdf/ Category: Text Synopsis: Convert MediaWiki text to LaTeX Description: mediawiki2latex converts MediaWiki markup to LaTeX and PDF. So it provides and export from MediaWiki to LaTeX. It works with any project running MediaWiki, especially Wikipedia and Wikibooks. Please note, that the program requieres certain run time dependencies. Those cannot be expressed in cabal and thus won't be installed when installing from hackage. So we strongly recommend to use the binaries included in debian as well as ubuntu or to use the binary version for windows provided on the sourcefogre project page. Stability: Experimental Tested-With: GHC==6.12.3 Tested-With: GHC==7.4.1 Cabal-Version: >=1.6 Build-Type: Simple extra-source-files: latex/coverfrontpage.tex latex/my-head.tex latex/my-tabhead.tex latex/my-tabtail.tex latex/my-tail.tex latex/preamble.tex latex/templates.user src/babel/af src/babel/an src/babel/ang src/babel/ar src/babel/ba src/babel/bo src/babel/ca src/babel/ce src/babel/co src/babel/da src/babel/de src/babel/el src/babel/en src/babel/es src/babel/fi src/babel/fr src/babel/ga src/babel/gl src/babel/gu src/babel/he src/babel/hu src/babel/hy src/babel/ia src/babel/ie src/babel/io src/babel/is src/babel/it src/babel/ka src/babel/km src/babel/ku src/babel/la src/babel/li src/babel/my src/babel/ne src/babel/nn src/babel/no src/babel/pa src/babel/pi src/babel/pt src/babel/qu src/babel/rm src/babel/ro src/babel/ru src/babel/se src/babel/sh src/babel/si src/babel/sk src/babel/sl src/babel/so src/babel/sq src/babel/sw src/babel/ta src/babel/te src/babel/tg src/babel/th src/babel/to src/babel/ug src/babel/uk src/babel/ur src/babel/vi src/babel/yi src/babel/zh document/headers/commands.tex document/headers/defaultcolors.tex document/headers/formattings.tex document/headers/hyphenation.tex document/headers/imageheader.tex document/headers/license.tex document/headers/options.tex document/headers/packages1.tex document/headers/packages2.tex document/headers/templates-chemie.tex document/headers/templates-dirk.tex document/headers/templates.tex document/headers/unicodes.tex Source-Repository head Type: git Location: git://git.code.sf.net/p/wb2pdf/git Executable mediawiki2latex Build-Depends: directory-tree, network-uri, bytestring, process, http-client, http-types, bytestring >= 0.10, temporary >1.0, file-embed, url >=2.1 , hxt >=8 , utf8-string >=0.3.6 , parsec >=2.1 , HTTP >=4000 , split >=0.1.2.3 , containers >=0.3 , base >=4.1 && < 5, utility-ht >=0.0.5 , transformers >=0.3 , directory >=1.0 , blaze-html, array, filepath, text, happstack-server, mtl, blaze-markup, time, zip-archive, deepseq, hashable, strict, cereal, network >= 2.3.0.13, tagsoup, http-client-tls, word8, HUnit Other-Modules: All Babel BaseFont Compiler FontTool GetImages Hex ImperativeState LatexRenderer Licenses Load MagicStrings MediaWikiParser MediaWikiParseTree MegaFont MyState Parallel Server SimpleContributors Static TableHelper Test Tools UrlAnalyse WikiHelper WikiLinkHelper HtmlParser Wiki2Fen GHC-Options: -Wall -fno-warn-orphans -O2 -rtsopts "-with-rtsopts=-K1000M -N" -threaded -optl-Wl,-z,relro -optl-Wl,-z,now Hs-Source-Dirs: src Main-Is: mediawiki2latex.hs mediawiki2latex-8.29/mediawikiparser.cabal.external000066400000000000000000000020371504464363500225400ustar00rootroot00000000000000Name: mediawikiparser Version: 1.0 License: GPL License-File: LICENSE Author: Dirk Hünniger Maintainer: Dirk Hünniger Homepage: http://sourceforge.net/projects/wb2pdf/ Category: Text Synopsis: Parse MediaWiki Description: a parser for mediawiki Stability: Experimental Tested-With: GHC==6.12.3 Tested-With: GHC==7.4.1 Cabal-Version: >=1.6 Build-Type: Simple Source-Repository head Type: git Location: git://git.code.sf.net/p/wb2pdf/git library hs-source-dirs: src exposed-modules: Text.ParserMediaWiki build-depends: utf8-string >=0.3.6 , utility-ht >=0.0.5 , split >=0.1.2.3 , text, containers >=0.3 , network >= 2.3.0.13 , parsec >=2.1 , base >= 4 && <= 5 Other-Modules: MagicStrings MediaWikiParseTree MediaWikiParser Tools GHC-Options: -Wall -O2 -rtsopts "-with-rtsopts=-K100M -N" -threaded Hs-Source-Dirs: src mediawiki2latex-8.29/src/000077500000000000000000000000001504464363500153405ustar00rootroot00000000000000mediawiki2latex-8.29/src/All.hs000066400000000000000000001072011504464363500164050ustar00rootroot00000000000000-- | imperative part of the programm. The outer flow of the programm is -- controlled here module All where import Babel import Codec.Archive.Zip import Codec.Binary.UTF8.String import Compiler import Control.Concurrent import Control.Concurrent.MVar () import Control.Exception import Control.Monad import Control.Monad.State import Data.ByteString hiding ( drop, dropWhile, elem, intercalate, map, reverse, take, takeWhile, zip, ) import Data.ByteString.Char8 (any, singleton) import qualified Data.ByteString.Lazy as LZ (toStrict) import Data.ByteString.UTF8 (toString) import Data.Char import Data.Hashable import Data.List import Data.List.Split import Data.Map.Strict hiding (drop, map, take) import qualified Data.Map.Strict as Map hiding (drop, take) import qualified Data.Serialize as S (encode) import Data.String.HT import Data.Word8 (isSpace) import GHC.Conc import GetImages import Hex import HtmlParser (parseHtml) import ImperativeState import LatexRenderer import Load import MagicStrings import MediaWikiParseTree import MediaWikiParser import MyState (footnoteMap, getInTab) import Network.URI import Network.URL import SimpleContributors import Static import System.Directory import System.Directory.Tree import System.Exit import System.FilePath import System.IO import System.IO.Error import System.IO.Temp import System.Info import System.Process hiding (cwd) import Text.Read (readMaybe) import Tools import UrlAnalyse import Wiki2Fen import WikiHelper -- | takes a filename as input parameter and returns the so called normalized -- extension for it. This is and extension classifying the type of the file -- while used in this program. Its not necessarily the real extension of the -- filename. For example .jpeg images will be converted to jpg and so on. getExtension :: String -> String getExtension s = normalizeExtension2 (map toLower (reverse . (takeWhile (/= '.')) . reverse $ s)) getExtensionBase :: String -> String getExtensionBase s = (map toLower (reverse . (takeWhile (/= '.')) . reverse $ s)) -- | returns that name of image magick convert command on the current operating -- system. It takes the path from which mediawiki2latex was started as input -- parameter. On Windows convert.exe has to reside in a path relative to it for -- this to work. On linux it does not matter getConvert :: FilePath -> String getConvert p = if os == "linux" then convertexe else (getPathPrefix p) ++ convertexe where convertexe = if os == "linux" then "convert " else "convert.exe " -- | generates the information for the titlepage. It takes the result of the -- wiki text compilation (CompileResult) as first input parameter and the -- FullWikiUrl to the article as second parameter. It title information is found -- in the CompileResult it is used, otherise it is generated from the -- FullWikiUrl makeTitle :: CompileResult -> FullWikiUrl -> [Char] makeTitle result fu = theTitle where theTitle = if (title result) == "" then pub ++ tit else pub ++ (title result) pub = "\\publishers{" ++ (Data.List.concat (map chartrans (UrlAnalyse.hostname fu))) ++ "}\n" tit = "\\title{" ++ (Data.List.concat (map (chartrans) ((removePrintVersion (lemma fu))))) ++ "}\n" makeTitle2 :: CompileResult -> FullWikiUrl -> [Char] makeTitle2 result fu = theTitle where theTitle = if (title result) == "" then tit else (title result) tit = (Data.List.concat (map (chartrans) ((removePrintVersion (lemma fu))))) -- | returns the prefix of the path where addional needed software resides -- depending on the operation system getPathPrefix :: FilePath -> String getPathPrefix p = if os == "linux" then "" else (p ++ "..\\lib\\") -- | applied the necessary image processing to a file so that it can be included -- in a latex document and does not take too much diskspace. It takes the path -- form which mediawiki2latex was started as first input parameter. It takes -- filename with its extension striped as second input parameter. It takes the -- normalized extension of the file as third parameter (see also function -- getExtension in this module). It takes the maximum resolution that images -- should have as fourth parameter. It takes the imagenumbers of the images -- residing in image galleries in the wiki source text as fifth parameter (those -- images are given a lower absolute with in cm in the pdf document and thus can -- be dithered to a loweder absolute with in pixels). It takes the image number -- of the current image as sixth parameter. runFileMods :: String -> FilePath -> String -> String -> Integer -> [Integer] -> Integer -> String -> IO () runFileMods extbase p filenamebase extension theResolution gals imgNumber pathname = case extension of ('s' : ('v' : ('g' : _))) -> do _ <- system ( (getPathPrefix p) ++ "rsvg-convert -u -o " ++ pngfilename ++ " -a -w 1250 " ++ filename ) postprocpng pngfilename _ <- system ( (getPathPrefix p) ++ "rsvg-convert -u --format=pdf -o " ++ (filenamebase ++ "." ++ "pdf") ++ " -a -w 1250 " ++ filename ) return () ('g' : ('i' : ('f' : _))) -> do stdfun b <- doesFileExist firstpngfilename if b then copyFile firstpngfilename newfilename else return () postprocpng newfilename ('t' : ('i' : ('f' : _))) -> do stdfun postprocpng newfilename ('x' : ('c' : ('f' : _))) -> do stdfun postprocpng newfilename ('j' : ('p' : ('g' : _))) -> postprocjpg filename ('p' : ('n' : ('g' : _))) -> postprocpng filename ('d' : ('j' : ('v' : ('u' : _)))) -> do let hx = case (dropWhile (/= '?') extbase) of ('?' : 'p' : 'a' : 'g' : 'e' : '=' : ys) -> (readMaybe ys :: (Maybe Integer)) _ -> Nothing case hx of Just n -> djvupngp n _ -> djvupng b <- doesFileExist firstpngfilename if b then copyFile firstpngfilename newfilename else return () ('w' : ('e' : ('b' : ('p' : _)))) -> do stdfun postprocpng newfilename ('p' : 'd' : 'f' : _) -> do _ <- system ("pdftk " ++ filename ++ " output " ++ filename ++ ".tmp") copyFile (filename ++ ".tmp") filename _ -> return () where firstpngfilename = (reverse . (drop 4) . reverse $ newfilename) ++ "-0.png" newfilename = filenamebase ++ "." ++ (normalizeExtension extension) filename = filenamebase ++ "." ++ extension stdfun = do _ <- system ( (getConvert p) ++ "\"" ++ filename ++ "\" \"" ++ newfilename ++ "\"" ) return () djvupngp :: Integer -> IO () djvupngp n = do _ <- system ( "djvused \"" ++ filename ++ "\" -e \"select " ++ (show n) ++ "; save-page-with " ++ filenamebase ++ "b.djvu\"" ) _ <- system ( "ddjvu -format=pdf " ++ "\"" ++ filenamebase ++ "b.djvu" ++ "\" \"" ++ filenamebase ++ ".pdf" ++ "\"" ) _ <- system ( (getConvert p) ++ "\"" ++ filenamebase ++ ".pdf" ++ "\" \"" ++ newfilename ++ "\"" ) return () djvupng = do _ <- system ("ddjvu -format=pdf " ++ "\"" ++ filename ++ "\" \"" ++ filenamebase ++ ".pdf" ++ "\"") _ <- system ( (getConvert p) ++ "\"" ++ filenamebase ++ ".pdf" ++ "\" \"" ++ newfilename ++ "\"" ) return () postprocpng fn = do _ <- background fn dither fn return () postprocjpg fn = do _ <- system ((getConvert p) ++ "-verbose " ++ fn ++ " " ++ fn) _ <- system ("exiftool -all= -overwrite_original " ++ fn) dither fn return () background fn = system ((getConvert p) ++ fn ++ " -background white -flatten " ++ fn) pngfilename = filenamebase ++ "." ++ "png" dither :: String -> IO () dither fn = do _ <- system ( (getConvert p) ++ "-verbose " ++ fn ++ " -format '%w' " ++ pathname ++ "nullfile.bmp" ++ " > " ++ pathname ++ "dump2 2> " ++ pathname ++ "dump" ) dump <- Tools.readFile (pathname ++ "dump") case reverse (Prelude.filter (\x -> (trim x) /= "") (splitOn "\n" dump)) of (x : _) -> case splitOn " " x of (_ : (_ : (y : _))) -> case splitOn "x" y of (z : _) -> case reads z of [ ( ii, _ ) ] -> do runDither fn ( if imgNumber `elem` gals then galleryWidth else imageWidth ) ii _ -> return () _ -> return () _ -> return () _ -> return () runDither :: String -> Integer -> Integer -> IO () runDither fn newSize oldSize = if newSize < oldSize then system ( (getConvert p) ++ fn ++ " -resize " ++ (show newSize) ++ " " ++ fn ) >> return () else return () textWidth = 10.5 galleryImageWidth = 10.5 centimetersPerInch :: Double centimetersPerInch = 2.54 galleryWidth :: Integer galleryWidth = round ( (fromIntegral theResolution) * galleryImageWidth / centimetersPerInch ) imageWidth :: Integer imageWidth = round ((fromIntegral theResolution) * textWidth / centimetersPerInch) -- | function to write the image files into the temporary directory and modify -- the files for use in a LaTeX document. It takes the pathname of temporary -- image download directory as first input parameter. Please note that the -- temporary image download directory is always different from the temporary -- directory. It takes the pathname of the directory in which mediawiki2latex -- was stated as second input parameter. It takes the name of the temporary -- directory as third input parameter. It takes the result of the image -- downloading process as fourth input parameter. This structure has a Maybe -- monad as outer type since the image download may fail. Inside is a 3 element -- tuple. The first one is the filename of the image on the wiki. The second one -- is the number under which the image was stored in the temporary image -- download directory. The third one is a list of possible urls where the image -- may be found on the wiki. It takes maximum resolution that images should have -- as fifth parameter. It takes the list of images number of images residing in -- galleries as sixth input parameter. writeFiles :: FilePath -> FilePath -> String -> [ImageCredits] -> Integer -> [Integer] -> IO () writeFiles dir p pathname theImages theResolution gals = mapM_ go (Prelude.zip ([1 ..] :: [Integer]) theImages) where go (i, x) = do let filenamebase = (pathname ++ (show i)) let filename = filenamebase ++ "." ++ (getExtension (wikiFilename x)) filecontent <- Data.ByteString.readFile (dir (show (imageNumber x))) Data.ByteString.writeFile filename filecontent runFileMods (getExtensionBase (wikiFilename x)) p filenamebase (getExtension (wikiFilename x)) theResolution gals i pathname writeFiles2 :: String -> String -> [(String, Int)] -> IO () writeFiles2 tmpdir pathname forms = mapM_ go forms where go (x, _) = do filecontent <- Data.ByteString.readFile (tmpdir x) Data.ByteString.writeFile (pathname ++ (Prelude.last (splitOn "/" x))) filecontent runLaTeX :: LatexConfig -> ImperativeMonad ByteString runLaTeX config = liftIO ( do home <- getHomeDirectory ( withTempDirectory home "MediaWiki2LaTeX-tmp" (runLaTeXCallback config) ) ) runLaTeXIOAction :: LatexConfig -> String -> IO ByteString runLaTeXIOAction config subpath = do home <- getHomeDirectory ( withTempDirectory home ("MediaWiki2LaTeX-" ++ subpath ++ "-tmp") ( \p -> do Data.ByteString.writeFile (p "config") (S.encode config) _ <- system ( "mediawiki2latex -x " ++ (Hex.hex (show (fullconfigbase {ltxproc = Just p}))) ) te <- Control.Exception.catch (Tools.readFile (p "document/main" "main.txt")) catchFun case splitOn "\n" te of (x : xs) -> return (pack (encode (intercalate "," (map (strip "pt\r,\f") (x : xs))))) _ -> return (pack (encode "")) ) ) runLaTeXCallback :: LatexConfig -> FilePath -> IO ByteString runLaTeXCallback config pathname = do extract pathname case (ImperativeState.headers (fullConfig config)) of Just x -> do d <- readDirectoryWith Data.ByteString.readFile (x ++ "/./") _ <- writeDirectoryWith Data.ByteString.writeFile d {anchor = pathname "document/headers"} return () _ -> return () if os == "linux" then return () else do d <- readDirectoryWith Data.ByteString.readFile ((mainPath (fullConfig config)) ++ "../fonts/main/") _ <- writeDirectoryWith Data.ByteString.writeFile d {anchor = pathname ++ "/document/"} return () Tools.writeFile (pathname ++ "/document/main/main.tex") (content config) Tools.writeFile (pathname ++ "/document/index.html") ( (html (theResult config)) ++ "

List of Figures

" ++ (figHTML config) ) Tools.writeFile (pathname ++ "/document/headers/svg.tex") ( if vector (fullConfig config) then "\\newcommand{\\SVGExtension}{pdf}" else "\\newcommand{\\SVGExtension}{png}" ) Tools.writeFile (pathname ++ "/document/headers/title.tex") (ltitle config) Tools.writeFile (pathname ++ "/document/headers/babel.tex") (makeBabel (lang config) (lhostname config)) Tools.writeFile (pathname ++ "/document/headers/paper.tex") ("\\KOMAoption{paper}{" ++ (paper (fullConfig config)) ++ "}") if (onlyTables config) then return () else do myprint " preparing images for LaTeX document" All.writeFiles (theTempDir config) (mainPath (fullConfig config)) (pathname ++ "/document/images/") (figures config) (resolution (fullConfig config)) (galleryNumbers (theResult config)) All.writeFiles2 (theTempDir config) (pathname ++ "/document/formulas/") (formulas config) _ <- mapM (\(n, c) -> (Tools.writeFile (pathname ++ "/document/table" ++ (show n) ++ ".html") c) >> system ("chromium --no-sandbox --no-pdf-header-footer --headless --print-to-pdf=\"" ++ pathname ++ "/document/table" ++ (show n) ++ ".pdf\" " ++ pathname ++ "/document/table" ++ (show n) ++ ".html >/dev/null 2>/dev/null") >> system ("pdfcrop --margins '0 0 0 0' " ++ pathname ++ "/document/table" ++ (show n) ++ ".pdf " ++ pathname ++ "/document/table" ++ (show n) ++ ".pdf >/dev/null 2>/dev/null")) (zip ([1 ..] :: [Integer]) (theHtmlTables config)) _ <- mapM (\(n, c) -> (Tools.writeFile (pathname ++ "/document/map" ++ (show n) ++ ".html") c) >> system ("chromium --no-sandbox --no-pdf-header-footer --headless --print-to-pdf=\"" ++ pathname ++ "/document/map" ++ (show n) ++ ".pdf\" " ++ pathname ++ "/document/map" ++ (show n) ++ ".html >/dev/null 2>/dev/null") >> system ("pdfcrop --margins '0 0 0 0' " ++ pathname ++ "/document/map" ++ (show n) ++ ".pdf " ++ pathname ++ "/document/map" ++ (show n) ++ ".pdf >/dev/null 2>/dev/null")) (zip ([1 ..] :: [Integer]) (theHtmlMapes config)) _ <- mapM (\(n, c) -> (Tools.writeFile (pathname ++ "/document/images/chess" ++ (show n) ++ ".tex") ("\\documentclass{article}\n\\usepackage[ps]{skak}\n\\begin{document}\n\\thispagestyle{empty}\n\\fenboard{" ++ (fst (toBoard c)) ++ "}\n\\showboard\n\\highlight[x]{" ++ (snd (toBoard c)) ++ "}\n\\end{document}")) >> (system ("latex -interaction=batchmode -output-directory " ++ pathname ++ "/document/images/" ++ " " ++ pathname ++ "/document/images/chess" ++ (show n) ++ ".tex")) >> (system ("dvips " ++ "-o " ++ pathname ++ "/document/images/chess" ++ (show n) ++ ".ps " ++ pathname ++ "/document/images/chess" ++ (show n) ++ ".dvi")) >> (system ("ps2pdf " ++ pathname ++ "/document/images/chess" ++ (show n) ++ ".ps " ++ pathname ++ "/document/images/chess" ++ (show n) ++ ".pdf")) >> (system ("pdfcrop " ++ pathname ++ "/document/images/chess" ++ (show n) ++ ".pdf " ++ pathname ++ "/document/images/chess" ++ (show n) ++ ".pdf "))) (zip ([1 ..] :: [Integer]) (theChessBoardes config)) cwd <- getCurrentDirectory setCurrentDirectory (pathname ++ "/document/main") case (ImperativeState.copy (fullConfig config)) of Just x -> do d <- readDirectoryWith Data.ByteString.readFile "../../document/" _ <- writeDirectoryWith Data.ByteString.writeFile d {anchor = x} return () _ -> return () _ <- forM ( ( if onlyTables config then [1] else if ((outputType (fullConfig config)) /= PlainPDF) then [] else [1, 2] ) :: [Integer] ) ( \r -> do if (onlyTables config) then return () else myprint (" generating PDF file. LaTeX run " ++ (show r) ++ " of 4") system ( ( if os == "linux" then "buf_size=10000000 lualatex" else (mainPath (fullConfig config)) ++ "..\\miktex\\miktex\\bin\\xelatex.exe" ) ++ " --interaction=batchmode main.tex > /dev/null" ) ) _ <- ( ( if onlyTables config then return () else system ( ( if os == "linux" then "makeindex" else (mainPath (fullConfig config)) ++ "..\\miktex\\miktex\\bin\\makeindex.exe" ) ++ " main > /dev/null" ) >> return () ) ) _ <- forM ( ( if (onlyTables config) || ((outputType (fullConfig config)) /= PlainPDF) then [] else [3, 4] ) :: [Integer] ) ( \r -> do if (onlyTables config) then return () else myprint (" generating PDF file. LaTeX run " ++ (show r) ++ " of 4") system ( ( if os == "linux" then "buf_size=10000000 lualatex" else (mainPath (fullConfig config)) ++ "..\\miktex\\miktex\\bin\\xelatex.exe" ) ++ " --interaction=batchmode main.tex > /dev/null" ) ) result <- if (onlyTables config) then do _ <- do system ( ( if os == "linux" then "" else (mainPath (fullConfig config)) ++ "..\\pdftotext\\" ) ++ "pdftotext main.pdf main.txt" ) te <- Control.Exception.catch (Tools.readFile ("main.txt")) catchFun case splitOn "\n" te of (x : xs) -> return (pack (encode (intercalate "," (map (strip "pt\r,\f") (x : xs))))) _ -> return (pack (encode "")) else case outputType (fullConfig config) of PlainPDF -> Data.ByteString.readFile "main.pdf" ZipArchive -> do setCurrentDirectory pathname a <- addFilesToArchive [OptRecursive] emptyArchive ["document"] Data.ByteString.writeFile "main.zip" (LZ.toStrict (fromArchive a)) Data.ByteString.readFile "main.zip" OdtFile -> do setCurrentDirectory ".." _ <- system "libreoffice --headless --convert-to odt index.html" _ <- system "libreoffice --headless --convert-to html:HTML:EmbedImages index.odt" _ <- system "libreoffice --headless --convert-to odt index.html" Data.ByteString.readFile "index.odt" EPubFile -> do _ <- system "ebook-convert ../index.html .epub" Data.ByteString.readFile "index.epub" setCurrentDirectory cwd return result ex :: ProcessHandle -> Handle -> Handle -> IO () ex h o e = do b <- hReady stdin if b then do terminateProcess h exitFailure else do return () v <- tryIOError (hWaitForInput e 0) let xo = case v of Right j -> j _ -> False _ <- if xo then hGetChar e else return ' ' w <- tryIOError (hWaitForInput o 0) let yo = case w of Right j -> j _ -> False _ <- if yo then hGetChar o else return ' ' y <- getProcessExitCode h case y of Just _ -> do hClose o hClose e return () _ -> ex h o e mysystem :: String -> IO () mysystem x = if os == "linux" then do (_, o, e, h) <- runInteractiveCommand x ex h o e return () else do _ <- system x return () getLang :: URL -> IO (Maybe String) getLang u = let theUrl = exportURL u in do yy <- geturl theUrl case (deepGet2 "html" (parseHtml yy)) of ((Environment Tag (TagAttr _ m) _) : []) -> return $ Data.Map.Strict.lookup "lang" m _ -> return $ Nothing catchFun :: IOException -> IO String catchFun _ = return "" latexPostamble :: String latexPostamble = "\n\\end{longtable}\n" toLaTeX :: [Anything Char] -> String toLaTeX zz = fst (treeToLaTeX3 zz initialState) makeImgAuthorsList :: [ImageCredits] -> ([String], String) makeImgAuthorsList l = let (aut, st) = (runState (mapM treeToLaTeX2 (map theAuthor l)) initialState {MyState.getInTab = 1}) in (aut, intercalate "\n" (Map.elems (footnoteMap st))) makeImgList :: [ImageCredits] -> ImperativeMonad String makeImgList contrib = do let z = Data.List.concat (map go (zip3 ([1 ..] :: [Integer]) contrib authors)) return ((toString latexPreamble) ++ z ++ (latexPostamble) ++ footnotes ++ "\\pagebreak") where (authors, footnotes) = makeImgAuthorsList contrib go (i, crb, aut) = "\\href{" ++ ( replace2 ( replace2 (Data.List.concat (map chartransforlink ((theDescUrl crb)))) "//" "/" ) "https:/" "https://" ) ++ "}{" ++ (show i) ++ "}& " ++ aut ++ "&" ++ (toLaTeX (theLicense crb)) ++ "\\\\ \\hline \n" toHtml :: [Anything Char] -> String toHtml l = fst (treeToHtml3 (fromList []) Nothing "" l initialState) makeImgListHTML :: [ImageCredits] -> ImperativeMonad String makeImgListHTML imgs = do let z = Data.List.concat (map go imgs) return ( "" ++ z ++ "
NumberContributorsLicense
" ) where go crb = "" ++ (show (imageNumber crb)) ++ "" ++ (toHtml (theAuthor crb)) ++ "" ++ (toHtml (theLicense crb)) ++ "" makeformulas :: String -> String -> [Anything Char] -> ImperativeMonad [(String, Int)] makeformulas p tempdir ll = do x <- allinfo return $ Data.List.concat x where allinfo :: ImperativeMonad [[(String, Int)]] allinfo = mapM processNode ll processNode :: Anything Char -> ImperativeMonad [(String, Int)] processNode (Environment Math _ l) = do myname <- return (((hex (show (hash (mathTransform l)))))) sz <- liftIO ( do Tools.writeFile (tempdir (myname ++ ".tex")) ( "\\documentclass{article}\n\\usepackage{color}\n\\input{./defaultcolors}\n\\usepackage{amsfonts}\n\\usepackage{amsmath}\n\\usepackage{amssymb}\n\\begin{document}\n\\thispagestyle{empty}\n$" ++ (mathTransform l) ++ "$\n\\end{document}" ) Static.writeFiles tempdir headerFiles _ <- system ("latex2png " ++ (tempdir (myname ++ ".tex"))) sz <- mysize (tempdir (myname ++ ".png")) _ <- system ("latex2png -c -d 1200 " ++ (tempdir (((myname)) ++ ".tex"))) myprint (mathTransform l) return sz ) return [(myname ++ ".png", sz)] processNode (Environment BigMath _ l) = do myname <- return (((hex (show (hash (mathTransform l)))))) sz <- liftIO ( do Tools.writeFile (tempdir (myname ++ ".tex")) ( "\\documentclass{article}\n\\usepackage{color}\n\\input{./defaultcolors}\n\\usepackage{amsfonts}\n\\usepackage{amsmath}\n\\begin{document}\n\\thispagestyle{empty}\n$" ++ (mathTransform l) ++ "$\n\\end{document}" ) Static.writeFiles tempdir headerFiles _ <- system ("latex2png " ++ (tempdir (myname ++ ".tex"))) sz <- mysize (tempdir (myname ++ ".png")) _ <- system ("latex2png -c -d 1200 " ++ (tempdir (((myname)) ++ ".tex"))) myprint (mathTransform l) return sz ) return [(myname ++ ".png", sz)] processNode (Environment _ _ l) = (makeformulas p tempdir l) processNode _ = return [] mysize :: String -> IO Int mysize fn = do _ <- system ( (getConvert p) ++ "-verbose " ++ fn ++ " -format '%w' " ++ tempdir ++ "nullfile.bmp" ++ " > " ++ tempdir ++ "dump2 2> " ++ tempdir ++ "dump" ) dump <- Tools.readFile (tempdir ++ "dump") case reverse (Prelude.filter (\x -> (trim x) /= "") (splitOn "\n" dump)) of (x : _) -> case splitOn " " x of (_ : (_ : (y : _))) -> case splitOn "x" y of (z : _) -> case reads z of [(ii, _)] -> do return ii _ -> return 0 _ -> return 0 _ -> return 0 _ -> return 0 jjoin :: String -> String -> String jjoin theBody listOfFiguers = ( (toString (latexHeader)) ++ theBody ++ listOfFiguers ++ (toString latexFooter) ) tabgo :: [Int] -> [ByteString] -> [[ByteString]] tabgo (x : xs) bs = (take x bs) : (tabgo xs (drop x bs)) tabgo [] _ = [] forkFinally2 :: IO a -> (Either SomeException a -> IO ()) -> IO ThreadId forkFinally2 action and_then = mask $ \restore -> forkOS $ try (restore action) >>= and_then forker :: IO () -> [MVar Bool] -> IO () forker w (x : xs) = do b <- readMVar x if b then (swapMVar x False) >> (forkFinally2 w (\_ -> swapMVar x True >> return ())) >> return () else forker w xs forker _ _ = error "Error forking subprocess" waiter :: [IO ()] -> [MVar Bool] -> IO () waiter work l = do threadDelay 1000 ll <- mapM readMVar l if or ll then case work of (w : ws) -> do forker w l waiter ws l _ -> if and ll then return () else waiter work l else waiter work l all :: FullConfig -> ImperativeMonad () all cfg = do liftIO $ myprint " processing started" systempdir <- liftIO getTemporaryDirectory tempdir <- liftIO $ createTempDirectory systempdir "MediaWiki2LaTeXImages" st <- get templates <- case runMode cfg of UserTemplateFile _ filename -> liftIO (Tools.readFile filename) _ -> return userTemplates let uurl = replace2 ( if (take 8 (inputUrl cfg)) == "https://" then "https://" ++ (drop 8 (inputUrl cfg)) else if (take 7 (inputUrl cfg)) == "http://" then (inputUrl cfg) else "https://" ++ (inputUrl cfg) ) "_" " " purl <- parseUrl (escapeURIString isAllowedInURI uurl) language <- liftIO $ getLang (UrlAnalyse.url purl) put st {fullUrl = purl} liftIO $ myprint " downloading article and contributor information" text <- load cfg liftIO $ myprint " parsing article text" theFormulas <- if (outputType cfg) `elem` [EPubFile, OdtFile] then makeformulas (mainPath cfg) tempdir ( printPrepareTree False ( if ( case (runMode cfg) of HTML Yes -> True UserTemplateFile Yes _ -> True StandardTemplates Yes -> True ExpandedTemplates Yes -> True _ -> False ) then case (loadacu st) of Right _ -> (parseit minparsers text); _ -> [] else ( parseit (if (runMode cfg) == (HTML No) then minparsers else parsers) text ) ) ) else return [] liftIO ( myprint ( " number of bytes to be parsed: " ++ (show (Data.List.length text)) ) ) result <- Compiler.compile (runMode cfg) text templates [] "" Nothing (Map.fromList theFormulas) ((outputType cfg) `elem` [EPubFile, OdtFile]) language (latexTables cfg) liftIO $ myprint " forking threads to download of images and contributor information on them" liftIO ( myprint ( " number of images going to be downloaded: " ++ (show (Data.List.length (images result))) ) ) imageCredits <- getImages1 tempdir (images result) (wikiUrl purl) let joined = jjoin (body result) "" let theConfig = LatexConfig { content = joined, figures = [], ltitle = (makeTitle result purl), fullConfig = cfg, lhostname = (UrlAnalyse.hostname purl), theResult = result, onlyTables = True, lang = language, theTempDir = tempdir, formulas = theFormulas, figHTML = "", theHtmlTables = [], theHtmlMapes = [], theChessBoardes = [] } liftIO $ myprint " precompiling table columns" let cols = (sum (map Data.List.length (tablelist result))) liftIO (myprint (" number of columns to be compiled: " ++ (show cols))) let chunks = (chunksOf 100 (Data.List.concat $ (tablelist result))) :: [[String]] mvars <- liftIO ((mapM (\_ -> newEmptyMVar) chunks)) let work = map ( \(chun, cc, m) -> do myprint (" precompiling column number " ++ (show (1 + 100 * (cc - 1)))) r <- runLaTeXIOAction theConfig { content = (toString (latexTableHeader)) ++ (intercalate "}\\the\\wd\\mybox{},\n\n\\let\\mybox\\undefined\\newsavebox{\\mybox}\\sbox{\\mybox}{" chun) ++ "\n" ++ (toString latexTableFooter) } (show cc) putMVar m r ) (zip3 chunks ([1 ..] :: [Integer]) mvars) np <- liftIO getNumProcessors cores <- liftIO (mapM (\_ -> newMVar True) ([1 .. np] :: [Int])) liftIO (waiter work cores) ttabs <- liftIO (mapM takeMVar mvars) let tabs = tabgo (Prelude.map Data.List.length (tablelist result)) (Prelude.filter (Data.ByteString.Char8.any (== '.')) (Data.ByteString.split (Prelude.head (Data.ByteString.unpack (Data.ByteString.Char8.singleton ','))) (Data.ByteString.pack (Prelude.filter (not . Data.Word8.isSpace) (Data.ByteString.unpack (Data.ByteString.concat ttabs)))))) liftIO $ myprint " generating LaTeX document" liftIO ( myprint ( " number of bytes to be parsed: " ++ (show (Data.List.length text)) ) ) newResult <- Compiler.compile (runMode cfg) text templates tabs (makeTitle2 result purl) language (Map.fromList theFormulas) ((outputType cfg) `elem` [EPubFile, OdtFile]) language (latexTables cfg) liftIO $ myprint " joining threads to download the images and contributor information on them" liftIO ( myprint ( " number of images to be processed: " ++ (show (Data.List.length (images result))) ) ) pp <- makeImgList imageCredits pphtml <- makeImgListHTML imageCredits (contrib, contribHTML) <- makeContributors (Just (UrlAnalyse.url purl)) let newContent = jjoin (body newResult) (contrib ++ pp) liftIO $ myprint " preparing for PDF generation" pdf <- runLaTeX theConfig { onlyTables = False, theResult = newResult, content = newContent, figures = imageCredits, figHTML = pphtml ++ contribHTML ++ "", theHtmlTables = (theHtmlTabs newResult), theHtmlMapes = (theHtmlMaps newResult), theChessBoardes = (theChessBoards newResult) } liftIO (Data.ByteString.writeFile (outputFilename cfg) pdf) liftIO $ removeDirectoryRecursive tempdir liftIO $ myprint " finished" mediawiki2latex-8.29/src/Babel.hs000066400000000000000000000024061504464363500167030ustar00rootroot00000000000000-- | This module provides language specific customization to be included in the -- LaTeX code. module Babel where import Codec.Binary.UTF8.String import Data.ByteString hiding ( any, concat, drop, dropWhile, elem, hPutStr, init, intercalate, isPrefixOf, length, map, null, reverse, tails, take, takeWhile, zip, ) import Data.List.Split (splitOn) import qualified Data.Map import Data.Maybe import Static -- | returns the language specific customization to be included in the LaTeX -- file. makeBabel :: -- | the language code of the wiki currently being processed (en for English, -- de for German, etc.) Maybe String -> -- | The hostname or language code to be used if the first parameter is the -- Nothing value of the maybe monad. [Char] -> -- | The LaTeX code to be included in the LaTeX document when generating -- content for the language determined by the first two parameters. String makeBabel b x = case Data.Map.lookup (fromMaybe xx b) m of Just v -> decode . unpack $ v _ -> case Data.Map.lookup "en" m of Just w -> decode . unpack $ w _ -> "" where m = Data.Map.fromList babelFiles xx = case splitOn "." x of (z : _) -> z _ -> "en" mediawiki2latex-8.29/src/BaseFont.hs000066400000000000000000000202411504464363500173740ustar00rootroot00000000000000{-# LANGUAGE DefaultSignatures #-} {-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DeriveGeneric #-} -- | general Fonts configuration module module BaseFont where import Data.Array import Data.Char import Data.Serialize import Data.Tuple import GHC.Generics -- | Basic fontstyle, may be either normal of monospaced or small caps data FontStyleBase = -- | Normal font Normal | -- | Mono spaced font Mono | -- | Small caps font Smallcaps deriving (Eq, Ord, Show, Read, Serialize, Generic) -- | Full description of style of a font. Consists of Basic fontstyle -- (`FontStyleBase`) plus boolean for bold and/or italic data FontStyle = FontStyle { -- | basic fontstyle stylebase :: FontStyleBase, -- | bold font bold :: Bool, -- | italic font italic :: Bool } deriving (Eq, Ord, Show, Read, Serialize, Generic) -- | Font, a list of ttf font file currently used by mediawiki2latex data Font = -- | GNU Unifont (fallback if nothing else has the glyph) GnuUnifont | -- | GNU Unifont "upper" companion see Supplementary Multilingual Plane (SMP) GnuUnifontUpper | -- | WenQuanYi Zen Hei (Chinese glyphs) WenQuanYiZenHei | -- | GNU FreeFont Monospaced FreeMono | -- | GNU FreeFont Monospaced italic FreeMonoOblique | -- | GNU FreeFont Monospaced bold FreeMonoBold | -- | GNU FreeFont Monospaced bold italic FreeMonoBoldOblique | -- | GNU FreeFont Serif FreeSerif | -- | GNU FreeFont Serif bold FreeSerifBold | -- | GNU FreeFont Serif bold italic FreeSerifBoldItalic | -- | GNU FreeFont Serif italic FreeSerifItalic | -- | Computer Modern Typewriter ComputerModernTypeWriter | -- | Computer Modern Typewriter bold ComputerModernTypeWriterBold | -- | Computer Modern Typewriter italic ComputerModernTypeWriterItalic | -- | Computer Modern Typewriter bold italic ComputerModernTypeWriterBoldItalic | -- | Computer Modern Roman ComputerModernRoman | -- | Computer Modern Roman bold ComputerModernRomanBold | -- | Computer Modern Roman italic ComputerModernRomanItalic | -- | Computer Modern Roman bold italic ComputerModernRomanBoldItalic deriving (Eq, Ord, Show, Ix, Read, Serialize, Generic) -- | list of Fonts. The first element in the list is the fonts that is preferred -- to be used. If it can not be used for some reason the next font in the list -- is used. Note that the list is denoted in reverse order and put into the -- right order by the reverse function in the way it is just written at this -- point of the source file. fonts :: -- | List of fonts in the order of priority for use. [Font] fonts = reverse [ GnuUnifontUpper, GnuUnifont, WenQuanYiZenHei, FreeMono, FreeMonoOblique, FreeMonoBold, FreeMonoBoldOblique, FreeSerif, FreeSerifBold, FreeSerifBoldItalic, FreeSerifItalic, ComputerModernTypeWriter, ComputerModernTypeWriterBold, ComputerModernTypeWriterItalic, ComputerModernTypeWriterBoldItalic, ComputerModernRoman, ComputerModernRomanBold, ComputerModernRomanItalic, ComputerModernRomanBoldItalic ] -- | Enumeration of Fonts. To store the fonts database efficiently on disk and -- to read it to memory quickly integer indices are used. The Integers are low -- in magnitude and thus stored as chars on disk. fontList :: -- | List of tuples, first element of the tuple is the font as instance of -- type `Font`. The second element of the tuple is the integer index where it -- is store in the fonts database on disk. Please note that the Char is just -- an index in the fonts database on disk and has nothing to do with the chars -- available inside the ttf and otf files. [(Font, Int)] fontList = zip fonts [(ord 'A') ..] -- | converts font to char. See also `fontList` in this source file fromFontToChar :: -- | The font as a instance of type `Font` to be looked up. Font -> -- | The Char index under which it is stored on disk in the fonts database. Char fromFontToChar f = chr ((array (GnuUnifont, ComputerModernRomanBoldItalic) fontList) ! f) -- | converts from char to font. See also `fontList` in this source file fromCharToFont :: -- | The Char index under which the Font is stored on disk. Char -> -- | An instance of the `Font` type representing the requested font. Font fromCharToFont c = ( array (ord ('A'), ord ('A') + (length fontList) - 1) (map swap fontList) ) ! (ord c) -- | converts from Fonts to path of ttf or otf file on disk. getttf :: -- | An instance of the type `Font` representing the font for which the ttf or -- otf file on disk shall be returned. Font -> -- | The filename of the ttf or otf file for the requested `Font`. String getttf ComputerModernTypeWriter = "/usr/share/fonts/truetype/cmu/cmuntt.ttf" getttf ComputerModernTypeWriterBoldItalic = "/usr/share/fonts/truetype/cmu/cmuntx.ttf" getttf ComputerModernTypeWriterItalic = "/usr/share/fonts/truetype/cmu/cmunit.ttf" getttf ComputerModernTypeWriterBold = "/usr/share/fonts/truetype/cmu/cmuntb.ttf" getttf ComputerModernRoman = "/usr/share/fonts/truetype/cmu/cmunrm.ttf" getttf ComputerModernRomanBold = "/usr/share/fonts/truetype/cmu/cmunbx.ttf" getttf ComputerModernRomanItalic = "/usr/share/fonts/truetype/cmu/cmunti.ttf" getttf ComputerModernRomanBoldItalic = "/usr/share/fonts/truetype/cmu/cmunbi.ttf" getttf FreeMono = "/usr/share/fonts/truetype/freefont/FreeMono.ttf" getttf FreeMonoOblique = "/usr/share/fonts/truetype/freefont/FreeMonoOblique.ttf" getttf FreeMonoBold = "/usr/share/fonts/truetype/freefont/FreeMonoBold.ttf" getttf FreeMonoBoldOblique = "/usr/share/fonts/truetype/freefont/FreeMonoBoldOblique.ttf" getttf FreeSerif = "/usr/share/fonts/truetype/freefont/FreeSerif.ttf" getttf FreeSerifBold = "/usr/share/fonts/truetype/freefont/FreeSerifBold.ttf" getttf FreeSerifBoldItalic = "/usr/share/fonts/truetype/freefont/FreeSerifBoldItalic.ttf" getttf FreeSerifItalic = "/usr/share/fonts/truetype/freefont/FreeSerifItalic.ttf" getttf GnuUnifont = "/usr/share/fonts/opentype/unifont/unifont.otf" getttf GnuUnifontUpper = "/usr/share/fonts/opentype/unifont/unifont_upper.otf" getttf WenQuanYiZenHei = "/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc" -- | defines the FontStyle for each ttf font file. See also FontStyle in this -- source file. getstyle :: -- | an instance of the `Font` type for which the `FontStyle` is requested. Font -> -- | The `FontStyle` of the requested `Font` FontStyle getstyle GnuUnifont = FontStyle {stylebase = Normal, bold = False, italic = False} getstyle GnuUnifontUpper = FontStyle {stylebase = Normal, bold = False, italic = False} getstyle WenQuanYiZenHei = FontStyle {stylebase = Normal, bold = False, italic = False} getstyle FreeMono = FontStyle {stylebase = Mono, bold = False, italic = False} getstyle FreeMonoOblique = FontStyle {stylebase = Mono, bold = False, italic = True} getstyle FreeMonoBold = FontStyle {stylebase = Mono, bold = True, italic = False} getstyle FreeMonoBoldOblique = FontStyle {stylebase = Mono, bold = True, italic = True} getstyle FreeSerif = FontStyle {stylebase = Normal, bold = False, italic = False} getstyle FreeSerifBold = FontStyle {stylebase = Normal, bold = True, italic = False} getstyle FreeSerifBoldItalic = FontStyle {stylebase = Normal, bold = True, italic = True} getstyle FreeSerifItalic = FontStyle {stylebase = Normal, bold = False, italic = True} getstyle ComputerModernTypeWriter = FontStyle {stylebase = Mono, bold = False, italic = False} getstyle ComputerModernTypeWriterBold = FontStyle {stylebase = Mono, bold = True, italic = False} getstyle ComputerModernTypeWriterItalic = FontStyle {stylebase = Mono, bold = False, italic = True} getstyle ComputerModernTypeWriterBoldItalic = FontStyle {stylebase = Mono, bold = True, italic = True} getstyle ComputerModernRoman = FontStyle {stylebase = Normal, bold = False, italic = False} getstyle ComputerModernRomanBold = FontStyle {stylebase = Normal, bold = True, italic = False} getstyle ComputerModernRomanItalic = FontStyle {stylebase = Normal, bold = False, italic = True} getstyle ComputerModernRomanBoldItalic = FontStyle {stylebase = Normal, bold = True, italic = True} mediawiki2latex-8.29/src/Compiler.hs000066400000000000000000000370311504464363500174520ustar00rootroot00000000000000{-# LANGUAGE DefaultSignatures #-} {-# LANGUAGE DeriveAnyClass #-} -- | module to compile mediawiki page to latex documents. This module is called -- from the All module.| module Compiler where import Control.Monad import Control.Monad.State import Data.ByteString as B hiding ( concat, drop, dropWhile, elem, filter, head, isInfixOf, length, map, minimum, reverse, take, takeWhile, zip, ) import Data.ByteString.UTF8 (toString) import qualified Data.Map as Map import Data.Serialize as S (decode, encode) import Data.Set () import Hex import ImperativeState import LatexRenderer import MediaWikiParseTree import MediaWikiParser import MyState import System.Directory import System.FilePath.Posix import System.IO.Temp import System.Process import Tools import UrlAnalyse runCompile :: String -> FullConfig -> ImperativeMonad () runCompile dir cfg = do t <- liftIO $ Tools.readFile (dir "input") p <- return $ case runMode cfg of (HTML _) -> minparsers _ -> parsers ppt <- return $ case runMode cfg of (HTML _) -> printPrepareTree2 _ -> printPrepareTree cr <- return (ppt (not (latexTables cfg)) (parseit p t)) liftIO $ B.writeFile (dir "output") (encode cr) runNewTree :: String -> ImperativeMonad () runNewTree dir = do t <- liftIO $ B.readFile (dir "output") let tr = (case S.decode t of Right k -> k :: [Anything Char]; _ -> []) intus <- liftIO $ B.readFile (dir "intus") let us = case decode intus of Right r -> r _ -> error "Could not read State intus" let (nus, ntr) = makeLables tr us liftIO $ B.writeFile (dir "newtree") (encode ntr) liftIO $ B.writeFile (dir "us") (encode nus) runTreeToLaTeX :: String -> String -> ImperativeMonad () runTreeToLaTeX instfn dir = do t <- liftIO $ B.readFile (dir "newtree") let l = (case S.decode t of Right k -> k; _ -> []) inst <- liftIO $ B.readFile (instfn "inst") let st = case decode inst of Right r -> r _ -> error "Could not read State inst" let (ltx, newst) = runState (treeToLaTeX2 l) st liftIO $ B.writeFile (dir "ltx") (encode (ltx :: String)) liftIO $ B.writeFile (dir "st") (encode newst) liftIO $ B.writeFile (dir "inst") (encode newst) -- | main function to compile mediawiki pages | compile :: RunMode -> String -> String -> [[ByteString]] -> String -> Maybe String -> Map.Map String Int -> Bool -> Maybe String -> Bool -> ImperativeMonad CompileResult compile theRunMode text templates tabs mytitle mylanguage fformulas b llang latexTabels = do st <- get case theRunMode of StandardTemplates No -> return ( run (getStyles (parseit parsers text)) b mylanguage mytitle (parseit parsers text) (parseit parsers text) (hostname . fullUrl $ st) templates tabs fformulas (vectorr st) llang latexTabels ) UserTemplateFile No _ -> return ( run (getStyles (parseit parsers text)) b mylanguage mytitle (parseit parsers text) (parseit parsers text) (hostname . fullUrl $ st) templates tabs fformulas (vectorr st) llang latexTabels ) HTML No -> do -- liftIO (Tools.writeFile "/home/dirk/dhudhu" (show -- (printPrepareTree2 (not latexTabels) (parseit minparsers text)))) return ( run (getStyles (parseit minparsers text)) b mylanguage mytitle (printPrepareTree2 (not latexTabels) (parseit minparsers text)) (printPrepareTree2 (not latexTabels) (parseit minparsers text)) (hostname . fullUrl $ st) templates tabs fformulas (vectorr st) llang latexTabels ) ExpandedTemplates No -> do return ( run (getStyles (parseit minparsers text)) b mylanguage mytitle (parseit parsers text) (parseit parsers text) (hostname . fullUrl $ st) templates tabs fformulas (vectorr st) llang latexTabels ) _ -> do case loadacu st of Right pt -> return (run (getStyles pt) b mylanguage mytitle pt pt (hostname . fullUrl $ st) templates tabs fformulas (vectorr st) llang latexTabels) Left pt -> do help <- case pt of (x : _) -> liftIO (B.readFile (x "output")) _ -> return empty let hhelp = case (S.decode help) of Right r -> r _ -> [] (runcheap (getStyles hhelp) b mylanguage mytitle pt (hostname . fullUrl $ st) templates tabs fformulas theRunMode latexTabels) -- | pathname of the temporary directory of the compiler | dirpref :: [Char] dirpref = "../tmp/compiler/" -- | converts a wiki source document received from mediawiki when requesting it -- for Special:Export to a parse tree to be converted to LaTeX be treeToLaTeX3. -- It also signals to compiler.py that the source code was read using the -- temporary compiler directory | shortparse :: String -> IO [Anything Char] shortparse x = do Tools.writeFile (dirpref ++ "done") "" return (parseit parsers x) -- | return a parse tree of a source file. The first argument is the source -- file. The second argument is a list of command line parameter. If it contains -- the keyword print. The source file is understood to be the HTML code returned -- by mediawiki when being requested for the print version of a wiki page, -- otherwise it is understood to be the wiki source code of a wiki page, that is -- what you get when issuing a Special:Export request to mediawiki. This -- function return a parse tree ready to be turned into a latex document by -- treeToLaTeX3 | {- getparse :: String -> [String] -> IO [Anything Char] getparse x args = if ("print" `elem` args) then printparse x else shortparse x -} -- | prepares a HTML document received from mediawiki when requesting it for the -- print version of a wiki page to a parse tree to be converted to LaTeX be -- treeToLaTeX3. It also signals to compiler.py that the source code was read -- using the temporary compiler directory | {- printparse :: String -> IO [Anything Char] printparse x = do Tools.writeFile (dirpref ++ "done") "" return (printPrepareTree (parseit minparsers x)) -} -- | the pathname of the temporary directory | tmppath :: [Char] tmppath = "../tmp/" -- | the function takes a list of the following format as first input -- [([table1,column1],width_x),([table1,column2],width_y),...,([table2,column1], -- width_z),...] parameter. Thats is a list containing the maximum width for -- each column of each table of the document. The maximum width of the column is -- the width that the column could have if it was printed on paper of infinite -- size. So the size without line breaks. The second parameter is the -- accumulator which should be the empty map when calling this function from -- outside. The function returns a map mapping tablenumber to a map mapping -- columnnumbers to maximum columns width. This data structure contains all -- information needed to make the decisions on the final width of the columns in -- the document | maketabmap :: [([Int], Double)] -> Map.Map Int (Map.Map Int Double) -> Map.Map Int (Map.Map Int Double) maketabmap (x : xs) m = case x of (t : (s : []), b) -> maketabmap xs (Map.alter (f s b) t m) _ -> m where f s1 b1 xx = case xx of Nothing -> Just (Map.singleton s1 b1) Just m1 -> Just (Map.insert s1 b1 m1) maketabmap _ m = m -- | prepare the result of maketabmap for further procession. Some indices are -- offset corrected. Space for the rules of the table is added to the width of -- the columns postproctabmap :: (Fractional a, Num k1, Ord k1, Ord a) => Map.Map k (Map.Map k1 a) -> Map.Map k (Map.Map k1 a) postproctabmap m = Map.map f m where f m1 = Map.delete 0 ( Map.mapKeys (\k -> k - 1) (Map.map (\x -> (x + 12.333748 - (minimum (Map.elems m1)))) m1) ) -- | the first parameter is the parse tree created by get parse of the document -- currently being processed. the second parameter is the URL under which the -- document was downloaded. the third parameter is the netloc describing the -- wiki this page belongs to. The fourth parameter is a mapping file defined by -- the user for the mapping of mediawiki templates to latex commands. the fifth -- parameter is a possible parse tree created by precious run the the should be -- added before the begging of the newly created parse tree. This function -- writes out all results to temporary files that will be further processed by -- compiler.py run :: [Anything Char] -> Bool -> Maybe String -> String -> [Anything Char] -> [Anything Char] -> String -> String -> [[ByteString]] -> Map.Map String Int -> Bool -> Maybe String -> Bool -> CompileResult run theStyles bb mylanguage mytitle parsetree parsetree2 netloc tmpl someTables fformulas vec llang latexTabels = CompileResult { images = img, body = bdy, tablelist = theTables, galleryNumbers = gals, title = tit, html = if bb then trda3 else [], theHtmlTabs = htmlTabs, theHtmlMaps = htmlMs, theChessBoards = chessBrd } where alldata2 g u = ( treeToLaTeX3 ((snd . newtree $ g)) initialState {urld = analyseNetloc netloc} { styles = theStyles, langu = llang, tabmap = u, templateMap = getUserTemplateMap (read tmpl :: [[String]]) } { urls = mUrlState . fst . newtree $ g, latexTabs = latexTabels } ) alldata3 g u = ( treeToHtml3 fformulas mylanguage mytitle ((snd . newtree $ g)) initialState {urld = analyseNetloc netloc} { styles = theStyles, langu = llang, MyState.vector = vec, tabmap = u, templateMap = getUserTemplateMap (read tmpl :: [[String]]) } { urls = mUrlState . fst . newtree $ g, latexTabs = latexTabels } ) newtree g = makeLables g initialUrlState tm = (postproctabmap (maketabmap theNewSizes Map.empty)) (trda, trst) = (alldata2 parsetree tm) (trda3, _) = (alldata3 parsetree2 tm) img = (map (\g -> ((replace '\n' ' ' g))) (getImages trst)) theTables = reverse (tablist trst) bdy = doUnicode trda gals = getGalleryNumbers trst tit = getTitle trst htmlTabs = htmlTables trst htmlMs = htmlMaps trst chessBrd = chessBoards trst fun :: ByteString -> Double fun x = case reads (toString x) of [(f, _)] -> f _ -> (1000.0) theSizes = zip [1 ..] (map (\x -> zip [1 ..] (map fun x)) someTables) theNewSizes = concat (map sizeFun theSizes) sizeFun (t, k) = map (\(s, b) -> ([t, s], b)) k runcheap :: [Anything Char] -> Bool -> Maybe String -> String -> [String] -> String -> String -> [[ByteString]] -> Map.Map String Int -> RunMode -> Bool -> ImperativeMonad CompileResult runcheap theStyles _ _ _ input netloc tmpl someTables _ theRunMode theLatexTables = do ntree <- labelit input trst <- ttl3 initialState {styles = theStyles, latexTabs = theLatexTables, urld = analyseNetloc netloc} { tabmap = tm, templateMap = getUserTemplateMap (read tmpl :: [[String]]) } { urls = mUrlState ntree } input lis <- mapM treeToLaTeX2ldr input let bdy = doUnicode (concat lis) let tit = getTitle trst let gals = getGalleryNumbers trst let theTables = reverse (tablist trst) let img = (map (\g -> ((replace '\n' ' ' g))) (getImages trst)) return CompileResult { images = img, body = bdy, tablelist = theTables, galleryNumbers = gals, title = tit, html = [], theHtmlTabs = htmlTables trst, theHtmlMaps = htmlMaps trst, theChessBoards = chessBoards trst } where labelit g = foldM labelloc initialUrlState g labelloc us fn = do _ <- liftIO $ B.writeFile (fn "intus") (encode us) _ <- liftIO $ system ( "mediawiki2latex -x " ++ (Hex.hex (show (fullconfigbase {convert = Just (NewTree fn), runMode = theRunMode, latexTables = theLatexTables}))) ) t <- liftIO $ B.readFile (fn "us") case S.decode t of Right nus -> return (nus :: UrlState) _ -> error "could not read state nus" treeToLaTeX2ext instfn fn = do _ <- liftIO $ system ( "mediawiki2latex -x " ++ (Hex.hex (show (fullconfigbase {convert = Just (TreeToLaTeX instfn fn), runMode = theRunMode, latexTables = theLatexTables}))) ) return () treeToLaTeX2ldr fn = do ltx <- liftIO $ B.readFile (fn "ltx") case S.decode ltx of Right lt -> return (lt :: String) _ -> return [] -- fullttl::String->[String]->MyState fullttl instfn g = do let hh = instfn : g _ <- mapM (\(x, y) -> treeToLaTeX2ext x y) (zip hh (Prelude.tail hh)) stx <- liftIO $ B.readFile ((Prelude.last g) "st") case S.decode stx of Right nus -> return (nus :: MyState) _ -> undefined -- ttl3::MyState->[String]->MyState ttl3 st g = do systempdir <- liftIO getTemporaryDirectory tempdir <- liftIO $ createTempDirectory systempdir "MediaWiki2LaTeXStateIO" liftIO (B.writeFile (tempdir "inst") (encode st)) sst <- fullttl tempdir g tempdir2 <- liftIO $ createTempDirectory systempdir "MediaWiki2LaTeXStateIO" liftIO (B.writeFile (tempdir2 "inst") (encode st {fndict = fndict sst})) fullttl tempdir2 g tm = (postproctabmap (maketabmap theNewSizes Map.empty)) fun :: ByteString -> Double fun x = case reads (toString x) of [(f, _)] -> f _ -> (1000.0) theSizes = zip [1 ..] (map (\x -> zip [1 ..] (map fun x)) someTables) theNewSizes = concat (map sizeFun theSizes) sizeFun (t, k) = map (\(s, b) -> ([t, s], b)) k mediawiki2latex-8.29/src/Font.hs000066400000000000000000000044021504464363500166020ustar00rootroot00000000000000import Data.Tuple import BaseFont import Data.Maybe import Control.Monad import Data.Array import Data.Char import System.Process findfont::[Font]->[Font]->Font findfont (x:xs) f= if x `elem` f then x else findfont f xs findfont [] f= GnuUnifont getArray::Font->IO (Array Int Bool) getArray f = do print name _<-system ("python3 /home/dirk/Downloads/usr/bin/names.py "++(show f)++"> "++name) text<-readFile name return $ array (0,(length text) -1) (zip [0..((length text) -1)] (zt text)) where zt::[Char]->[Bool] zt text=(map fun (zip [0..] text)) fun::(Int,Char)->Bool fun (_,'T') = True fun (i,_) = (chr i) `elem` "\n\r\t " name=takeWhile (/='.') filename ext =dropWhile (/='.') filename filename = reverse ((takeWhile (/='/')) (reverse (getttf f))) itbf s= [FontStyle{stylebase=s,bold=False,italic=False},FontStyle{stylebase=s,bold=True,italic=False},FontStyle{stylebase=s,bold=False,italic=True},FontStyle{stylebase=s,bold=True,italic=True}] stylebasenext::FontStyleBase->FontStyleBase stylebasenext Normal = Mono stylebasenext Mono = Smallcaps stylebasenext Smallcaps = Normal styles =(itbf Normal)++(itbf Mono)++(itbf Smallcaps) myfun as i fs = [f|(f,b)<-zip fonts (map (! i) as),b&&(fs==getstyle f)] getdata::[Array Int Bool]->Int-> [([Font],FontStyle)] getdata as i = zip (map (myfun as i) styles) styles main = jjj jjj = do arrs<-mapM getArray fonts let chrs=array (0,2^16-1) (zip [0..2^16-1] (map (getdata arrs) [0..2^16-1])) print [(s, map (fromFontToChar.f) [0..2^16-1])|(s,f)<-zip styles (map (getFont chrs) styles)] getFont::Array Int [([Font],FontStyle)]->FontStyle->Int->Font getFont chars fontStyle i = if (mi<=i) && (i<=mx) then getf else def where (mi,mx) = bounds chars def = GnuUnifont ch= chars!i swp = map swap ch ff sty = (lookup sty swp) gg sty = (ff sty) `mplus` (ff sty{italic= not (italic sty)}) `mplus` (ff sty{bold= not (bold sty)}) `mplus` (ff sty{italic= not (italic sty),bold= not (bold sty)}) hh sty = (gg sty) `mplus` (gg sty{stylebase= stylebasenext .stylebase $ sty}) `mplus` (gg sty{stylebase= stylebasenext.stylebasenext.stylebase$ sty}) getf = fromMaybe def ((hh fontStyle)>>=return.(findfont fonts) ) mediawiki2latex-8.29/src/FontTool.hs000066400000000000000000000117171504464363500174470ustar00rootroot00000000000000-- | module to switch between different ttf fonts during latex code generation module FontTool where import BaseFont import Data.Array import Data.Char import Data.Map.Strict hiding ((!)) import Data.Maybe import MegaFont import System.Info -- | a map taking a FontStyle as key. (see FontStyle in the BaseFont module). -- The Values of a maps is and array. The array has got an integer index -- covering 16 bit. The elements of the arrows are chars. These chars can be -- converted to the paths of ttf files on disc. (see functions fromCharToFont -- and getttf in the module BaseFont on how to converts the char to a path to a -- ttf file on disc). The idea is that you got a 16 Bit unicode charter with -- certain font style properties. It put in this information in the this map and -- the array you get from it you get the idea ttf file to print that character -- in that fontstyle in a latex document. megafont2 :: Map FontStyle (Array Int Char) megafont2 = Data.Map.Strict.fromList [ ( s, array ((0, (2 :: Int) ^ (16 :: Int) - 1) :: (Int, Int)) (zip ([0 .. (2 :: Int) ^ (16 :: Int) - 1] :: [Int]) f) ) | (s, f) <- megafont ] -- | takes a fontstyle and a 16 bis unicode charater and give you the ideal font -- to print this character in a LaTeX document. See also megafont2 in this -- module getFont :: -- | The `FontStyle` for which to look the font for. FontStyle -> -- | The character for which to look the font for. Char -> -- | The ideal font to use for the given `FontStyle` and character. Font getFont fontStyle c = fromMaybe GnuUnifont ( do d <- Data.Map.Strict.lookup fontStyle megafont2 (if (ord c) > 65535 then Just GnuUnifontUpper else Just ((fromCharToFont (d ! ord (c))))) ) -- | Takes a font and returns the LaTeX Command to switch to this particular -- font in xelatex as well as lulatex. fontsetter :: -- | The font to switch to Font -> -- | The LaTeX command to switch to the given font. [Char] fontsetter f = "\\allowbreak{}\\setmainfont" ++ inner ++ "\\setmonofont" ++ innermono where filename = reverse ((takeWhile (/= '/')) (reverse (getttf f))) pathname = reverse ((dropWhile (/= '/')) (reverse (getttf f))) inner = "{" ++ filename ++ "}" ++ "[RawFeature={fallback=myfallback}," ++ (if os == "linux" then "Path=" ++ pathname else "") ++ (mid f) ++ "]" innermono = "{" ++ filename ++ "}" ++ "[RawFeature={fallback=myfallback}," ++ (if os == "linux" then "Path=" ++ pathname else "") ++ (midmono f) ++ "]" mid i | i `elem` [ ComputerModernRoman, ComputerModernRomanBold, ComputerModernRomanItalic, ComputerModernRomanBoldItalic, ComputerModernTypeWriter, ComputerModernTypeWriterBold, ComputerModernTypeWriterItalic, ComputerModernTypeWriterBoldItalic ] = ",UprightFont=cmunrm,BoldFont=cmunbx" ++ ",ItalicFont=cmunti,BoldItalicFont=cmunbi" mid i | i `elem` [ FreeSerif, FreeSerifBold, FreeSerifBoldItalic, FreeSerifItalic, FreeMono, FreeMonoOblique, FreeMonoBold, FreeMonoBoldOblique ] = ",UprightFont=FreeSerif,BoldFont=FreeSerifBold," ++ "ItalicFont=FreeSerifItalic,BoldItalicFont=FreeSerifBoldItalic" mid _ = "" midmono i | i `elem` [ ComputerModernRoman, ComputerModernRomanBold, ComputerModernRomanItalic, ComputerModernRomanBoldItalic, ComputerModernTypeWriter, ComputerModernTypeWriterBold, ComputerModernTypeWriterItalic, ComputerModernTypeWriterBoldItalic ] = ",UprightFont=cmuntt,BoldFont=cmuntb" ++ ",ItalicFont=cmunit,BoldItalicFont=cmuntx" midmono i | i `elem` [ FreeSerif, FreeSerifBold, FreeSerifBoldItalic, FreeSerifItalic, FreeMono, FreeMonoOblique, FreeMonoBold, FreeMonoBoldOblique ] = ",UprightFont=FreeMono,BoldFont=FreeMonoBold," ++ "ItalicFont=FreeMonoOblique,BoldItalicFont=FreeMonoBoldOblique" midmono _ = "" -- | Takes a FontStyle and returns the LaTeX Command to switch to that style. fontstyler :: -- | the `FontStyle` to switch to. FontStyle -> -- | the LaTeX command to switch to the given `FontStyle` [Char] fontstyler s = (if (stylebase s) == Mono then "\\ttfamily " else "") ++ (if (bold s) == True then "\\bfseries " else "") ++ (if (italic s) == True then "\\itshape " else "") mediawiki2latex-8.29/src/GetImages.hs000066400000000000000000000410761504464363500175510ustar00rootroot00000000000000-- | module to download images form the wiki module GetImages where import Control.DeepSeq import Control.Monad import Control.Monad.State import Data.ByteString as BStr (readFile, writeFile) import qualified Data.ByteString as BStr import qualified Data.ByteString.UTF8 as UTF8Str import Data.List import Data.List.Split (splitOn) import Data.Map hiding (drop, filter, map, take) import qualified Data.Map as Map import Data.Maybe import Data.Serialize as S (decode, encode) import GHC.IO.Exception import Hex import HtmlParser (parseHtmlFast) import ImperativeState import MediaWikiParseTree import MediaWikiParser import Network.URL as URL import SimpleContributors import System.FilePath import System.Process import Tools import UrlAnalyse import WikiHelper modpath2 :: String -> URL -> URL modpath2 s u = u { url_path = if p /= [] then p ++ "/File:" ++ s else "/File:" ++ s } where pp = (url_path u) p = case reverse pp of ('/' : xs) -> (reverse xs) xs -> (reverse xs) conv :: URL -> String -> String conv u s = if take 5 s == "http:" then s else if take 6 s == "https:" then "https:" ++ (drop 6 s) else if (take 2 s) == "//" then "https:" ++ s else ( replace2 ( replace2 ( exportURL u { url_path = case s of ('/' : xs) -> xs _ -> s } ) "%27" "'" ) "%25" "%" ) getImageUrl2 :: (String, URL) -> Maybe String getImageUrl2 (s, u) = (getImageUrl "fullImageLink" u s) `mplus` (getImageUrl "fullMedia" u s) getImageUrl3 :: String -> Maybe String getImageUrl3 s = return s getImageUrl :: String -> URL -> String -> Maybe String getImageUrl fi u ss = if isInfixOf fil s then case splitOn fil s of (_ : (y : _)) -> case splitOn theHref y of (_ : (yy : _)) -> case splitOn q yy of (z : _) -> Just ( (conv u) . UTF8Str.toString $ (BStr.pack z) ) _ -> Nothing _ -> Nothing _ -> Nothing else Nothing where s = BStr.unpack (UTF8Str.fromString ss) fil = BStr.unpack (UTF8Str.fromString fi) theHref = BStr.unpack (UTF8Str.fromString "href=\"") q = BStr.unpack (UTF8Str.fromString "\"") -- | downloads a single image form the wiki. It takes the temporary image -- download directory as first parameter. It takes the WikiUrl of the wiki -- website currently being processed as second parameter. It takes a tuple as -- third input parameter. The first element of the tuple is the image number so -- just an integer that can be used to identify the image uniquely) . The second -- element of the tuple is image include string of the image from the wiki -- source, that is the text in between the square brackets as second input -- parameter. It returns a tuple. The first element of the tuple is a String -- that shall be passed as part of a configuration file to the curl program in -- order to download the all possible image description pages from the wiki. The -- second element of the tuple is a list of output files where the curl program -- shall store the image description page from the wiki on the local disk. The -- third element of the tuple is a list of URLs where the image description -- pages from the wiki are located on the web. getImagePage1 :: String -> WikiUrl -> (Integer, String) -> (String, [String], [String]) getImagePage1 dir u (i, ss) = (concat (map go numberedurls), map moo numberedurls, myloadurls) where numberedurls = (zip [1 ..] myurls) :: [(Integer, String)] go (n, myurl) = myurl ++ "\"\noutput = " ++ (moo (n, myurl)) ++ "\n" moo (n, _) = (dir (show i)) ++ "." ++ (show n) ++ ".html" myurls = map (("url = \"" ++) . kds . unify . exportURL . modpath2 ss) (parses u) :: [String] myloadurls = (map (kds . unify . exportURL . modpath2 ss) (parses u)) :: [String] kds ('h' : 't' : 't' : 'p' : 's' : ':' : '/' : '/' : xs) = ('h' : 't' : 't' : 'p' : 's' : ':' : '/' : '/' : (kds xs)) kds ('/' : '/' : xs) = '/' : (kds xs) kds (x : xs) = x : (kds xs) kds [] = [] getImagePage2 :: String -> WikiUrl -> (Integer, String) -> IO (Maybe ([String], Integer, URL, String)) getImagePage2 dir u (i, ss) = do l <- (mapM (\k -> Tools.readFile (dir (show i) ++ "." ++ (show k) ++ ".html")) [1 .. (length (parses u))]) :: IO [String] let xx = (map (getImageUrl2) (zip l (parses u))) :: [Maybe String] let gg = (zip (parses u) xx) :: [(URL, Maybe String)] let yy = (map go gg) :: [[(URL, String)]] let zz = (listToMaybe (concat yy)) :: Maybe (URL, String) case zz of Just (du, x) -> return ( Just ( map (unify . exportURL . (modpath2 ss)) (parses u), i, modpath2 ss du, x ) ) _ -> return Nothing where go :: (URL, Maybe String) -> [(URL, String)] go (uu, Just x) = [(uu, x)] go _ = [] -- | downloads a single image form the wiki. It takes the temporary image -- download directory as first parameter. It takes a tuple as second input -- parameter. The first element of the tuple is the image number so just an -- integer that can be used to identify the image uniquely) . The second element -- of the tuple is image include string of the image from the wiki source, that -- is the text in between the square brackets as second input parameter. It -- takes the WikiUrl of the wiki website currently being processed as thrird -- parameter. See function getImages in this module for documentation on the -- returned data type doImage1 :: String -> WikiUrl -> (Integer, String) -> IO (String, [String], [String]) doImage1 dir theWikiUrl img = do return (getImagePage1 dir theWikiUrl (fst img, theName)) where theName = case dropWhile (/= ':') (takeWhile (/= '|') (snd img)) of (_ : xs) -> replace2 xs "%27" "'" _ -> [] doImage2 :: String -> WikiUrl -> (Integer, String) -> IO (Maybe String) doImage2 dir theWikiUrl img = do p <- getImagePage2 dir theWikiUrl (fst img, theName) case p of Just (_, _, _, x) -> return (Just x) _ -> return Nothing where theName = case dropWhile (/= ':') (takeWhile (/= '|') (snd img)) of (_ : xs) -> replace2 xs "%27" "'" _ -> [] getImgContribUrl :: String -> String -> IO () getImgContribUrl theHost x = do _ <- system ( "mediawiki2latex -x " ++ (Hex.hex (show (fullconfigbase {imgctrburl = Just (x, theHost)}))) ) return () getImgContrib :: String -> IO () getImgContrib theFileName = do _ <- system ( "mediawiki2latex -x " ++ (Hex.hex (show (fullconfigbase {ctrb = Just theFileName}))) ) return () getContribCallBack :: [Char] -> ImperativeMonad () getContribCallBack theFileName = do x <- liftIO (Tools.readFile theFileName) let ff = (force (parseHtmlFast x)) let dd = ( ( (deepGet "a" "class" "new mw-userlink" ff) ++ (deepGet "a" "class" "mw-userlink" ff) ) ) :: [Anything Char] let ll = (filter pre (map go dd)) let n = (nub ll) :: [(String, String)] let out = (map go2 (zip (map (count ll) n) n)) :: [(String, String, Int)] liftIO (BStr.writeFile (theFileName ++ ".out") (S.encode out)) return () where go :: Anything Char -> (String, String) go (Environment Tag (TagAttr _ m) l) = ((shallowFlatten (deepFlatten l)), findWithDefault "" "href" m) go _ = ("", "") go2 (c, (a, h)) = (a, h, c) runCtrbUrl :: String -> String -> ImperativeMonad () runCtrbUrl ctrbfilename theHost = do yy <- liftIO (Tools.readFile ctrbfilename) let ht = (force (parseHtmlFast yy)) let aut = fromMaybe [] (getAuthor ht) :: [Anything Char] let lic = map C (fromMaybe [] (getLicense ht)) :: [Anything Char] -- liftIO (print lic) liftIO (print aut) liftIO (BStr.writeFile (ctrbfilename ++ ".author") (S.encode aut)) liftIO (BStr.writeFile (ctrbfilename ++ ".license") (S.encode lic)) let gg = (deepGet "li" "id" "ca-history" ht) let theUrl = makeUrl4 ( case gg of ((Environment Tag (TagAttr _ _) l) : []) -> case deepGet2 "a" l of [ Environment Tag (TagAttr _ mm) _ ] -> case Data.Map.lookup "href" mm of ( Just x ) -> if (Data.List.take 8 x == "https://") then (replace2 x "&" "&") else "https://" ++ theHost ++ ( replace2 x "&" "&" ) _ -> [] _ -> [] _ -> [] ) liftIO (Tools.writeFile (ctrbfilename ++ ".histurl") theUrl) return () -- | main function to download images. It takes the temporary image download -- directory as first parameter. It takes image include strings of the images -- from the wiki source, that is the text in between the square brackets as -- second input parameter. It takes the WikiUrl of the wiki websitze currently -- being processed as thrird parameter. This function runs as a background -- process. So it returns a list of empty MVars immediately when being called. -- They are later on filled with information on the downloaded images including -- their location in the temporary image download directory. The returend MVars -- contain ImageInfo values. See description in the module ImperativeState for a -- detailed description. fullmake :: String -> String -> IO () fullmake dir s = do _ <- system ("curl --retry-all-errors --retry 3 -s -w \"%{http_code} %{url} %{filename_effective}\\n\" --compressed -K " ++ (dir ("curlrun" ++ s)) ++ " --parallel -L > " ++ (dir ("curloutput" ++ s ++ ".1"))) mymake dir s 1 mymake :: String -> String -> Integer -> IO () mymake dir s n = do text <- Tools.readFile (dir ("curloutput" ++ s ++ "." ++ (show n))) let list = (filter ppred (map (splitOn " ") (splitOn "\n" text))) putStrLn ("Number of Failures " ++ (show (length list))) Tools.writeFile (dir ("curlrun" ++ s ++ "." ++ (show (n + 1)))) (concat ((map jjoin list) :: [String])) _ <- if (list == []) then (return ExitSuccess) else system ("curl --retry-all-errors --retry 3 -s --compressed -K " ++ (dir ("curlrun" ++ s ++ "." ++ (show (n + 1)))) ++ " --parallel -L -w \"%{http_code} %{url} %{filename_effective}\\n\" > " ++ (dir ("curloutput" ++ s ++ "." ++ (show (n + 1))))) if ((list == [])) then return () else (mymake dir s (n + 1)) where ppred (x : _) | x == "429" = True ppred _ = False jjoin :: [String] -> String jjoin (_ : y : z : []) = "url = \"" ++ y ++ "\"\noutput = \"" ++ z ++ "\"\n" jjoin _ = [] getImages1 :: String -> [String] -> WikiUrl -> ImperativeMonad ([ImageCredits]) getImages1 dir imagess theWikiUrl = do liftIO $ do let ddir = dir let thetheWikiUrl = theWikiUrl let iimages = ((zip [1 ..] (map (premap2 . premap) imagess))) helper <- (mapM (doImage1 ddir thetheWikiUrl) iimages) let l = map first helper let hosts = concat (repeat (map hof (parses theWikiUrl))) let imgdescfiles = concat (map second helper) let imgdescurls = (map (gogo . third) helper) myprint (" curl run (1/3)") Tools.writeFile (dir "curlrun1") (concat l) fullmake dir "1" res <- (mapM (doImage2 ddir thetheWikiUrl) iimages) let cnt = concat (map go (zip ([1 ..] :: [Integer]) res)) Tools.writeFile (dir "curlrun2") (cnt) myprint (" curl run (2/3)") fullmake dir "2" _ <- mapM (\(theHost, theFile) -> getImgContribUrl theHost theFile) (zip hosts imgdescfiles) histories <- mapM fun imgdescfiles Tools.writeFile (dir "curlrun3") (concat histories) myprint (" curl run (3/3)") fullmake dir "3" authorList <- mapM fun2 imgdescfiles mapM (getCredits dir) (zip (makautlist authorList) (zip imagess (zip ([1 .. (length imagess)]) imgdescurls))) where premap2 x = case splitOn "?lang=" x of (y : _) -> y _ -> x premap x = case splitOn "?page=" x of (y : _) -> y _ -> x lu = (length (parses theWikiUrl)) makautlist [] = [] makautlist xs = (concat (take lu xs)) : (makautlist (drop lu xs)) gogo (x : _) = x gogo _ = "" first (x, _, _) = x second (_, x, _) = x third (_, _, x) = x getCredits mydir (author, (wwi, (i, descurl))) = do credits <- mapM (getCredit author (mydir (show i))) [1 .. (length (parses theWikiUrl))] return ((joinImageCredits credits) {theDescUrl = descurl, wikiFilename = theName wwi, imageNumber = i}) getCredit :: String -> String -> Int -> IO ImageCredits getCredit auth path j = do aut <- getTheAuthor path j lic <- getTheLicense path j return (ImageCredits {theAltAuthors = auth, theAuthor = if j == (length (parses theWikiUrl)) then commonize aut else aut, theLicense = lic, theDescUrl = "", imageNumber = 0, wikiFilename = ""}) getTheAuthor path j = do t <- BStr.readFile (path ++ "." ++ (show j) ++ ".html.author") let r = (S.decode t) :: Either String [Anything Char] case r of Right rr -> return (killTree rr) _ -> return [] commonize ((Environment Tag (TagAttr "a" m) l) : xs) = (Environment Tag (TagAttr "a" (Map.alter altfun "href" m)) (commonize l)) : (commonize xs) commonize ((Environment t s l) : xs) = (Environment t s (commonize l)) : (commonize xs) commonize (x : xs) = x : (commonize xs) commonize [] = [] altfun Nothing = Nothing altfun (Just ('/' : 'w' : 'i' : 'k' : 'i' : '/' : xs)) = Just ("https://commons.wikimedia.org/wiki/" ++ xs) altfun (Just ('/' : 'w' : '/' : xs)) = Just ("https://commons.wikimedia.org/w/" ++ xs) altfun (Just x) = Just x getTheLicense path j = do t <- BStr.readFile (path ++ "." ++ (show j) ++ ".html.license") let r = (S.decode t) :: Either String [Anything Char] case r of Right rr -> return rr _ -> return [] theName wi = case dropWhile (/= ':') (takeWhile (/= '|') wi) of (_ : xs) -> replace2 (replace2 xs "%27" "'") "%" "%25" _ -> [] joinImageCredits :: [ImageCredits] -> ImageCredits joinImageCredits c = let au = intercalate [C ','] (nub ((filter (/= []) (map theAuthor c)))) in ImageCredits {theAuthor = if au == [] then (map C (intercalate "," (nub ((filter (/= []) (map theAltAuthors c)))))) else au, theLicense = intercalate [C ','] (nub (filter (/= []) (map theLicense c))), theDescUrl = "", wikiFilename = "", imageNumber = 0, theAltAuthors = ""} fun x = do s <- Tools.readFile (x ++ ".histurl") if s == "" then return "" else return ("url = \"" ++ s ++ "\"\noutput = \"" ++ x ++ ".history\"\n") fun2 x = do s <- Tools.readFile (x ++ ".histurl") if s == "" then return [] else do getImgContrib (x ++ ".history") t <- BStr.readFile (x ++ ".history.out") let r = (S.decode t) :: Either String [(String, String, Int)] case r of Right xs -> return (intercalate ", " (map atos xs)) _ -> return [] atos (x, _, _) = x go (number, Just u) = "url = \"" ++ u ++ "\"\noutput = \"" ++ (dir (show number)) ++ "\"\n" go _ = "" hof u = case url_type u of Absolute h -> host h _ -> "" killTree ll = concat (map killNode ll) killNode (Environment Tag (TagAttr "table" m) l) = case (Map.lookup "class" m) of Just "commons-creator-table mw-collapsible mw-collapsed mw-content-ltr" -> case (deepGet2 "th" l) of (x : _) -> [x] _ -> [] _ -> [Environment Tag (TagAttr "table" m) (killTree l)] killNode (Environment Tag (TagAttr "div" m) l) = case (Map.lookup "style" m) of Just "display: none;" -> [] _ -> [Environment Tag (TagAttr "div" m) (killTree l)] killNode (Environment x y l) = [Environment x y (killTree l)] killNode x = [x] mediawiki2latex-8.29/src/Grammatik.hs000066400000000000000000000016531504464363500176150ustar00rootroot00000000000000module Grammatik where data Plingular = Singular | Plural deriving (Show) data Casus = Nominativ | Dativ | Genitiv | Akkusativ deriving (Show) data Person = Ich | Du | ErSieEs deriving (Show) data Verbform = VerbformPerson Person | Paeteritum | Partizip2 | Lonjunktiv | Imperativ Plingular | Grundform deriving (Show) data Adjektivfrom = Positiv | Koperativ | Superlativ deriving (Show) data Genus = Maskulin | Feminin | Neutrum deriving (Show) data GenusArticelis = MaskulinA | FemininA | NeutrumA | PluralA deriving (Show) data Bestimmung = Demonstativ | Definit | Unbestimmt deriving (Show) data Wort = Nomen String Genus Casus Plingular | Verb String Verbform | Adjektiv Adjektivfrom | Artikel Bestimmung GenusArticelis Casus deriving (Show) data SatzTeil = Unbekannt [Wort] | Subjekt Wort | VerbS Wort | Objekt Wort deriving (Show) mediawiki2latex-8.29/src/Hex.hs000066400000000000000000000053621504464363500164260ustar00rootroot00000000000000-- | module to convert string to hexadecimally encodes strings and vice versa module Hex where import Data.Char import Data.Map.Strict hiding (map) import Data.Maybe -- | list of integers in the range from 0 to 15. So one hex digit. nums :: -- | the list of integers in the range from 0 to 15 [Int] nums = [0 .. 15] -- | list of single digit hex numbers in ascending order chars :: -- | the list of characters representing a hex digit [Char] chars = (['0' .. '9'] ++ ['A' .. 'F']) -- | map from integer to hex digit fromm :: -- | A map from integers to their hex digit representation for all integer in -- the range of one hex digit. Map Int Char fromm = fromList $ zip nums chars -- | map from a hex digit to integer tom :: -- | A map form a hex single hex digits to their integer representations Map Char Int tom = fromList $ zip chars nums -- | function to convert a single Unicode character (Char) to a hex encodes -- string. Each character is converted to eight hexadecimal digits. Leading -- zeros are a added if need to fill the full eight hex digits. hexChar :: -- | The Unicode character to be converter to hexadecimal notation Char -> -- | Returns the hexadecimal representation of the Unicode character String hexChar c = concat ( map ( \i -> fromMaybe "" ( ( Data.Map.Strict.lookup ( (if (i == 0) then (ord c) else (ord c) `div` (16 ^ i)) `mod` (16 :: Int) ) fromm ) >>= (\x -> return [x]) ) ) (reverse [0 .. 7] :: [Int]) ) -- | function to convert a string of Unicode characters to a hex encoded version -- of it. Each Unicode character is represented by 8 hex digits. hex :: -- | The string of Unicode characters to be converted to their hexadecimal -- representation String -> -- | The concatenation of the hexadecimal representations of the Unicode -- characters given in the first Parameter. String hex s = concat (map hexChar s) -- | function to decode a hex encoded Unicode string. Groups of eight hex digit -- are converted to a single Unicode characters each. unhex :: -- | The hexadecimal representation of the Unicode string (eight digits per -- character). String -> -- | The unicode String converted from the hexadecimal representation given as -- first parameter. String unhex (a : (b : (c : (d : (e : (f : (g : (h : xs)))))))) = ( chr ( sum ( map ( \(i, cc) -> (16 ^ i) * (fromMaybe 0 (Data.Map.Strict.lookup cc tom)) ) (zip (reverse [0 .. 7] :: [Int]) [a, b, c, d, e, f, g, h]) ) ) ) : (unhex xs) unhex _ = [] mediawiki2latex-8.29/src/HtmlParser.hs000066400000000000000000000036421504464363500177620ustar00rootroot00000000000000module HtmlParser where import qualified Data.Map as Map import MediaWikiParseTree import MediaWikiParser import Text.HTML.TagSoup parseHtml :: String -> [Anything Char] parseHtml = parseit minparsers data Frame = Frame {tag :: Tag String, ds :: [Anything Char]} parseHtmlFast :: String -> [Anything Char] parseHtmlFast = makebrackets . parseTags makebrackets :: [Tag String] -> [Anything Char] makebrackets l = go l [Frame {tag = (TagOpen "root" []), ds = []}] where go [] ys = reverse (ds (head (closeTags ((length ys) - 1) ys))) go ((TagOpen n a) : xs) ys = go xs (Frame {tag = (TagOpen n a), ds = []} : ys) go ((TagClose n) : xs) ys = case getfrm n ys 1 of Just m -> let midys = closeTags m ys in go xs (openTags (m - 1) ys midys) _ -> go xs ys go ((TagText n) : xs) (y : ys) = go xs (y {ds = (reverse (map C n)) ++ (ds y)} : ys) go (_ : xs) ys = go xs ys closeTags :: Int -> [Frame] -> [Frame] closeTags 0 ys = ys closeTags m (y : ys) = case tag y of TagOpen n a -> case ys of (yy : yys) -> closeTags (m - 1) ( yy { ds = ( Environment Tag (TagAttr n (Map.fromList a)) (reverse (ds y)) ) : (ds yy) } : yys ) _ -> ys _ -> ys closeTags _ _ = [] openTags 0 _ zs = zs openTags 1 (y : _) zs = Frame {tag = tag y, ds = []} : zs openTags n (y : ys) zs = Frame {tag = tag y, ds = []} : (openTags (n - 1) ys zs) openTags _ _ zs = zs getfrm :: String -> [Frame] -> Int -> Maybe Int getfrm _ [] _ = Nothing getfrm n (y : ys) m = case (tag y) of TagOpen nn _ | nn == n -> Just m _ -> getfrm n ys (m + 1) mediawiki2latex-8.29/src/ImperativeState.hs000066400000000000000000000456221504464363500210130ustar00rootroot00000000000000{-# LANGUAGE DefaultSignatures #-} {-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE StandaloneDeriving #-} -- | module defining the datatypes needed for the outer imperative flow control -- of the program. All configuration information needed for single run of the -- program is stored here. module ImperativeState where import Control.Monad.Except import Control.Monad.State import Data.List import Data.Map.Strict import Data.Serialize import GHC.Generics import MediaWikiParseTree import UrlAnalyse -- | A type to for errors that might be thrown during the imperative -- calculation. data MyError = -- | Error downloading the lemma (first parameter) from the URL (second parameter). DownloadError String String | -- | Generic error with error message. OtherError String | -- | Error parsing an URL. WikiUrlParseError String | -- | Error: A command line option that has to be given exactly one was given more than once of not at all. NotExcatlyOneError String | -- | Error: The command line option given in the only parameter did have a parameter that could not be parsed to an integer. NotIntegerError String | -- | Error: An option that is allowed to be present at most once was present two or more times NotAtMostOneError String | -- | Error: more than one of the options --internal --templates --mediawiki --html were given ToManyOptionsError | -- | Error: more than one of the options --zip --epub --odt were given ToManyOutputOptionsError | -- | Error: An other paper format than A4, A5, B5, letter, legal, executive was given. PaperError | -- | Error: More than one of the options --tableschromium or ---tableslatex were given ToManyTableOptionsError | -- | Error: The option was given as well as an other option. ToManyTestOptionsError -- | A monad for dealing with errors type MyErrorMonad = Either MyError -- | printable error messages instance Show MyError where show (DownloadError theLemma theUrl) = "Error downloading the lemma \"" ++ theLemma ++ "\" form the url \"" ++ theUrl ++ "\"" show (WikiUrlParseError theUrl) = "Error: The supplied url " ++ theUrl ++ " could not be parsed" show PaperError = "Error: The option paper may only be one of A4, A5, B5, letter, legal, executive" show ToManyTableOptionsError = "Error: at most one of the options --tableschromium or ---tableslatex may be given" show ToManyOptionsError = "Error: at most one of the options --internal --templates --mediawiki --html may be given" show ToManyOutputOptionsError = "Error: at most one of the options --zip --epub --odt may be given" show ToManyTestOptionsError = "Error: if the option --test is given no other option may be given" show (NotExcatlyOneError msg) = "Error: The option --" ++ msg ++ " has to be present exactly once in the command line" show (NotAtMostOneError msg) = "Error: The option --" ++ msg ++ " can only be present at most once in the command line" show (NotIntegerError msg) = "Error: The option --" ++ msg ++ " could not be parsed as an integer." show (OtherError msg) = msg -- | A type to capture a contributor form the list of contributors needed for -- license reasons. data Contributor = Contributor { -- | The Username of the author. name :: String, -- | The number of edits on the given article done by the user. edits :: Integer, -- | The link to the users homepage on the wiki. href :: String } deriving (Eq, Ord, Show, Read, Serialize, Generic) -- | The sum of two contributors is defined as the new contributor with the same -- name and homepage and the edits summed up. Of course this makes only sense -- when summing up edits for the same contributor, which is not checked but has -- to be ensured by hand myplus :: -- | The first addend. Contributor -> -- | The second addend. Contributor -> -- | The sum of the addends. Contributor myplus x y = x {edits = (edits x) + (edits y)} -- | Build a map of contributors summing up the edits per contributor. The map -- takes the name of the contributor as key and the `Contributor` records given -- above as value. The first parameter is a list of such maps the results is -- also such a map representing the sum of the maps in the list contribsum :: -- | List of maps from contributor names to `Contributor` records. [Map String Contributor] -> -- | The sum of the list given in the first parameter Map String Contributor contribsum x = Data.List.foldl (unionWith myplus) Data.Map.Strict.empty x -- | a default version of the record `ImperativeState` imperativeStateZero :: -- | IO action returning the default version of `ImperativeState` IO ImperativeState imperativeStateZero = do return ImperativeState { audict = [], fullUrl = fullWikiUrlZero, loadacu = Right [], vectorr = False, finishedLemmas = [] } -- | The datatype storing the state information for the part of the program -- using imperative flow of control data ImperativeState = ImperativeState { -- | The list of maps from contributor names (as keys) to `Contributor` records (as values). Each map in the list represents a list of contributors which a read from the list of contributors for a single wiki article on the web. audict :: [(Map String Contributor)], -- | The parsed version of the main URL mediawiki2latex is processing. See -- `UrlAnalyse.analyseFull` for details. fullUrl :: FullWikiUrl, -- | The loading accumulator for accumulating the input to be processed with -- mediawiki2latex. In book mode (Left case) with outputs PDF or LaTeX zip -- it stores the names of temporary directories where the data to be -- processed is stored. In any other case (Right case) it stores the parsed -- version of the information downloaded from the wiki. loadacu :: Either [FilePath] [Anything Char], -- | True if vector graphics should be converted to PDF as vector graphics -- and should not be converted to raster graphics. False otherwise. vectorr :: Bool, -- | The list of lemmas that already have been download an shall not be -- downloaded again to avoid infinite recursive downloads. finishedLemmas :: [String] } -- | Datatype for the results of a compilation process. It is the process of -- compiling MediaWiki or HTML source code to LaTeX source code. So this data -- type contains the resulting LaTeX code together with auxiliary information data CompileResult = CompileResult { -- | Contains the strings enclosed in double square brackets in the wiki used for image inclusion. images :: [String], -- | Contains the body of the latex document compiled form the wiki -- documents body :: String, -- | Contains a list of lists of bodies of latex document containing the -- latex source for a single column. Those can be compiled with the proper -- headers and footers on arbitrary huge paper to determine the maximum -- reasonable width for a each column in each table of the document which is -- need for automatic calculation of column widths for the document. tablelist :: [[String]], -- | Contains the image numbers of images included in the wiki source inside -- of galleries. These got a smaller dimension in cm in the final PDF -- document and can thus be dithered to a small width in pixels. galleryNumbers :: [Integer], -- | Contains the title of the document if a template defining the title was -- part of the parse wiki source title :: String, -- | HTML intermediate code if output mode EPUB or ODT was selected. html :: String, -- | The HTML code for the tables to be compiled with chromium if table -- rendering with chromium is selected theHtmlTabs :: [String], -- | The OpenStreetMap maps included in the wiki article as HTML code. -- Works only when run from inside wikimedias server farm, so only on the -- web server provides the wikimedia foundation. theHtmlMaps :: [String], -- | The LaTeX Codes for the chess board diagrams in the Wiki currently -- processes. Currently only used for the German Wikibook on chess. theChessBoards :: [String] } deriving (Show, Serialize, Generic, Read) -- | The configuration for a run of the LaTeX typesetting system. data LatexConfig = LatexConfig { -- | Information about the authors of the images figures :: [ImageCredits], -- | The information for the title page of the PDF to be generated ltitle :: String, -- | the full configuration for single run of mediawiki2latex (e.g parsed -- from the command line interface) fullConfig :: FullConfig, -- | the content of the main.tex LaTeX file to be processed by the LaTeX -- typesetting system content :: String, -- | the hostname of the host the wiki information is downloaded from lhostname :: String, -- | The result of the source code HTML or Wiki to LaTeX source compilation. theResult :: CompileResult, -- | True if the intended LaTeX run is only a table columns precompilation -- run and not a run creating a PDF document for the user. If True the -- unnecessary parts of compilation process are left out. onlyTables :: Bool, -- The language code for the document to be processed wrapped into a Just -- value of the Maybe monad if it could be determined, otherwise the Nothing -- value of the Maybe monad. lang :: Maybe String, -- The temporary directory where to store the information and run the LaTeX -- typesetting system in. theTempDir :: String, -- The formulas for use in HTML intermediate output (e.g. for EPUB or ODT -- generation) as a list of pairs. The first element of each pair is the -- name code for the PNG file the formula was compiled to. The second -- element of each pair is the size of the PNG file in x direction (so its -- width). formulas :: [(String, Int)], -- The tailing part of the HTML intermediate code containing the list of -- contributors as well as the list of figures (including the respective -- authors) as well as the closing tags for the root and body tags of the -- HTML documents. This is only needed when HTML intermediate code is use to -- create ODT or EPUB documents. figHTML :: String, -- | The HTML code for the tables to be compiled with chromium if table -- rendering with chromium is selected theHtmlTables :: [String], -- Works only when run from inside wikimedias server farm, so only on the -- web server provides the wikimedia foundation. theHtmlMapes :: [String], -- | The LaTeX Codes for the chess board diagrams in the Wiki currently -- processes. Currently only used for the German wikibook on chess. theChessBoardes :: [String] } deriving (Show, Serialize, Read, Generic) -- | The monad for the part of mediawiki2latex written in imperative style. type ImperativeMonad = ExceptT MyError (StateT ImperativeState IO) -- | Selection for the book mode. That means processing of multiple articles -- (given as list wiki links) to a single document data BookMode = -- | Book mode active Yes | -- | Book mode not active No deriving (Show, Read, Eq, Serialize, Generic) -- | The mode of processing mediawiki2latex is running. See also `BookMode`. data RunMode = -- | Process HTML generated by MediaWiki downloaded from the MediaWiki server (default mode) HTML BookMode | -- | process MediaWiki source code downloaded from the MediaWiki server with templates expanded by the MediaWiki server. ExpandedTemplates BookMode | -- | Process MediaWiki source code downloaded from the MediaWiki server. Load the plain wiki source including possible calls to templates, don't let the MediaWiki server expand the templates. Rather use the own template processing mechanisms included in mediawiki2latex. StandardTemplates BookMode | -- | Same as `StandardTemplates` but use a used defined template mapping. The file name of the mapping file is given in the second parameter UserTemplateFile BookMode String deriving (Show, Read, Eq, Serialize, Generic) -- | The output format to be generated. data OutputType = -- | Output a PDF file. PlainPDF | -- | Output a Zip archive of the LaTeX code that can be compiled to a PDF file. ZipArchive | -- | Output an EPUB file. Here a HTML file is generated at first an the processed into an EPUB file by calibre. EPubFile | -- | Output a ODT file. Here a HTML file is generated at first an the processed into an ODT file by libreoffice. OdtFile deriving (Show, Read, Eq, Serialize, Generic) -- | For recursive call of the mediawiki2latex command line application. In -- order to save memory (RAM) when processing to LaTeX ZIP or PDF in bookmode -- mediawiki2latex run different steps of the compilation processes in sub -- processes of itself which free their memory when terminated. data ConvertState = -- | Add labels to the parse tree and return the new parse tree as well as the new renderer state, including the labels for internal references in the PDF or LaTeX document. The String parameter is the name of the directory where the processing shall take place. NewTree String | -- | Convert parse tree to LaTeX representation. The first parameter is the name of the directory where to read the initial renderer state form. The second parameter is the directory where the processing shall take place and where the output shall be written to. TreeToLaTeX String String | -- | Load an article form the server, parse the result and store the resulting parse tree. Also download an store the contributor information the contributors of the article. The first parameter is the name of the directory where processing shall take place. NewLoad String deriving (Show, Read, Eq, Serialize, Generic) -- | The full configuration for a single run of mediawiki2latex data FullConfig = FullConfig { -- | If a user supplied headers directory for the LaTeX compilation process is provided in the command line, its name is given as a Just value of the Maybe monad. Otherwise the Nothing value of the Maybe monad. headers :: Maybe String, -- | The maximum resolution in (dots per inch) the images shall be dithered -- to, in order to make the PDF not too large in terms of diskspace. resolution :: Integer, -- | The output filename where the resulting file shall be written to. outputFilename :: String, -- | The input URL to the article on the wiki server where to download the -- content from. inputUrl :: String, -- | The run mode of mediawiki2latex. See `RunMode`. runMode :: RunMode, -- | The paper format to use for the output file. paper :: String, -- | If true SVG vector graphics are included in the output file as vector -- graphics. Otherwise they are converted to raster graphics. vector :: Bool, -- | If the output tree directory containing the LaTeX of HTML intermediate -- code shall be copied to a given directory before the final compilation -- step takes place a Just value of the Maybe monad containing the name of -- the directory where the data shall be copied. Otherwise the Nothing value -- of the Maybe monad. copy :: Maybe String, -- | The working directory where mediawiki2latex is running in. mainPath :: String, -- | Open the mediawiki2latex web server on the port given as first -- parameter server :: Maybe Int, -- | The output format to be generated. See `OutputType` outputType :: OutputType, -- | Used only for recursive calls of mediawiki2latex to itself to save -- memory (see also `ConvertState`). The only parameter is the directory -- where the processing shall happen wrapped in a Just value of the Maybe -- monad. Reads the given input from the wiki notation into a parse tree -- structure and stores the result. On a non recursive (normal) call of -- mediawiki2latex a Nothing value of the Maybe monad is used and nothing is -- done here. compile :: Maybe String, -- | Used only for recursive calls of mediawiki2latex to itself to save -- memory (see also `ConvertState`). On a recursive call the requested -- `ConvertState` wrapped into a Maybe monad is used here. Otherwise the -- Nothing value of the Maybe monad is used and nothing is done here. convert :: Maybe ConvertState, -- | True if only children of the current URL shall be used in the -- processing. False if any URL shall be processed noparent :: Bool, -- | Run LaTeX compiler in a sub process, this is needed for table column -- precompilation, since it can happen in parallel processes. The only -- parameter is the name of the directory where the processing shall take -- place. This is only used in recursive call of mediawiki2latex on itself. ltxproc :: Maybe String, -- | Read the HTML image description page and determine the author and -- license of the image if possible. Also determine the link to the version -- history of the image. Write the resulting information to disk. The first -- element of the parameter tuple is the filename where to read the HTML of -- the image description page from. The second one is the host name of the -- server the data has been received from. This only used in recursive calls -- of the mediawiki2latex command line application to itself, in which case -- a Just value of the Maybe monad is used. In normal processing the Nothing -- value of the Maybe monad is used. imgctrburl :: Maybe (String, String), -- | Get the image contributors from a version history page of the MediaWiki -- server stored on the local disc. Store the result to disk again. This is -- parsing the HTML of the version history page. In order so save memory -- (RAM), this is done in a separate sub process freeing its memory when -- terminated. This only used in recursive calls of the mediawiki2latex -- command line application to itself, in which case a Just value of the -- Maybe monad is used. In normal processing the Nothing value of the Maybe -- monad is used. ctrb :: Maybe String, -- | Typeset all table with LaTeX if True. Typeset complex tables with -- chromium and simple tables with LaTeX if false. latexTables :: Bool, -- | True if internal test shall be run an no further processing shall -- occur. testMode :: Bool } deriving (Show, Read, Serialize, Generic) -- | The standard instance of the `FullConfig` data type. fullconfigbase :: FullConfig fullconfigbase = FullConfig { headers = Nothing, resolution = 0, outputFilename = "", inputUrl = "", runMode = HTML No, paper = "A4", vector = False, copy = Nothing, mainPath = "", server = Nothing, outputType = PlainPDF, compile = Nothing, convert = Nothing, noparent = False, imgctrburl = Nothing, ctrb = Nothing, latexTables = False, ltxproc = Nothing, testMode = False } mediawiki2latex-8.29/src/LatexRenderer.hs000066400000000000000000004707141504464363500204550ustar00rootroot00000000000000-- | This modules converts the parse tree to a latex document module LatexRenderer ( treeToLaTeX2, treeToLaTeX3, shallowFlatten, prepateTemplate, replace, doUnicode, getGalleryNumbers, getTitle, initialState, getJ, urld, analyseNetloc, templateMap, getUserTemplateMap, urls, mUrlState, initialUrlState, makeLables, templateRegistry, baseUrl, deepFlatten, wikiLinkCaption, imageSize, isCaption, linewidth, generateGalleryImageNumbers, splitToTuples, galleryTableScale, tempProcAdapter, treeToHtml3, tabletoodeep, mathTransform, wdth3, ) where import Babel import BaseFont import Control.Monad (guard, mplus, msum) import Control.Monad.Trans.Class (lift) import Control.Monad.Trans.State (State, StateT, get, put, runState, runStateT, state) import Data.Char import Data.Hashable import Data.List import Data.List.Split import qualified Data.Map as Map import Data.Map.Strict (Map) import Data.Maybe import qualified Data.Set as Set import Data.String.HT (trim) import Data.Tuple (swap) import FontTool import GHC.Float import Hex import MagicStrings import MediaWikiParseTree import MediaWikiParser hiding (prep) import MyState import TableHelper import Text.Printf import Tools import WikiHelper import WikiLinkHelper type HtmlRenderer = State MyState mathTreeToLaTeX :: [Anything Char] -> String mathTreeToLaTeX ll = concat (map mathNodeToLaTeX ll) where mathNodeToLaTeX (C x) = [x] mathNodeToLaTeX (Environment MuInsideMath (Str f) _) = case reads f of [(y, _)] -> "\\\\[" ++ (printf "%0.5f" ((y :: Float) / 18.0)) ++ "em]" _ -> "\\\\[" ++ f ++ "mu]" mathNodeToLaTeX _ = [] -- | converts a mathematical expression (that is something within a math tag in -- the wiki) to an latex expression. Essentially the wiki is using latex. But it -- allows for some extra features that are take care of in this transformation mathTransform :: [Anything Char] -> String mathTransform x = mathTreeToLaTeX (parseit [muinsidemathp] (multireplace (replace '\n' ' ' (shallowFlatten x)) replist)) templateToHtml :: [Anything Char] -> String -> Renderer String templateToHtml l s = state $ \st -> swap $ templateHtmlProcessor st (prepateTemplate l s) templateHtmlProcessor :: MyState -> (String, Map String [Anything Char]) -> (MyState, String) templateHtmlProcessor st ("Mathe f\252r Nicht-Freaks: Vorlage:Warnung", ll) = ( st, "Warnung
" ++ (treeToHtml (Map.findWithDefault [] "1" ll) st) ++ "" ) templateHtmlProcessor st ("Mathe f\252r Nicht-Freaks: Vorlage:Hinweis", ll) = ( st, "Hinweis
" ++ (treeToHtml (Map.findWithDefault [] "1" ll) st) ++ "" ) templateHtmlProcessor st ("Mathe f\252r Nicht-Freaks: Vorlage:Beispiel", ll) = ( st, "Beispiel
" ++ (treeToHtml (Map.findWithDefault [] "beispiel" ll) st) ++ "" ) templateHtmlProcessor st ("Mathe f\252r Nicht-Freaks: Vorlage:Satz", ll) = ( st, "Satz
" ++ (treeToHtml (Map.findWithDefault [] "satz" ll) st) ++ "" ) templateHtmlProcessor st ("Mathe f\252r Nicht-Freaks: Vorlage:L\246sungsweg", ll) = ( st, "Wie kommt man auf den Beweis?" ++ (treeToHtml (Map.findWithDefault [] "l\246sungsweg" ll) st) ++ "" ) templateHtmlProcessor st ("Mathe f\252r Nicht-Freaks: Vorlage:Beweis", ll) = ( st, "Beweis:
" ++ (treeToHtml (Map.findWithDefault [] "beweis" ll) st) ++ "" ) templateHtmlProcessor st ("Mathe f\252r Nicht-Freaks: Vorlage:Definition", ll) = ( st, "Definition: (" ++ (treeToHtml (Map.findWithDefault [] "titel" ll) st) ++ ")
" ++ (treeToHtml (Map.findWithDefault [] "definition" ll) st) ) templateHtmlProcessor st ("mathe f\252r Nicht-Freaks: Vorlage:Definition", ll) = ( st, "Definition: (" ++ (treeToHtml (Map.findWithDefault [] "titel" ll) st) ++ ")
" ++ (treeToHtml (Map.findWithDefault [] "definition" ll) st) ) templateHtmlProcessor st ("-", ll) = (tempProcAdapter $ mnfindent ll) st templateHtmlProcessor st ("Mathe f\252r Nicht-Freaks: Vorlage:Klapptext", ll) = (tempProcAdapter $ mnfklapptext ll) st templateHtmlProcessor st ("Aufgabensammlung: Vorlage:Klapptext", ll) = (tempProcAdapter $ mnfklapptext ll) st templateHtmlProcessor st ("Aufgabensammlung: Vorlage:Vollst\228ndige Induktion", ll) = (tempProcAdapter $ mnfinduktion ll) st templateHtmlProcessor st ("Formel", ll) = ( st, "
" ++ (treeToHtml (Map.findWithDefault [] "1" ll) st) ++ "
" ) templateHtmlProcessor st ("Mathe f\252r Nicht-Freaks: Vorlage:Frage", ll) = (tempProcAdapter $ mnffrage ll) st templateHtmlProcessor st ("Anker", _) = (st, "") templateHtmlProcessor st ("Symbol", ll) = (st, (treeToHtml (Map.findWithDefault [] "1" ll) st)) templateHtmlProcessor st ("#invoke:Mathe f\252r Nicht-Freaks/Seite", _) = (st, "") templateHtmlProcessor st ("Aufgabensammlung: Vorlage:Infobox", _) = (st, "") templateHtmlProcessor st ("Aufgabensammlung: Vorlage:Symbol", _) = (st, "") templateHtmlProcessor st ("Nicht l\246schen", _) = (st, "") templateHtmlProcessor st ("#ifeq:{{{include", _) = (st, "") templateHtmlProcessor st ("Druckversion Titelseite", _) = (st, "") templateHtmlProcessor st ("PDF-Version Gliederung", _) = (st, "") templateHtmlProcessor st ("#invoke:Liste", _) = (st, "") templateHtmlProcessor st ("Smiley", _) = (st, "\9786") templateHtmlProcessor st ("", _) = (st, "") templateHtmlProcessor st (x, _) = (st, "UNKNOWN TEMPLATE " ++ x ++ " ") wikiLinkCaptionHtml :: [Anything Char] -> MyState -> String wikiLinkCaptionHtml l st = if isCaption x then rebuild x else "" where x = (treeToHtml (last (splitOn [C '|'] l)) st) rebuild (':' : xs) = xs rebuild b = b wikiImageToHtml :: [Anything Char] -> Renderer String wikiImageToHtml l = do st <- get mystr <- return ( (if not (micro st) then "

" else "") ++ "<" ++ (if ext == "webm" then "video controls" else "img") ++ " src=\"./images/" ++ (n st) ++ "." ++ (if (ext == "svg" && (not (MyState.vector st))) then "png" else ext) ++ "\" style=\"width: " ++ (if (tb st) then "100.0" else (mysize st)) ++ "%;\">" ++ ( if (not (micro st)) then "
" ++ (getfig st) ++ " " ++ (n st) ++ " " ++ (s st) ++ "

" else "" ) ) put st { getImages = (getImages st) ++ [shallowFlatten l], getJ = ((getJ st) + 1) } return mystr where ext = normalizeExtensionHtml ( map toLower (fileNameToExtension (headSplitEq '|' (shallowFlatten l))) ) s st = if (trim (s1 st)) `elem` ["verweis=", "alt=", "link="] then "" else (s1 st) s2 st = case Map.lookup "alt" (snd (prepateTemplate l "x")) of Just xx -> wikiLinkCaptionHtml xx st Nothing -> wikiLinkCaptionHtml l st s1 st = if '|' `elem` (shallowFlatten l) then (s2 st) else (treeToHtml [] st {getJ = ((getJ st) + 1)}) mysize st = printf "%0.5f" ((mysizefloat2 st) * 100.0) mysizefloat st = (min (getF st) (imageSize l)) mysizefloat2 st = if (msb st) then 1.0 else (mysizefloat st) msb st = (mysizefloat st) == (getF st) micro st = ((mysizefloat st) < 0.17) || ((getInTab st) > 1) n st = show (getJ st) tb st = ((getInTab st) > 0) getfig st = head ( splitOn "}" ( last ( splitOn "\\newcommand{\\myfigurebabel}{" (makeBabel (langu st) "en") ) ) ) galleryContentToHtml :: [[Anything Char]] -> Renderer String galleryContentToHtml (x : xs) = do s <- galleryRowToHtml x ss <- galleryContentToHtml xs return $ s ++ "" ++ ss galleryContentToHtml [] = return [] -- | converts a part of a gallery (image gallery, gallery tag) from parse tree -- to latex. A part are as many elements as fit into a single row in the -- resulting latex table galleryRowToHtml :: [Anything Char] -> Renderer String galleryRowToHtml [] = return [] galleryRowToHtml (x : []) = treeToHtml2 [x] galleryRowToHtml (x : xs) = do s <- treeToHtml2 [x] g <- galleryRowToHtml xs return $ s ++ "" ++ g -- | Converts are gallery (image gallery, gallery tag) from parse tree to latex. -- Also writes table header and footer. This is the function you should use for -- converting galleries to latex galleryToHtml :: [Anything Char] -> Renderer String galleryToHtml x = do st <- get put st {getF = (getF st) * galleryTableScale} s <- ( galleryContentToHtml [ z | z <- splitToTuples [y | y <- x, isWikiLink y], trim (treeToHtml z st) /= "" ] ) st2 <- get put st2 {getF = (getF st)} return ("" ++ s ++ "
") mnffrage :: Map String [Anything Char] -> Renderer String mnffrage ll = do typ <- treeToHtml2 (Map.findWithDefault [] "typ" ll) frage <- treeToHtml2 (Map.findWithDefault [] "frage" ll) antwort <- treeToHtml2 (Map.findWithDefault [] "antwort" ll) return ( "
" ++ typ ++ ": " ++ frage ++ "
" ++ antwort ++ "
" ) mnfindent :: Map String [Anything Char] -> Renderer String mnfindent ll = do one <- treeToHtml2 (Map.findWithDefault [] "1" ll) return ("
" ++ one ++ "
") mnfklapptext :: Map String [Anything Char] -> Renderer String mnfklapptext ll = do kopf <- treeToHtml2 (Map.findWithDefault [] "kopf" ll) inhalt <- treeToHtml2 (Map.findWithDefault [] "inhalt" ll) return ("" ++ kopf ++ "
" ++ inhalt) mnfinduktion :: Map String [Anything Char] -> Renderer String mnfinduktion ll = do erf <- treeToHtml2 (Map.findWithDefault [] "erfuellungsmenge" ll) aus <- treeToHtml2 (Map.findWithDefault [] "aussageform" ll) anf <- treeToHtml2 (Map.findWithDefault [] "induktionsanfang" ll) vor <- treeToHtml2 (Map.findWithDefault [] "induktionsvoraussetzung" ll) beh <- treeToHtml2 (Map.findWithDefault [] "induktionsbehauptung" ll) sch <- treeToHtml2 (Map.findWithDefault [] "beweis_induktionsschritt" ll) return ( "Aussageform, deren Allgemeing\252ltigkeit f\252r " ++ erf ++ " bewiesen werden soll:
" ++ aus ++ "
1. Induktionsanfang
" ++ anf ++ "
2. Induktionsschritt
2a. Induktionsvoraussetzung
" ++ vor ++ "
2b. Induktionsbehauptung
" ++ beh ++ "
2c. Beweis des Induktionsschritts
" ++ sch ++ "
" ) writedict :: [(String, String)] -> String writedict [] = [] writedict ((k, v) : xs) = k ++ "=\"" ++ v ++ "\" " ++ (writedict xs) treeToHtml3 :: Map String Int -> Maybe String -> String -> [Anything Char] -> MyState -> (String, MyState) treeToHtml3 formulas mylanguage title l st = let (a, b) = runState (treeToHtml2 l) st {langu = mylanguage, forms = formulas} in let (aa, _) = runState (treeToHtml2 (styles st)) st in ( "" ++ title ++ "
" ++ aa ++ a, b ) treeToHtml :: [Anything Char] -> MyState -> String treeToHtml l states = (fst $ runState (treeToHtml2 l) states) treeToHtml4 :: [Anything Char] -> HtmlRenderer String treeToHtml4 ll = do x <- allinfo return $ concat x where allinfo :: HtmlRenderer [String] allinfo = mapM nodeToHtml ll walk :: String -> [Anything Char] -> String -> HtmlRenderer String walk prefix l postfix = do d <- treeToHtml4 l return $ prefix ++ d ++ postfix nodeToHtml (C c) = do st <- get x <- if (c == '\n') && ((lastChar st) == c) then return "" else return [c] put st {lastChar = c} return x nodeToHtml (Environment NumHtml (Str s) l) = walk ("&#" ++ s ++ ";") l "" nodeToHtml (Environment HtmlChar (Str s) _) = return ("&" ++ s ++ ";") nodeToHtml (Environment _ (TagAttr "br" _) _) = return "
" nodeToHtml (Environment Tag (TagAttr "figure" _) l) = walk "" l "" nodeToHtml (Environment Tag (TagAttr "figcaption" _) _) = return "" nodeToHtml (Environment _ (TagAttr x m) l) = walk ("<" ++ x ++ " " ++ (writedict (Map.toList (updateDict m))) ++ ">") l ("") nodeToHtml (Environment _ _ l) = walk "" l "" nodeToHtml _ = return [] updateDict m = Map.adjust udf2 "srcset" (Map.adjust udf "src" m) udf ('/' : '/' : xs) = "https://" ++ xs udf xs = xs udf2 (',' : ' ' : '/' : '/' : xs) = ", https://" ++ (udf2 xs) udf2 (x : xs) = x : (udf2 xs) udf2 [] = [] treeToHtml2 :: [Anything Char] -> HtmlRenderer String treeToHtml2 ll = do x <- allinfo return $ concat x where allinfo :: HtmlRenderer [String] allinfo = mapM nodeToHtml ll walk :: String -> [Anything Char] -> String -> HtmlRenderer String walk prefix l postfix = do d <- treeToHtml2 l return $ prefix ++ d ++ postfix walk4 :: String -> [Anything Char] -> String -> HtmlRenderer String walk4 prefix l postfix = do d <- treeToHtml4 l return $ prefix ++ d ++ postfix modmap :: Maybe String -> Maybe String modmap Nothing = Just "font-size:50%;" modmap (Just j) = Just ("font-size:50%; " ++ j) nodeToHtml :: Anything Char -> HtmlRenderer String nodeToHtml (C c) = do st <- get x <- if (c == '\n') && ((lastChar st) == c) then return "

" else return [c] put st {lastChar = c} return x nodeToHtml (Environment Tag (TagAttr "table" m) l) = do sst <- get if (latexTabs sst) then do st <- get put $ st {getInTab = (getInTab st) + 1} d <- walk ("") l ("
") st2 <- get put $ st2 {getInTab = (getInTab st)} return d else walk4 ("<" ++ "table" ++ " " ++ (writedict (Map.toList (Map.alter modmap "style" m))) ++ ">") l ("") nodeToHtml (Environment Wikitable (TagAttr "table" m) l) = do st <- get if (latexTabs st) then walk ("") l "
" else walk4 ("<" ++ "table" ++ " " ++ (writedict (Map.toList (Map.alter modmap "style" m))) ++ ">") l ("") nodeToHtml (Environment HtmlChar (Str s) _) = return ("&" ++ s ++ ";") nodeToHtml (Environment Wikilink _ l) = do st <- get if getInHeading st then return $ wikiLinkCaptionHtml l st else if (isImage (shallowFlatten l)) then wikiImageToHtml l else return $ wikiLinkCaptionHtml l st nodeToHtml (Environment Tag (TagAttr "br" _) _) = return "
" nodeToHtml (Environment Tag (TagAttr "script" _) _) = return [] nodeToHtml (Environment Tag (TagAttr "audio" _) _) = return [] nodeToHtml (Environment Source (TagAttr _ _) l) = do let g = case reverse l of [] -> [] (x : xs) -> if x == (C '\n') then reverse xs else l d <- treeToHtml2 (breakLines3 linewidth g) return $ (rtrim d) nodeToHtml (Environment Template (Str s) l) = templateToHtml l s nodeToHtml (Environment Wikitable (TagAttr _ m) l) = walk ("") l "
" nodeToHtml (Environment Wikitable _ l) = walk "" l "
" nodeToHtml (Environment TableRowSep _ _) = return "" nodeToHtml (Environment TableColSep (TagAttr _ m) _) = return ("") nodeToHtml (Environment TableColSep _ _) = return ("") nodeToHtml (Environment TableHeadColSep _ _) = return "" nodeToHtml (Environment TableCap _ l) = walk "" l "" nodeToHtml (Environment Wikiheading (Str x) l) = let y = (show (length x)) in walk ("") l ("") nodeToHtml (Environment ItemEnv (Str _) [Item _]) = return [] nodeToHtml (Environment ItemEnv (Str s) l) = do tag <- return ( case s of "*" -> "ul" _ -> "ol" ) walk ("<" ++ tag ++ ">") l ("") nodeToHtml (Item _) = return "

  • " nodeToHtml (Environment Tag (TagAttr "noscript" _) _) = return [] nodeToHtml (Environment Tag (TagAttr "head" _) _) = return [] nodeToHtml (Environment Tag (TagAttr "a" m) l) = do st <- get walk (" if (take 5 r) == "/wiki" then Just (wikiUrlDataToString (urld st) r) else Just r) "href" m))) ++ ">") l ("") nodeToHtml (Environment Tag (TagAttr "body" _) l) = walk "" l "" nodeToHtml (Environment Tag (TagAttr "html" _) l) = walk "" l "" nodeToHtml (Environment NumHtml (Str s) l) = walk ("&#" ++ s ++ ";") l "" nodeToHtml (Environment Tag (TagAttr "div" a) l) = if (Map.member "class" a) then if ( (Map.findWithDefault [] "class" a) `elem` ["noprint", "latitude", "longitude", "elevation"] ) || ((Map.findWithDefault [] "id" a) `elem` ["coordinates"]) then return "" else walk ("
    ") l ("
    ") else walk ("
    ") l ("
    ") nodeToHtml (Environment Tag (TagAttr "img" m) _) | (Map.lookup "class" m) == (Just "mwe-math-fallback-image-inline") = return [] nodeToHtml (Environment Tag (TagAttr "img" m) l) | ( case (Map.lookup "src" m) of Just str -> (take 2 str) == "//" _ -> False ) = nodeToHtml (Environment Tag (TagAttr "img" (Map.adjust (\x -> "https:" ++ x) "src" m)) l) nodeToHtml (Environment Comment _ _) = return [] nodeToHtml (Environment Preformat (TagAttr "pre" _) l) = walk "
    " l "
    " nodeToHtml (Environment Math (TagAttr "math" _) l) = do st <- get return ( "" ) nodeToHtml (Environment Math _ l) = do st <- get return ( "" ) nodeToHtml (Environment Gallery _ l) = do st <- get put st {getInGallery = True} d <- galleryToHtml l st2 <- get put $ (newst st2) {getInGallery = (getInGallery st)} return d where midst i = i {getInGallery = False} gins i = generateGalleryImageNumbers i (midst i) newst i = (midst i) { getGalleryNumbers = (getGalleryNumbers (midst i)) ++ (map toInteger (gins i)) } nodeToHtml (Environment Tag (TagAttr x m) l) = walk ("<" ++ x ++ " " ++ (writedict (Map.toList m)) ++ ">") l ("") nodeToHtml (Environment _ _ l) = walk "" l "" nodeToHtml _ = return [] -- | the maximum width of lines for preformat and source code linewidth :: Int linewidth = 80 -- | The user can provide her own translation table for mediawiki templates to -- latex commands. this is done in the templates.user files. This function takes -- this file in list representation and converts it to the map representation to -- be able to look up the names of templates getUserTemplateMap :: [[String]] -> Map String [String] getUserTemplateMap input = Map.fromList (map go input) where go (x : xs) = (x, xs) go [] = ([], []) -- | table may omit tailing columns in a row, but in latex they need to be -- written out, this function does so rowaddsym :: TableState -> [Char] rowaddsym st = if (currentColumn st) < ((numberOfColumnsInTable st) + 1) then ( if (currentColumn st) == 1 then replicate (((numberOfColumnsInTable st)) - (currentColumn st)) '&' else replicate (((numberOfColumnsInTable st)) - (currentColumn st)) '&' ) else [] -- | This function renders the inner parts of a table to latex it does so by -- calling tableContentToLaTeX and additionally removes superfluous newlines -- which might cause compilation problems in latex when used inside tables tableContentToLaTeX2 :: [Anything Char] -> (StateT TableState (State MyState) String) tableContentToLaTeX2 l = do r <- tableContentToLaTeX l return (killnl2 r) varwidthbegin :: TableState -> [Char] varwidthbegin st = if isJust (activeColumn st) then "\\begin{varwidth}{\\linewidth}" else "" varwidthend :: TableState -> [Char] varwidthend st = if isJust (activeColumn st) then "\\end{varwidth}" else "" -- | This function renders the inner parts of a table to latex, please always -- use tableContentToLaTeX2 since this also removes superfluous newlines tableContentToLaTeX :: [Anything Char] -> (StateT TableState (State MyState) String) tableContentToLaTeX ((Environment TableRowSep _ _) : []) = do st <- get let cc = (currentColumn st) let c = cc + (multiRowCount cc (multiRowMap st)) return $ (varwidthend st) ++ (headendsym (lastCellWasHeaderCell st)) ++ (multiColumnEndSymbol (lastCellWasMultiColumn st)) ++ (multiRowEndSymbol (lastCellWasMultiRow st)) ++ (rowaddsym st {currentColumn = c}) tableContentToLaTeX ((Environment TableRowSep _ l) : xs) = do sst <- lift get st <- get let cc = (currentColumn st) let c = cc + (multiRowCount cc (multiRowMap st)) let mycond = (not (currentRowIsHeaderRow st)) && (stillInTableHeader st) && (lastRowHadEmptyMultiRowMap st) && (not (isFirstRow st)) put ( st { rowCounter = 1 + (rowCounter st), outputTableHasHeaderRows = (outputTableHasHeaderRows st) || (currentRowIsHeaderRow st), lastRowHadEmptyMultiRowMap = (myempty (multiRowMap st)) } ) st2 <- get put st2 { outputLastRowOfHeader = (if mycond then rowCounter st2 else outputLastRowOfHeader st2) } st3 <- get put st3 { lastCellWasNotFirstCellOfRow = False, lastCellWasMultiColumn = False, currentColumn = 1, multiRowMap = multiRowDictChange (currentColumn st) (multiRowMap st) l, lastCellWasMultiRow = False, isFirstRow = False, lastCellWasHeaderCell = False, currentRowIsHeaderRow = False, stillInTableHeader = if stillInTableHeader st then not mycond else False } st4 <- get xx <- tableContentToLaTeX xs return $ if (not (isFirstRow st)) then (varwidthend st) ++ (headendsym (lastCellWasHeaderCell st)) ++ (multiColumnEndSymbol (lastCellWasMultiColumn st)) ++ (multiRowEndSymbol (lastCellWasMultiRow st)) ++ ( multiRowSymbolForRowSep (currentColumn st) (multiRowMap st) (seperatingLinesRequestedForTable st) ) ++ (rowaddsym st {currentColumn = c}) ++ ( rowendsymb ((getInTab sst) <= 1) ((rowCounter st) == (inputLastRowOfHeader st) - 2) (multiRowMap st4) ) ++ ( innerHorizontalLine (seperatingLinesRequestedForTable st) (multiRowMap st4) (numberOfColumnsInTable st) -- ++ ((show (multiRowMap st3))++"["++(show (currentColumn st3)++"]")++"!"++(show cc)++","++ (show c)++"!") ) ++ " \n" ++ (varwidthbegin st) ++ xx else xx tableContentToLaTeX ((Environment TableColSep _ l) : xs) = do st <- get outerstate <- lift get let cc = (currentColumn st) let c = cc + (multiRowCount cc (multiRowMap st)) colsym <- tablecolorsym l put st { lastCellWasNotFirstCellOfRow = True, lastCellWasMultiColumn = ( "" /= ( multiColumnStartSymbol l (getInTab outerstate) (columnsWidthList st) c (seperatingLinesRequestedForTable st) st ) ), currentColumn = (c + (columnMultiplicityForCounting l)), multiRowMap = multiRowDictChange (currentColumn st) (multiRowMap st) l, lastCellWasMultiRow = (multiRowStartSymbol l (activeColumn st) outerstate) /= "", isFirstRow = False, lastCellWasHeaderCell = False } xx <- tableContentToLaTeX xxs return $ (varwidthend st) ++ (headendsym (lastCellWasHeaderCell st)) ++ (multiColumnEndSymbol (lastCellWasMultiColumn st)) ++ (multiRowEndSymbol (lastCellWasMultiRow st)) ++ (columnSeperator (lastCellWasNotFirstCellOfRow st)) ++ ( multiRowSymbol (currentColumn st) (multiRowMap st) (seperatingLinesRequestedForTable st) ) ++ -- (show (multiRowMap st))++"["++(show (currentColumn -- st)++"]")++"!"++(show cc)++","++ (show c)++"!"++ ( multiColumnStartSymbol l (getInTab outerstate) (columnsWidthList st) c (seperatingLinesRequestedForTable st) st ) ++ (multiRowStartSymbol l (activeColumn st) outerstate) ++ (if rig then "\\RaggedLeft{}" else "") ++ colsym ++ hypennothing ++ (varwidthbegin st) ++ xx where rig = isInfixOf [Environment Attribute (Attr ("style", "text-align:right")) []] l xxs = if rig then (reverse . removesp . reverse . removesp) xs else xs removesp (C ' ' : as) = removesp as removesp a = a tableContentToLaTeX ((Environment TableHeadColSep _ l) : xs) = do st <- get outerstate <- lift get let cc = currentColumn st let c = cc + (multiRowCount cc (multiRowMap st)) colsym <- tablecolorsym l put st { lastCellWasNotFirstCellOfRow = True, lastCellWasMultiColumn = ( "" /= ( multiColumnStartSymbol l (getInTab outerstate) (columnsWidthList st) c (seperatingLinesRequestedForTable st) st ) ), currentColumn = (c + (columnMultiplicityForCounting l)), multiRowMap = multiRowDictChange (currentColumn st) (multiRowMap st) l, lastCellWasMultiRow = (multiRowStartSymbol l (activeColumn st) outerstate) /= "", isFirstRow = False, lastCellWasHeaderCell = True, currentRowIsHeaderRow = True } xx <- tableContentToLaTeX xs return $ (varwidthend st) ++ (headendsym (lastCellWasHeaderCell st)) ++ (multiColumnEndSymbol (lastCellWasMultiColumn st)) ++ (multiRowEndSymbol (lastCellWasMultiRow st)) ++ (columnSeperator (lastCellWasNotFirstCellOfRow st)) ++ ( multiRowSymbol (currentColumn st) (multiRowMap st) (seperatingLinesRequestedForTable st) ) ++ ( multiColumnStartSymbol l (getInTab outerstate) (columnsWidthList st) c (seperatingLinesRequestedForTable st) st ) ++ (multiRowStartSymbol l (activeColumn st) outerstate) ++ headstartsym ++ colsym ++ hypennothing ++ (varwidthbegin st) ++ xx tableContentToLaTeX (x : xs) = do st <- get ele <- case (activeColumn st) of Just n | (n /= fromIntegral (currentColumn st)) -> return [] _ -> lift $ treeToLaTeX2 [x] xx <- tableContentToLaTeX xs return $ ele ++ xx tableContentToLaTeX [] = do st <- get let cc = currentColumn st let c = cc + (multiRowCount cc (multiRowMap st)) return $ (varwidthend st) ++ (headendsym (lastCellWasHeaderCell st)) ++ (multiColumnEndSymbol (lastCellWasMultiColumn st)) ++ (multiRowEndSymbol (lastCellWasMultiRow st)) ++ ( rowaddsym st {currentColumn = (c + (columnMultiplicityForCounting []))} ) ++ ( multiRowSymbolForTableEnd (currentColumn st) (multiRowMap st) (seperatingLinesRequestedForTable st) ) subTableCellCorrect :: [Anything Char] -> [Anything Char] subTableCellCorrect [] = [] subTableCellCorrect (x : xs) = if look then (smaller upto) ++ (subTableCellCorrect (dropWhile p (x : xs))) else x : (subTableCellCorrect xs) where p (Environment TableRowSep _ _) = False p (Environment TableColSep _ _) = False p (Environment TableHeadColSep _ _) = False p _ = True q (Environment Wikitable _ _) = (1 :: Integer) q _ = 0 smaller ((Environment Wikitable (TagAttr t a) l) : ys) = (Environment Wikitable (TagAttr t (Map.insert "class" "navbox" a)) l) : (smaller ys) smaller (y : ys) = y : (smaller ys) smaller [] = [] upto = takeWhile p (x : xs) look = (sum (map q upto)) >= 2 -- | This string has to be added to each new cell in a latex table in order to -- allow for hyphenation of the first word in this cell hypennothing :: [Char] hypennothing = "\\hspace*{0pt}\\ignorespaces{}\\hspace*{0pt}" -- | color cell in latex if HTML attribute bgcolor is present in the parse tree -- for the cell tablecolorsym :: [Anything Char] -> (StateT TableState (State MyState) String) tablecolorsym ll = case genLookup "bgcolor" ll of Just x -> getcol x Nothing -> case genLookup "style" ll of Just y -> case lookup "background-color" (stylelist y) of Just z -> getcol z Nothing -> return "" Nothing -> return "" where getcol x = case x of ('#' : ys) -> let (p, colname, col) = colinfo ('l' : 'l' : ys) in if p then return ("\\cellcolor[rgb]" ++ col) else return ("\\cellcolor{" ++ colname ++ "}") _ -> return ("\\cellcolor{" ++ (if Set.member x htmlColorNames then x else "grey") ++ "}") stylelist y = concat (map (go . (splitOn ":")) (splitOn ";" y)) go [a, b] = [(strip " \n\r\t" a, strip " \n\r\t" b)] go _ = [] -- | the caption of a table is given in |+ or elements, it needs to be -- reformatted in the parse in oder to be rendered in latex as a multicolumn -- cell spanning the whole width of the table reformatTableCaption :: Int -> [Anything Char] -> MyState -> [Anything Char] reformatTableCaption n ((Environment TableCap _ l) : ((Environment TableRowSep a b) : xs)) st = if (filter (not . isSpace) (treeToLaTeX l st)) == [] then reformatTableCaption n xs st else (Environment TableRowSep (Str "") []) : ( ( Environment TableHeadColSep (Str "") [Environment Attribute (Attr ("colspan", (show n))) []] ) : l ) ++ [(Environment TableRowSep a b)] ++ reformatTableCaption n xs st reformatTableCaption n ((Environment TableCap _ l) : xs) st = if (filter (not . isSpace) (treeToLaTeX l st)) == [] then reformatTableCaption n xs st else (Environment TableRowSep (Str "") []) : ( ( Environment TableHeadColSep (Str "") [Environment Attribute (Attr ("colspan", (show n))) []] ) : l ) ++ [(Environment TableRowSep (Str "") [])] ++ reformatTableCaption n xs st reformatTableCaption n (x : xs) st = x : reformatTableCaption n xs st reformatTableCaption _ [] _ = [] -- | In order to determine the maximum width of columns, each table is -- precompiled with latex several times, with only one column included each -- time. this function creates the list of the latex sources of these tables, -- for one table in the parse tree maketablist :: [Anything Char] -> TableState -> Int -> MyState -> [[Char]] maketablist l tst nc mst = map tablo [1 .. (nc + 1)] where tablo n = "\\begin{tabular}{|" ++ (replicate nc 'l') ++ "|}" ++ "\\begin{varwidth}{\\linewidth}" ++ ( fst ( fst ( runState ( (runStateT (tableContentToLaTeX2 l)) tst {inputLastRowOfHeader = -2, activeColumn = Just n} ) mst ) ) ) ++ "\\end{tabular}" -- | Takes a map from int to double finds the biggest double and removes the -- corresponding key value pair from the map. This way wide columns are set to -- smaller sizes in order to fit the whole table onto the page width removehighest :: Map Int Double -> Map Int Double removehighest m | m /= Map.empty = Map.fromList (hlp (Map.toList m)) where mx = maximum (Map.elems m) hlp ((_, v) : xs) | v == mx = xs hlp (x : xs) = x : (hlp xs) hlp [] = [] removehighest _ = Map.empty -- | Returns a list of floats which represents the width of the columns of a -- table in units of the line width with the proper corrections for use in the a -- latex documents. If the boolean input parameter is true the table is -- understood to be written in landscape mode. It also take a map of Int to -- Double. This is the list of the maximum width of columns determined by -- previous runs of latex on the table with only one column included per run wdth3 :: Bool -> Map Int Double -> ([Float], Double) wdth3 ls m | m /= Map.empty = ( ( map ( (* (1.0 - (scalefactor (fromIntegral n)))) . double2Float . (/ (linew2 ls)) ) (Map.elems mm) ), if d == 1.0 then 1.0 else d * 0.9 ) where n = (maximum (Map.keys m)) (mm, d) = wdth ls n m wdth3 _ _ = ([], 1.0) -- | Returns a table header which represents the width of the columns of a table -- in units of the line width with the proper corrections for use in the a latex -- documents. If the first boolean input parameter is true the table is -- understood to be written in landscape mode. It also take a map of Int to -- Double. This is the list of the maximum width of columns determined by -- previous runs of latex on the table with only one column included per run. If -- second boolean parameter is true it is understood the the rule should be -- printed with the table, otherwise the table should be printed without rules wdth2 :: Int -> Bool -> Map Int Double -> Bool -> Float -> String wdth2 i ls m b f | m /= Map.empty = tableSpecifier i b ( map ( (* (f * (1.0 - (scalefactor (fromIntegral n))))) . double2Float . (/ (linew2 ls)) ) (Map.elems mm) ) where n = (maximum (Map.keys m)) (mm, _) = wdth ls n m wdth2 _ _ _ _ _ = [] -- | takes the list of maximum column widths created by previous runs of the -- latex compiler with only one columns included per run as map from Int to -- Double. Take the total number of columns of the table as Int. The table is -- understood to be printed in landscape mode if the boolean parameter is true. -- It returns a map from int to double representing the width of columns of the -- table to be used in the latex documents. So it takes raw widths. Which are -- just the width of the column if the width of the paper was infinite and -- return the width that fit on the finite width of the real paper wdth :: Bool -> Int -> Map Int Double -> (Map Int Double, Double) wdth ls n mm = case ( Control.Monad.msum ( map hlp ( zip ( iterate removehighest ( Map.mapMaybe (\x -> Just $ x / (1.0 - (scalefactor (fromIntegral n)))) mm ) ) [0 .. (length (Map.keys mm))] ) ) ) of Just (x, Nothing) -> if (sum (Map.elems x)) < (linew2 ls) then (Map.map (\y -> y * ((linew2 ls) / (sum (Map.elems x)))) x, 1.0) else (x, 1.0) Just (x, Just ddd) -> ( Map.map (\y -> y * ((linew2 ls) / (sum (Map.elems x)))) x, ddd ) Nothing -> (myfill ((linew2 ls) / (fromIntegral n)) Map.empty, 1.0) where hlp :: (Map Int Double, Int) -> Maybe ((Map Int Double), Maybe Double) hlp (m, i) | ((sum (Map.elems m)) :: Double) + ((linew2 ls) / (fromIntegral n)) * (fromIntegral i) < (linew2 ls) = Just ( myfill ( ((linew2 ls) - (sum (Map.elems m))) / ((fromIntegral i) :: Double) ) m, Nothing ) hlp (_, i) | ((i == 3) || (i == n)) = let (mmm, dd) = (wdth ls n (Map.map ((\x -> x * 0.965 * 0.965)) mm)) in Just (mmm, Just ((0.965) * dd)) hlp (m, i) | ((sum (Map.elems m)) :: Double) + ((linew2 ls) / (fromIntegral n)) * (fromIntegral i) >= (linew2 ls) = Nothing hlp _ = Just (myfill ((linew2 ls) / (fromIntegral n)) Map.empty, Nothing) myfill :: Double -> Map Int Double -> Map Int Double myfill x m = Map.union m (Map.fromList (zip [1 .. n] (repeat x))) -- | In landscape mode everything has to be multiplied by a factor of two. If -- the boolean parameter is true it is understood that the table should be -- printed in landscape mode. This function return the width of the line in -- latex using the units of latex linew2 :: Bool -> Double linew2 ls = if ls then linew * 1.414 else linew -- | The width of the line in A4 paper with DIV margin factor of 13 in latex own -- units linew :: Double linew = 455.45742 mapToLaTeX :: [Anything Char] -> Renderer String mapToLaTeX l2 = do st <- get do let (output, _) = treeToHtml3 (Map.fromList []) (langu st) "" l2 st put st {htmlMaps = (htmlMaps st) ++ [output]} _ <- myfun l2 let n = (1 + (length (htmlMaps st))) return ("\n\n\\begin{minipage}{\\textwidth}\n\\begin{center}\n\\includegraphics[width=1.0\\textwidth,height=8.0in,keepaspectratio]{../map" ++ (show n) ++ ".pdf}\n\nCopyright OpenStreetMap\\end{center}\n\\raggedright{}\n\\end{minipage}\n\\vspace{0.75cm}\n\n") where myfun [(Environment Tag (TagAttr "div" _) l3)] = treeToLaTeX2 l3 myfun _ = return [] tableToLaTeXNew :: [Anything Char] -> Bool -> String -> Maybe Float -> [Anything Char] -> Renderer String tableToLaTeXNew l1 b s m l2 = do st <- get if (latexTabs st) || (not ((havepos l1) || (tabletoodeep l1))) then do tableToLaTeX (if (latexTabs st) then l1 else (printPrepareTree False l1)) b s m else ( do let (output, _) = treeToHtml3 (Map.fromList []) (langu st) "" l2 st _ <- tableToLaTeX (printPrepareTree False l1) b s m st2 <- get put st2 {htmlTables = (htmlTables st) ++ [output]} let n = (1 + (length (htmlTables st))) return ("\n\n\\begin{minipage}{\\textwidth}\n\\begin{center}\n\\includegraphics[width=1.0\\textwidth,height=8.0in,keepaspectratio]{../table" ++ (show n) ++ ".pdf}\n\\end{center}\n\\raggedright{}\n\\end{minipage}\n\\vspace{0.75cm}\n\n") ) posToLaTeX :: [Anything Char] -> Renderer String posToLaTeX l1 = do st <- get if (latexTabs st) then treeToLaTeX2 l1 else ( do let (output, _) = treeToHtml3 (Map.fromList []) (langu st) "" l1 st _ <- treeToLaTeX2 l1 st2 <- get put st2 {htmlTables = (htmlTables st) ++ [output]} let n = (1 + (length (htmlTables st))) return ("\n\n\\begin{minipage}{\\textwidth}\n\\begin{center}\n\\includegraphics[width=1.0\\textwidth,height=8.0in,keepaspectratio]{../table" ++ (show n) ++ ".pdf}\n\\end{center}\n\\raggedright{}\n\\end{minipage}\n\\vspace{0.75cm}\n\n") ) -- | convert a table form the parse tree to latex. The [Anything Char] parameter -- it the contend of the table represented as a parse tree. The String parameter -- contains the HTML attributes of the table element, or in wiki notation the -- HTML parameters of the line beginning with {| . This is evaluated in order -- to find out whether rules should be printed in the table. The return type is -- Renderer String. Which means that it returns a string but also take a state -- as additional monadic input parameter and returns a possible changed version -- of it as additional return parameter monadically tableToLaTeX :: [Anything Char] -> Bool -> String -> Maybe Float -> Renderer String tableToLaTeX l1 b s m = do st <- get let modst = st {getF = (getF st) * (tableScale (numberOfColumns l))} ((_, oldstate), _) = runState ((runStateT (tableContentToLaTeX2 reformed)) tblstate) modst ((t1, _), newstate) = runState ( (runStateT (tableContentToLaTeX2 reformed)) tblstate { inputLastRowOfHeader = if outputTableHasHeaderRows oldstate then outputLastRowOfHeader oldstate else -2 } ) modst { tablist = (maketablist reformed tblstate (numberOfColumns l) modst) : (tablist st) } reformed = ((reformatTableCaption (numberOfColumns l) l st)) l = l1 -- stripempty l1 st spec = case Map.lookup tbno (tabmap st) of Nothing -> ( if (tableSpecifier (getInTab st) sep widths) == "" then "p{\\linewidth}" else tableSpecifier (getInTab st) sep widths ) Just t -> wdth2 (getInTab st) lsc (Map.map ((if b then 0.5 else 1.0) *) t) sep (if b then 0.5 else 1.0) sep = seperatingLinesRequested s hline = horizontalLine sep widths = case m of Just d -> if sum basewidths > d / 400.0 then map ((d / 400.0) *) basewidths else basewidths Nothing -> basewidths (basewidths, fontscalefactor) = case Map.lookup tbno (tabmap st) of Nothing -> (columnWidths l, 1.0) Just t -> wdth3 lsc t env = tableEnvironment (getF st) scriptsize = (isInfixOf "latexfontsize=\"scriptsize\"" s) sb = if scriptsize then "{\\scriptsize{}" else "" se = if scriptsize then "}" else "" lsc = (env == "longtable") && (((numberOfColumns l) > 100)) lsb = (if lsc then "\\begin{landscape}\n" else "") lse = (if lsc then "\n\\end{landscape}" else "") tbno = (length (tablist st)) + 1 tblstate = TableState { seperatingLinesRequestedForTable = sep, lastCellWasNotFirstCellOfRow = False, lastCellWasMultiColumn = False, columnsWidthList = widths, currentColumn = 1, multiRowMap = Map.empty, lastCellWasMultiRow = False, numberOfColumnsInTable = (numberOfColumns l), isFirstRow = True, lastCellWasHeaderCell = False, currentRowIsHeaderRow = False, stillInTableHeader = True, rowCounter = 0, outputLastRowOfHeader = 0, inputLastRowOfHeader = 0, lastRowHadEmptyMultiRowMap = True, outputTableHasHeaderRows = False, activeColumn = Nothing } if spec == "" then return () else put $ newstate {getF = getF st} ssst <- get footnotes <- if ((footnoteMap ssst) /= Map.empty) && (env == "longtable") && (not (getInCaption st)) then do put ssst {footnoteMap = Map.empty} return $ intercalate "\n" (Map.elems (footnoteMap ssst)) else return "" r <- if spec == "" then treeToLaTeX2 l else return $ lsb ++ sb ++ (if (env /= "tabular") then "\n" else "\\scalebox{1.0}{") ++ ( if fontscalefactor == 1.0 then "" else "{\\scalefont{" ++ (printf "%0.5f" fontscalefactor) ++ "}" ) ++ "\\begin{" ++ env ++ "}{" ++ spec ++ "}" ++ hline ++ " \n" ++ t1 ++ (rowDelimiter sep) ++ " \n\\end{" ++ env ++ "}\n" ++ (if fontscalefactor == 1.0 then "" else "}") ++ (if (env /= "tabular") then "" else "}") ++ se ++ lse ++ (if (env == "tabular") then " " else "") ++ footnotes return r -- | Converts an image from the parse tree to latex. The actual images is only -- referenced in the wiki source, as well as the parse tree, as well as the -- latex source. It takes a parse tree representation of the image as only input -- parameter. The return type is Renderer String. Which means that it returns a -- string but also take a state as additional monadic input parameter and -- returns a possible changed version of it as additional return parameter -- monadically wikiImageToLaTeX :: [Anything Char] -> Renderer String wikiImageToLaTeX l = do st <- get put st { getImages = (getImages st) ++ [shallowFlatten l], getJ = ((getJ st) + 1) } sy <- s ssst <- get footnotes <- if ((footnoteMap ssst) /= Map.empty) && ((getInTab ssst) == 0) && (not (getInCaption ssst)) then do put ssst {footnoteMap = Map.empty} return $ intercalate "\n" (Map.elems (footnoteMap ssst)) else return "" mystr <- return $ ( if not (micro st) then "\n" ++ (if ((getInTab st) == 0) then "\n" else "") ++ "\\begin{minipage}{" ++ (if (msb st) then "1.0" else (mysize st)) ++ (if (msb st) then "\\linewidth" else "\\textwidth") ++ "}\n" else (if ((getInTab st) == 0) then "\n" else "") ) ++ (if (not (micro st)) then "\\begin{center}\n" else "") ++ "\\includegraphics[width=" ++ (if (not (micro st)) then "1.0" else (mysize st)) ++ (if (msb st) then "\\linewidth" else "\\textwidth") ++ ",height=6.5in,keepaspectratio]{../images/" ++ (n st) ++ "." ++ ext ++ "}\n" ++ (if (not (micro st)) then "\\end{center}\n" else "") ++ ( if (not (tb st)) && (not (micro st)) then "\\raggedright{}" else "" ) ++ ( if not (micro st) then ( if sy == "" then "\\myfigurewithoutcaption{" ++ (n st) ++ "}" else "\\myfigurewithcaption{" ++ (n st) ++ "}{" ++ sy ++ "}" ) else "" ) ++ (if not (micro st) then "\n\\end{minipage}\\linebreak{}" else "") ++ (addit st) ++ ( if not (micro st) then (if ((getInTab st) == 0) then "\n" else "") ++ "\n" else " " ) return (mystr ++ footnotes) where ext = normalizeExtension ( map toLower (fileNameToExtension (headSplitEq '|' (shallowFlatten l))) ) s :: Renderer String s = do sz <- s1 if (trim sz) `elem` ["verweis=", "alt=", "link="] then return "" else return sz s2 :: Renderer String s2 = case Map.lookup "alt" (snd (prepateTemplate l "x")) of Just xx -> wikiLinkCaption2 xx Nothing -> wikiLinkCaption2 l s1 :: Renderer String s1 = if '|' `elem` (shallowFlatten l) then s2 else (return "") mysize st = printf "%0.5f" (mysizefloat2 st) mysizefloat st = (min (getF st) (imageSize l)) mysizefloat2 st = if (msb st) then 1.0 else (mysizefloat st) msb st = (mysizefloat st) == (getF st) micro st = ((mysizefloat st) < 0.17) || ((getInTab st) > 1) n st = show (getJ st) tb st = ((getInTab st) > 0) addit st = if (getInTab st) > 0 then "" else (if not (micro st) then "\\vspace{0.75cm}" else "") -- | Returns the caption of a wikilink. Takes a parse tree representation of the -- wikilink and the current state of the renderer. Returns the caption in LaTeX -- representation as string. A Wikilink is represented as [[FooBar]] in Wiki -- notation. This function does not return any possible updated version of the -- state. wikiLinkCaption :: [Anything Char] -> MyState -> String wikiLinkCaption l st = if isCaption x then rebuild x else "" where x = (treeToLaTeX (last (splitOn [C '|'] l)) st {getCaptionLevel = 1 + (getCaptionLevel st)}) rebuild (':' : xs) = xs rebuild b = b -- | Returns the caption of a Wikilink and a possibly modified state use the -- state monad via the Renderer type. See also `wikiLinkCaption`. wikiLinkCaption2 :: [Anything Char] -> Renderer String wikiLinkCaption2 l = do st <- get put st {getCaptionLevel = 1 + (getCaptionLevel st)} x <- (treeToLaTeX2 (last (splitOn [C '|'] l))) out <- if isCaption x then return (rebuild x) else return "" st2 <- get put st2 {getCaptionLevel = (getCaptionLevel st2) - 1} return out where rebuild (':' : xs) = xs rebuild b = b -- | Returns the LaTeX representation of a wikilink. Takes a parse tree -- representation of the wikilink and the current state of the render. A -- Wikilink is represented as [[FooBar]] in Wiki notation. wikiLinkToLaTeX :: [Anything Char] -> MyState -> (String, MyState) wikiLinkToLaTeX l st = runState (wikiLinkToLaTeX2 l) st makeFootNoteRef :: String -> String -> String -> Renderer String makeFootNoteRef add target caption = do st <- get put st {footnoteNumber = (footnoteNumber st) + 1} let number = show (footnoteNumber st) if (getInFootnote st) then return $ "\\myfn" ++ add ++ "ref{" ++ target ++ "}{" ++ caption ++ "}" else do put st {footnoteNumber = (footnoteNumber st) + 1} if ((getInTab st) > 0) || (getInCaption st) then do sst <- get put sst {footnoteMap = Map.insert (footnoteNumber st) ("\\my" ++ add ++ "ref{" ++ number ++ "}{" ++ target ++ "}") (footnoteMap sst)} return $ caption ++ "\\footnotemark[" ++ number ++ "]" else return $ caption ++ "\\footnotemark[" ++ number ++ "]" ++ "\\my" ++ add ++ "ref{" ++ number ++ "}{" ++ target ++ "}" wikiLinkToLaTeX2 :: [Anything Char] -> Renderer String wikiLinkToLaTeX2 l = do st <- get cap <- wikiLinkCaption2 l case Map.lookup (map toUpper (finalloc st)) (Map.mapKeys (map toUpper) (urls st)) of Just yy -> makeFootNoteRef "l" yy cap Nothing -> case do hh <- maybeHead . (splitOn "#") . (map toUpper) $ (finalloc st) Map.lookup (Just hh) (Map.mapKeys (maybeHead . (splitOn "#") . (map toUpper)) (urls st)) of Just yy -> makeFootNoteRef "l" yy cap Nothing -> makeFootNoteRef "h" (wikiLinkLocationesc l st) (killnl cap) where zzz sssst = case localWikiLinkLocation (loc sssst) of ('#' : xs) -> (currentUrl sssst) ++ ('#' : xs) xs -> xs finalloc3 sts = replace2 (trim (zzz sts)) " " "_" finalloc ssst = case reverse (finalloc3 ssst) of ('/' : xs) -> reverse xs _ -> finalloc3 ssst restpath st = intercalate "/" (reverse (drop len (reverse (splitOn "/" (currentUrl st))))) loc st = if len > 0 then (restpath st) ++ "/" ++ rest else rest (len, rest) = doit2 0 (shallowFlatten l) doit2 n ('.' : ('.' : ('/' : xs))) = doit2 (n + 1) xs doit2 n xs = (n, xs) killnl ('\n' : ('\n' : xs)) = killnl ('\n' : xs) killnl (x : xs) = x : (killnl xs) killnl [] = [] -- | If repeated newlines appear in a string directly after each other. Each -- series of newlines is reduced to exactly one newline killnl2 :: String -> String killnl2 ('\n' : ('\n' : xs)) = killnl2 ('\n' : xs) killnl2 ('\n' : xs) = if (trim pre) == "" then killnl2 post else pre ++ (killnl2 post) where pre = (takeWhile (/= '\n') xs) post = (dropWhile (/= '\n') xs) killnl2 (x : xs) = x : (killnl2 xs) killnl2 [] = [] -- | returns the caption of a link. A link is represented as [foobar.com -- mycaption] in wiki notation. It takes the parse tree representation of the -- link as first input parameter. The second input parameter is the current -- state of the renderer. The third parameter is the Uri scheme as string (See -- 'URI scheme' in the English wikipeda) usually this is 'http'. It returns the -- latex representation of the caption of the link as string linkCaption :: [Anything Char] -> String -> Bool -> Renderer String linkCaption l s b = case spl of (_ : (gg : gs)) -> ( treeToLaTeX2 (concat (gg : (map (\x -> (C ' ') : x) gs))) ) _ -> if b then return "" else return $ s ++ (escapelink (linkLocation l)) where spl = splitOn [C ' '] l -- | returns the latex representation of a link. A link is represented as -- [foobar.com mycaption] in wiki notation. It takes the parse tree -- representation of the link as first input parameter. The second input -- parameter is the current state of the renderer. The third parameter is the -- Uri scheme as string (See 'URI scheme' in the English wikipeda) usually this -- is 'http'. It returns the latex representation of the link as string linkToLaTeX :: [Anything Char] -> String -> MyState -> (String, MyState) linkToLaTeX l s st = runState (linkToLaTeX2 l s) st linkToLaTeX2 :: [Anything Char] -> String -> Renderer String linkToLaTeX2 l s = do st <- get cap <- (linkCaption l s (b st)) if ((b st) && cap == "") || (cap == (s ++ (escapelink (linkLocation l)))) then return $ "\\myplainurl{" ++ s ++ (escapelink (linkLocation l)) ++ "}" else if addit st == "" then makeFootNoteRef "h" (s ++ (escapelink (linkLocation l))) cap else return $ "\\my" ++ (addit st) ++ "href{" ++ s ++ (escapelink (linkLocation l)) ++ "}{" ++ cap ++ "}" where addit st = if (b st) then "fn" else "" b st = getInFootnote st -- | takes a list and splits it into sublist of equal length, allowing a -- possible smaller length for the last list in case the devision does not -- create an integer result. splitToTuples :: [a] -> [[a]] splitToTuples x = map (take galleryNumberOfColumns) . takeWhile (not . null) . iterate (drop galleryNumberOfColumns) $ x -- | the number of column to be used in latex documents for mediawikis gallery -- (image gallery) (gallery tags) galleryNumberOfColumns :: Int galleryNumberOfColumns = 1 -- | the width of a column for the table of the latex version of mediawikis -- gallery (image gallery, gallery tags) galleryTableScale :: Float galleryTableScale = (1.0 / (fromIntegral galleryNumberOfColumns)) - (scalefactor 1.0) -- | the latex string for a single column in table header in the latex version -- of mediawikis gallery (image gallery, gallery tag) galleryTableSpecifier :: String galleryTableSpecifier = concat $ replicate galleryNumberOfColumns "p{0.5\\linewidth}" -- | converts the inner parts gallery (image gallery, gallery tag) from parse -- tree notation to latex, does not write the latex table header and footer. -- This is only a helper function. Always use galleryToLatex if you want to -- convert a gallery to latex galleryContentToLatex :: [[Anything Char]] -> Renderer String galleryContentToLatex (x : xs) = do s <- galleryRowToLaTex x ss <- galleryContentToLatex xs return $ s ++ "\\\\ \n" ++ ss galleryContentToLatex [] = return [] -- | converts a part of a gallery (image gallery, gallery tag) from parse tree -- to latex. A part are as many elements as fit into a single row in the -- resulting latex table galleryRowToLaTex :: [Anything Char] -> Renderer String galleryRowToLaTex [] = return [] galleryRowToLaTex (x : []) = treeToLaTeX2 [x] galleryRowToLaTex (x : xs) = do s <- treeToLaTeX2 [x] g <- galleryRowToLaTex xs return $ s ++ "&" ++ g -- | Converts are gallery (image gallery, gallery tag) from parse tree to latex. -- Also writes table header and footer. This is the function you should use for -- converting galleries to latex galleryToLatex :: [Anything Char] -> Renderer String galleryToLatex x = do st <- get put st {getF = (getF st) * galleryTableScale} s <- ( galleryContentToLatex [ z | z <- splitToTuples [y | y <- x, isWikiLink y], trim (treeToLaTeX z st) /= "" ] ) st2 <- get put st2 {getF = (getF st)} return ( "\\begin{longtable}{" ++ galleryTableSpecifier ++ "} \n" ++ s ++ "\\end{longtable}" ) -- | A function to drop all unnecessary elements of an HTML image map, so that -- it can be converted to latex by calling treeToLaTeX2 imageMapClean :: [Anything Char] -> [Anything Char] imageMapClean ((Environment Wikilink s l) : xs) = (Environment Wikilink s l) : imageMapClean xs imageMapClean (_ : xs) = imageMapClean xs imageMapClean [] = [] -- | Takes the parse tree representation of an image, and returns the its size -- in unit of the width of a line in latex. Images 400px or wider in wiki -- notation are understood to use the full width of the line. Smaller one are -- considered fractionally. That means 100px means 0.25 the width of the line -- and 200px means 0.5 width of the line imageSize :: [Anything Char] -> Float imageSize l = if [] == x then 1.0 else (minimum x) where x = map readImageSize (imageSizeStrings (shallowFlatten l)) -- | takes a candidate string for the width of an image in the wikis px -- notation. Returns 1.0 if the candidate could not be parsed, returns the width -- of the image in units of the width of a line in latex otherwise. Images 400px -- or wider in wiki notation are understood to use the full width of the line. -- Smaller one are considered fractionally. That means 100px means 0.25 the -- width of the line and 200px means 0.5 width of the line readImageSize :: String -> Float readImageSize y = case (reads x) of [] -> 1.0 (h : _) -> fst h / 400.0 where x = removex y removex ('x' : zs) = zs removex z = z -- | takes a flattend version of a parse tree represendtation of an image and -- retruns a list of substrings which are candidates for representing the width -- of the image in the wikis px notation imageSizeStrings :: String -> [String] imageSizeStrings s = [ take (length (x) - 2) (x) | x <- ((splitOn ['|'] s) :: [String]), isSuffixOf "px" x ] -- | converts a mathematical fomula from the wiki to latex notation mathToLatex :: [Anything Char] -> String mathToLatex l = if isInfixOf "\\begin{alignat}" (shallowFlatten l) then mathTransform l else "{$" ++ (mathTransform l) ++ "$}" -- | a predicate that returns true if and only if the input is a parse tree that -- contains only spaces but no other structures onlySpaces :: [Anything Char] -> Bool onlySpaces ((C ' ') : xs) = onlySpaces xs onlySpaces [] = True onlySpaces _ = False -- | in the wiki notation pipe (|)inside temples are escaped as {!} and double -- pipes as {!!}}. this function undoes this escaping in a parse tree prepateParameter :: [Anything Char] -> [Anything Char] prepateParameter ((Environment Template _ [C '!']) : xs) = (C '|') : prepateParameter xs prepateParameter ((Environment Template _ [C '!', C '!']) : xs) = (C '|') : (C '|') : prepateParameter xs prepateParameter (x : xs) = x : prepateParameter xs prepateParameter [] = [] -- | this function prepares a template as parse by the parser in the parse tree -- notation into a other notation that can be further processes by the latex -- renderer and the function templateToLatex in particular. The first input -- parameter is the parse tree notation of the template. The second is the name -- of the template as string. It returns a tuple, the first element of this -- tuple is the name of the template (stripped of heading an tailing white -- space) and the second element of the tuple is a map from strings to parse -- trees. The strings are the names of the parameters of the template. These -- might be just numbers represented as string but also any other strings prepateTemplate :: [Anything Char] -> String -> (String, Map String [Anything Char]) prepateTemplate ll x = (trim x, enum ll 1 (Map.fromList [])) where enum :: [Anything Char] -> Integer -> Map String [Anything Char] -> Map String [Anything Char] enum ((Environment TemplateInside (Str "") l) : zs) i d = enum zs (i + 1) (Map.insert (show i) (prepateParameter l) d) enum ((Environment TemplateInside (Str z) l) : zs) i d = enum zs i (Map.insert (trim z) (prepateParameter l) d) enum [] _ d = d enum (_ : zs) i d = enum zs i d -- | converts a template from the wiki to latex. The first parameter is the -- parse tree representation of the template as generated by the parse the -- second is the name of the template. It returns a Renderer String. That is it -- returns the latex representation of the template, but also takes a state as -- an additional monadic input parameter and returns a possible changed version -- of it as additional return parameter monadically templateToLatex :: [Anything Char] -> String -> Renderer String templateToLatex l s = state $ \st -> case l of ((C 'w') : ((C '|') : xs)) -> wikiLinkToLaTeX ((C 'w') : (C ':') : xs) st ((C 'W') : ((C '|') : xs)) -> wikiLinkToLaTeX ((C 'w') : (C ':') : xs) st ((C 'B') : ((C '|') : xs)) -> wikiLinkToLaTeX xs st _ -> swap $ templateProcessor st (prepateTemplate l s) mnfindentlatex :: Map String [Anything Char] -> Renderer String mnfindentlatex ll = do one <- treeToLaTeX2 (Map.findWithDefault [] "1" ll) st <- get return ( "\n\\begin{" ++ (itemEnvironmentName ":" (getF st)) ++ "}" ++ (itemEnvironmentParameters ":" (getF st)) ++ "\n\\item{}" ++ one ++ "\n\\end{" ++ (itemEnvironmentName ":" (getF st)) ++ "}\n" ) -- | function to converts wikipedias citearticle template to latex citearticle :: Map String [Anything Char] -> Renderer String citearticle ll = state $ \st -> ( (treeToLaTeX (Map.findWithDefault [] "author" ll) st) ++ (treeToLaTeX (Map.findWithDefault [] "first" ll) st) ++ (if Map.member "first" ll then " " else "") ++ (treeToLaTeX (Map.findWithDefault [] "last" ll) st) ++ ". " ++ (treeToLaTeX (Map.findWithDefault [] "title" ll) st) ++ ( if Map.member "url" ll then "\\my" ++ (if getInFootnote st then "fn" else "") ++ "href{" ++ (treeToLaTeX (deepFlatten (Map.findWithDefault [] "url" ll)) st) ++ "}{" ++ (treeToLaTeX (Map.findWithDefault [] "title" ll) st) ++ "}" else (treeToLaTeX (Map.findWithDefault [] "title" ll) st) ) ++ ". " ++ "\\textit{{}" ++ (treeToLaTeX (Map.findWithDefault [] "journal" ll) st) ++ "}, " ++ ( if Map.member "volume" ll then "{{\\bfseries " ++ (treeToLaTeX (Map.findWithDefault [] "volume" ll) st) ++ "}}" else "" ) ++ ( if Map.member "publisher" ll then "(" ++ (treeToLaTeX (Map.findWithDefault [] "publisher" ll) st) ++ ")" else "" ) ++ ( if Map.member "number" ll then "(" ++ (treeToLaTeX (Map.findWithDefault [] "number" ll) st) ++ ")" else "" ) ++ ( if Map.member "pages" ll then ":" ++ (treeToLaTeX (Map.findWithDefault [] "pages" ll) st) else "" ) ++ ( if Map.member "month" ll then (treeToLaTeX (Map.findWithDefault [] "month" ll) st) else "" ) ++ (treeToLaTeX (Map.findWithDefault [] "year" ll) st) ++ ( if Map.member "url" ll then (treeToLaTeX (Map.findWithDefault [] "url" ll) st) else "" ) ++ "\n", st ) -- | removes source structures from a parse tree, keeping the source inside the -- source structure in the parse tree, so flattens out the source structure. You -- need this if some parse tree contains source code but you don't know whether -- or not it is inside a source tag flattensource :: [Anything Char] -> [Anything Char] flattensource ((Environment Source (TagAttr _ _) l) : xs) = l ++ (flattensource xs) flattensource (x : xs) = x : (flattensource xs) flattensource [] = [] -- | prepare code for printing in latex. takes the current state of the renderer -- as first parameter. takes the map version of the template containing the code -- as second parameter. returns the latex representation as string trilex :: MyState -> Map String [Anything Char] -> String trilex st ll = trilexgen st ll "code" -- | prepare code for printing in latex. Takes the map version of the template -- containing the code as first parameter. returns the latex representation as -- string. It returns a Render String so that it can access the current state of -- the renderer as additional monadic input parameter trilex2 :: Map String [Anything Char] -> Renderer String trilex2 ll = do st <- get return $ trilexgen st ll "code" -- | prepare code for printing in latex. takes the current state of the renderer -- as first parameter. takes the map version of the template containing the code -- as second parameter. takes the name of the parameter containing the actual -- source in the map as third parameter. returns the latex representation as -- string trilexgen :: MyState -> Map String [Anything Char] -> String -> String trilexgen st ll code = if Map.member code ll then ( treeToLaTeX ( breakLines3 73 (killnewline (flattensource (Map.findWithDefault [] code ll))) ) st ) else "" where killnewline :: [Anything Char] -> [Anything Char] killnewline ((C '\n') : xs) = killnewline xs killnewline x = x -- | analyzes a color in HTML notation. It returns a triple. The first element -- is a boolean. If it is true the color has got rgb hex notation and the third -- parameter contains the rgb latex notation. If it is false, the color is not -- rgb and hopefully a HTML color name, which is returned a second element of -- the tuple colinfo :: String -> (Bool, String, String) colinfo colcode2 = case col of Just colo -> (True, map toLower colname, colo) Nothing -> ( False, map toLower colname, case colnamehelper of Just x -> x Nothing -> colcode2 ) where colcode = if length colcode2 == 7 then ('l' : colcode2) else colcode2 col = (makecol colnamehelper) colnamehelper = case colcode of ('#' : gs) -> Just gs (_ : (_ : gs)) -> Just gs _ -> Nothing colname = case do n <- colnamehelper guard $ mypred n return ("rgb" ++ n) of Just x -> x Nothing -> colcode2 ss :: String -> [Integer] ss (a : (b : xs)) = (maybeToList . Tools.unhex $ [a, b]) ++ (ss xs) ss _ = [] ss3 :: String -> [Integer] ss3 (a : xs) = (maybeToList . Tools.unhex $ [a, a]) ++ (ss3 xs) ss3 _ = [] ss2 :: [Integer] -> [Float] ss2 (x : xs) = ((fromInteger x) / 255.0) : ss2 xs ss2 [] = [] ss4 x = if (((length . ss) x) == 3) then ss x else ss3 x prettyp2 :: [String] -> String prettyp2 (x : []) = x prettyp2 (x : xs) = x ++ "," ++ (prettyp2 xs) prettyp2 [] = [] prettyp :: [String] -> String prettyp x = "{" ++ (prettyp2 x) ++ "}" makecol :: Maybe String -> Maybe String makecol x = do xx <- x guard $ mypred xx return $ prettyp ((map (printf "%0.5f") ((ss2 . ss4) xx)) :: [String]) mypred x = (((length . ss) x) == 3) || (((length . ss3) x) == 3) -- | and adapter to convert between the monadic and non monadic version of -- render. A function returning renderer string means that it returns a string -- but takes a state as additional monadic input parameter and returns the a -- possibly modified version of it as an additional monadic output parameter. -- This function takes a monadic return value. That is renderer String and -- returns its non monadic version. tempProcAdapter :: Renderer String -> (MyState -> (MyState, String)) tempProcAdapter = (swap .) . runState -- | function for key strokes templates in the blender wikibook key :: [Char] -> [Char] key "AKEY" = "A" key "BKEY" = "B" key "CKEY" = "C" key "DKEY" = "D" key "EKEY" = "E" key "FKEY" = "F" key "GKEY" = "G" key "HKEY" = "H" key "IKEY" = "I" key "JKEY" = "J" key "KKEY" = "K" key "LKEY" = "L" key "MKEY" = "M" key "NKEY" = "N" key "OKEY" = "O" key "PKEY" = "P" key "QKEY" = "Q" key "RKEY" = "R" key "SKEY" = "S" key "TKEY" = "T" key "UKEY" = "U" key "VKEY" = "V" key "WKEY" = "W" key "XKEY" = "X" key "YKEY" = "Y" key "ZKEY" = "Z" key "-KEY" = "-{}" key "SEMICOLON" = ";" key "NUM-" = "NUM-{}" key x = x -- | converts a template to latex. Takes the current state of the render as -- first input parameter. The second input parameter is a tuple. Its first -- element is the name of the template as string. Its second element is a map, -- mapping the names of the parameters of the template to their parse tree -- representations, it returns a tuple. The First element is the possible change -- state of the renderer the second one is the latex representation of the -- template templateProcessor :: MyState -> (String, Map String [Anything Char]) -> (MyState, String) templateProcessor st ("main", ll) = let (x, sst) = wikiLinkToLaTeX (Map.findWithDefault [] "1" ll) st in (sst, "Main Page: " ++ x) templateProcessor st ("#invoke:Mathe f\252r Nicht-Freaks/Seite", _) = (st, "") templateProcessor st ("#invoke:Liste", _) = (st, "") templateProcessor st ("!", _) = (st, "|") templateProcessor st ("!!", _) = (st, "||") templateProcessor st ("Mathe f\252r Nicht-Freaks: Vorlage:Frage", ll) = (st2, r) where j1 x = (Map.findWithDefault [] x ll) (r, st2) = runState ( do a <- treeToLaTeX2 (j1 "typ") b <- treeToLaTeX2 (j1 "frage") c <- treeToLaTeX2 (j1 "antwort") return $ if Map.member "typ" ll then "\\NFFrage{" ++ a ++ "}{" ++ b ++ "}{" ++ c ++ "}" else "\\NFFrageB{" ++ b ++ "}{" ++ c ++ "}" ) st templateProcessor st ("Aufgabensammlung: Vorlage:Frage", ll) = (st2, r) where j1 x = (Map.findWithDefault [] x ll) (r, st2) = runState ( do a <- treeToLaTeX2 (j1 "typ") b <- treeToLaTeX2 (j1 "frage") c <- treeToLaTeX2 (j1 "antwort") return $ if Map.member "typ" ll then "\\NFFrage{" ++ a ++ "}{" ++ b ++ "}{" ++ c ++ "}" else "\\NFFrageB{" ++ b ++ "}{" ++ c ++ "}" ) st templateProcessor st ("example", ll) = (st2, r) where j1 x = (Map.findWithDefault [] x ll) (r, st2) = runState ( do a <- treeToLaTeX2 (j1 "1") b <- treeToLaTeX2 (j1 "2") return $ if Map.member "2" ll then "\\LaTeXDoubleBoxTemplate{Example (" ++ a ++ "):}{" ++ b ++ "}" else "\\LaTeXDoubleBoxTemplate{Example:}{" ++ a ++ "}" ) st templateProcessor st ("box", ll) = (st2, r) where j1 x = (Map.findWithDefault [] x ll) (r, st2) = runState ( do a <- treeToLaTeX2 (j1 "1") b <- treeToLaTeX2 (j1 "title") c <- treeToLaTeX2 (j1 "note") return $ if Map.member "title" ll then "\\LaTeXDoubleBoxTemplate{" ++ b ++ "}{" ++ a ++ c ++ "}" else "\\LaTeXZeroBoxTemplate{" ++ a ++ c ++ "}" ) st templateProcessor st ("Mathe f\252r Nicht-Freaks: Vorlage:Mind Map", ll) = ( st2, "\\section*{Mind Map}\\begin{landscape}" ++ r ++ "\\end{landscape}" ) where (r, st2) = runState ( wikiImageToLaTeX ( (C 'F') : (C 'i') : (C 'l') : (C 'e') : (C ':') : (Map.findWithDefault [] "1" ll) ) ) st templateProcessor st ("C++-Programmierung/ Vorlage:Buchinterner Link", ll) = swap ( wikiLinkToLaTeX ( if ( "" /= ( if length (splitOn "/" (currentUrl st)) > 2 then (id ((splitOn "/" (currentUrl st)) !! 2)) else [] ) ) then if Map.member "\220berschrift" ll then (map (C) "C++-Programmierung/ ") ++ (Map.findWithDefault [] "Abschnitt" ll) ++ [C '/', C ' '] ++ (Map.findWithDefault [] "Kapitel" ll) ++ [C '#'] ++ (Map.findWithDefault [] "\220berschrift" ll) ++ ( if Map.member "Kapitelzusatz" ll then ((C) '_') : (Map.findWithDefault [] "Kapitelzusatz" ll) else [] ) else ( if Map.member "Kapitel" ll then (map (C) "C++-Programmierung/ ") ++ (Map.findWithDefault [] "Abschnitt" ll) ++ [C '/', C ' '] ++ (Map.findWithDefault [] "Kapitel" ll) else (map (C) "C++-Programmierung/ Inhaltsverzeichnis#Anker:") ++ (Map.findWithDefault [] "Abschnitt" ll) ) ++ [C '|'] ++ ( Map.findWithDefault ( Map.findWithDefault ( Map.findWithDefault (Map.findWithDefault [] "Abschnitt" ll) "Kapitel" ll ) "\220berschrift" ll ) "Text" ll ) else if Map.member "\220berschrift" ll then (map (C) "C++-Programmierung/ ") ++ (Map.findWithDefault [] "Abschnitt" ll) ++ [C '#'] ++ (Map.findWithDefault [] "\220berschrift" ll) ++ ( if Map.member "Abschnittszusatz" ll then ((C) '_') : (Map.findWithDefault [] "Abschnittszusatz" ll) else [] ) else ( if Map.member "Kapitel" ll then (map (C) "C++-Programmierung/ ") ++ (Map.findWithDefault [] "Abschnitt" ll) ++ [C '#'] ++ (Map.findWithDefault [] "Kapitel" ll) else (map (C) "C++-Programmierung/ ") ++ (Map.findWithDefault [] "Abschnitt" ll) ) ++ [C '|'] ++ ( Map.findWithDefault ( Map.findWithDefault ( Map.findWithDefault (Map.findWithDefault [] "Abschnitt" ll) "Kapitel" ll ) "\220berschrift" ll ) "Text" ll ) ) st ) templateProcessor st ("B3D:N2P/Do", ll) = ( st, intercalate "+" ( filter (/= "\\keystroke{}") ( map ( \x -> "\\keystroke{" ++ (key . (map toUpper)) (treeToLaTeX (Map.findWithDefault [] (show x) ll) st) ++ "}" ) ([1, 2, 3, 4] :: [Integer]) ) ) ) templateProcessor st ("HaskellGHCiExample", ll) = ( st, ( "\\LaTeXDoubleBoxTemplate{Example:}{" ++ (treeToLaTeX (Map.findWithDefault [] "1" ll) st) ++ "\\newline " ++ trilexgen st ll "2" ++ "}\n" ) ) templateProcessor st ("Latex Index", ll) = ( st, ( "\\index{" ++ (concatMap go (deepFlatten (Map.findWithDefault [] "1" ll))) ++ "}" ) ) where go (C x) = [x] go _ = [] templateProcessor st ("Komplexe Zahlen/ Vorlage:Formel", ll) = ( st, ( treeToLaTeX (shallowEnlargeMath (Map.findWithDefault [] "1" ll)) st ) ) templateProcessor st ("Ada/95/RM", ll) = swap ( ( linkToLaTeX ( ( map C "http://www.adaic.org/resources/add_content/standards/95lrm/ARM_HTML/RM-" ) ++ one ++ (if has then [C '-'] else []) ++ two ++ (map C ".html") ++ [C ' '] ++ ( if has then one ++ [C '.'] ++ two else (map C "Annex ") ++ one ++ [C ':'] ) ++ [C ' '] ++ (Map.findWithDefault [] "title" ll) ) "" st ) ) where one = (Map.findWithDefault [] "1" ll) two = (Map.findWithDefault [] "2" ll) has = Map.member "2" ll templateProcessor st ("Ada/2005/RM", ll) = swap ( ( linkToLaTeX ( ( map C "http://www.adaic.org/resources/add_content/standards/05rm/html/RM-2-" ) ++ one ++ (if has then [C '-'] else []) ++ two ++ (map C ".html") ++ [C ' '] ++ ( if has then one ++ [C '.'] ++ two else (map C "Annex ") ++ one ++ [C ':'] ) ++ [C ' '] ++ (Map.findWithDefault [] "title" ll) ) "" st ) ) where one = (Map.findWithDefault [] "1" ll) two = (Map.findWithDefault [] "2" ll) has = Map.member "2" ll templateProcessor st ("Ada/2012/RM", ll) = swap ( ( linkToLaTeX ( (map C "http://www.ada-auth.org/standards/12rm/html/RM-") ++ one ++ (if has then [C '-'] else []) ++ two ++ (map C ".html") ++ [C ' '] ++ ( if has then one ++ [C '.'] ++ two else (map C "Annex ") ++ one ++ [C ':'] ) ++ [C ' '] ++ (Map.findWithDefault [] "title" ll) ) "" st ) ) where one = (Map.findWithDefault [] "1" ll) two = (Map.findWithDefault [] "2" ll) has = Map.member "2" ll templateProcessor st ("Fortran:Vorlage: Pre1", ll) = ( st, "{\\ttfamily {\\scriptsize " ++ "\\newline{}" ++ s1 ++ "\\newline{}" ++ s2 ++ "\\newline{}" ++ (treeToLaTeX (Map.findWithDefault [] "1" ll) st) ++ "\\newline{}" ++ s2 ++ "\\newline{}" ++ s1 ++ "\\newline{}" ++ "}}\n" ) where s1 = "0${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}.${\\ttfamily }${}|${\\ttfamily }${}${\\ttfamily }${}1${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}.${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}2${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}.${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}3${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}.${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}4${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}.${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}5${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}.${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}6${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}.${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}7${\\ttfamily }${}|${\\ttfamily }${}${\\ttfamily }${}.${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}${\\ttfamily }${}8" s2 = "12345678901234567890123456789012345678901234567890123456789012345678901234567890" templateProcessor st ("Fortran:Vorlage: Pre2", ll) = ( st, "{\\bfseries Fortran 90/95-Code (free source form) }\\newline" ++ "{\\ttfamily {\\scriptsize " ++ (treeToLaTeX (Map.findWithDefault [] "1" ll) st) ++ "}}\n" ) templateProcessor st ("Fortran:Vorlage: Pre3", ll) = ( st, "{\\bfseries Programmcode} \\newline" ++ "{\\ttfamily {\\scriptsize " ++ (treeToLaTeX (Map.findWithDefault [] "1" ll) st) ++ "}}\n" ) templateProcessor st ("Fortran:Vorlage: Pre4", ll) = ( st, "{\\bfseries Fortran 2003-Code} \\newline" ++ "{\\ttfamily {\\scriptsize " ++ (treeToLaTeX (Map.findWithDefault [] "1" ll) st) ++ "}}\n" ) templateProcessor st ("Fortran:Vorlage: Intrinsic", ll) = ( st, "\\newline{}\n" ++ (treeToLaTeX (Map.findWithDefault [] "1" ll) st) ++ " = {\\bfseries " ++ (treeToLaTeX (Map.findWithDefault [] "2" ll) st) ++ "} ( " ++ (treeToLaTeX (Map.findWithDefault [] "3" ll) st) ++ " )\\newline{}\n" ) templateProcessor st ("Fortran:Vorlage: IntrinsicS", ll) = ( st, "\\newline{}\n {\\bfseries " ++ (treeToLaTeX (Map.findWithDefault [] "1" ll) st) ++ "} ( " ++ (treeToLaTeX (Map.findWithDefault [] "2" ll) st) ++ " )\\newline{}\n" ) templateProcessor st ("Fortran:Vorlage: Isocbinding", ll) = ( st, "Beispiel funktioniert mit Compiler\n" ++ "\\begin{myitemize}\n" ++ "\\item g95 (0.91!) May 10 2007: " ++ (treeToLaTeX (Map.findWithDefault [] "1" ll) st) ++ "\n" ++ "\\item gfortran 4.3.0 20070723 (experimental): " ++ (treeToLaTeX (Map.findWithDefault [] "2" ll) st) ++ "\n" ++ "\\item Intel Fortran Compiler 10.0: " ++ (treeToLaTeX (Map.findWithDefault [] "3" ll) st) ++ "\n" ++ "\\item Sun Studio Express - June 2007: " ++ (treeToLaTeX (Map.findWithDefault [] "4" ll) st) ++ "\n" ++ "\\end{myitemize}\n" ++ "Anmerkungen:\\newline{}\n" ++ (treeToLaTeX (Map.findWithDefault [] "5" ll) st) ++ "\n" ) templateProcessor st ("C++-Programmierung/ Vorlage:Aufgabe", ll) = ( st, ( "{\\bfseries Aufgabe " ++ (treeToLaTeX (Map.findWithDefault [] "Nummer" ll) st) ++ "} \n" ++ (treeToLaTeX (Map.findWithDefault [] "Aufgabe" ll) st) ++ "\n {\\bfseries Musterl\246sung} \n" ++ (treeToLaTeX (Map.findWithDefault [] "L\246sung" ll) st) ++ " \n" ) ) templateProcessor st ("-", ll) = (tempProcAdapter $ mnfindentlatex ll) st templateProcessor st ("Haskell speaker 2", ll) = (st, param "1") where param n = (treeToLaTeX (Map.findWithDefault [] n ll) st) templateProcessor st ("Vorlage:LaTeX Mehrspaltig Anfang", ll) = (st, "\\begin{multicols}{" ++ (param "1") ++ "}") where param n = (treeToLaTeX (Map.findWithDefault [] n ll) st) templateProcessor st ("Vorlage:LaTeX Mehrspaltig Ende", _) = (st, "\\end{multicols}") templateProcessor st ("Vorlage:Referenzbox IntraBuch", ll) = ( st, "{\\bfseries Querverweise:} Siehe auch " ++ (treeToLaTeX (Map.findWithDefault [] "1" ll) st) ) templateProcessor st ("Referenzbox IntraBuch", ll) = ( st, "{\\bfseries Querverweise:} Siehe auch " ++ (treeToLaTeX (Map.findWithDefault [] "1" ll) st) ) templateProcessor st ("Referenzbox Internet", ll) = ( st, "{\\bfseries Themenbezogene} " ++ ( treeToLaTeX [ Environment Wikilink (Str "") ((Map.findWithDefault [] "1" ll) ++ (map C "|Webangebote")) ] st ) ) templateProcessor st ("Vorlage:Referenzbox Internet", ll) = ( st, "{\\bfseries Themenbezogene} " ++ ( treeToLaTeX [ Environment Wikilink (Str "") ((Map.findWithDefault [] "1" ll) ++ (map C "|Webangebote")) ] st ) ) templateProcessor st ("Referenzbox IntraReihe", ll) = ( st, "{\\bfseries Zum anderen Band der " ++ ( treeToLaTeX [ Environment Wikilink (Str "") ( (Map.findWithDefault [] "1" ll) ++ [C '|'] ++ (Map.findWithDefault [] "2" ll) ) ] st ) ++ "}" ++ (treeToLaTeX (Map.findWithDefault [] "3" ll) st) ) templateProcessor st ("Vorlage:Referenzbox IntraReihe", ll) = ( st, "{\\bfseries Zum anderen Band der " ++ ( treeToLaTeX [ Environment Wikilink (Str "") ( (Map.findWithDefault [] "1" ll) ++ [C '|'] ++ (Map.findWithDefault [] "2" ll) ) ] st ) ++ "}" ++ (treeToLaTeX (Map.findWithDefault [] "3" ll) st) ) templateProcessor st ("unicode", ll) = (st, (treeToLaTeX (Map.findWithDefault [] "1" ll) st)) templateProcessor st ( "Praktikum Anorganische Chemie/ Vorlage:Infobox Nachweisreaktion", ll ) = ( st, "\\begin{tabular}{|p{0.3\\linewidth}|p{0.7\\linewidth}|}\\hline\n" ++ "\\multicolumn{2}{|p{1.0\\linewidth}|}{{\\bfseries Nachweisreaktion}} \\\\ \\hline\n" ++ "Reaktionstyp & " ++ (treeToLaTeX (Map.findWithDefault [] "Typ" ll) st) ++ " \\\\ \\hline\n" ++ "pH & " ++ (treeToLaTeX (Map.findWithDefault [] "pH" ll) st) ++ "\\\\ \\hline\n" ++ "Indikation & " ++ (treeToLaTeX (Map.findWithDefault [] "Indikation" ll) st) ++ "\\\\ \\hline \n\\end{tabular}\n" ) templateProcessor st ("Praktikum Anorganische Chemie/ Vorlage:Gift", _) = (st, "{\\bfseries Gefahrstoffwarnung! $\\skull$ }") templateProcessor st ("Wikibooks", ll) = swap (wikiLinkToLaTeX ((Map.findWithDefault [] "1" ll)) st) templateProcessor st ("See also", ll) = let (x, sst) = (wikiLinkToLaTeX ((Map.findWithDefault [] "1" ll)) st) in ( sst, "See also: " ++ x ) templateProcessor st ("info", ll) = ( st, "\\begin{TemplateInfo}{}{}" ++ (treeToLaTeX ((Map.findWithDefault [] "1" ll)) st) ++ "\\end{TemplateInfo}" ) templateProcessor st ("Java:statement1", _) = (st, "statement{$_{\\textrm{\\scriptsize 1}}$}") templateProcessor st ("Java:statement2", _) = (st, "statement{$_{\\textrm{\\scriptsize 2}}$}") templateProcessor st ("Java:boolean-condition", _) = (st, "boolean-condition") templateProcessor st ("Java:ch", ll) = ( st, "'" ++ (treeToLaTeX ((Map.findWithDefault [] "1" ll)) st) ++ "'" ) templateProcessor st ("Ubung", _) = (st, "\\ubung") templateProcessor st ("TickYes", _) = (st, "\\TickYes") templateProcessor st ("Achtung", ll) = ( st, "\\begin{TemplateInfo}{\\danger}{Achtung}" ++ (treeToLaTeX ((Map.findWithDefault [] "1" ll)) st) ++ "\\end{TemplateInfo}" ) templateProcessor st ("Warning", ll) = ( st, "\\begin{TemplateInfo}{\\danger}{Warning}" ++ (treeToLaTeX ((Map.findWithDefault [] "1" ll)) st) ++ "\\end{TemplateInfo}" ) templateProcessor st ("warning", ll) = ( st, "\\begin{TemplateInfo}{\\danger}{Warning}" ++ (treeToLaTeX ((Map.findWithDefault [] "1" ll)) st) ++ "\\end{TemplateInfo}" ) templateProcessor st ("Notiz", ll) = ( st, "\\begin{TemplateInfo}{}{Notiz}" ++ (treeToLaTeX ((Map.findWithDefault [] "1" ll)) st) ++ "\\end{TemplateInfo}" ) templateProcessor st ("Vorlage:Zitat3", ll) = ( st, "\\begin{longtable}{|p{\\linewidth}|}\\hline\n \\uline{" ++ (treeToLaTeX ((Map.findWithDefault [] "autor" ll)) st) ++ "}\\\\\\textit{\n" ++ (treeToLaTeX ((Map.findWithDefault [] "zitat" ll)) st) ++ "}\\scriptsize \\\\ \\RaggedLeft \\scriptsize \n" ++ (treeToLaTeX ((Map.findWithDefault [] "quelle" ll)) st) ++ "\\\\ \\hline \n\\end{longtable}\n" ) templateProcessor st ("C++-Programmierung/ Vorlage:Frage", ll) = ( st, if Map.member "Aufgabe" ll then ( "\\begin{longtable}{|p{\\linewidth}|}\\hline\n {\\bfseries Aufgabe " ++ (treeToLaTeX (Map.findWithDefault [] "Nummer" ll) st) ++ "} \\\\ \\hline\n" ++ (treeToLaTeX (Map.findWithDefault [] "Aufgabe" ll) st) ++ "\\\\ \\hline\n {\\bfseries Musterl\246sung} \\\\ \\hline\n" ++ (treeToLaTeX (Map.findWithDefault [] "L\246sung" ll) st) ++ "\\\\ \\hline \n\\end{longtable}\n" ) else ( "\\begin{longtable}{|p{\\linewidth}|}\\hline\n {\\bfseries Frage " ++ (treeToLaTeX (Map.findWithDefault [] "Nummer" ll) st) ++ "} \\\\ \\hline\n" ++ (treeToLaTeX (Map.findWithDefault [] "Frage" ll) st) ++ "\\\\ \\hline\n {\\bfseries Antwort} \\\\ \\hline\n" ++ (treeToLaTeX (Map.findWithDefault [] "Antwort" ll) st) ++ "\\\\ \\hline \n\\end{longtable}\n" ) ) templateProcessor st ("merke", ll) = ( st, "\\begin{TemplateInfo}{}{" ++ heading ++ "}" ++ (treeToLaTeX ((Map.findWithDefault [] "1" ll)) st) ++ "\\end{TemplateInfo}" ) where heading = if Map.member "info" ll then treeToLaTeX (Map.findWithDefault [] "info" ll) st else "Hinweis" templateProcessor st ("Merke", ll) = ( st, "\\begin{TemplateInfo}{}{" ++ heading ++ "}" ++ (treeToLaTeX ((Map.findWithDefault [] "1" ll)) st) ++ "\\end{TemplateInfo}" ) where heading = if Map.member "info" ll then treeToLaTeX (Map.findWithDefault [] "info" ll) st else "Hinweis" templateProcessor st ("Wie_mein_Buch_auf_die_Welt_kommt/_Vorlage:Zitat", ll) = templateProcessor st ("Zitat", ll) templateProcessor st ("Zitat", ll) = ( st, "\\begin{longtable}{|p{\\linewidth}|}\\hline\n" ++ ( if Map.member "beschreibung" ll then (treeToLaTeX ((Map.findWithDefault [] "beschreibung" ll)) st) ++ "\\\\ \\hline" else "" ) ++ " \\uline{" ++ ( treeToLaTeX ( ( Map.findWithDefault (Map.findWithDefault [] "Autor" ll) "autor" ll ) ) st ) ++ "}\\\\\\textit{\n" ++ ( treeToLaTeX ( ( Map.findWithDefault (Map.findWithDefault [] "Zitat" ll) "zitat" ll ) ) st ) ++ "}\\scriptsize \\\\ \\RaggedLeft \\scriptsize \n" ++ ( treeToLaTeX ( ( Map.findWithDefault (Map.findWithDefault [] "Quelle" ll) "quelle" ll ) ) st ) ++ "\\\\ \\hline \n\\end{longtable}\n" ) templateProcessor st ("java web api", ll) = ( st, "\\myhref{http://java.sun.com/javase/6/docs/api/" ++ loc ++ "}{" ++ cap ++ "}" ) where loc :: String loc = (shallowFlatten (Map.findWithDefault [] "1" ll)) cap :: String cap = "Java API: " ++ (treeToLaTeX (Map.findWithDefault [] "2" ll) st) templateProcessor st ("Python_unter_Linux: Vorlagen:VorlageAusgabe", ll) = ( st, ( "\n{\\bfseries Ausgabe}\\\\\n{\\ttfamily \\scriptsize \n" ++ ( "user\\@localhost:\\~\\$" ++ ( treeToLaTeX (breakLines3 linewidth (Map.findWithDefault [] "1" ll)) st ) ++ "\\newline " ++ ( treeToLaTeX ( id ( filter ( \x -> case x of C '\n' -> False (Environment Tag (TagAttr "br" _) _) -> True _ -> True ) (Map.findWithDefault [] "2" ll) ) ) st ) ) ++ "}\n" ) ) templateProcessor st ("Python_unter_Linux: Vorlagen:VorlageQZ", ll) = ( st, ( "{\\ttfamily \\uline{" ++ (treeToLaTeX (breakLines3 100 (Map.findWithDefault [] "1" ll)) st) ++ "}}" ) ) templateProcessor st ("Python_unter_Linux: Vorlagen:VorlageQZ", ll) = ( st, ( "{\\ttfamily \\uline{" ++ (treeToLaTeX (breakLines3 100 (Map.findWithDefault [] "1" ll)) st) ++ "}}" ) ) templateProcessor st ("Python unter Linux: Vorlagen:VorlageQZ", ll) = ( st, ( "{\\ttfamily \\uline{" ++ (treeToLaTeX (breakLines3 100 (Map.findWithDefault [] "1" ll)) st) ++ "}}" ) ) templateProcessor st ("C++-Programmierung/ Vorlage:Syntax", ll) = ( st, "{\\ttfamily {\\scriptsize " ++ ( treeToLaTeX (breakLines3 96 (Map.findWithDefault [] "code" ll)) st ) ++ "}}\n" ) templateProcessor st ("Java", ll) = ( st, "{\\ttfamily {\\scriptsize " ++ ( treeToLaTeX (breakLines3 96 (Map.findWithDefault [] "code" ll)) st ) ++ "}}\n" ) templateProcessor st ("XCode", ll) = ( st, "{\\ttfamily {\\scriptsize " ++ ( treeToLaTeX (breakLines3 96 (Map.findWithDefault [] "1" ll)) st ) ++ "}}\n" ) templateProcessor st ("C++-Programmierung/ Vorlage:Kapitelanhang", ll) = ( st, ( ( if Map.member "Zusammenfassung" ll then "\n {\\bfseries \\large Zusammenfassung} \n " ++ (treeToLaTeX (Map.findWithDefault [] "Zusammenfassung" ll) st) else "" ) ++ ( if Map.member "Fragen" ll then "\n {\\bfseries \\large Fragen} \n " ++ (treeToLaTeX (Map.findWithDefault [] "Fragen" ll) st) else "" ) ++ ( if Map.member "Aufgaben" ll then "\n {\\bfseries \\large Aufgaben} \n " ++ (treeToLaTeX (Map.findWithDefault [] "Aufgaben" ll) st) else "" ) ++ " \n" ) ) templateProcessor st ("code:Output", ll) = ( st, ( "{{" ++ ( if (Map.member "1" ll) then "{ {" ++ (treeToLaTeX (breakLines3 96 (Map.findWithDefault [] "1" ll)) st) ++ "}}" else "" ) ++ "}}\n$\\text{ }$\\newline{}\n{\\bfseries Code}\\newline{}" ++ ( if (Map.member "2" ll) then "{\\ttfamily {\\scriptsize" ++ (treeToLaTeX (breakLines3 96 (Map.findWithDefault [] "2" ll)) st) ++ "}}" else "" ) ++ ( if (Map.member "3" ll) then "\n{\\bfseries Output}\\newline{}{\\ttfamily {\\scriptsize" ++ (treeToLaTeX (breakLines3 96 (Map.findWithDefault [] "3" ll)) st) ++ "}}" else "" ) ) ) templateProcessor st ("bcode:Example", ll) = ( st, ( "{\\bfseries Code}\\newline{}{\\ttfamily {\\scriptsize" ++ ( if (Map.member "1" ll) then "{\\ttfamily {\\scriptsize" ++ (treeToLaTeX (breakLines3 96 (Map.findWithDefault [] "1" ll)) st) ++ "}}" else "" ) ++ "}}\n" ++ ( if (Map.member "2" ll) then "{\\ttfamily {\\scriptsize" ++ (treeToLaTeX (breakLines3 96 (Map.findWithDefault [] "2" ll)) st) ++ "}}" else "" ) ++ ( if (Map.member "3" ll) then "{\\ttfamily {\\scriptsize" ++ (treeToLaTeX (breakLines3 96 (Map.findWithDefault [] "3" ll)) st) ++ "}}" else "" ) ) ) templateProcessor st ("cite web", ll) = (st, mainer) where mainer = "\\myhref{" ++ url ++ "}{" ++ title ++ "}. " ++ publisher ++ ". Retrieved " ++ accessdate ++ " " url = shallowFlatten (Map.findWithDefault [] "url" ll) publisher = treeToLaTeX (Map.findWithDefault [] "publisher" ll) st title = treeToLaTeX (Map.findWithDefault [] "title" ll) st accessdate = treeToLaTeX (Map.findWithDefault [] "accessdate" ll) st templateProcessor st ("code", ll) = (st, mainer) where mainer :: String mainer = "\\TemplateCode{" ++ header ++ "}{" ++ "}{" ++ "}{" ++ "}{" ++ lang ++ "}{" ++ code ++ "}{}{}{}" header :: String header = if Map.member "header" ll then ( treeToLaTeX (Map.findWithDefault [] "header" ll) st {getInCode = True} ) else "" lang :: String lang = if Map.member "lang" ll then ( treeToLaTeX (Map.findWithDefault [] "lang" ll) st {getInCode = True} ) ++ " Source" else "" code :: String code = trilexgen st {getInCode = True} ll "source" templateProcessor st ("Java_Code_File", ll) = (st, mainer) where mainer :: String mainer = "\\TemplateCode{" ++ header ++ "}{" ++ "}{" ++ "}{" ++ "}{" ++ lang ++ "}{" ++ code ++ "}{}{}{}" header :: String header = if Map.member "header" ll then ( treeToLaTeX (Map.findWithDefault [] "header" ll) st {getInCode = True} ) else "" lang :: String lang = if Map.member "lang" ll then "Java Source" else "" code :: String code = trilexgen st {getInCode = True} ll "source" templateProcessor st ("Syntax", ll) = (st, mainer) where mainer :: String mainer = "\\begin{TemplateCodeInside}{}{\\baselineskip}{\\baselineskip}{}{}{}\n" ++ code ++ "\n\\end{TemplateCodeInside}\n" code :: String code = trilex st {getInCode = True} ll templateProcessor st ("syntax", ll) = (st, mainer) where mainer :: String mainer = "\\begin{TemplateCodeInside}{}{\\baselineskip}{\\baselineskip}{}{}{}\n" ++ code ++ "\n\\end{TemplateCodeInside}\n" code :: String code = trilex st {getInCode = True} ll templateProcessor st ("HaskellGHCi", ll) = (st, mainer) where mainer :: String mainer = "\\begin{TemplateCodeInside}{}{\\baselineskip}{\\baselineskip}{}{}{}\n" ++ code ++ "\n\\end{TemplateCodeInside}\n" code :: String code = trilexgen st {getInCode = True} ll "1" templateProcessor st ("Java://", ll) = (st, mainer) where mainer :: String mainer = "\\begin{TemplateCodeInside}{}{\\baselineskip}{\\baselineskip}{}{}{}\n" ++ code ++ "\n\\end{TemplateCodeInside}\n" code :: String code = trilexgen st {getInCode = True} ll "1" templateProcessor st ("java://", ll) = (st, mainer) where mainer :: String mainer = "\\begin{TemplateCodeInside}{}{\\baselineskip}{\\baselineskip}{}{}{}\n" ++ code ++ "\n\\end{TemplateCodeInside}\n" code :: String code = trilexgen st {getInCode = True} ll "1" templateProcessor st ("java", ll) = (st, mainer) where mainer :: String mainer = "\\begin{TemplateCodeInside}{}{\\baselineskip}{\\baselineskip}{}{}{}\n" ++ code ++ "\n\\end{TemplateCodeInside}\n" code :: String code = trilex st {getInCode = True} ll templateProcessor st ("DOI", ll) = ( st, "DOI:\\myhref{http://dx.doi.org/" ++ tl ++ "}{" ++ tx ++ "}" ) where tx = (treeToLaTeX (Map.findWithDefault [] "1" ll) st) tl = (shallowFlatten (Map.findWithDefault [] "1" ll)) templateProcessor st ("ISSN", ll) = ( st, "\\myhref{http://dispatch.opac.d-nb.de/DB=1.1/CMD?ACT=SRCHA&IKT=8&TRM=" ++ tl ++ "}{ISSN: " ++ tl ++ "}" ) where tl = (shallowFlatten (Map.findWithDefault [] "1" ll)) templateProcessor st ("cpp", ll) = ( st, ( "{\\ttfamily " ++ (treeToLaTeX (breakLines3 96 (Map.findWithDefault [] "1" ll)) st) ++ "}" ) ) templateProcessor st ("Schach: Vorlage:Schachbrett", l) = ( st {getC = ((getC st) + 1), chessBoards = (chessBoards st) ++ [(shallowFlatten (fromMaybe [] (Map.lookup "4" l)))]}, "\n\n\\parbox[t]{" ++ mysize ++ "\\linewidth}{\n\\begin{center}\n" ++ "\\includegraphics[width=" ++ mysize ++ "\\linewidth,height=6.5in,keepaspectratio]{../images/chess" ++ n ++ ".pdf}\\end{center}\n" ++ "Stellung " ++ n ++ "}\\vspace{0.75cm}\n\n" ) where mysize = printf "%0.5f" (getF st) n = show (getC st) templateProcessor st ("Farblegende", ll) = ( st, if p then "\\legendColorBox" ++ col ++ "{" ++ param2 ++ "}\n" else "\\legendNamedColorBox{" ++ colname ++ "}{" ++ param2 ++ "}\n" ) where (p, colname, col) = colinfo (treeToLaTeX (Map.findWithDefault [] "1" ll) st) param2 = (treeToLaTeX (Map.findWithDefault [] "2" ll) st) templateProcessor st ("Farbe", ll) = (st, defineall ++ inside) where (pred1, colname1, col1) = colinfo (param "1") (pred2, colname2, col2) = colinfo (param "2") param n = (treeToLaTeX (Map.findWithDefault [] n ll) st) trans = ((param "2") == "transparent") define p colname col = ( if p then "\\definecolor{" ++ colname ++ "}{rgb}" ++ col else "" ) defineall = (define pred1 colname1 col1) ++ (define pred2 colname2 col2) inside = if trans then "\\textcolor{" ++ colname1 ++ "}{" ++ (param "3") ++ "}" else "\\fcolorbox{" ++ colname2 ++ "}{" ++ colname2 ++ "}{\\textcolor{" ++ colname1 ++ "}{" ++ (param "3") ++ "}}" templateProcessor st ("cite paper", ll) = ( st, ( if Map.member "editor" ll then (treeToLaTeX (Map.findWithDefault [] "editor" ll) st) else (treeToLaTeX (Map.findWithDefault [] "author" ll) st) ) ++ ( if Map.member "coauthor" ll then "; " ++ (treeToLaTeX (Map.findWithDefault [] "coauthor" ll) st) else "" ) ++ " " ++ (treeToLaTeX (Map.findWithDefault [] "date" ll) st) ++ ". " ++ (treeToLaTeX (Map.findWithDefault [] "title" ll) st) ++ "- " ++ (treeToLaTeX (Map.findWithDefault [] "publisher" ll) st) ++ ". pp. " ++ (treeToLaTeX (Map.findWithDefault [] "pages" ll) st) ++ "\n" ) templateProcessor st ("Cite book", ll) = ( st, ( if Map.member "editor" ll then (treeToLaTeX (Map.findWithDefault [] "editor" ll) st) else (treeToLaTeX (Map.findWithDefault [] "author" ll) st) ) ++ " " ++ (treeToLaTeX (Map.findWithDefault [] "title" ll) st) ++ ". " ++ (treeToLaTeX (Map.findWithDefault [] "publisher" ll) st) ++ ", " ++ (treeToLaTeX (Map.findWithDefault [] "address" ll) st) ++ ", " ++ (treeToLaTeX (Map.findWithDefault [] "year" ll) st) ++ "\n" ) templateProcessor st ("cite book", ll) = ( st, ( if Map.member "editor" ll then (treeToLaTeX (Map.findWithDefault [] "editor" ll) st) else (treeToLaTeX (Map.findWithDefault [] "author" ll) st) ) ++ " " ++ (treeToLaTeX (Map.findWithDefault [] "title" ll) st) ++ ". " ++ (treeToLaTeX (Map.findWithDefault [] "publisher" ll) st) ++ ", " ++ (treeToLaTeX (Map.findWithDefault [] "address" ll) st) ++ ", " ++ (treeToLaTeX (Map.findWithDefault [] "year" ll) st) ++ "\n" ) templateProcessor st ("Cite article", ll) = (tempProcAdapter $ citearticle ll) st templateProcessor st ("cite journal", ll) = (tempProcAdapter $ citearticle ll) st templateProcessor st ("Citation", ll) = (tempProcAdapter $ citearticle ll) st templateProcessor st ("Literatur", ll) = (tempProcAdapter $ citearticle ll) st templateProcessor st ("cite techreport", ll) = (tempProcAdapter $ citearticle ll) st templateProcessor st ("citation", ll) = (tempProcAdapter $ citearticle ll) st templateProcessor st ("Cite episode", ll) = (tempProcAdapter $ citearticle ll) st templateProcessor st ("cite newsgroup", ll) = (tempProcAdapter $ citearticle ll) st templateProcessor st ("Ada/95/cite AI", ll) = (tempProcAdapter $ citearticle ll) st templateProcessor st ("Ada/Cite cla", ll) = (tempProcAdapter $ citearticle ll) st templateProcessor st ("cite", ll) = (tempProcAdapter $ citearticle ll) st templateProcessor st ("cite news", ll) = (tempProcAdapter $ citearticle ll) st templateProcessor st ("Druckversionsnotiz", _) = (st, "") templateProcessor st ("meta", ll) = swap ( wikiLinkToLaTeX ((C 'm') : (C ':') : (Map.findWithDefault [] "1" ll)) st ) templateProcessor st ("Wikipedia", ll) = swap ( wikiLinkToLaTeX ((C 'w') : (C ':') : (Map.findWithDefault [] "1" ll)) st ) templateProcessor st ("Wikipedia2", ll) = let (x, sst) = (wikiLinkToLaTeX ((C 'w') : (C ':') : (Map.findWithDefault [] "1" ll)) st) in let (y, ssst) = (wikiLinkToLaTeX ((C 'w') : (C ':') : (Map.findWithDefault [] "2" ll)) sst) in (ssst, x ++ y) templateProcessor st ("GLSL Programming Unity SectionRef", ll) = swap ( wikiLinkToLaTeX ((map (C) xx) ++ (Map.findWithDefault [] "1" ll)) st ) where xx = if shallowFlatten (Map.findWithDefault [] "1" ll) `elem` [ "OpenGL ES 2.0 Pipeline", "Vertex Transformations", "Vector and Matrix Operations", "Applying Matrix Transformations", "Rasterization", "Per-Fragment Operations" ] then "GLSL Programming/" else "GLSL Programming/Unity/" templateProcessor st ("S", ll) = swap ( wikiLinkToLaTeX ( ((C 's') : (C ':') : (Map.findWithDefault [] "1" ll)) ++ [C '|'] ++ (Map.findWithDefault [] "2" ll) ) st ) templateProcessor st ("wiktionary", ll) = swap ( wikiLinkToLaTeX ( (C 'w') : (C 'i') : (C 'k') : (C 't') : (C ':') : (Map.findWithDefault [] "1" ll) ) st ) templateProcessor st ("indent", ll) = (st, go) where go = case reads (shallowFlatten (Map.findWithDefault [] "1" ll)) :: [(Integer, String)] of [(n, _)] -> "\\newline{}" ++ (concat (genericReplicate n "{$\\text{ }$}")) _ -> "\\newline{}" templateProcessor st ("wikipedia", ll) = swap ( wikiLinkToLaTeX ((C 'w') : (C ':') : (Map.findWithDefault [] "1" ll)) st ) templateProcessor st ("Wikiversity", ll) = swap ( wikiLinkToLaTeX ((C 'v') : (C ':') : (Map.findWithDefault [] "1" ll)) st ) templateProcessor st ("wikiquote", ll) = swap ( wikiLinkToLaTeX ((C 'q') : (C ':') : (Map.findWithDefault [] "1" ll)) st ) templateProcessor st ("W", ll) = swap ( wikiLinkToLaTeX ((C 'w') : (C ':') : (Map.findWithDefault [] "1" ll)) st ) templateProcessor st ("wp", ll) = swap ( wikiLinkToLaTeX ((C 'w') : (C ':') : (Map.findWithDefault [] "1" ll)) st ) templateProcessor st ("B", ll) = swap ( wikiLinkToLaTeX ((C 'b') : (C ':') : (Map.findWithDefault [] "1" ll)) st ) templateProcessor st ("Wikipedia-inline", ll) = swap ( wikiLinkToLaTeX ((C 'w') : (C ':') : (Map.findWithDefault [] "1" ll)) st ) templateProcessor st ("Wiktionary", ll) = swap ( wikiLinkToLaTeX ( (map C "wiktionary") ++ ((C ':') : (Map.findWithDefault [] "1" ll)) ) st ) templateProcessor st ("B3D:N2P/VTT1", ll) = (st2, r) where (r, st2) = runState ( wikiImageToLaTeX ( (C 'F') : (C 'i') : (C 'l') : (C 'e') : (C ':') : (Map.findWithDefault [] "image" ll) ++ [C '|'] ++ (Map.findWithDefault [] "imageWidth" ll) ++ [C '|'] ++ (Map.findWithDefault [] "text3" ll) ) ) st templateProcessor st ("Template:B3D:N2P/VTT1", ll) = (st2, r) where (r, st2) = runState ( wikiImageToLaTeX ( (C 'F') : (C 'i') : (C 'l') : (C 'e') : (C ':') : (Map.findWithDefault [] "image" ll) ++ [C '|'] ++ (Map.findWithDefault [] "imageWidth" ll) ++ [C '|'] ++ (Map.findWithDefault [] "text3" ll) ) ) st templateProcessor st ("Vorlage:Referenzen Zitat", ll) = swap ( wikiLinkToLaTeX ( (Map.findWithDefault [] "1" ll) ++ [C '|', C '['] ++ (Map.findWithDefault [] "2" ll) ++ [C ']'] ) st ) templateProcessor st ("Referenzen Zitat", ll) = swap ( wikiLinkToLaTeX ( (Map.findWithDefault [] "1" ll) ++ [C '|', C '['] ++ (Map.findWithDefault [] "2" ll) ++ [C ']'] ) st ) templateProcessor st ("wikipediapar", ll) = swap ( wikiLinkToLaTeX ( (C 'w') : (C ':') : ( Map.findWithDefault [] (if Map.member "2" ll then "2" else "1") ll ) ) st ) templateProcessor st ("Wikipediapar", ll) = swap ( wikiLinkToLaTeX ( (C 'w') : (C ':') : ( Map.findWithDefault [] (if Map.member "2" ll then "2" else "1") ll ) ) st ) templateProcessor st ("Kasten", ll) = ( st, "\\LaTeXZeroBoxTemplate{" ++ ( treeToLaTeX (Map.findWithDefault (Map.findWithDefault [] "inhalt" ll) "1" ll) st ) ++ "}" ) templateProcessor st ("Druckversion Titeleintrag", ll) = ( st, "\\pagebreak{}\\begin{longtable}{|p{0.3\\linewidth}|p{0.7\\linewidth}|}\\hline\n" ++ "\\multicolumn{2}{|p{1.0\\linewidth}|}{\\bfseries Standardtiteleintrag}" ++ ( if (Map.member "URL" ll) then "\\\\ \\hline\n \\fetchurlcaption & \\url{" ++ (treeToLaTeX (Map.findWithDefault [] "URL" ll) st) ++ "}" else "" ) ++ ( if (Map.member "Buch" ll) then "\\\\ \\hline\n \\bookcaption & \\url{http://de.wikibooks.org/wiki/" ++ replace2 (treeToLaTeX (Map.findWithDefault [] "Buch" ll) st) " " "_" ++ "}" else "" ) ++ ( if (Map.member "Sachgruppen" ll) then "\\\\ \\hline\n \\functionalgroupcaption & " ++ (treeToLaTeX (Map.findWithDefault [] "Sachgruppen" ll) st) else "" ) ++ ( if (Map.member "WeitereThemen" ll) then "\\\\ \\hline\n \\futhertopicscaption & " ++ (treeToLaTeX (Map.findWithDefault [] "WeitereThemen" ll) st) else "" ) ++ ( if (Map.member "Hauptautoren" ll) then "\\\\ \\hline\n \\mainauthorscaption & " ++ (treeToLaTeX (Map.findWithDefault [] "Hauptautoren" ll) st) else "" ) ++ ( if (Map.member "Betreuer" ll) then "\\\\ \\hline\n \\projecttexniciancaption & " ++ (treeToLaTeX (Map.findWithDefault [] "Betreuer" ll) st) else "" ) ++ "\\\\ \\hline\n \\organizationscaptions & Wikibooks" ++ ( if (Map.member "Erscheinungsdatum" ll) then "\\\\ \\hline\n \\datecaption & " ++ (treeToLaTeX (Map.findWithDefault [] "Erscheinungsdatum" ll) st) else "" ) ++ ( if (Map.member "Standardnummer" ll) then "\\\\ \\hline\n \\standardcodecaption & " ++ (treeToLaTeX (Map.findWithDefault [] "Standardnummer" ll) st) else "" ) ++ ( if (Map.member "Buch" ll) then "\\\\ \\hline\n \\maintitlecaption & " ++ (treeToLaTeX (Map.findWithDefault [] "Buch" ll) st) else "" ) ++ ( if (Map.member "Verleger" ll) then "\\\\ \\hline\n \\publishercaption & " ++ (treeToLaTeX (Map.findWithDefault [] "Verleger" ll) st) else "" ) ++ ( if (Map.member "Verlagsort" ll) then "\\\\ \\hline\n \\publishercitycaption & " ++ (treeToLaTeX (Map.findWithDefault [] "Verlagsort" ll) st) else "" ) ++ ( if (Map.member "Regal" ll) then "\\\\ \\hline\n \\shelfcaption & " ++ (treeToLaTeX (Map.findWithDefault [] "Regal" ll) st) else "" ) ++ ( if (Map.member "Umfang" ll) then "\\\\ \\hline\n \\sizecaption & " ++ (treeToLaTeX (Map.findWithDefault [] "Umfang" ll) st) else "" ) ++ "\\\\ \\hline \n\\end{longtable}\n" ) templateProcessor st ("Druckversion Titelseite", ll) = (st {getTitle = s}, s) where s = ( if (Map.member "Haupttitel" ll) then "\\mymaintitle{" ++ ( treeToLaTeX (Map.findWithDefault [] "Haupttitel" ll) st {getInCenter = True} ) ++ "}" else "" ) ++ ( if (Map.member "Untertitel" ll) then "\\mysubtitle{" ++ ( treeToLaTeX (Map.findWithDefault [] "Untertitel" ll) st {getInCenter = True} ) ++ "}" else "" ) ++ ( if (Map.member "Autor" ll) then "\\myauthor{" ++ ( treeToLaTeX (Map.findWithDefault [] "Autor" ll) st {getInCenter = True} ) ++ "}" else "" ) templateProcessor st ('j' : ('a' : ('v' : ('a' : (':' : xs)))), ll) = (tempProcAdapter $ javakeyword xs ll "java:") st templateProcessor st ('J' : ('a' : ('v' : ('a' : (':' : xs)))), ll) = (tempProcAdapter $ javakeyword xs ll "java:") st templateProcessor st ("Haskell lib", ll) = swap (linkToLaTeX link "" st) where param :: String -> Maybe [Anything Char] param name = Map.lookup name ll package = fromMaybe (map (C) "base") $ param "p" `mplus` param "package" version = fromMaybe (map (C) "4.1.0.0") $ param "v" `mplus` param "version" unnamed :: Integer -> [Anything Char] unnamed i = fromMaybe [] $ param (show i) unnPars = takeWhile (not . null) $ map unnamed [1 ..] location = (map (C) "http://hackage.haskell.org/packages/archive/") ++ package ++ [C '/'] ++ version ++ (map (C) "/doc/html/") ++ (intercalate [C '-'] unnPars) ++ (map (C) ".html") caption = intercalate [C '.'] unnPars link = location ++ [C ' '] ++ caption templateProcessor st ("V", ll) = swap ( wikiLinkToLaTeX ((C 'v') : (C ':') : (Map.findWithDefault [] "1" ll)) st ) templateProcessor st ("wikisource", ll) = swap ( wikiLinkToLaTeX ((C 's') : (C ':') : (Map.findWithDefault [] "1" ll)) st ) templateProcessor st ("M", ll) = swap ( wikiLinkToLaTeX ((C 'm') : (C ':') : (Map.findWithDefault [] "1" ll)) st ) templateProcessor st ("C", ll) = ( st, "\\myhref{http://commons.wikimedia.org/wiki/" ++ loc ++ "}{" ++ cap ++ "}" ) where loc = (shallowFlatten (Map.findWithDefault [] "1" ll)) cap :: String cap = if (Map.member "2" ll) then (treeToLaTeX (Map.findWithDefault [] "2" ll) st) else (treeToLaTeX (Map.findWithDefault [] "1" ll) st) templateProcessor st ("commons", ll) = ( st, "\\myhref{http://commons.wikimedia.org/wiki/" ++ loc ++ "}{" ++ cap ++ "}" ) where loc = (shallowFlatten (Map.findWithDefault [] "1" ll)) cap :: String cap = if (Map.member "2" ll) then (treeToLaTeX (Map.findWithDefault [] "2" ll) st) else (treeToLaTeX (Map.findWithDefault [] "1" ll) st) templateProcessor st ("Commonscat", ll) = ( st, "\\myhref{http://commons.wikimedia.org/wiki/Category:" ++ loc ++ "}{" ++ cap ++ "}" ) where loc = (shallowFlatten (Map.findWithDefault [] "1" ll)) cap :: String cap = if (Map.member "2" ll) then (treeToLaTeX (Map.findWithDefault [] "2" ll) st) else (treeToLaTeX (Map.findWithDefault [] "1" ll) st) templateProcessor st ("Commons", ll) = ( st, "\\myhref{http://commons.wikimedia.org/wiki/" ++ loc ++ "}{" ++ cap ++ "}" ) where loc = (shallowFlatten (Map.findWithDefault [] "1" ll)) cap :: String cap = if (Map.member "2" ll) then (treeToLaTeX (Map.findWithDefault [] "2" ll) st) else (treeToLaTeX (Map.findWithDefault [] "1" ll) st) templateProcessor st ("b", ll) = swap ( wikiLinkToLaTeX ((C 'b') : (C ':') : (Map.findWithDefault [] "1" ll)) st ) templateProcessor st ("Wikiquote", ll) = swap ( wikiLinkToLaTeX ((C 'q') : (C ':') : (Map.findWithDefault [] "1" ll)) st ) templateProcessor st ("Wikisource", ll) = swap ( wikiLinkToLaTeX ((C 's') : (C ':') : (Map.findWithDefault [] "1" ll)) st ) templateProcessor st ("Reaktion", ll) = (st, edukte ++ " $\\rightarrow$ " ++ produkte) where reput :: [String] -> [[Anything Char]] -> [[Anything Char]] reput (k : ks) out = if Map.member k ll then reput ks ((Map.findWithDefault [] k ll) : out) else reput ks out reput [] out = out myjoin :: [[Anything Char]] -> String -> String myjoin (x : xs) acu = if xs == [] then ( if acu == "" then (treeToLaTeX x st) else acu ++ "+" ++ (treeToLaTeX x st) ) else ( if acu == "" then myjoin xs (treeToLaTeX x st) else myjoin xs acu ++ "+" ++ (treeToLaTeX x st) ) myjoin [] acu = acu edukte = myjoin (reput ["Edukt", "Edukt1", "Edukt2", "Edukt3"] []) "" produkte = myjoin (reput ["Produkt", "Produkt1", "Produkt2", "Produkt3"] []) "" templateProcessor st ("Visual Basic .NET: Vorlage:Code", ll) = templateProcessor st ("C++-Programmierung/ Vorlage:Code", ll) templateProcessor st ("Regal:Programmierung: Vorlage:Code", ll) = (st, mainer) where mainer :: String mainer = "\\TemplateCode{" ++ header ++ "}{" ++ footer ++ "}{" ++ marker ++ "}{}{" ++ output ++ "}{" ++ lang ++ "}{" ++ code ++ "}{}{}{}" marker :: String marker = if Map.member "error" ll then "e" else if Map.member "valid" ll then "valid" else "" header :: String header = if Map.member "kopf" ll then ( treeToLaTeX (Map.findWithDefault [] "kopf" ll) st {getInCode = True} ) else "" lang :: String lang = if Map.member "lang" ll then ( treeToLaTeX (Map.findWithDefault [] "lang" ll) st {getInCode = True} ) ++ " Quelltext" else "" code :: String code = trilex st {getInCode = True} ll output :: String output = if Map.member "output" ll then ( treeToLaTeX (killnbsp (Map.findWithDefault [] "output" ll)) st {getInCode = True} ) else "" footer :: String footer = if Map.member "fuss" ll then ( treeToLaTeX (Map.findWithDefault [] "fuss" ll) st {getInCode = True} ) else "" killnbsp ((Environment HtmlChar (Str "nbsp") _) : xs) = xs killnbsp x = x templateProcessor st (x, ll) = (tempProcAdapter $ unknownTemplate x ll) st -- | This function is currently nearly unused, it is essentially the same as -- templateProcessor. But with this way of writing it down you can find out for -- which templates handler functions are registered. templateRegistry :: [(String, Map String [Anything Char] -> Renderer String)] templateRegistry = [ ( "Regal:Programmierung: Vorlage:Code", \ll -> let marker :: String marker = if Map.member "error" ll then "e" else if Map.member "valid" ll then "valid" else "" killnbsp ((Environment HtmlChar (Str "nbsp") _) : xs) = xs killnbsp x = x withdef x f = if Map.member x ll then (treeToLaTeX2 (f (Map.findWithDefault [] x ll))) else return "" in do st <- get put $ st {getInCode = True} code <- trilex2 ll footer <- withdef "fuss" id header <- withdef "kopf" id lang <- do x <- (withdef "lang" id) return $ if x == "" then "" else x ++ " Quelltext" output <- withdef "output" killnbsp st2 <- get put $ st2 {getInCode = False} return $ "\\TemplateCode{" ++ header ++ "}{" ++ footer ++ "}{" ++ marker ++ "}{" ++ output ++ "}{" ++ lang ++ "}{" ++ code ++ "}{}{}{}" ) ] -- | processing of Java keywords for the English wikibook on Java, each Java -- keyword got its own template there javakeyword :: [Char] -> Map String [Anything Char] -> [Char] -> Renderer String javakeyword xs ll j = if (xs `elem` keywords) then state $ \st -> ("{\\bfseries \\ttshape " ++ xs ++ "}", st) else unknownTemplate (j ++ xs) ll where keywords = ["abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "default", "do"] ++ ["double", "else", "enum", "extends", "final", "finally", "float", "for", "goto", "if", "implements", "import", "instanceof"] ++ ["int", "interface", "long", "native", "new", "package", "private", "protected", "public", "return", "short", "static"] ++ ["strictfp", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "try", "void", "volatile", "while"] ++ ["none", "true", "false", "Object", "String", "null", "identifier", "access-modifiers"] -- | Handler for the unknown template. That is the ones that no handler was -- registered for unknownTemplate :: String -> Map String [Anything Char] -> Renderer String unknownTemplate xx ll2 = do st <- get let x = trim xx ll = Map.fromList (trimall (Map.toList ll2)) trimall ((a, b) : xs) = ((trim a), b) : (trimall xs) trimall [] = [] tm = (templateMap st) step_ttl y = treeToLaTeX2 (Map.findWithDefault [] y ll) maybe_known_sf = do lis <- Map.lookup x tm guard (not $ null lis) case lis of (latexname : transparams) -> do guard (latexname /= "") return $ do out <- mapM step_ttl transparams return $ "\\" ++ latexname ++ "{" ++ (intercalate "}{" (map trim out)) ++ "}" _ -> Nothing unknown_sf = do uparams <- mapM step_ttl $ Map.keys ll return $ "\n\nUNKNOWN TEMPLATE \n" ++ (drop 1 . nullinit $ show x) ++ "\n\n" ++ "{" ++ (intercalate "}{" uparams) ++ "}" ++ "\n\n" in fromMaybe unknown_sf maybe_known_sf -- | helper function to generate image numbers for image in image galleries -- (gallery tag in mediawiki) the fist input parameter is the start number, the -- second the end number. A list of all numbers between start and end is -- returned generateGINsHelper :: Int -> Int -> [Int] generateGINsHelper b e = if b == e then [] else b : (generateGINsHelper (b + 1) e) -- | function to generate image numbers for image in image galleries (gallery -- tag in mediawiki). The renderer start before the start of the gallery is -- given as first parameter. The state of the renderer after the end of the -- gallery is given as second parameter. A list containing the numbers of the -- images in the gallery is returned generateGalleryImageNumbers :: MyState -> MyState -> [Int] generateGalleryImageNumbers oldst newst = generateGINsHelper (getJ oldst) (getJ newst) -- | strips center tags of the parse tree keeping the data inside the center -- tags in the parse tree, so just flattens out the center tags uncenter :: [Anything t] -> [Anything t] uncenter ((Environment Tag (TagAttr "center" _) l) : xs) = l ++ (uncenter xs) uncenter ((Environment e s l) : xs) = (Environment e s (uncenter l)) : (uncenter xs) uncenter (x : xs) = x : (uncenter xs) uncenter [] = [] -- | converts a parse tree to latex. Takes the parse tree as first parameter. -- Takes the current state of the renderer as second input parameter. Returns -- the latex representation of the tree as return value. This function should -- only be used internally in latex renderer since it does not generate the -- table of names references for the ref tags. treeToLaTeX :: [Anything Char] -> MyState -> String treeToLaTeX l states = fst $ runState (treeToLaTeX2 l) states -- | converts a parse tree to latex. Takes the parse tree as first parameter. -- Takes the current state of the renderer as second input parameter. Returns a -- tuple. the first element is the latex representation of the tree. The second -- is the new state of the renders. Does one run before the actual run, in order -- to generate a table of names references for the ref tags in mediawiki. This -- function should be called by the main program after the parser. treeToLaTeX3 :: [Anything Char] -> MyState -> (String, MyState) treeToLaTeX3 l st = runState ttl2twice st where ttl2twice = do _ <- treeToLaTeX2 l b <- get put st {fndict = fndict b} treeToLaTeX2 l findwd :: String -> Maybe Float findwd ('w' : 'i' : 'd' : 't' : 'h' : ':' : xs) = case ((reads (takeWhile (`elem` "01234567890.") xs)) :: [(Float, String)]) of [(_, _)] -> Nothing _ -> Nothing findwd (_ : xs) = findwd xs findwd [] = Nothing -- | converts a parse tree to latex. Takes the parse tree as first parameter. -- Takes the current state of the renderer as second input parameter. Returns -- the latex representation of the tree as Renderer String. So it actually takes -- the current state of the renderer as additional monadic input parameter and -- returns a possible modified version of it as additional monadic return -- parameter. This function should only be used internally in latex renderer -- since it does not generate the table of names references for the ref tags. treeToLaTeX2 :: [Anything Char] -> Renderer String treeToLaTeX2 ll = do x <- allinfo return $ concat x where allinfo :: Renderer [String] allinfo = mapM nodeToLaTeX (removeBr ll) walk :: String -> [Anything Char] -> String -> Renderer String walk prefix l postfix = do d <- treeToLaTeX2 l return $ prefix ++ d ++ postfix walktrim :: String -> [Anything Char] -> String -> Renderer String walktrim prefix l postfix = do st <- get put $ st {getInHeading = True} d <- treeToLaTeX2 l st2 <- get put $ st2 {getInHeading = getInHeading st} return $ prefix ++ (trim d) ++ postfix walkbf :: [Anything Char] -> Renderer String walkbf l = do st <- get put $ st { lastFontChanged = True, fontStack = ( ( fromMaybe FontStyle {stylebase = Normal, bold = True, italic = False} (maybeHead (fontStack st)) ) { bold = True } : (fontStack st) ) } d <- treeToLaTeX2 l st2 <- get put $ st2 {fontStack = drop 1 (fontStack st2)} return $ "{\\bfseries " ++ (trim d) ++ "}" walkit :: [Anything Char] -> Renderer String walkit l = do st <- get put $ st { lastFontChanged = True, fontStack = ( ( fromMaybe FontStyle {stylebase = Normal, bold = False, italic = True} (maybeHead (fontStack st)) ) { italic = True } : (fontStack st) ) } d <- treeToLaTeX2 l st2 <- get put $ st2 {fontStack = drop 1 (fontStack st2)} return $ "{\\itshape " ++ (trim d) ++ "}" walktt :: [Anything Char] -> Renderer String walktt l = do st <- get put $ st { lastFontChanged = True, fontStack = ( ( fromMaybe FontStyle {stylebase = Mono, bold = False, italic = False} (maybeHead (fontStack st)) ) { stylebase = Mono } : (fontStack st) ) } d <- treeToLaTeX2 l st2 <- get put $ st2 {fontStack = drop 1 (fontStack st2)} return $ "{\\ttfamily " ++ (trim d) ++ "}" walkfn :: [Anything Char] -> Renderer String walkfn l = do st <- get put $ st {getInFootnote = True} d <- treeToLaTeX2 l st2 <- get put $ st2 {getInFootnote = (getInFootnote st)} makeFootNoteRef "" d "" nodeToLaTeX :: Anything Char -> Renderer String nodeToLaTeX (C c) = do st <- get case (fontStack st) of (x : _) -> if ((getFont x c) == (font st)) || (isSpaceIndent st) then return (chartrans c) else do put st { font = (getFont x c), lastFontChanged = (lastFontChanged st) && (not (c == ' ')) } return ( ( if ((lastFontChanged st) && (c == ' ')) then "{$\\text{ }$}" else "" ) ++ (fontsetter (getFont x c)) ++ (fontstyler x) ++ (chartrans c) ) _ -> return (chartrans c) nodeToLaTeX (Environment Wikitable (TagAttr "table" m) lll) | havefontsize (Map.lookup "style" m) = do d <- nodeToLaTeX (Environment Wikitable (TagAttr "table" (Map.alter rmfontsize "style" m)) lll) let size = do p <- (Map.lookup "style" m) case splitOn "font-size:" p of (_ : v : []) -> case splitOn "%" v of (h : _) -> case (reads (strip " \t\n\r" h)) of [(z, _)] -> (Just z) :: (Maybe Integer) _ -> Nothing _ -> Nothing _ -> Nothing return ( case size of Nothing -> d Just s -> "{\\scalefont{" ++ (show (mangle ((0.01 :: Double) * (fromIntegral s)))) ++ "}" ++ d ++ "}" ) where mangle x = if x < 1.0 then min 0.75 x else x nodeToLaTeX (Environment Tag (TagAttr "div" m) lll) | kartopred m = mapToLaTeX [(Environment Tag (TagAttr "div" m) lll)] nodeToLaTeX (Environment Wikitable (Str s) l) = do st <- get put $ st {getInTab = (getInTab st) + 1} d <- tableToLaTeXNew l False s Nothing [(Environment Wikitable (Str s) l)] st2 <- get put $ st2 {getInTab = (getInTab st)} return d nodeToLaTeX (Environment Wikitable (TagAttr t a) l) = do st <- get put $ st {getInTab = (getInTab st) + 1} d <- tableToLaTeXNew (subTableCellCorrect l) False ( if ((Map.lookup "rules" a `elem` (map Just ["all"]))) || (isJust ((Map.lookup "class" a) >>= \str -> if (isInfixOf "wikitable" str) || (isInfixOf "prettytable" str) then return "wikitable" else Nothing)) then "class=\"wikitable\"" else "" ) ((Map.lookup "style" a) >>= findwd) [(Environment Wikitable (TagAttr t a) l)] st2 <- get put $ st2 {getInTab = (getInTab st)} return d nodeToLaTeX (Environment Wikilink _ l) = do st <- get if getInHeading st then return $ wikiLinkCaption l st else if (isImage (shallowFlatten l)) then wikiImageToLaTeX l else wikiLinkToLaTeX2 l nodeToLaTeX (Environment Link (Str s) l) = do st <- get if getInHeading st then linkCaption l s (getInFootnote st) else linkToLaTeX2 l s nodeToLaTeX (Environment Link2 (Str s) l) = nodeToLaTeX (Environment Link (Str s) l) nodeToLaTeX (Environment ItemEnv (Str _) [Item _]) = return [] nodeToLaTeX (Environment ItemEnv (Str s) l) = do st <- get d <- if s == ";" then do fulllist else do ff <- treeToLaTeX2 ( if (s == ":") && ( [] == [ x | x <- l, not ( ( case x of Environment Math _ _ -> True Item _ -> True _ -> False ) || (x `elem` (map (C) "\n\t \r;,.")) ) ] ) then ( shallowEnlargeMath [x | x <- l, not (x `elem` (map (C) "\n\t \r;,.:!?"))] ) else l ) return [(ff, "")] if s /= ";" then return $ "\n\\begin{" ++ (itemEnvironmentName s (getF st)) ++ "}" ++ (itemEnvironmentParameters s (getF st)) ++ (mmm2 d) ++ "\n\\end{" ++ (itemEnvironmentName s (getF st)) ++ "}\n" else return $ (prolist d st) where mmm2 d = case d of (x : _) -> fst x _ -> [] texit v = do prep <- treeToLaTeX2 . prepart $ v post <- treeToLaTeX2 . postpart $ v return (prep, post) fulllist :: Renderer [(String, String)] fulllist = mapM texit vv vv :: [[Anything Char]] vv = [x | x <- splitOn [Item ';'] l, x /= []] prepart v = takeWhile ((/=) (C ':')) v postpart v = case dropWhile ((/=) (C ':')) v of (_ : xs) -> xs x -> x prolist :: [(String, String)] -> MyState -> String prolist lis st = do (prd, pod) <- lis if pod == [] then (singlepart prd st) else (doublepart prd pod st) doublepart pre po st = "{\\bfseries" ++ "\n\\begin{" ++ (itemEnvironmentName s (getF st)) ++ "}" ++ (itemEnvironmentParameters s (getF st)) ++ pre ++ "\n\\end{" ++ (itemEnvironmentName s (getF st)) ++ "}\n" ++ "}" ++ "\n\\begin{" ++ (itemEnvironmentName ":" (getF st)) ++ "}" ++ (itemEnvironmentParameters s (getF st)) ++ (itemEnvironmentParameters s (getF st)) ++ (itemSeperator2 s) ++ po ++ "\n\\end{" ++ (itemEnvironmentName ":" (getF st)) ++ "}\n" singlepart pre st = "{\\bfseries" ++ "\n\\begin{" ++ (itemEnvironmentName s (getF st)) ++ "}" ++ (itemEnvironmentParameters s (getF st)) ++ pre ++ "\n\\end{" ++ (itemEnvironmentName s (getF st)) ++ "}\n" ++ "}\n" nodeToLaTeX (Item c) = return $ "\n" ++ (itemSeperator c) ++ " " nodeToLaTeX (Environment Itemgroup _ l) = walk "" l "" nodeToLaTeX (Environment Wikiheading (Str s) l) = do st <- get if (getInTab st) > 0 then walktrim ("{\\Large ") (uncenter l) ("}\n") else walktrim ("\\" ++ (getsec s) ++ "{") (uncenter l) ("}\n" ++ (getsecpost s)) nodeToLaTeX (Environment Tag (TagAttr ('h' : (x : [])) _) l) = if x `elem` "123456" then case reads [x] of [] -> walk "" l "" ((y, _) : _) -> let s = replicate y '=' in walktrim ("\\" ++ (getsec s) ++ "{") (uncenter l) ("}\n" ++ (getsecpost s)) else walk "" l "" nodeToLaTeX (Environment Bold _ l) = walkbf l nodeToLaTeX (Environment Italic _ l) = walkit l nodeToLaTeX (Environment Chapter _ l) = do d <- treeToLaTeX2 l return $ "\\chapter{" ++ (chapterTransform d) ++ "}\n\\myminitoc\n" nodeToLaTeX (Environment Tag (TagAttr "sup" _) l) = do st <- get walk ((fontsetter (font st)) ++ "\\textsuperscript{") l "}" nodeToLaTeX (Environment Tag (TagAttr "li" _) l) = walk "\\item{}" l "" nodeToLaTeX (Environment Tag (TagAttr "a" d) l) = do st <- get if getInHeading st then treeToLaTeX2 l else case Map.lookup "href" d of Just g -> case g of '#' : _ -> wikiLinkToLaTeX2 (map C g) _ -> linkToLaTeX2 ( ( map (C) ( case g of '/' : ('/' : gx) -> "https://" ++ gx '/' : _ -> wikiUrlDataToString (urld st) g _ -> g ) ) ++ [C ' '] ++ l ) "" Nothing -> treeToLaTeX2 l nodeToLaTeX (Environment Tag (TagAttr "ol" _) l) = do st <- get walk ( "\n\\begin{" ++ (itemEnvironmentName "#" (getF st)) ++ "}" ++ (itemEnvironmentParameters "#" (getF st)) ) l ("\n\\end{" ++ (itemEnvironmentName "#" (getF st)) ++ "}\n") nodeToLaTeX (Environment Tag (TagAttr "dd" _) l) = do st <- get walk ( "\n\\begin{" ++ (itemEnvironmentName ":" (getF st)) ++ "}" ++ (itemEnvironmentParameters ":" (getF st)) ++ "\n\\item{}" ) l ("\n\\end{" ++ (itemEnvironmentName ":" (getF st)) ++ "}\n") nodeToLaTeX (Environment Tag (TagAttr "ul" _) l) = do st <- get walk ( "\n\\begin{" ++ (itemEnvironmentName "*" (getF st)) ++ "}" ++ (itemEnvironmentParameters "*" (getF st)) ) l ("\n\\end{" ++ (itemEnvironmentName "*" (getF st)) ++ "}\n") nodeToLaTeX (Environment Tag (TagAttr "dir" _) l) = do st <- get walk ( "\n\\begin{" ++ (itemEnvironmentName "*" (getF st)) ++ "}" ++ (itemEnvironmentParameters "*" (getF st)) ) l ("\n\\end{" ++ (itemEnvironmentName "*" (getF st)) ++ "}\n") nodeToLaTeX (Environment Tag (TagAttr "strong" _) l) = walkbf l nodeToLaTeX (Environment Tag (TagAttr "dfn" _) l) = walkit l nodeToLaTeX (Environment Tag (TagAttr "var" _) l) = walkit l nodeToLaTeX (Environment Tag (TagAttr "q" _) l) = walkit l nodeToLaTeX (Environment Tag (TagAttr "sub" _) l) = do st <- get walk ((fontsetter (font st)) ++ "\\textsubscript{") l "}" nodeToLaTeX (Environment Tag (TagAttr "cite" _) l) = walk "{$\\text{ }$}\\newline\n\\quad {\\scshape " l "}" nodeToLaTeX (Environment Sup (Str s) _) = return $ "{$^{\\textrm{\\scriptsize " ++ s ++ "}}$}" nodeToLaTeX (Environment Sub (Str s) _) = return $ "{$_{\\textrm{\\scriptsize " ++ s ++ "}}$}" nodeToLaTeX (Environment Tag (TagAttr "u" _) l) = walk "\\uline{" l "}" nodeToLaTeX (Environment Tag (TagAttr "p" _) l) = do st <- get if (not (getInFootnote st)) && (not (getInCaption st)) && (not ((getInTab st) > 0)) then walk "" l "\n\n" else walk "" l "" nodeToLaTeX (Environment Tag (TagAttr "ins" _) l) = walk "\\uline{" l "}" nodeToLaTeX (Environment Tag (TagAttr "del" _) l) = walk "\\sout{" l "}" nodeToLaTeX (Environment Tag (TagAttr "strike" _) l) = walk "\\sout{" l "}" nodeToLaTeX (Environment Tag (TagAttr "b" _) l) = walkbf l nodeToLaTeX (Environment Tag (TagAttr "script" _) _) = walk "" [] "" nodeToLaTeX (Environment Tag (TagAttr "style" _) _) = walk "" [] "" nodeToLaTeX (Environment Tag (TagAttr "dt" _) l) = walkbf l nodeToLaTeX (Environment Tag (TagAttr "wbr" _) l) = walk "" l "\\allowbreak{}" nodeToLaTeX (Environment Tag (TagAttr "i" _) l) = walkit l nodeToLaTeX (Environment Tag (TagAttr "em" _) l) = walkit l nodeToLaTeX (Environment Tag (TagAttr "s" _) l) = walk "\\sout{" l "}" nodeToLaTeX (Environment Tag (TagAttr "small" _) l) = do st <- get if getInHeading st then walk "" l "" else walk "{\\smaller " l "}" nodeToLaTeX (Environment Tag (TagAttr "center" _) l) = do d <- treeToLaTeX2 (shallowEnlargeMath l) return $ "\n\\begin{center}\n" ++ d ++ "\n\\end{center}\n" nodeToLaTeX (Environment Tag (TagAttr "ref" a) l) = do st <- get case Map.lookup "name" a of Just n -> case Map.lookup n (fndict st) of Just lll -> go st lll Nothing -> if not (and (map (`elem` (map (C) " \r\n\t")) l)) then do put st {fndict = Map.insert n l (fndict st)} st2 <- get go st2 l else go st l Nothing -> go st l where go ss xx = if getInFootnote ss then walk "\\^{}\\{" xx "\\}" else walkfn xx nodeToLaTeX (Environment Tag (TagAttr "includeonly" _) l) = walk "" l "" nodeToLaTeX (Environment Tag (TagAttr "blockquote" _) l) = walk "\\begin{myblockquote}\n\\item{}" l "\n\\end{myblockquote}" nodeToLaTeX (Environment Tag (TagAttr "code" _) l) = walktt l nodeToLaTeX (Environment Tag (TagAttr "kbd" _) l) = walktt l nodeToLaTeX (Environment Tag (TagAttr "samp" _) l) = walktt l nodeToLaTeX (Environment Tag (TagAttr "tt" _) l) = walktt l nodeToLaTeX (Environment Tag (TagAttr "big" _) l) = do st <- get if getInHeading st then walk "" l "" else walk "{\\large " l "}" nodeToLaTeX (Environment Tag (TagAttr "div" m) l) | (havepos [Environment Tag (TagAttr "div" m) l]) = posToLaTeX l nodeToLaTeX (Environment Tag (TagAttr "div" a) _) | (isInfixOf "display:none" (Map.findWithDefault [] "style" a)) = return "" nodeToLaTeX (Environment Tag (TagAttr "div" a) l) = let co = case Map.lookup "style" a of Nothing -> Nothing Just x -> case splitOn "background-color:" x of (_ : (y2 : [])) -> case splitOn ";" y2 of (z1 : _) -> case (trim z1) of ('#' : gs) -> let ( p, _, col ) = colinfo ( 'l' : 'l' : gs ) in Just $ if p then "\\definecolor{shadecolor}{rgb}" ++ col else "\\colorlet{shadecolor}{" ++ (if not (Set.member z1 htmlColorNames) then "grey" else z1) ++ "}" _ -> Just $ "\\colorlet{shadecolor}{" ++ (if not (Set.member z1 htmlColorNames) then "grey" else z1) ++ "}" _ -> Nothing _ -> Nothing beg = case co of Nothing -> "" Just x -> "\\LaTeXShadedColorBoxTemplate{" ++ x ++ "}{" en = case co of Nothing -> "" Just _ -> "}" in if (Map.member "class" a) then if (Map.findWithDefault [] "class" a) `elem` ["noprint", "topicon"] then return $ beg ++ en else walk beg l en else walk beg l en nodeToLaTeX (Environment Tag (TagAttr "span" a) l) = if (Map.member "class" a) then if ( (Map.findWithDefault [] "class" a) `elem` ["noprint", "latitude", "longitude", "elevation"] ) || ((Map.findWithDefault [] "id" a) `elem` ["coordinates"]) then return "" else col (Map.findWithDefault [] "style" a) else col (Map.findWithDefault [] "style" a) where col x = case splitOn "border-left-color" x of (_ : xs : _) -> case splitOn ":" xs of (_ : ys : _) -> case splitOn ";" ys of (hs : _) -> case colinfo ((strip " \n\r\t" hs)) of (True, colname, colo) -> walk ("\\definecolor{" ++ colname ++ "}{rgb}" ++ colo ++ "\\colorbox{" ++ colname ++ "}{") l "}" (False, colname, _) -> walk ("\\colorbox{" ++ colname ++ "}{") l "}" _ -> walk "" l "" _ -> walk "" l "" _ -> walk "" l "" nodeToLaTeX (Environment Tag (TagAttr "br" _) _) = do st <- get return $ if (getInCenter st) then "\\\\" else if (getInTab st) > 0 then "\\newline{}" else "$\\text{ }$\\newline{}\n" nodeToLaTeX (Environment Source (TagAttr _ a) l) = do let g = case reverse l of [] -> [] (x : xs) -> if x == (C '\n') then reverse xs else l let xg = case g of (C '\n') : xs -> xs _ -> g let f = shallowFlatten (map renormalize (breakLines3 linewidth xg)) let glines = (Map.lookup "line" a) /= Nothing let spg = splitOn "\n" f let spgl = length (show (length spg)) let lino = linenumbers spgl 1 (length spg) let newlines = if glines then intercalate "\n" (map (\(k, v) -> k ++ " " ++ v) (zip lino spg)) else f d <- treeToLaTeX2 (breakLines3 linewidth (if glines then map C newlines else xg)) return ("\\TemplateSource{" ++ (rtrim d) ++ "}\n") nodeToLaTeX (Environment Tag (TagAttr "font" a) l) = if Map.member "style" a then if ((Map.findWithDefault [] "style" a) == "text-decoration:overline") then walk "\\myoverline{" l "}" else walk "" l "" else walk "" l "" nodeToLaTeX (Environment Tag _ l) = walk "" l "" nodeToLaTeX (Environment Preformat (TagAttr _ _) l) = do d <- treeToLaTeX2 (breakLines3 linewidth l) return $ "\\TemplatePreformat{" ++ d ++ "}" nodeToLaTeX (Environment DhunUrl _ l) = do st <- get put st {currentUrl = shallowFlatten l} return "" nodeToLaTeX (Environment NoWiki _ l) = walk "" l "" nodeToLaTeX (Environment HDevLine _ l) = walk "" l "" nodeToLaTeX (Environment PageBreak _ _) = return "\\pagebreak " nodeToLaTeX (Quad) = return "$\\text{ }${}" nodeToLaTeX (Environment TableCap _ l) = walk "" l "" nodeToLaTeX (Tab) = return $ concat (take tabwidth (repeat "${\\text{ }}${}")) nodeToLaTeX (Environment SpaceIndent _ l) = if onlySpaces l then return "\n" else do st <- get z <- treeToLaTeX2 l put st if (all (\x -> x `elem` "\r\n\t ") z) then return "" else do sst <- get put sst {isSpaceIndent = True} d <- treeToLaTeX2 (breakLines3 linewidth l) ssst <- get put ssst {isSpaceIndent = False} return $ (preput st) ++ "\\TemplateSpaceIndent{" ++ d ++ "}\n" where preput i = if (getInCode i) || ((getInTab i) > 0) then "" else "\\\\\n\n" nodeToLaTeX (Environment Math _ l) = return $ mathToLatex l nodeToLaTeX (Environment BigMath _ l) = return $ "\\begin{equation*}" ++ (mathTransform l) ++ "\\end{equation*}" nodeToLaTeX (Environment Greek (Str s) _) = return $ "{\\mbox{$\\" ++ s ++ "$}}" nodeToLaTeX (Environment P302 (Str s) _) = return $ "\\^{" ++ s ++ "}" nodeToLaTeX (Environment HtmlChar (Str s) _) = return $ getHtmlChar s nodeToLaTeX (Environment NumHtml (Str s) _) = case reads s of [] -> case do z <- case s of ('x' : xs) -> Just xs ('X' : xs) -> Just xs _ -> Nothing g <- Tools.unhex z return g of Just x -> if (x == (65279 :: Integer)) then return "\\raisebox{2.0ex}{ }" else nodeToLaTeX (C (chr (fromIntegral x))) Nothing -> return (("&#" ++ s ++ ";") >>= chartrans) (x : _) -> nodeToLaTeX (C (chr (fst x))) nodeToLaTeX (Environment Gallery _ l) = do st <- get put st {getInGallery = True} d <- galleryToLatex l st2 <- get put $ (newst st2) {getInGallery = (getInGallery st)} return d where midst i = i {getInGallery = False} gins i = generateGalleryImageNumbers i (midst i) newst i = (midst i) { getGalleryNumbers = (getGalleryNumbers (midst i)) ++ (map toInteger (gins i)) } nodeToLaTeX (Environment ImageMap _ l) = treeToLaTeX2 (imageMapClean l) nodeToLaTeX (Environment Reserved (Str "·") _) = return "{\\mbox{$\\cdot$}}" nodeToLaTeX (Environment Template (Str s) l) = templateToLatex l s nodeToLaTeX (Environment Label (Str s) _) = return $ "\\label{" ++ s ++ "}" nodeToLaTeX _ = return [] havefontsize :: Maybe String -> Bool havefontsize Nothing = False havefontsize (Just x) = isInfixOf "font-size:" x rmfontsize :: Maybe String -> Maybe String rmfontsize Nothing = Nothing rmfontsize (Just x) = Just (intercalate ";" (filter (\y -> not (isInfixOf "font-size:" y)) (splitOn ";" x))) havepos :: [Anything Char] -> Bool havepos ((Environment Tag (TagAttr "div" a) l) : xs) = checkattrstyle || checkattrclass || (havepos xs) || (havepos l) where checkattrstyle = case Map.lookup "style" a of Just x -> (isInfixOf "position:" x) Nothing -> False checkattrclass = case Map.lookup "class" a of Just x -> (isInfixOf "timeline" x) || (isInfixOf "mw-ext-score" x) Nothing -> False havepos ((Environment _ _ l) : xs) = (havepos l) || (havepos xs) havepos (_ : xs) = (havepos xs) havepos [] = False tabletoodeep :: [Anything Char] -> Bool tabletoodeep l = tdeep l 1 tdeep :: [Anything Char] -> Int -> Bool tdeep ((Environment _ (TagAttr "table" _) _) : _) 0 = True tdeep ((Environment _ (TagAttr "table" _) l) : xs) n = (tdeep l (n - 1)) || (tdeep xs n) tdeep ((Environment _ _ l) : xs) n = (tdeep l n) || (tdeep xs n) tdeep (_ : xs) n = (tdeep xs n) tdeep [] _ = False -- | Unicode escaping for latex strings doUnicode :: String -> String doUnicode ('\206' : ('\178' : xs)) = "\\ensuremath{\\beta}" ++ doUnicode xs doUnicode (x : xs) = x : doUnicode xs doUnicode [] = [] mediawiki2latex-8.29/src/Licenses.hs000066400000000000000000000232711504464363500174460ustar00rootroot00000000000000-- | module storing information on image licensing on Wikipedia, Wikimedia -- commons and so on. module Licenses where import Data.List (nub) -- | a map (written as list) to map an URL (to a license) to an abbreviated text -- of the license. In contrast to the map minlicenses in this module the -- presence of a leading http: is optional licenses :: -- | List of tuples. The first element of each tuple is the text -- representation of a hyperlink to the license. The second element of each -- tuple is an abbreviated text representation of the license. The list -- contains all cases of the links including present or missing leading http -- or https or https://en.wikipedia.org [(String, String)] licenses = nub $ minlicenses ++ (map go minlicenses) ++ (map gog minlicenses) ++ (map gogo minlicenses) ++ (map gogogo minlicenses) where go :: (String, String) -> (String, String) go (x, y) = ((drop 5) x, y) gog (x, y) = ((drop 6) x, y) gogo ('h' : 't' : 't' : 'p' : 's' : ':' : '/' : '/' : 'e' : 'n' : '.' : 'w' : 'i' : 'k' : 'i' : 'p' : 'e' : 'd' : 'i' : 'a' : '.' : 'o' : 'r' : 'g' : xs, y) = (xs, y) gogo x = x gogogo ('h' : 't' : 't' : 'p' : ':' : '/' : '/' : xs, y) = ("https://" ++ xs, y) gogogo x = x -- | a map (written as list) to map an URL to a license to an abbreviated text -- of the license. Only one representation of each case is present in this list. -- This list is not to be used directly. Rather the list `licenses` should be -- used instead. minlicenses :: -- | A list tuples. The first element of each tuple is a hyperlink to license -- and the second element of each tuple is a string representation of the -- abbreviation of the license. [(String, String)] minlicenses = [ ("http://en.wikipedia.org/wiki/public_domain", "PD"), ("https://en.wikipedia.org/wiki/Public_domain", "PD"), ("https://en.wikipedia.org/wiki/en:Public_domain", "PD"), ("https://en.wikipedia.org/wiki/en:public_domain", "PD"), ("https://creativecommons.org/licenses/publicdomain/", "PD"), ( "https://de.wikibooks.org/wiki/GNU_Freie_Dokumentationslizenz", "GFDL" ), ( "https://de.wikipedia.org/wiki/GNU-Lizenz_f%C3%BCr_freie_Dokumentation", "GFDL" ), ( "https://de.wikipedia.org/wiki/GNU-Lizenz_f\252r_freie_Dokumentation", "GFDL" ), ( "http://en.wikipedia.org/wiki/en:GNU_Free_Documentation_License", "GFDL" ), ( "https://en.wikipedia.org/wiki/de:GNU-Lizenz_f%C3%BCr_freie_Dokumentation", "GFDL" ), ( "http://en.wikipedia.org/wiki/en:GNU_General_Public_License", "GPL" ), ("http://de.wikipedia.org/wiki/GNU_General_Public_License", "GPL"), ("http://de.wikipedia.org/wiki/Gemeinfreiheit", "PD"), ("http://en.wikipedia.org/wiki/de:Gemeinfreiheit", "PD"), ("http://de.wikipedia.org/wiki/Gemeinfreiheit", "PD"), ("https://de.wikipedia.org/wiki/Gemeinfreiheit", "PD"), ( "http://en.wikipedia.org/wiki/en:GNU_Lesser_General_Public_License", "LGPL" ), ( "http://creativecommons.org/licenses/by/3.0/deed.en", "CC-BY-3.0" ), ( "http://creativecommons.org/licenses/by/3.0/au/deed.en", "CC-BY-3.0" ), ( "http://creativecommons.org/licenses/by/3.0/de/deed.en", "CC-BY-3.0" ), ( "http://creativecommons.org/licenses/by/3.0/it/deed.en", "CC-BY-3.0" ), ( "http://creativecommons.org/licenses/by/3.0/nl/deed.en", "CC-BY-3.0" ), ( "http://creativecommons.org/licenses/by/3.0/nz/deed.en", "CC-BY-3.0" ), ( "http://creativecommons.org/licenses/by/3.0/pt/deed.en", "CC-BY-3.0" ), ( "http://creativecommons.org/licenses/by/3.0/ro/deed.en", "CC-BY-3.0" ), ( "http://creativecommons.org/licenses/by/3.0/us/deed.en", "CC-BY-3.0" ), ( "https://creativecommons.org/licenses/by/3.0/deed.de", "CC-BY-3.0" ), ( "http://creativecommons.org/licenses/by-sa/3.0/deed.en", "CC-BY-SA-3.0" ), ( "http://creativecommons.org/licenses/by-sa/3.0/deed.de", "CC-BY-SA-3.0" ), ( "https://creativecommons.org/licenses/by-sa/3.0/de/legalcode", "CC-BY-SA-3.0" ), ( "https://creativecommons.org/licenses/by-sa/3.0/deed.de", "CC-BY-SA-3.0" ), ( "https://creativecommons.org/licenses/by-sa/3.0/at/deed.de", "CC-BY-SA-3.0" ), ( "http://creativecommons.org/licenses/by-sa/3.0/cr/deed.en", "CC-BY-SA-3.0" ), ( "http://creativecommons.org/licenses/by-sa/3.0/de/deed.en", "CC-BY-SA-3.0" ), ( "http://creativecommons.org/licenses/by-sa/3.0/it/deed.en", "CC-BY-SA-3.0" ), ( "http://creativecommons.org/licenses/by-sa/3.0/lu/deed.en", "CC-BY-SA-3.0" ), ( "http://creativecommons.org/licenses/by-sa/3.0/nl/deed.en", "CC-BY-SA-3.0" ), ( "http://creativecommons.org/licenses/by-sa/3.0/ro/deed.en", "CC-BY-SA-3.0" ), ( "http://creativecommons.org/licenses/by-sa/3.0/us/deed.en", "CC-BY-SA-3.0" ), ( "http://creativecommons.org/licenses/by/2.5/deed.en", "CC-BY-2.5" ), ( "http://creativecommons.org/licenses/by/2.5/au/deed.en", "CC-BY-2.5" ), ( "http://creativecommons.org/licenses/by/2.5/br/deed.en", "CC-BY-2.5" ), ( "http://creativecommons.org/licenses/by/2.5/ca/deed.en", "CC-BY-2.5" ), ( "http://creativecommons.org/licenses/by/2.5/in/deed.en", "CC-BY-2.5" ), ( "http://creativecommons.org/licenses/by/2.5/it/deed.en", "CC-BY-2.5" ), ( "http://creativecommons.org/licenses/by/2.5/mk/deed.en", "CC-BY-2.5" ), ( "http://creativecommons.org/licenses/by/2.5/pl/deed.en", "CC-BY-2.5" ), ( "http://creativecommons.org/licenses/by/2.5/pt/deed.en", "CC-BY-2.5" ), ( "http://creativecommons.org/licenses/by/2.5/au/deed.en", "CC-BY-2.5" ), ( "https://creativecommons.org/licenses/by/2.5/bg/deed.de", "CC-BY-2.5" ), ( "https://creativecommons.org/licenses/by-sa/2.5/deed.de", "CC-BY-SA-2.5" ), ( "http://creativecommons.org/licenses/by-sa/2.5/deed.en", "CC-BY-SA-2.5" ), ( "http://creativecommons.org/licenses/by-sa/2.5/deed.de", "CC-BY-SA-2.5" ), ( "http://creativecommons.org/licenses/by-sa/2.5/au/deed.en", "CC-BY-SA-2.5" ), ( "http://creativecommons.org/licenses/by-sa/2.5/br/deed.en", "CC-BY-SA-2.5" ), ( "http://creativecommons.org/licenses/by-sa/2.5/ch/deed.en", "CC-BY-SA-2.5" ), ( "http://creativecommons.org/licenses/by-sa/2.5/dk/deed.en", "CC-BY-SA-2.5" ), ( "http://creativecommons.org/licenses/by-sa/2.5/es/deed.en", "CC-BY-SA-2.5" ), ( "http://creativecommons.org/licenses/by-sa/2.5/in/deed.en", "CC-BY-SA-2.5" ), ( "http://creativecommons.org/licenses/by-sa/2.5/it/deed.en", "CC-BY-SA-2.5" ), ( "http://creativecommons.org/licenses/by-sa/2.5/mk/deed.en", "CC-BY-SA-2.5" ), ( "http://creativecommons.org/licenses/by-sa/2.5/mx/deed.en", "CC-BY-SA-2.5" ), ( "http://creativecommons.org/licenses/by-sa/2.5/pl/deed.en", "CC-BY-SA-2.5" ), ( "http://creativecommons.org/licenses/by-sa/2.5/si/deed.en", "CC-BY-SA-2.5" ), ( "http://creativecommons.org/licenses/by-sa/2.5/za/deed.en", "CC-BY-SA-2.5" ), ( "https://creativecommons.org/licenses/by-sa/2.0/de/deed.de", "CC-BY-SA-2.0" ), ( "http://commons.wikimedia.org/wiki/Template:Cc-by-2.0", "CC-BY-2.0" ), ( "http://creativecommons.org/licenses/by/2.0/at/deed.en", "CC-BY-2.0" ), ( "http://creativecommons.org/licenses/by/2.0/de/deed.en", "CC-BY-2.0" ), ( "http://creativecommons.org/licenses/by/2.0/kr/deed.en", "CC-BY-2.0" ), ( "https://creativecommons.org/licenses/by/2.0/deed.de", "CC-BY-2.0" ), ( "https://creativecommons.org/licenses/by/2.0/deed.en", "CC-BY-2.0" ), ( "http://creativecommons.org/licenses/by-sa/2.0/deed.en", "CC-BY-SA-2.0" ), ( "http://creativecommons.org/licenses/by-sa/2.0/at/deed.en", "CC-BY-SA-2.0" ), ( "http://creativecommons.org/licenses/by-sa/2.0/be/deed.en", "CC-BY-SA-2.0" ), ( "http://creativecommons.org/licenses/by-sa/2.0/ca/deed.en", "CC-BY-SA-2.0" ), ( "http://creativecommons.org/licenses/by-sa/2.0/fr/deed.en", "CC-BY-SA-2.0" ), ( "http://creativecommons.org/licenses/by-sa/2.0/jp/deed.en", "CC-BY-SA-2.0" ), ( "http://creativecommons.org/licenses/by-sa/2.0/kr/deed.en", "CC-BY-SA-2.0" ), ( "http://creativecommons.org/licenses/by-sa/2.0/tw/deed.en", "CC-BY-SA-2.0" ), ( "http://creativecommons.org/licenses/by-sa/2.0/uk/deed.en", "CC-BY-SA-2.0" ), ( "https://creativecommons.org/licenses/by-sa/2.0/de/deed.en", "CC-BY-SA-2.0" ), ("http://creativecommons.org/licenses/sa/1.0/", "CC-SA-1.0"), ("https://creativecommons.org/licenses/by/1.0/deed.en", "CC-BY-1.0"), ("http://creativecommons.org/publicdomain/zero/1.0/deed.en", "PD"), ("https://de.wikipedia.org/wiki/Public_domain", "PD"), ("https://commons.wikimedia.org/wiki/Public_domain", "PD"), ("https://creativecommons.org/publicdomain/zero/1.0/deed.de", "PD"), ("https://de.wikipedia.org/wiki/Gemeinfreiheit", "PD"), ("https://de.wikipedia.org/wiki/Gemeinfreiheit#Public_Domain", "PD"), ("https://en.wikipedia.org/wiki/de:Gemeinfreiheit", "PD"), ("https://creativecommons.org/licenses/by-sa/4.0/deed.de", "CC-BY-SA-4.0"), ("https://creativecommons.org/licenses/by-sa/4.0/deed.en", "CC-BY-SA-4.0"), ("https://creativecommons.org/licenses/by/4.0/deed.de", "CC-BY-4.0"), ("https://creativecommons.org/licenses/by/4.0/deed.en", "CC-BY-4.0"), ("http://artlibre.org/lal/de", "LFK") ] mediawiki2latex-8.29/src/Load.hs000066400000000000000000000564561504464363500165730ustar00rootroot00000000000000{-# LANGUAGE DefaultSignatures #-} {-# LANGUAGE DeriveAnyClass #-} -- | module to download the wiki source text form the wiki website module Load where import Codec.Binary.UTF8.String as C import Control.Monad import Control.Monad.Except import Control.Monad.State import Data.ByteString as B hiding ( concat, intercalate, isInfixOf, map, sort, takeWhile, ) import Data.List hiding (lookup) import Data.List.Split import Data.Map as Map hiding (map) import Data.Maybe (fromMaybe) import Data.Serialize as S (decode, encode) import Data.String.HT import Hex import HtmlParser (parseHtml) import ImperativeState import MagicStrings import MediaWikiParseTree import Network.URL import SimpleContributors import System.Directory import System.FilePath.Posix import System.IO.Temp import System.Process import Text.Parsec.Prim import Text.ParserCombinators.Parsec hiding (try) import Tools import UrlAnalyse import WikiHelper notendyet :: (String -> ImperativeMonad String) -> ParsecT String () ImperativeMonad String -> ParsecT String () ImperativeMonad String -> String -> ParsecT String () ImperativeMonad String notendyet action sstart eend aku = try ( do eof return aku ) <|> try ( do _ <- eend r <- startToEnd action sstart eend a <- lift (action aku) return (a ++ r) ) <|> do a <- anyChar notendyet action sstart eend (aku ++ [a]) beginning :: (String -> ImperativeMonad String) -> ParsecT String () ImperativeMonad String -> ParsecT String () ImperativeMonad String -> ParsecT String () ImperativeMonad [Char] beginning action sstart eend = try ( do eof return [] ) <|> do _ <- sstart ne <- notendyet action sstart eend [] return (ne) startToEnd :: (String -> ImperativeMonad String) -> ParsecT String () ImperativeMonad String -> ParsecT String () ImperativeMonad String -> ParsecT String () ImperativeMonad String startToEnd action sstart eend = try ( do eof return [] ) <|> try (beginning action sstart eend) <|> do a <- anyChar s <- startToEnd action sstart eend return (a : s) zeroAction :: (Monad m) => t -> t1 -> m [Char] zeroAction _ _ = return "" runAction :: String -> String -> (String -> ImperativeMonad String) -> String -> ImperativeMonad String runAction sstart eend action text = do x <- ( runParserT (startToEnd action (string sstart) (string eend)) () "" text ) case x of Left _ -> return "" Right xs -> return xs chapterAction :: WikiUrl -> String -> ImperativeMonad String chapterAction wurl text = do pp <- liftIO (getpage d (wurl)) case pp of Just p -> do _ <- addContributors d Nothing noinclude wurl ("\n\ndhunparserurl " ++ d ++ "\n\n" ++ p) _ -> return "" where d = (trim (takeWhile (/= '|') text)) chapterAction2 :: WikiUrl -> String -> String -> ImperativeMonad String chapterAction2 wurl lema text = do pp <- liftIO (getpage d (wurl)) case pp of Just p -> do _ <- addContributors d Nothing noinclude wurl ("\n\ndhunparserurl " ++ d ++ "\n\n" ++ "= " ++ e ++ " =\n" ++ p) _ -> return "" where e = (trim (takeWhile (/= '|') text)) d = (removePrintVersion lema) ++ "/" ++ e chapterAction3 :: WikiUrl -> String -> String -> ImperativeMonad String chapterAction3 wurl text lema = do pp <- liftIO (getpage d (wurl)) case pp of Just p -> do _ <- addContributors d Nothing noinclude wurl ("\n\ndhunparserurl " ++ d ++ "\n\n" ++ "= " ++ e ++ " =\n" ++ p) _ -> return "" where e = (trim (takeWhile (/= '|') text)) d = (removePrintVersion lema) ++ "/ " ++ e includeAction :: WikiUrl -> String -> ImperativeMonad String includeAction = qIncludeAction qIncludeAction :: WikiUrl -> String -> ImperativeMonad String qIncludeAction wurl text = if isInfixOf "Vorlage" text then return ("{{" ++ text ++ "}}") else do st <- get if d `Data.List.elem` (finishedLemmas st) then return [] else do put (st {finishedLemmas = (d : (finishedLemmas st))}) pp <- (liftIO (print d)) >> liftIO (getpage d (wurl)) case pp of Just p -> do _ <- addContributors d Nothing noinclude wurl ("\n\ndhunparserurl " ++ d ++ "\n\n" ++ p ++ " ") _ -> return "" where d = (trim (takeWhile (/= '|') text)) runqBookIncludeAction :: String -> ImperativeMonad () runqBookIncludeAction dir = do t <- liftIO $ B.readFile (dir "bookinput") let (cfg, wurl, text, acu, ad, fu) = (case S.decode t of Right k -> k :: (FullConfig, WikiUrl, String, Either [FilePath] [Anything Char], [(Map String Contributor)], FullWikiUrl); _ -> undefined) oldst <- get put oldst {loadacu = acu, fullUrl = fu} _ <- qBookIncludeActionbase cfg wurl text st <- get liftIO $ B.writeFile (dir "bookoutput") (S.encode (loadacu st, (audict st) ++ ad)) qBookIncludeActionbase :: FullConfig -> WikiUrl -> String -> ImperativeMonad String qBookIncludeActionbase cfg wurl text = if isInfixOf "Vorlage" text then return ("{{" ++ text ++ "}}") else if (isInfixOf "Category:" text) || (isInfixOf "Kategorie:" text) then return "" else do pp <- (liftIO (print d)) >> myfun case pp of Just p -> do _ <- addContributors d Nothing x <- noinclude wurl ("\n\ndhunparserurl " ++ d ++ "\n\n" ++ p) st <- get systempdir <- liftIO getTemporaryDirectory tempdir <- liftIO $ createTempDirectory systempdir "MediaWiki2LaTeXParser" liftIO $ Tools.writeFile (tempdir "input") x _ <- liftIO $ system ( "mediawiki2latex -x " ++ (Hex.hex (show (fullconfigbase {compile = Just tempdir, runMode = runMode cfg, latexTables = latexTables cfg}))) ) case (loadacu st) of Right base -> do t <- liftIO $ B.readFile (tempdir "output") put st {loadacu = Right ((case S.decode t of Right k -> k; _ -> []) ++ base :: [Anything Char])} Left base -> put st {loadacu = Left (tempdir : base)} return x _ -> return "" where d = (trim (takeWhile (/= '|') text)) myfun = case (runMode cfg) of HTML _ -> liftIO (getBookpage d (wurl)) (ExpandedTemplates _) -> (loadMediaWiki d wurl) >>= (return . Just) _ -> (loadPlain d wurl Nothing) >>= (return . Just) qBookIncludeAction :: FullConfig -> WikiUrl -> String -> ImperativeMonad String qBookIncludeAction cfg wurl text = do sst <- get case (loadacu sst) of Right _ -> if isInfixOf "Vorlage" text then return ("{{" ++ text ++ "}}") else if (isInfixOf "Category:" text) || (isInfixOf "Kategorie:" text) then return "" else if (noparent cfg) && case text of { '/' : _ -> False; _ -> True } && (fromMaybe False (wurl >>= (return . not . ((flip Data.List.isPrefixOf) text) . (intercalate "/") . (Data.List.dropWhile (== "wiki")) . (splitOn "/") . url_path . fst))) then return "" else do pp <- (liftIO (print d)) >> myfun case pp of Just p -> do _ <- addContributors d Nothing x <- noinclude wurl ("\n\ndhunparserurl " ++ d ++ "\n\n" ++ p) st <- get systempdir <- liftIO getTemporaryDirectory tempdir <- liftIO $ createTempDirectory systempdir "MediaWiki2LaTeXParser" liftIO (Tools.writeFile (tempdir "input") x) _ <- liftIO $ system ("mediawiki2latex -x " ++ (Hex.hex (show (fullconfigbase {compile = Just tempdir, runMode = runMode cfg})))) case (loadacu st) of Right base -> do t <- liftIO $ B.readFile (tempdir "output") put st {loadacu = Right ((case S.decode t of Right k -> k; _ -> []) ++ base :: [Anything Char])} Left base -> put st {loadacu = Left (tempdir : base)} return x _ -> return "" Left _ -> if isInfixOf "Vorlage" text then return ("{{" ++ text ++ "}}") else if (isInfixOf "Category:" text) || (isInfixOf "Kategorie:" text) then return "" else if (noparent cfg) && case text of { '/' : _ -> False; _ -> True } && (fromMaybe False (wurl >>= (return . not . ((flip Data.List.isPrefixOf) text) . (intercalate "/") . (Data.List.dropWhile (== "wiki")) . (splitOn "/") . url_path . fst))) then return "" else do systempdir <- liftIO getTemporaryDirectory tempdir <- liftIO $ createTempDirectory systempdir "MediaWiki2LaTeXBook" liftIO $ B.writeFile (tempdir "bookinput") (S.encode (cfg, wurl, text, loadacu sst, audict sst, fullUrl sst)) _ <- liftIO $ system ("mediawiki2latex -x " ++ (Hex.hex (show (fullconfigbase {convert = Just (NewLoad tempdir)})))) t <- liftIO $ B.readFile (tempdir "bookoutput") oldst <- get let (acu, au) = (case S.decode t of Right k -> k :: (Either [FilePath] [Anything Char], [(Map String Contributor)]); _ -> (Right [], [])) put oldst {loadacu = acu, audict = au} return [] where d = (trim (takeWhile (/= '|') text)) myfun = case (runMode cfg) of HTML _ -> liftIO (getBookpage d (wurl)) (ExpandedTemplates _) -> (loadMediaWiki d wurl) >>= (return . Just) _ -> (loadPlain d wurl Nothing) >>= (return . Just) makeUrl :: String -> String -> String -> [Char] makeUrl llang theFam thePage = (unify . exportURL) ( if isInfixOf "commons" llang then ( URL { url_path = "~daniel/WikiSense/Contributors.php", url_params = [ ("wikifam", "commons.wikimedia.org"), ("page", thePage), ("since", ""), ("until", ""), ("grouped", "on"), ("hideanons", "on"), ("max", "100000"), ("format", "html") ], url_type = Absolute ( Host { protocol = HTTP True, host = "toolserver.org", port = Nothing } ) } ) else ( URL { url_path = "~daniel/WikiSense/Contributors.php", url_params = [ ("wikilang", llang), ("wikifam", theFam), ("page", thePage), ("since", ""), ("until", ""), ("grouped", "on"), ("hideanons", "on"), ("max", "100000"), ("format", "html") ], url_type = Absolute ( Host { protocol = HTTP True, host = "toolserver.org", port = Nothing } ) } ) ) langau :: Map String String langau = fromList [ ("hi", "\2354\2375\2326\2325"), ("ja", "\33879\32773"), ("pl", "Autorzy"), ("lo", "\3737\3761\3713\3739\3760\3742\3761\3737"), ("fi", "Tekij\228"), ("sv", "F\246rfattare"), ("pt", "Autores"), ("ru", "\1040\769\1074\1090\1086\1088\1099"), ("ko", "\51200\51088"), ("tr", "Yazar"), ("sk", "Avtor"), ("hy", "\1344\1381\1394\1387\1398\1377\1391"), ("lt", "Autorius"), ("ta", "\2986\2975\3016\2986\3021\2986\3006\2995\2992\3021"), ("en", "Contributors"), ("ro", "Autor"), ("it", "Autori"), ("hr", "\192utor"), ("vo", "Lautan"), ("eo", "Verkinto"), ("hu", "Szerz\337"), ("is", "H\246fundur"), ("gd", "\217ghdar"), ("de", "Autoren"), ("ca", "Autor"), ("el", "\931\965\947\947\961\945\966\941\945\962"), ("bg", "\1040\1074\1090\1086\1088"), ("ce", "\1071\1079\1076\1072\1088\1093\1086"), ("nl", "Auteurs"), ("es", "Autores"), ("eu", "Egile"), ("fr", "Auteurs"), ("cs", "Autor"), ("br", "Aozer") ] makeHeader :: FullWikiUrl -> Maybe String -> [Char] makeHeader fullurl m = let mmm = m >>= (\yy -> Map.lookup yy langau) in "\\chapter{" ++ ( case mmm `mplus` ( case splitOn "." (hostname fullurl) of (x : _) -> Map.lookup x langau _ -> Nothing ) `mplus` (Map.lookup "en" langau) of Just x -> x _ -> "Contributors" ) ++ "}\n" ++ "\\label{Contributors}\n" ++ "\\begin{longtable}{rp{0.6\\linewidth}}\n" ++ "\\textbf{Edits}&\\textbf{User}\\\\\n" makeHeaderHTML :: FullWikiUrl -> Maybe String -> [Char] makeHeaderHTML fullurl m = let mmm = m >>= (\yy -> Map.lookup yy langau) in "

    " ++ ( case mmm `mplus` ( case splitOn "." (hostname fullurl) of (x : _) -> Map.lookup x langau _ -> Nothing ) `mplus` (Map.lookup "en" langau) of Just x -> x _ -> "Contributors" ) ++ "

    \n" ++ "" ++ "" makeBody :: (Ord t) => Map t Contributor -> URL -> [Char] makeBody m u = concat (map go (sort (toList m))) where fun ('/' : xs) = xs fun xs = xs go (_, v) = (show (edits v)) ++ "& \\mycontributorhref{" ++ ( concat (map chartransforlink (exportURL (u {url_path = (fun (href v))}))) ) ++ "}{" ++ (concat (map chartrans (name v))) ++ "}\\\\\n" makeBodyHTML :: (Ord t) => Map t Contributor -> URL -> [Char] makeBodyHTML m u = concat (map go (sort (toList m))) where fun ('/' : xs) = xs fun xs = xs go (_, v) = "" makeContributors :: Maybe URL -> ImperativeMonad (String, String) makeContributors uu = do st <- get li <- liftIO (return (audict st)) let myaudict = contribsum li let theUrl = case uu of Just u -> exportURL u _ -> makeUrl3 (lemma (fullUrl st)) (hostname (fullUrl st)) yy <- liftIO $ geturl theUrl let llang = case (deepGet2 "html" (parseHtml yy)) of ((Environment Tag (TagAttr _ m) _) : []) -> Map.lookup "lang" m _ -> Nothing return ( ( (makeHeader (fullUrl st) llang) ++ (makeBody (myaudict) (url (fullUrl st))) ++ "\\end{longtable}\n" ++ "\\pagebreak\n" ), (makeHeaderHTML (fullUrl st) llang) ++ (makeBodyHTML (myaudict) (url (fullUrl st))) ++ "
    EditsUser
    " ++ (show (edits v)) ++ "" ++ (concat (map chartrans (name v))) ++ "
    " ) parseUrl :: String -> ImperativeMonad FullWikiUrl parseUrl u = case analyseFull u of Just x -> return x _ -> throwError (WikiUrlParseError u) getContributors :: [String] -> ImperativeMonad (([(Map String Contributor)], [(Maybe String)])) getContributors u = do st <- get stz <- liftIO imperativeStateZero put stz au <- mapM go u newState <- get put st rr <- liftIO (return (audict newState, au)) return rr where go uu = do purl <- parseUrl uu sst <- get put sst {fullUrl = purl} addContributors (lemma purl) (Just (UrlAnalyse.url purl)) addContributors :: [Char] -> Maybe URL -> ImperativeMonad ((Maybe String)) addContributors theLemma uu = do sst <- get let st = fullUrl sst thetheLemma <- liftIO $ return theLemma thetheHostname <- liftIO $ return (hostname st) thetheUU <- liftIO $ return uu au <- (liftIO ((((fun sst)) thetheLemma thetheHostname thetheUU))) :: ImperativeMonad ((Map String Contributor, Maybe String)) auau <- liftIO (((return . fst)) au) lic <- liftIO (((return . snd)) au) put sst {audict = auau : (audict sst)} return lic where fun ssst lem ho uuu = do xx <- simpleContributors lem ho uuu ssst return (Data.List.foldl runGo2 Map.empty xx, myvalue xx) runGo2 mymap (author, theHref, theEdits, _) = Map.alter (infun author theHref (fromIntegral theEdits)) author mymap myvalue yy = case yy of [(_, __, _, Just lic)] -> (Just lic) _ -> Nothing infun :: String -> String -> Integer -> Maybe Contributor -> Maybe Contributor infun a h e xx = case xx of Nothing -> Just Contributor {name = a, href = h, edits = e} Just old -> Just old {edits = (edits old) + e} noinclude :: t -> String -> ImperativeMonad [Char] noinclude wurl = runAction "" "" (zeroAction wurl) runActions :: WikiUrl -> String -> String -> ImperativeMonad String runActions wurl lema text = do x <- noinclude wurl text y <- runAction "{{Druckversion Kapitel|" "}}" (chapterAction3 wurl lema) x v <- runAction "{{Print entry|" "}}" (chapterAction2 wurl lema) y z <- runAction "{{print entry|" "}}" (chapterAction2 wurl lema) v a <- runAction "{{Print entry|" "}}" (chapterAction wurl) z b <- runAction "{{:" "}}" (includeAction wurl) a c <- runAction "{{:" "}}" (qIncludeAction wurl) b d <- runAction "{{:" "}}" (qIncludeAction wurl) c e <- runAction "{{:" "}}" (qIncludeAction wurl) d f <- runAction "{{:" "}}" (qIncludeAction wurl) e g <- runAction "{{:" "}}" (qIncludeAction wurl) f h <- runAction "{{:" "}}" (qIncludeAction wurl) g i <- runAction "{{:" "}}" (qIncludeAction wurl) h j <- runAction "{{:" "}}" (qIncludeAction wurl) i k <- runAction "{{:" "}}" (qIncludeAction wurl) j runAction "{{:" "}}" (qIncludeAction wurl) k runBookActions :: FullWikiUrl -> String -> FullConfig -> ImperativeMonad String runBookActions fu text cfg = do x <- noinclude wurl text runAction "[[" "]]" (qBookIncludeAction cfg wurl) x where wurl = wikiUrl fu replacements :: String -> String replacements x = replace2 ( replace2 ( replace2 ( replace2 x "[[Image:Nuvola apps noatun.png|left|20px|Aufgabe]]" "{{Ubung}}" ) "[[Image:Yes_check.svg|12px]]" "{{TickYes}}" ) "{{col-break}}" "\n|" ) "{{Fortran:Vorlage: Table}}" "prettytable" loadPlain :: String -> WikiUrl -> Maybe URL -> ImperativeMonad [Char] loadPlain lema wurl uu = do pp <- liftIO (getpage lema wurl) case pp of Just p -> do _ <- addContributors lema uu runActions wurl lema p _ -> throwError (DownloadError lema (show wurl)) loadBook :: ImperativeState -> Maybe URL -> FullConfig -> ImperativeMonad [Char] loadBook st uu cfg = let fu = fullUrl st in do pp <- liftIO (getpage (lemma fu) (wikiUrl fu)) case pp of Just p -> do _ <- addContributors (lemma fu) uu runBookActions fu p cfg _ -> throwError (DownloadError (lemma fu) (exportURL (url fu))) loadHTML :: ImperativeState -> ImperativeMonad String loadHTML st = let fu = fullUrl st in do midst <- get (res, newst) <- liftIO (runStateT (runExceptT (loadPlain (lemma (fullUrl st)) (wikiUrl (fullUrl st)) (Just (url fu)))) midst) case res of Right _ -> put newst _ -> return () x <- liftIO (geturl2 (exportURL (url fu))) return ("\n\ndhunparserurl " ++ (lemma (fullUrl st)) ++ "\n\n" ++ ((C.decode . unpack) x)) loadHTMLnoQuote :: ImperativeState -> ImperativeMonad String loadHTMLnoQuote st = let fu = fullUrl st in do x <- liftIO (geturl2 (exportURL (url fu))) return . C.decode . unpack $ x loadBookHTML :: ImperativeState -> ImperativeMonad String loadBookHTML st = let fu = fullUrl st in do midst <- get (res, newst) <- liftIO (runStateT (runExceptT (loadPlain (lemma (fullUrl st)) (wikiUrl (fullUrl st)) (Just (url fu)))) midst) case res of Right _ -> put newst _ -> return () x <- liftIO (geturl2 (exportURL (url fu))) return . C.decode . unpack $ x loadMediaWiki :: String -> WikiUrl -> ImperativeMonad [Char] loadMediaWiki lema wurl = do pp <- liftIO (getpage2 lema wurl) case pp of Just (ss, u) -> do _ <- addContributors lema Nothing s <- liftIO ( getExpandedPage lema ( replace2 ( replace2 (replace2 ss "" "dhunrefclosedhun" ) u ) case s of Just sss -> return ( multireplace sss [ ("<", "<"), (">", ">"), ("&", "&"), ("dhunrefopendhun", "") ] ) _ -> do liftIO (print "Error") throwError (DownloadError lema (show wurl)) _ -> throwError (DownloadError lema (show wurl)) -- | main function to download images form the wiki. It takes the RunMode as -- only parameter. In case of HTML the html from the website is loaded. In all -- other cases the wiki source text is downloaded. In case of ExpandedTemplates -- the templates are also expanded by mediawiki running on the wiki website load :: FullConfig -> ImperativeMonad String load cfg = do st <- get case (runMode cfg) of HTML Yes -> do if (outputType cfg) `Data.List.elem` [ZipArchive, PlainPDF] then put (st {loadacu = Left []}) else return () loadBook st Nothing cfg UserTemplateFile Yes _ -> loadBook st Nothing cfg StandardTemplates Yes -> loadBook st Nothing cfg ExpandedTemplates Yes -> loadBook st Nothing cfg HTML No -> loadHTML st UserTemplateFile No _ -> loadPlain (lemma (fullUrl st)) (wikiUrl (fullUrl st)) Nothing StandardTemplates No -> loadPlain (lemma (fullUrl st)) (wikiUrl (fullUrl st)) Nothing ExpandedTemplates No -> loadMediaWiki (lemma (fullUrl st)) (wikiUrl (fullUrl st)) mediawiki2latex-8.29/src/MagicStrings.hs000066400000000000000000001122701504464363500202710ustar00rootroot00000000000000-- | This module provides string constants module MagicStrings where import Data.Char import Data.List.Split import qualified Data.Map as Map import qualified Data.Set as Set import Network.URI -- | HTML color names htmlColorNames :: -- | A set of strings. Each string represents a valid HTML color. Set.Set String htmlColorNames = Set.fromList ["AliceBlue", "aliceblue", "AntiqueWhite", "antiquewhite", "Aqua", "aqua", "Aquamarine", "aquamarine", "Azure", "azure", "Beige", "beige", "Bisque", "bisque", "Black", "black", "BlanchedAlmond", "blanchedalmond", "Blue", "blue", "BlueViolet", "blueviolet", "Brown", "brown", "BurlyWood", "burlywood", "CadetBlue", "cadetblue", "Chartreuse", "chartreuse", "Chocolate", "chocolate", "Coral", "coral", "CornflowerBlue", "cornflowerblue", "Cornsilk", "cornsilk", "Crimson", "crimson", "Cyan", "cyan", "DarkBlue", "darkblue", "DarkCyan", "darkcyan", "DarkGoldenRod", "darkgoldenrod", "DarkGray", "darkgray", "DarkGreen", "darkgreen", "DarkKhaki", "darkkhaki", "DarkMagenta", "darkmagenta", "DarkOliveGreen", "darkolivegreen", "Darkorange", "darkorange", "DarkOrchid", "darkorchid", "DarkRed", "darkred", "DarkSalmon", "darksalmon", "DarkSeaGreen", "darkseagreen", "DarkSlateBlue", "darkslateblue", "DarkSlateGray", "darkslategray", "DarkTurquoise", "darkturquoise", "DarkViolet", "darkviolet", "DeepPink", "deeppink", "DeepSkyBlue", "deepskyblue", "DimGray", "dimgray", "DodgerBlue", "dodgerblue", "FireBrick", "firebrick", "FloralWhite", "floralwhite", "ForestGreen", "forestgreen", "Fuchsia", "fuchsia", "Gainsboro", "gainsboro", "GhostWhite", "ghostwhite", "Gold", "gold", "GoldenRod", "goldenrod", "Gray", "gray", "Green", "green", "GreenYellow", "greenyellow", "HoneyDew", "honeydew", "HotPink", "hotpink", "IndianRed", "indianred", "Indigo", "indigo", "Ivory", "ivory", "Khaki", "khaki", "Lavender", "lavender", "LavenderBlush", "lavenderblush", "LawnGreen", "lawngreen", "LemonChiffon", "lemonchiffon", "LightBlue", "lightblue", "LightCoral", "lightcoral", "LightCyan", "lightcyan", "LightGoldenRodYellow", "lightgoldenrodyellow", "LightGrey", "lightgrey", "LightGreen", "lightgreen", "LightPink", "lightpink", "LightSalmon", "lightsalmon", "LightSeaGreen", "lightseagreen", "LightSkyBlue", "lightskyblue", "LightSlateGray", "lightslategray", "LightSteelBlue", "lightsteelblue", "LightYellow", "lightyellow", "Lime", "lime", "LimeGreen", "limegreen", "Linen", "linen", "Magenta", "magenta", "Maroon", "maroon", "MediumAquaMarine", "mediumaquamarine", "MediumBlue", "mediumblue", "MediumOrchid", "mediumorchid", "MediumPurple", "mediumpurple", "MediumSeaGreen", "mediumseagreen", "MediumSlateBlue", "mediumslateblue", "MediumSpringGreen", "mediumspringgreen", "MediumTurquoise", "mediumturquoise", "MediumVioletRed", "mediumvioletred", "MidnightBlue", "midnightblue", "MintCream", "mintcream", "MistyRose", "mistyrose", "Moccasin", "moccasin", "NavajoWhite", "navajowhite", "Navy", "navy", "OldLace", "oldlace", "Olive", "olive", "OliveDrab", "olivedrab", "OliveGreen", "olivegreen", "Orange", "orange", "OrangeRed", "orangered", "Orchid", "orchid", "PaleGoldenRod", "palegoldenrod", "PaleGreen", "palegreen", "PaleTurquoise", "paleturquoise", "PaleVioletRed", "palevioletred", "PapayaWhip", "papayawhip", "PeachPuff", "peachpuff", "Peru", "peru", "Pink", "pink", "Plum", "plum", "PowderBlue", "powderblue", "Purple", "purple", "Red", "red", "RosyBrown", "rosybrown", "RoyalBlue", "royalblue", "SaddleBrown", "saddlebrown", "Salmon", "salmon", "SandyBrown", "sandybrown", "SeaGreen", "seagreen", "SeaShell", "seashell", "Sienna", "sienna", "Silver", "silver", "SkyBlue", "skyblue", "SlateBlue", "slateblue", "SlateGray", "slategray", "Snow", "snow", "SpringGreen", "springgreen", "SteelBlue", "steelblue", "Tan", "tan", "Teal", "teal", "Thistle", "thistle", "Tomato", "tomato", "Turquoise", "turquoise", "Violet", "violet", "Wheat", "wheat", "White", "white", "WhiteSmoke", "whitesmoke", "Yellow", "yellow", "YellowGreen", "yellowgreen", "shadecolor", "mydarkgreen"] -- | Wikimedia project prefixes so 'de' from de.wikipedia.org foreignPrefixes :: -- | List of the country prefixes in Wikimedia project. [String] foreignPrefixes = [ "af", "als", "an", "roa-rup", "ast", "gn", "av", "ay", "az", "id", "ms", "bm", "zh-min-nan", "jv", "map-bms", "su", "bug", "bi", "bar", "bs", "br", "ca", "cbk-zam", "ch", "cs", "ny", "sn", "tum", "ve", "co", "za", "cy", "da", "pdc", "de", "nv", "na", "lad", "et", "ang", "en", "es", "eo", "ext", "eu", "to", "fo", "fr", "frp", "fy", "ff", "fur", "ga", "gv", "sm", "gd", "gl", "got", "hak", "haw", "hsb", "hr", "io", "ilo", "ig", "ia", "ie", "ik", "xh", "zu", "is", "it", "mh", "kl", "pam", "csb", "kw", "kg", "ki", "rw", "ky", "rn", "sw", "ht", "ku", "ksh", "la", "lv", "lb", "lt", "lij", "li", "ln", "jbo", "lg", "lmo", "hu", "mg", "mt", "mi", "cdo", "my", "nah", "fj", "nl", "cr", "ne", "nap", "pih", "no", "nn", "nrm", "oc", "om", "ng", "pag", "pi", "pap", "pms", "nds", "pl", "pt", "ty", "ro", "rmy", "rm", "qu", "se", "sg", "sc", "sco", "st", "tn", "sq", "scn", "simple", "ceb", "ss", "sk", "sl", "so", "sh", "fi", "sv", "tl", "tt", "tet", "vi", "tpi", "chy", "tr", "tk", "tw", "vec", "vo", "fiu-vro", "wa", "vls", "war", "wo", "ts", "yo", "bat-smg", "el", "ab", "ba", "be", "bg", "bxr", "cu", "os", "kk", "kv", "mk", "mn", "ce", "ru", "sr", "tg", "udm", "uk", "uz", "xal", "cv", "hy", "ka", "he", "yi", "ar", "fa", "ha", "ps", "sd", "ur", "ug", "arc", "dv", "as", "bh", "bn", "bo", "bpy", "dz", "gu", "hi", "kn", "ks", "ml", "mr", "ne", "new", "or", "pa", "sa", "si", "ta", "te", "km", "lo", "th", "am", "ti", "iu", "chr", "ko", "ja", "zh", "wuu", "lzh", "yue" ] -- | Wikimedia projects for interwiki links [[w:Foobar]] means -- en.wikipedia.org/wiki/Foobar multilangwikis :: -- | List of tuples. The second element of each tuple is the name of a -- wikimedia project that is available in several languages. The first element -- of the tuple is its respective acronym. [(String, String)] multilangwikis = ( [ ("w", "wikipedia"), ("wikipedia", "wikipedia"), ("wikt", "wiktionary"), ("wiktionary", "wiktionary") ] ++ [ ("n", "wikinews"), ("wikinews", "wikinews"), ("b", "wikibooks"), ("wikibooks", "wikibooks"), ("q", "wikiquote") ] ++ [ ("wikiquote", "wikiquote"), ("s", "wikisource"), ("wikisource", "wikisource"), ("species", "wikispecies") ] ++ [ ("wikispecies", "wikispecies"), ("v", "wikiversity"), ("wikiversity", "wikiversity") ] ) -- | Wikimedia projects for interwiki links to wikis which only have got a -- single language version singlelangwikis :: -- | List of tuples. The second element of each tuple is the name of a -- wikimedia project that is available in only one language. The first element -- of the tuple is its respective acronym. [(String, String)] singlelangwikis = [ ("wikimedia", "wikimediafoundation"), ("foundation", "wikimediafoundation"), ("wmf", "wikimediafoundation"), ("mw", "mediawiki") ] -- | Wikimedia projects for interwiki links to wikis which only have got a -- single language version wikimediasingellangwikis :: -- | List of tuples. The second element of each tuple is the name of a -- wikimedia project that is available in only one language. The first element -- of the tuple is its respective acronym. [(String, String)] wikimediasingellangwikis = [ ("commons", "commons"), ("metawikipedia", "meta"), ("meta", "meta"), ("m", "meta"), ("incubator", "incubator"), ("strategy", "strategy") ] -- | All Wikis allwikis :: -- | List of tuples. The second element of each tuple is the name of a -- wikimedia wki project. The first element of the tuple is its respective -- acronym. [(String, String)] allwikis = multilangwikis ++ singlelangwikis ++ wikimediasingellangwikis -- | Prefixes for including images in wikis imgtags :: -- | List of strings. The strings are the keywords for including images (or -- other file) in wikis in different languages [String] imgtags = [ map toLower x | x <- [ "\1589\1608\1585\1577", "Billede", "Im\225gen", "Image", "Immagine", "Bild", "Afbeelding", "Imagine", "\3619\3641\3611", "\22270\20687", "\1605\1604\1601", "Fil", "Archivo", "File", "Datei", "Bestand", "Fisier", "\3652\3615\3621\3660", "\25991\20214", "Fichier", "\1605\1604\1601", "Archiv", "\1060\1072\1081\1083", "\2458\2495\2468\2509\2480", "Datoteka", "Fitxer", "Image", "So", "Delwedd", "Fil", "Datei", "\913\961\967\949\943\959", "Dosiero", "Archivo", "Pilt", "\1662\1585\1608\1606\1583\1607", "Tiedosto", "Fichier", "\205omh\225", "\1511\1493\1489\1509", "Datoteka", ": ", "Berkas", "Video", "\12501\12449\12452\12523", "Gambar", "\4324\4304\4312\4314\4312", "\6063\6016\6047\6070\6042", "\54028\51068", "Fascic", "Fichier", "Plaetje", "\3758\3769\3738", "Vaizdas", "Att\275ls", "Image", "Sary", "\1055\1086\1076\1072\1090\1086\1090\1077\1082\1072", "Fi\351ier", "Fail", "Bestand", "Fil", "Fil", "Fichi\232r", "Plik", "Imagem", "Fi\351ier", ": ", "S\250bor", "Slika", "\1057\1083\1080\1082\1072", "Bild", "\3652\3615\3621\3660", "Talaksan", "Dosya", "\1496\1506\1511\1506", "\22294\20687", "\22294\20687" ] ] -- | lowercase Greek letter for HTML entity to latex so δ to \\delta lowergreek :: -- | List of strings. Each string is a Greek letter. [String] lowergreek = [ "alpha", "beta", "gamma", "delta", "epsilon", "zeta", "eta", "theta", "iota", "kappa", "lambda", "mu", "nu", "xi", "pi", "rho", "sigma", "tau", "upsilon", "phi", "chi", "psi", "omega" ] -- | not Greek but to be processed like the Greeks above notsogreek :: -- | List of strings. Each string is a mathematical symbol that can processed -- like a greek letter in HTML to LaTeX conversion. So ∩ gets turned into -- \\cap just the same way as δ gets turned into \\delta. [String] notsogreek = ["cap", "cup", "sim"] -- | Full list of characters with Greek like processing explained above greek :: -- | List of strings. Each string is either a Greek letter or mathematical -- symbol that can be processed similar to a Greek letter. Both uppercase and -- lowercase Greek letters are part of this list. [String] greek = concat ( do g <- lowergreek case g of (x : xs) -> return [(toUpper x) : xs] [] -> return [] ) ++ lowergreek ++ notsogreek -- | HTML entities to latex htmlchars :: -- | List of tuples. The first element of each tuple is a HMTL entity (for -- example forall as first element of the tuple and represents the HTML entity -- ∀). The second element of each tuple is the corresponding LaTeX -- notation for the respective HTML entity. [(String, String)] htmlchars = [ ("thetasym", "{\\mbox{$\\vartheta$}}"), ("Upsilon", "{\\mbox{$\\Upsilon$}}"), ("epsilon", "{\\mbox{$\\varepsilon$}}"), ("upsilon", "{\\mbox{$\\upsilon$}}"), ("Epsilon", "{\\mbox{$\\Epsilon$}}"), ("Omicron", "{\\mbox{$\\text{O}$}}"), ("omicron", "{\\mbox{$\\text{o}$}}"), ("forall", "{\\mbox{$\\forall$}}"), ("lowast", "{\\mbox{$\\ast$}}"), ("there4", "{\\mbox{$\\therefore$}}"), ("otimes", "{\\mbox{$\\otimes$}}"), ("Lambda", "{\\mbox{$\\Lambda$}}"), ("lambda", "{\\mbox{$\\lambda$}}"), ("sigmaf", "{\\mbox{$\\varsigma$}}"), ("dagger", "{\\mbox{$\\dagger$}}"), ("Dagger", "{\\mbox{$\\ddagger$}}"), ("hellip", "{\\mbox{$\\ldots$}}"), ("lfloor", "{\\mbox{$\\lfloor$}}"), ("rfloor", "{\\mbox{$\\rfloor$}}"), ("spades", "{\\mbox{$\\spadesuit$}}"), ("hearts", "{\\mbox{$\\varheartsuit$}}"), ("plusmn", "{\\mbox{$\\pm$}}"), ("divide", "{\\mbox{$\\div$}}"), ("Scaron", "{\\mbox{$\\text{\\v{S}}$}}"), ("scaron", "{\\mbox{$\\text{\\v{s}}$}}"), ("thinsp", "{\\mbox{$\\,$}}"), ("permil", "{\\mbox{$\\text{\\textperthousand}$}}"), ("lsaquo", "{\\mbox{$\\text{\\guilsinglleft}$}}"), ("rsaquo", "{\\mbox{$\\text{\\guilsinglright}$}}"), ("curren", "{\\mbox{$\\text{\\currency}$}}"), ("brvbar", "{\\mbox{$\\text{\\textbrokenbar}$}}"), ("middot", "{\\mbox{$\\cdot$}}"), ("frac14", "{\\mbox{$\\frac{1}{4}$}}"), ("frac12", "{\\mbox{$\\frac{1}{2}$}}"), ("frac34", "{\\mbox{$\\frac{3}{4}$}}"), ("iquest", "{\\mbox{$\\text{\\textquestiondown}$}}"), ("Agrave", "{\\mbox{$\\text{\\`A}$}}"), ("Aacute", "{\\mbox{$\\text{\\'A}$}}"), ("Atilde", "{\\mbox{$\\text{\\~A}$}}"), ("Ccedil", "{\\mbox{$\\text{\\c{C}}$}}"), ("Egrave", "{\\mbox{$\\text{\\`E}$}}"), ("Eacute", "{\\mbox{$\\text{\\'E}$}}"), ("Igrave", "{\\mbox{$\\text{\\`I}$}}"), ("Iacute", "{\\mbox{$\\text{\\'I}$}}"), ("Ntilde", "{\\mbox{$\\text{\\~N}$}}"), ("Ograve", "{\\mbox{$\\text{\\`O}$}}"), ("Oacute", "{\\mbox{$\\text{\\'O}$}}"), ("Otilde", "{\\mbox{$\\text{\\~O}$}}"), ("Oslash", "{\\mbox{$\\O$}}"), ("Ugrave", "{\\mbox{$\\text{\\`U}$}}"), ("Uacute", "{\\mbox{$\\text{\\'U}$}}"), ("Yacute", "{\\mbox{$\\text{\\'Y}$}}"), ("agrave", "{\\mbox{$\\text{\\`a}$}}"), ("aacute", "{\\mbox{$\\text{\\'a}$}}"), ("atilde", "{\\mbox{$\\text{\\~a}$}}"), ("ccedil", "{\\mbox{$\\text{\\c{c}}$}}"), ("egrave", "{\\mbox{$\\text{\\`e}$}}"), ("eacute", "{\\mbox{$\\text{\\'e}$}}"), ("igrave", "{\\mbox{$\\text{\\`i}$}}"), ("iacute", "{\\mbox{$\\text{\\'i}$}}"), ("ntilde", "{\\mbox{$\\text{\\~n}$}}"), ("ograve", "{\\mbox{$\\text{\\`o}$}}"), ("oacute", "{\\mbox{$\\text{\\'o}$}}"), ("otilde", "{\\mbox{$\\text{\\~o}$}}"), ("oslash", "{\\mbox{$\\o$}}"), ("ugrave", "{\\mbox{$\\text{\\`u}$}}"), ("uacute", "{\\mbox{$\\text{\\'u}$}}"), ("yacute", "{\\mbox{$\\text{\\'y}$}}"), ("#x202f", "{\\,}"), ("#8704", "{\\mbox{$\\forall$}}"), ("#8706", "{\\mbox{$\\partial$}}"), ("#8707", "{\\mbox{$\\exists$}}"), ("exist", "{\\mbox{$\\exists$}}"), ("#8709", "{\\mbox{$\\varnothing$}}"), ("empty", "{\\mbox{$\\varnothing$}}"), ("#8711", "{\\mbox{$\\nabla$}}"), ("nabla", "{\\mbox{$\\nabla$}}"), ("#8712", "{\\mbox{$\\in$}}"), ("#8713", "{\\mbox{$\\notin$}}"), ("notin", "{\\mbox{$\\notin$}}"), ("#8715", "{\\mbox{$\\ni$}}"), ("#8719", "{\\mbox{$\\prod$}}"), ("#8721", "{\\mbox{$\\sum$}}"), ("#8722", "{\\mbox{$-$}}"), ("minus", "{\\mbox{$-$}}"), ("#8727", "{\\mbox{$\\ast$}}"), ("#8730", "{\\mbox{$\\sqrt$}}"), ("radic", "{\\mbox{$\\sqrt$}}"), ("#8733", "{\\mbox{$\\propto$}}"), ("#8734", "{\\mbox{$\\infty$}}"), ("infin", "{\\mbox{$\\infty$}}"), ("#8736", "{\\mbox{$\\angle$}}"), ("#8743", "{\\mbox{$\\wedge$}}"), ("#8744", "{\\mbox{$\\vee$}}"), ("#8745", "{\\mbox{$\\cap$}}"), ("#8746", "{\\mbox{$\\cup$}}"), ("#8747", "{\\mbox{$\\int$}}"), ("#8756", "{\\mbox{$\\therefore$}}"), ("#8764", "{\\mbox{$\\sim$}}"), ("#8773", "{\\mbox{$\\cong$}}"), ("#8776", "{\\mbox{$\\approx$}}"), ("asymp", "{\\mbox{$\\approx$}}"), ("#8800", "{\\mbox{$\\neq$}}"), ("#8801", "{\\mbox{$\\equiv$}}"), ("equiv", "{\\mbox{$\\equiv$}}"), ("#8804", "{\\mbox{$\\leq$}}"), ("#8805", "{\\mbox{$\\geq$}}"), ("#8834", "{\\mbox{$\\subset$}}"), ("#8835", "{\\mbox{$\\supset$}}"), ("#8836", "{\\mbox{$\\nsubset$}}"), ("#8838", "{\\mbox{$\\subseteq$}}"), ("#8839", "{\\mbox{$\\supseteq$}}"), ("#8853", "{\\mbox{$\\oplus$}}"), ("oplus", "{\\mbox{$\\oplus$}}"), ("#8855", "{\\mbox{$\\otimes$}}"), ("#8869", "{\\mbox{$\\bot$}}"), ("#8901", "{\\mbox{$\\cdot$}}"), ("Gamma", "{\\mbox{$\\Gamma$}}"), ("Delta", "{\\mbox{$\\Delta$}}"), ("Theta", "{\\mbox{$\\Theta$}}"), ("Sigma", "{\\mbox{$\\Sigma$}}"), ("Omega", "{\\mbox{$\\Omega$}}"), ("alpha", "{\\mbox{$\\alpha$}}"), ("gamma", "{\\mbox{$\\gamma$}}"), ("delta", "{\\mbox{$\\delta$}}"), ("theta", "{\\mbox{$\\theta$}}"), ("kappa", "{\\mbox{$\\kappa$}}"), ("sigma", "{\\mbox{$\\sigma$}}"), ("omega", "{\\mbox{$\\omega$}}"), ("#8224", "{\\mbox{$\\dagger$}}"), ("#8225", "{\\mbox{$\\ddagger$}}"), ("#8230", "{\\mbox{$\\ldots$}}"), ("#8242", "{\\mbox{$\\prime$}}"), ("prime", "{\\mbox{$\\prime$}}"), ("#8243", "{\\mbox{$\\second$}}"), ("Prime", "{\\mbox{$\\second$}}"), ("#8592", "{\\mbox{$\\leftarrow$}}"), ("#8593", "{\\mbox{$\\uparrow$}}"), ("#8594", "{\\mbox{$\\rightarrow$}}"), ("#8595", "{\\mbox{$\\downarrow$}}"), ("#8596", "{\\mbox{$\\leftrightarrow$}}"), ("#8968", "{\\mbox{$\\lceil$}}"), ("lceil", "{\\mbox{$\\lceil$}}"), ("#8969", "{\\mbox{$\\rceil$}}"), ("rceil", "{\\mbox{$\\rceil$}}"), ("#8970", "{\\mbox{$\\lfloor$}}"), ("#8971", "{\\mbox{$\\rfloor$}}"), ("#9674", "{\\mbox{$\\lozenge$}}"), ("#9824", "{\\mbox{$\\spadesuit$}}"), ("#9827", "{\\mbox{$\\clubsuit$}}"), ("clubs", "{\\mbox{$\\clubsuit$}}"), ("#9829", "{\\mbox{$\\varheartsuit$}}"), ("#9830", "{\\mbox{$\\vardiamondsuit$}}"), ("diams", "{\\mbox{$\\vardiamondsuit$}}"), ("pound", "{\\mbox{$\\pounds$}}"), ("micro", "{\\mbox{$\\Micro$}}"), ("times", "{\\mbox{$\\times$}}"), ("Alpha", "{\\mbox{$\\Alpha$}}"), ("Kappa", "{\\mbox{$\\Kappa$}}"), ("upsih", "{\\mbox{$\\Upsilon$}}"), ("OElig", "{\\mbox{$\\text{\\OE}$}}"), ("oelig", "{\\mbox{$\\text{\\oe}$}}"), ("tilde", "{\\mbox{$\\text{\\~{}}$}}"), ("#8194", "{\\mbox{$\\text{ }$}}"), ("#8195", "{\\mbox{$\\text{\\hspace*{1em}}$}}"), ("#8201", "{\\mbox{$\\,$}}"), ("#8211", "{\\mbox{$-$}}"), ("ndash", "{\\mbox{$-$}}"), ("#8212", "{\\mbox{$\\text{---}$}}"), ("mdash", "{\\mbox{$\\text{---}$}}"), ("#8216", "{\\mbox{$\\text{\\textquoteleft}$}}"), ("lsquo", "{\\mbox{$\\text{\\textquoteleft}$}}"), ("#8217", "{\\mbox{$\\text{\\textquoteright}$}}"), ("rsquo", "{\\mbox{$\\text{\\textquoteright}$}}"), ("#8218", "{\\mbox{$\\text{\\quotesinglbase}$}}"), ("sbquo", "{\\mbox{$\\text{\\quotesinglbase}$}}"), ("#8220", "{\\mbox{$\\text{\\textquotedblleft}$}}"), ("ldquo", "{\\mbox{$\\text{\\textquotedblleft}$}}"), ("#8221", "{\\mbox{$\\text{\\textquotedblright}$}}"), ("rdquo", "{\\mbox{$\\text{\\textquotedblright}$}}"), ("#8222", "{\\mbox{$\\text{\\quotedblbase}$}}"), ("bdquo", "{\\mbox{$\\text{\\quotedblbase}$}}"), ("#8226", "{\\mbox{$\\bullet$}}"), ("#8240", "{\\mbox{$\\text{\\textperthousand}$}}"), ("#8249", "{\\mbox{$\\text{\\guilsinglleft}$}}"), ("#8250", "{\\mbox{$\\text{\\guilsinglright}$}}"), ("#8254", "{\\mbox{$\\text{\\textasciimacron}$}}"), ("oline", "{\\mbox{$\\text{\\textasciimacron}$}}"), ("#8364", "{\\mbox{$\\text{\\EUR}$}}"), ("#8482", "{\\mbox{$\\text{\\texttrademark}$}}"), ("trade", "{\\mbox{$\\text{\\texttrademark}$}}"), ("#8629", "{\\mbox{$\\hookleftarrow$}}"), ("crarr", "{\\mbox{$\\hookleftarrow$}}"), ("iexcl", "{\\mbox{$\\text{\\textexclamdown}$}}"), ("laquo", "{\\mbox{$\\text{\\guillemotleft}$}}"), ("acute", "{\\mbox{$\\text{\\'{}}$}}"), ("cedil", "{\\mbox{$\\c{}$}}"), ("raquo", "{\\mbox{$\\text{\\guillemotright}$}}"), ("Acirc", "{\\mbox{$\\text{\\^A}$}}"), ("Aring", "{\\mbox{$\\text{\\r{A}}$}}"), ("AElig", "{\\mbox{$\\text{\\AE}$}}"), ("Ecirc", "{\\mbox{$\\text{\\^E}$}}"), ("Icirc", "{\\mbox{$\\text{\\^I}$}}"), ("Ocirc", "{\\mbox{$\\text{\\^O}$}}"), ("Ucirc", "{\\mbox{$\\text{\\^U}$}}"), ("THORN", "{\\mbox{$\\text{\\Thorn}$}}"), ("szlig", "{\\mbox{$\\text{\\ss}$}}"), ("acirc", "{\\mbox{$\\text{\\^a}$}}"), ("aring", "{\\mbox{$\\text{\\r{a}}$}}"), ("aelig", "{\\mbox{$\\text{\\ae}$}}"), ("ecirc", "{\\mbox{$\\text{\\^e}$}}"), ("icirc", "{\\mbox{$\\text{\\^i}$}}"), ("ocirc", "{\\mbox{$\\text{\\^o}$}}"), ("ucirc", "{\\mbox{$\\text{\\^u}$}}"), ("thorn", "{\\mbox{$\\text{\\thorn}$}}"), ("part", "{\\mbox{$\\partial$}}"), ("isin", "{\\mbox{$\\in$}}"), ("prod", "{\\mbox{$\\prod$}}"), ("prop", "{\\mbox{$\\propto$}}"), ("cong", "{\\mbox{$\\cong$}}"), ("nsub", "{\\mbox{$\\nsubset$}}"), ("sube", "{\\mbox{$\\subseteq$}}"), ("supe", "{\\mbox{$\\supseteq$}}"), ("perp", "{\\mbox{$\\bot$}}"), ("sdot", "{\\mbox{$\\cdot$}}"), ("#915", "{\\mbox{$\\Gamma$}}"), ("#916", "{\\mbox{$\\Delta$}}"), ("#920", "{\\mbox{$\\Theta$}}"), ("#923", "{\\mbox{$\\Lambda$}}"), ("#926", "{\\mbox{$\\Xi$}}"), ("#928", "{\\mbox{$\\Pi$}}"), ("#931", "{\\mbox{$\\Sigma$}}"), ("#933", "{\\mbox{$\\Upsilon$}}"), ("#934", "{\\mbox{$\\Phi$}}"), ("#936", "{\\mbox{$\\Psi$}}"), ("#937", "{\\mbox{$\\Omega$}}"), ("#945", "{\\mbox{$\\alpha$}}"), ("#946", "{\\mbox{$\\beta$}}"), ("beta", "{\\mbox{$\\beta$}}"), ("#947", "{\\mbox{$\\gamma$}}"), ("#948", "{\\mbox{$\\delta$}}"), ("#949", "{\\mbox{$\\varepsilon$}}"), ("#950", "{\\mbox{$\\zeta$}}"), ("zeta", "{\\mbox{$\\zeta$}}"), ("#951", "{\\mbox{$\\eta$}}"), ("#952", "{\\mbox{$\\theta$}}"), ("#953", "{\\mbox{$\\iota$}}"), ("iota", "{\\mbox{$\\iota$}}"), ("#954", "{\\mbox{$\\kappa$}}"), ("#955", "{\\mbox{$\\lambda$}}"), ("#956", "{\\mbox{$\\mu$}}"), ("#957", "{\\mbox{$\\nu$}}"), ("#958", "{\\mbox{$\\xi$}}"), ("#960", "{\\mbox{$\\pi$}}"), ("#961", "{\\mbox{$\\rho$}}"), ("#962", "{\\mbox{$\\varsigma$}}"), ("#963", "{\\mbox{$\\sigma$}}"), ("#964", "{\\mbox{$\\tau$}}"), ("#965", "{\\mbox{$\\upsilon$}}"), ("#966", "{\\mbox{$\\varphi$}}"), ("#967", "{\\mbox{$\\chi$}}"), ("#968", "{\\mbox{$\\psi$}}"), ("#969", "{\\mbox{$\\omega$}}"), ("#977", "{\\mbox{$\\vartheta$}}"), ("#982", "{\\mbox{$\\varpi$}}"), ("#402", "{\\mbox{$f$}}"), ("fnof", "{\\mbox{$f$}}"), ("larr", "{\\mbox{$\\leftarrow$}}"), ("uarr", "{\\mbox{$\\uparrow$}}"), ("rarr", "{\\mbox{$\\rightarrow$}}"), ("darr", "{\\mbox{$\\downarrow$}}"), ("harr", "{\\mbox{$\\leftrightarrow$}}"), ("varr", "{\\mbox{$\\updownarrow$}}"), ("8658", "{\\mbox{$\\Leftarrow$}}"), ("8657", "{\\mbox{$\\Uparrow$}}"), ("8656", "{\\mbox{$\\Rightarrow$}}"), ("8659", "{\\mbox{$\\Downarrow$}}"), ("8660", "{\\mbox{$\\Leftrightarrow$}}"), ("8661", "{\\mbox{$\\Updownarrow$}}"), ("8592", "{\\mbox{$\\leftarrow$}}"), ("8593", "{\\mbox{$\\uparrow$}}"), ("8594", "{\\mbox{$\\rightarrow$}}"), ("8595", "{\\mbox{$\\downarrow$}}"), ("8596", "{\\mbox{$\\leftrightarrow$}}"), ("8597", "{\\mbox{$\\updownarrow$}}"), ("lArr", "{\\mbox{$\\Leftarrow$}}"), ("uArr", "{\\mbox{$\\Uparrow$}}"), ("rArr", "{\\mbox{$\\Rightarrow$}}"), ("dArr", "{\\mbox{$\\Downarrow$}}"), ("hArr", "{\\mbox{$\\Leftrightarrow$}}"), ("vArr", "{\\mbox{$\\Updownarrow$}}"), ("#160", "{\\mbox{$~$}}"), ("nbsp", "{\\mbox{$~$}}"), ("#162", "{\\mbox{$\\cent$}}"), ("cent", "{\\mbox{$\\cent$}}"), ("#163", "{\\mbox{$\\pounds$}}"), ("#165", "{\\mbox{$\\yen$}}"), ("#168", "{\\mbox{$\\spddot$}}"), ("#172", "{\\mbox{$\\neg$}}"), ("#174", "{\\mbox{$\\circledR$}}"), ("#177", "{\\mbox{$\\pm$}}"), ("#181", "{\\mbox{$\\Micro$}}"), ("#215", "{\\mbox{$\\times$}}"), ("#247", "{\\mbox{$\\div$}}"), ("#240", "{\\mbox{$\\eth$}}"), ("#913", "{\\mbox{$\\Alpha$}}"), ("#914", "{\\mbox{$\\Beta$}}"), ("Beta", "{\\mbox{$\\Beta$}}"), ("#917", "{\\mbox{$\\Epsilon$}}"), ("#918", "{\\mbox{$\\Zeta$}}"), ("Zeta", "{\\mbox{$\\Zeta$}}"), ("#919", "{\\mbox{$\\Eta$}}"), ("#921", "{\\mbox{$\\Iota$}}"), ("Iota", "{\\mbox{$\\Iota$}}"), ("#922", "{\\mbox{$\\Kappa$}}"), ("#924", "{\\mbox{$\\Mu$}}"), ("#925", "{\\mbox{$\\Nu$}}"), ("#927", "{\\mbox{$\\text{O}$}}"), ("#929", "{\\mbox{$\\Rho$}}"), ("#932", "{\\mbox{$\\Tau$}}"), ("#935", "{\\mbox{$\\Chi$}}"), ("#959", "{\\mbox{$\\text{o}$}}"), ("#978", "{\\mbox{$\\Upsilon$}}"), ("#338", "{\\mbox{$\\text{\\OE}$}}"), ("#339", "{\\mbox{$\\text{\\oe}$}}"), ("#352", "{\\mbox{$\\text{\\v{S}}$}}"), ("#353", "{\\mbox{$\\text{\\v{s}}$}}"), ("#376", "{\\mbox{$\\text{\\\"Y}$}}"), ("Yuml", "{\\mbox{$\\text{\\\"Y}$}}"), ("#710", "{\\mbox{$\\text{\\^{}}$}}"), ("circ", "{\\mbox{$\\text{\\^{}}$}}"), ("#732", "{\\mbox{$\\text{\\~{}}$}}"), ("ensp", "{\\mbox{$\\text{ }$}}"), ("emsp", "{\\mbox{$\\text{\\hspace*{1em}}$}}"), ("bull", "{\\mbox{$\\bullet$}}"), ("euro", "{\\mbox{$\\text{\\EUR}$}}"), ("quot", "{\\mbox{$\\text{\\symbol{34}}$}}"), ("#161", "{\\mbox{$\\text{\\textexclamdown}$}}"), ("#164", "{\\mbox{$\\text{\\currency}$}}"), ("#166", "{\\mbox{$\\text{\\textbrokenbar}$}}"), ("#167", "{\\mbox{$\\text{\\S}$}}"), ("sect", "{\\mbox{$\\text{\\S}$}}"), ("#169", "{\\mbox{$\\copyright$}}"), ("copy", "{\\mbox{$\\copyright$}}"), ("#170", "{\\mbox{$\\text{\\textordfeminine{}}$}}"), ("ordf", "{\\mbox{$\\text{\\textordfeminine{}}$}}"), ("#171", "{\\mbox{$\\text{\\guillemotleft}$}}"), ("#173", "{\\mbox{$\\text{\\-}$}}"), ("#175", "{\\mbox{$\\text{\\textasciimacron}$}}"), ("macr", "{\\mbox{$\\text{\\textasciimacron}$}}"), ("#176", "{\\mbox{$^\\circ$}}"), ("#178", "{\\mbox{${}^2$}}"), ("sup2", "{\\mbox{${}^2$}}"), ("#179", "{\\mbox{${}^3$}}"), ("sup3", "{\\mbox{${}^3$}}"), ("#180", "{\\mbox{$\\text{\\'{}}$}}"), ("#182", "{\\mbox{$\\text{\\textparagraph}$}}"), ("para", "{\\mbox{$\\text{\\textparagraph}$}}"), ("#183", "{\\mbox{$\\cdot$}}"), ("#184", "{\\mbox{$\\c{}$}}"), ("#185", "{\\mbox{${}^1$}}"), ("sup1", "{\\mbox{${}^1$}}"), ("#186", "{\\mbox{$\\text{\\textordmasculine{}}$}}"), ("ordm", "{\\mbox{$\\text{\\textordmasculine{}}$}}"), ("#187", "{\\mbox{$\\text{\\guillemotright}$}}"), ("#188", "{\\mbox{$\\frac{1}{4}$}}"), ("#189", "{\\mbox{$\\frac{1}{2}$}}"), ("#190", "{\\mbox{$\\frac{3}{4}$}}"), ("#191", "{\\mbox{$\\text{\\textquestiondown}$}}"), ("#192", "{\\mbox{$\\text{\\`A}$}}"), ("#193", "{\\mbox{$\\text{\\'A}$}}"), ("#194", "{\\mbox{$\\text{\\^A}$}}"), ("#195", "{\\mbox{$\\text{\\~A}$}}"), ("#196", "{\\mbox{$\\text{\\\"A}$}}"), ("Auml", "{\\mbox{$\\text{\\\"A}$}}"), ("#197", "{\\mbox{$\\text{\\r{A}}$}}"), ("#198", "{\\mbox{$\\text{\\AE}$}}"), ("#199", "{\\mbox{$\\text{\\c{C}}$}}"), ("#200", "{\\mbox{$\\text{\\`E}$}}"), ("#201", "{\\mbox{$\\text{\\'E}$}}"), ("#202", "{\\mbox{$\\text{\\^E}$}}"), ("#203", "{\\mbox{$\\text{\\\"E}$}}"), ("Euml", "{\\mbox{$\\text{\\\"E}$}}"), ("#204", "{\\mbox{$\\text{\\`I}$}}"), ("#205", "{\\mbox{$\\text{\\'I}$}}"), ("#206", "{\\mbox{$\\text{\\^I}$}}"), ("#207", "{\\mbox{$\\text{\\\"I}$}}"), ("Iuml", "{\\mbox{$\\text{\\\"I}$}}"), ("#208", "{\\mbox{$\\DH$}}"), ("#209", "{\\mbox{$\\text{\\~N}$}}"), ("#210", "{\\mbox{$\\text{\\`O}$}}"), ("#211", "{\\mbox{$\\text{\\'O}$}}"), ("#212", "{\\mbox{$\\text{\\^O}$}}"), ("#213", "{\\mbox{$\\text{\\~O}$}}"), ("#214", "{\\mbox{$\\text{\\\"O}$}}"), ("Ouml", "{\\mbox{$\\text{\\\"O}$}}"), ("#216", "{\\mbox{$\\O$}}"), ("#217", "{\\mbox{$\\text{\\`U}$}}"), ("#218", "{\\mbox{$\\text{\\'U}$}}"), ("#219", "{\\mbox{$\\text{\\^U}$}}"), ("#220", "{\\mbox{$\\text{\\\"U}$}}"), ("Uuml", "{\\mbox{$\\text{\\\"U}$}}"), ("#221", "{\\mbox{$\\text{\\'Y}$}}"), ("#222", "{\\mbox{$\\text{\\Thorn}$}}"), ("#223", "{\\mbox{$\\text{\\ss}$}}"), ("#224", "{\\mbox{$\\text{\\`a}$}}"), ("#225", "{\\mbox{$\\text{\\'a}$}}"), ("#226", "{\\mbox{$\\text{\\^a}$}}"), ("#227", "{\\mbox{$\\text{\\~a}$}}"), ("#228", "{\\mbox{$\\text{\\\"a}$}}"), ("auml", "{\\mbox{$\\text{\\\"a}$}}"), ("#229", "{\\mbox{$\\text{\\r{a}}$}}"), ("#230", "{\\mbox{$\\text{\\ae}$}}"), ("#231", "{\\mbox{$\\text{\\c{c}}$}}"), ("#232", "{\\mbox{$\\text{\\`e}$}}"), ("#233", "{\\mbox{$\\text{\\'e}$}}"), ("#234", "{\\mbox{$\\text{\\^e}$}}"), ("#235", "{\\mbox{$\\text{\\\"e}$}}"), ("euml", "{\\mbox{$\\text{\\\"e}$}}"), ("#236", "{\\mbox{$\\text{\\`i}$}}"), ("#237", "{\\mbox{$\\text{\\'i}$}}"), ("#238", "{\\mbox{$\\text{\\^i}$}}"), ("#239", "{\\mbox{$\\text{\\\"i}$}}"), ("iuml", "{\\mbox{$\\text{\\\"i}$}}"), ("#241", "{\\mbox{$\\text{\\~n}$}}"), ("#242", "{\\mbox{$\\text{\\`o}$}}"), ("#243", "{\\mbox{$\\text{\\'o}$}}"), ("#244", "{\\mbox{$\\text{\\^o}$}}"), ("#245", "{\\mbox{$\\text{\\~o}$}}"), ("#246", "{\\mbox{$\\text{\\\"o}$}}"), ("ouml", "{\\mbox{$\\text{\\\"o}$}}"), ("#248", "{\\mbox{$\\o$}}"), ("#249", "{\\mbox{$\\text{\\`u}$}}"), ("#250", "{\\mbox{$\\text{\\'u}$}}"), ("#251", "{\\mbox{$\\text{\\^u}$}}"), ("#252", "{\\mbox{$\\text{\\\"u}$}}"), ("uuml", "{\\mbox{$\\text{\\\"u}$}}"), ("#253", "{\\mbox{$\\text{\\'y}$}}"), ("#254", "{\\mbox{$\\text{\\thorn}$}}"), ("#255", "{\\mbox{$\\text{\\\"y}$}}"), ("yuml", "{\\mbox{$\\text{\\\"y}$}}"), ("#10", "{\\newline}"), ("#39", "'"), ("sum", "{\\mbox{$\\sum$}}"), ("ang", "{\\mbox{$\\angle$}}"), ("and", "{\\mbox{$\\wedge$}}"), ("cap", "{\\mbox{$\\cap$}}"), ("cup", "{\\mbox{$\\cup$}}"), ("int", "{\\mbox{$\\int$}}"), ("sim", "{\\mbox{$\\sim$}}"), ("sub", "{\\mbox{$\\subset$}}"), ("sup", "{\\mbox{$\\supset$}}"), ("Phi", "{\\mbox{$\\Phi$}}"), ("Psi", "{\\mbox{$\\Psi$}}"), ("eta", "{\\mbox{$\\eta$}}"), ("rho", "{\\mbox{$\\rho$}}"), ("tau", "{\\mbox{$\\tau$}}"), ("phi", "{\\mbox{$\\varphi$}}"), ("chi", "{\\mbox{$\\chi$}}"), ("psi", "{\\mbox{$\\psi$}}"), ("piv", "{\\mbox{$\\varpi$}}"), ("loz", "{\\mbox{$\\lozenge$}}"), ("#38", "{\\mbox{$\\&$}}"), ("amp", "{\\mbox{$\\&$}}"), ("#60", "{\\mbox{$<$}}"), ("#62", "{\\mbox{$>$}}"), ("yen", "{\\mbox{$\\yen$}}"), ("uml", "{\\mbox{$\\spddot$}}"), ("not", "{\\mbox{$\\neg$}}"), ("reg", "{\\mbox{$\\circledR$}}"), ("eth", "{\\mbox{$\\eth$}}"), ("Eta", "{\\mbox{$\\Eta$}}"), ("Rho", "{\\mbox{$\\Rho$}}"), ("Tau", "{\\mbox{$\\Tau$}}"), ("Chi", "{\\mbox{$\\Chi$}}"), ("#34", "{\\mbox{$\\text{\\symbol{34}}$}}"), ("shy", "{\\mbox{$\\text{\\-}$}}"), ("deg", "{\\mbox{$^\\circ$}}"), ("ETH", "{\\mbox{$\\DH$}}"), ("ni", "{\\mbox{$\\ni$}}"), ("or", "{\\mbox{$\\vee$}}"), ("ne", "{\\mbox{$\\neq$}}"), ("le", "{\\mbox{$\\leq$}}"), ("ge", "{\\mbox{$\\geq$}}"), ("Xi", "{\\mbox{$\\Xi$}}"), ("Pi", "{\\mbox{$\\Pi$}}"), ("mu", "{\\mbox{$\\mu$}}"), ("nu", "{\\mbox{$\\nu$}}"), ("xi", "{\\mbox{$\\xi$}}"), ("pi", "{\\mbox{$\\pi$}}"), ("lt", "{\\mbox{$<$}}"), ("weierp", "{\\mbox{$\\wp$}}"), ("image", "{\\mbox{$\\Im$}}"), ("real", "{\\mbox{$\\Re$}}"), ("alefsym", "{\\mbox{$\\aleph$}}"), ("uArr", "{\\mbox{$\\Uparrow$}}"), ("rArr", "{\\mbox{$\\Rightarrow$}}"), ("dArr", "{\\mbox{$\\Downarrow$}}"), ("hArr", "{\\mbox{$\\Leftrightarrow$}}"), ("lArr", "{\\mbox{$\\Leftarrow$}}"), ("rang", "{\\mbox{$\\rangle$}}"), ("lang", "{\\mbox{$\\langle$}}"), ("zwnj", "{}"), ("zwj", ""), ("lrm", ""), ("rlm", ""), ("gt", "{\\mbox{$>$}}"), ("Mu", "{\\mbox{$\\Mu$}}"), ("#151", "{--}"), ("Nu", "{\\mbox{$\\Nu$}}"), ("frasl", "\8260") ] -- | get latex representation of HTML entity like & getHtmlChar :: -- | The HTML entity to be looked up (for example amp for the entity &). String -> -- | The LaTeX representation of the respective HTML entity. String getHtmlChar x = Map.findWithDefault [] x (Map.fromList htmlchars) -- | a function to remove the tailing print version string from URLs (usually on -- wikibooks). This function is needed so the name of the book without the -- tailing print version string will be printed on the title page of the book removePrintVersion :: -- | the lemma to be processed . String -> -- | the lemma with the tailing print version string removed. String removePrintVersion lem = fun [ "/Druckversion", "/ Druckversion", "/Print version", "/Complete Wikibook", "/All Chapters", "/Print Version", "/print version", "/Printable version", "/The Whole Book", "/print", ": Druckversion" ] lem where fun (y : ys) x = case splitOn y x of (z : _) -> fun ys z _ -> [] fun [] x = x -- | Nearly all HTML tags but no HTML tags for tables. goodtags1 :: [String] -- List of nearly all HTML tags (only lowercase). Tags for tables a intentionally not part of this list. goodtags1 = [ "templatestyles", "includeonly", "references", "blockquote", "noinclude", "figcaption", "noframes", "frameset", "colgroup", "fieldset", "basefont", "!DOCTYPE", "noscript", "address", "acronym", "caption", "strong", "applet", "script", "button", "select", "section", "legend", "footer", "figure", "header", "strike", "object", "input", "center", "legend", "iframe", "small", "video", "audio", "style", "input", "label", "tbody", "thead", "title", "track", "frame", "param", "base", "area", "font", "code", "span", "main", "abbr", "body", "link", "menu", "math", "meta", "samp", "cite", "head", "html", "form", "cite", "ref", "div", "pre", "sub", "nav", "sup", "big", "del", "map", "bdo", "var", "dfn", "kbd", "col", "wbr", "ins", "bdi", "dir", "img", "h1", "h2", "h3", "h4", "h5", "h6", "li", "ul", "ol", "tt", "dd", "dl", "dt", "hr", "em", "b", "i", "s", "u", "p", "q", "a" ] -- | HTML tags for tables rows in tables and so on, only lower case. tabletags :: -- | List of HTML tags for tables only lower case. [String] tabletags = ["table", "td", "th", "tr"] -- | HTML tags for tables rows in tables and so on, lowercase as well as -- uppercase. listOfTableTags :: -- | list of HTML tags for tables uppercase and lowercase. [String] listOfTableTags = tabletags ++ (map (map toUpper) tabletags) -- | Nearly all HTML tags uppercase and lowercase. But intentionally no HTML -- tags for tables listOfTags :: -- | List of all HTML tags without the HTML tags for tables (uppercase and -- lowercase). [String] listOfTags = goodtags1 ++ (map (map toUpper) goodtags1) -- | Character escaping from Unicode to LaTeX chartrans :: -- | The character to be escaped for use in LaTeX Char -> -- | The escape code of the character for use in LaTeX String chartrans '•' = "\\allowbreak{}•" chartrans '|' = "\\allowbreak{}|" chartrans '\'' = "\\textquotesingle{}" chartrans '[' = "{$\\text{[}$}" chartrans ']' = "{$\\text{]}$}" chartrans '&' = "\\&" chartrans '%' = "\\%" chartrans '{' = "\\{" chartrans '}' = "\\}" chartrans '_' = "\\_" chartrans '$' = "\\${}" chartrans '#' = "\\#" chartrans '~' = "\\~{}" chartrans '^' = "\\^{}" chartrans '"' = "\\symbol{34}" chartrans '\\' = "\\textbackslash{}" chartrans '<' = "<{}" chartrans '>' = ">{}" chartrans '-' = "-{}" chartrans '\8239' = "\\," chartrans c = c : [] -- | Character escaping from Unicode to web links inside latex with the URL -- package chartransforlink :: -- | the character to be escaped for use in LaTeX inside an URL using the URL -- package of LaTeX. Char -> -- | the escaped version of the character for use in LaTeX inside an URL using -- the URL package of LaTeX. String chartransforlink '&' = "\\&" chartransforlink '%' = "\\%" chartransforlink '{' = "\\{" chartransforlink '}' = "\\}" chartransforlink '#' = "\\#" chartransforlink '$' = "\\${}" chartransforlink '\\' = "\\textbackslash{}" chartransforlink '<' = "<{}" chartransforlink '>' = ">{}" chartransforlink '^' = "\\%5E" chartransforlink c | 127 < ord c = concat (map chartransforlink $ escapeURIString (const False) [c]) chartransforlink c = c : [] mediawiki2latex-8.29/src/MediaWikiParseTree.hs000066400000000000000000000314351504464363500213600ustar00rootroot00000000000000{-# LANGUAGE DefaultSignatures #-} {-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DeriveGeneric #-} -- | A module providing all necessary types of a parse tree for the -- representation of source written in the MediaWiki markup language module MediaWikiParseTree where import Control.DeepSeq import Data.Map.Strict (Map) import Data.Serialize import GHC.Generics -- | Lists the different environment possible in the MediaWiki markup language -- and example of an environment is an HTML tag with everything included between -- the its opening and closing tags. Here this is called Tag. data EnvType = -- | A wiki link, so a inside a wiki or to an article on another MediaWiki instance. In wiki notation this is denoted by the link target in double square brackets. Wikilink | -- | An "include only" tag. So contents inside this tag shall only be visible when the page get included by an other wiki page. Within mediawiki2latex the content is just passed through, just like only the contents between the opening an closing tags but not the tags themselves would be there. IncludeOnly | -- | An HTML image map, so an image with some clickable areas that link to other HTML pages. Within mediawiki2latex only the image itself is processed. ImageMap | -- | A table in the wiki. In wiki notation this is denoted by an opening curly bracket followed by a vertical bar character as starting marker and a vertical bar character followed by a closing curly bracket as end marker. Wikitable | -- | The root element of a Wiki page. It is automatically added to any wiki page and surround the wiki page as a whole. Root | -- | A heading in the wiki text. In wiki notation. A heading in wiki notation is denoted by two or more equal signs surrounding the heading text. Wikiheading | -- | A group of items. This can be an numbered list or a bulleted list or the like. See documentation on `MediaWikiParser.evaluateItemgroup` for more details Itemgroup | -- | a line inside an item group. See documentation on `MediaWikiParser.evaluateItemgroup` for more details. Its a line starting with a combination of the characters *#:; . So this is close to the wiki notation of an itemization ItemLine | -- | An itemized environment. So a bulleted or numbered list of the like. This is close to the LaTeX representation of an itemization. It carries one of the characters *#:; which are mapped to the respective itemization commands in LaTeX. ItemEnv | -- | A text that shall be printed in italics. This is denoted by double apostrophes surrounding the italic text. Italic | -- | A text that shall be printed in bold font. This is denoted by triple apostrophes surrounding the bold text. Bold | -- | A table caption line. TableCap | -- | A table row separator. TableRowSep | -- | A table column separator. TableColSep | -- | A table headings columns separator. TableHeadColSep | -- | A HTML tag. Tag | -- | A HTML tag for a table. TableTag | -- | A MediaWiki source tag. Used for displaying source code on the wiki. Source | -- | A keyword of the MediaWiki syntax. Reserved | -- | A HTML comment. Comment | -- | A template in MediaWiki notation. Template | -- | The contents inside a template. TemplateInside | -- | The contents inside a template whose inner structure shall not be parsed. Needed for templates containing source code, which shall be passed to latex verbatim. TemplateInsideVerbatim | -- | A chapter heading. In wiki notation this is denoted by single equal signs surrounding the chapter heading. Chapter | -- | A gallery. So a group of images that belong together. Gallery | -- | content inside a nowiki tag in wiki code. NoWiki | -- | Parser for the length unit mu (math unit) inside a math formula. Only use when the contents of math tags is parsed for the second time in the course of making the formula ready for use in a LaTeX document. MuInsideMath | -- | A horizontal dividing line. This replace by nothing when generating the LaTeX code. HDevLine | -- | A noinclude tag in the wiki source code. It is replaced by nothing when generating the LaTeX code. So content between the opening and closing noinclude tags is removed. NoInclude | -- | A page break. PageBreak | -- | A formula written in between opening closing math tags in the wiki source code. This is usually rendered between dollar signs in the LaTeX document. So it becomes a normal formula. If the formula is indented or centered it will be converted to `BigMath` by `WikiHelper.shallowEnlargeMath` function. Math | -- | A parser for a link in the wiki source code. Surrounding square brackets are required. May also be nested. Link | -- | A parser for a link in the wiki source code. Surrounding square brackets are not possible. Must not be nested. Link2 | -- | A formula written in between opening and closing math tag in the wiki source code, which needs to be surrounded by either center tags or indented by a colon in the beginning of the line in the wiki source code. This formula is rendered in a LaTeX document by surrounding it with a equation environment, so it looks centered and bigger in the resulting PDF file. BigMath | -- | A Greek letter or similar HTML entity, that can be converted to LaTeX by removing the starting ampersand and tailing semicolon and add a backslash in front. Greek | -- | A character that shall have a hat (circumflex) above itself. In HTML (and wiki code) this is denoted by putting a hash x 302 entity behind the character which shall get the hat above itself. P302 | -- | A HTML character entity starting with an ampersand character and ending with a semicolon character. It is mapped to its LaTeX representation by the `MagicStrings.htmlchars` mapping. HtmlChar | -- | An attribute of a table header column separator or a table column separator or a table heading. Similar to and attribute of an HTML tag. Use only for tables processing. Attribute | -- | A preformatted section that is denoted by lines starting with the space character in wiki notation. Some markup commands are still usable in such a section. This is in contrast to `Preformat` SpaceIndent | -- | A preformatted section enclosed by pre HTML tags. No markup commands are possible inside this section. Preformat | -- | Denotes the start of a new lemma inside the wiki to download. This is needed to for cross references inside to different lemma within a single LaTeX document. When downloading the lemmas, a line starting with dhunparserurl is inserted at the beginning of each lemma. DhunUrl | -- | Text that is displayed subscript. Sub | -- | Text that is displayed superscript. Sup | -- | A label for a reference to a section inside the wiki code of the current lemma. See `WikiHelper.makeLables` for details. Label | -- | A parameter in the definition of a template in the wiki code. So something that is enclosed in triple curly brackets. Parameter | -- | A HTML character entity written in numeric encoding. So an ampersand followed by a hash followed by the numeric code in hex or decimal number followed by a semicolon. NumHtml deriving (Show, Eq, Serialize, Generic, NFData, Read) -- | A type representing a node in a the parse tree. Open and Close represent -- opening and closing bracket. They will be replace by environments (look at -- 'Environment' in this data structure) before the parse tree is processed -- further. The C represents a single character. Tab is a special elements used -- like the tabulator character for line breaking purposes. Quad is similar to -- that. The Item... data construction are for processing itemization -- enumerations and so on and well be replace be environments before further -- processing data Anything a = -- | An environment that was successfully parsed. The first parameter is the type of the environment (see `EnvType` for details). The second parameter is the data that was parsed at during the parse of the beginning of the environment (see `StartData` for details). The third parameter is anything that is contained inside the parsed environment. Environment EnvType StartData [Anything a] | -- | An opening bracket of an environment. Used only internally during the parse process. The first parameter is the depth of the stack of environments at the time this opening bracket was parsed. So it shows how deeply the environment is nested in outer environments. Note this has nothing to do with the nestingdepth parameter in the module `MediaWikiParser`, which is just a unique identifier for each environment ever parsed. The second parameter is the type of the environment (see `EnvType` for details). The third parameter is the data parsed during the parsing of the beginning of the environment (see `StartData` for details). The forth parameter is the number of the parser that is currently matching at this specific opening bracket. So there is a list of parsers use for the whole parsing process, where each parser is responsible for a certain environment. This list gets enumerated before the actual parsing starts and the third parameter here is just the number in this list. Open Int EnvType StartData Int | -- | The closing part of a parsed environment. The first parameter is the depth of the stack of environments. So it show how deep the environment just about to close is nested in sub environments. Close Int EnvType | -- | A character. C a | -- | An item separator in an itemization. This first parameter defines the type of the itemization and is written in wiki notation (for example * stands for a bulleted list) Item Char | -- | The beginning of an itemization only used internally during the parsing of item groups. (see `MediaWikiParser.evaluateItemgroup` for details) ItemStop Char | -- | The end of an itemization only used internally during the parsing of item groups. (see `MediaWikiParser.evaluateItemgroup` for details) ItemStart Char | -- | A space character only used during line breaking of preformatted text sections (like for example source codes) Quad | -- | A tab character only used during line breaking of preformatted text sections (like for example source codes) four times wide as the `Quad` symbol. Tab deriving (Show, Eq, Serialize, Generic, NFData, Read) -- | represents the result of a parser for the begin of an environment. A parser -- for an opening HTML tag is an example. TagAttr means tag with attributes. And -- is thus a string for the element and a map from string to string for it -- attributes. Str is a String. And Attr is key value pair and used for -- attribute in tables. data StartData = -- | A string Str [Char] | -- | A HTML tag. The first parameter is a string representing the tag. The second parameter is a map that maps the tags attributes as keys to their respective values. TagAttr String (Map String String) | -- | An tupel. The first element is and attribute. The second one is its value. Attr (String, String) deriving (Show, Eq, Serialize, Generic, NFData, Read) -- | The information about the author(s) an the license(s) about an image on the -- wiki. data ImageCredits = ImageCredits { -- | the author of the image, represented as parse tree. This calculated by looking at the author entry of the information template in the HTML image description page on the wiki. If no author could be determined this way the HTML history page of the HTML image description page is used to get the authors. See `SimpleContributors.getAuthor` for details. theAuthor :: [Anything Char], -- | the license of the image, represented as parse tree. This is just a -- String abbreviation of the license as a list of characters in Anything -- Char. See `Licenses.licenses` for a list of licenses processable by -- mediawiki2latex. See `SimpleContributors.getLicense` for how the license -- is calculated. theLicense :: [Anything Char], -- | The URL on the wiki where the image description page of the image is -- located. This used to implement that you can click on the image number in -- the list of figures in the resulting PDF file in order to open the image -- description page of the image in your browser. theDescUrl :: String, -- | The file name of the image on the wiki. wikiFilename :: String, -- | the number of the image. That is the position at which it occurs in the -- input as well as in the output in the list of figures. imageNumber :: Int, -- | the alternative authors of the image file. This is derived from the -- full history list of the version history on the wiki. This is also use in -- the field `theAuthor` of this record if no author could be determined -- from the information template in the HTML image description page on the -- wiki. theAltAuthors :: String } deriving (Show, Eq, Serialize, Generic, NFData, Read) mediawiki2latex-8.29/src/MediaWikiParser.hs000066400000000000000000003174411504464363500207260ustar00rootroot00000000000000-- | A parser for the medaiiwki grammar module MediaWikiParser where import Codec.Binary.UTF8.String import Control.Monad import Data.List (isInfixOf) import qualified Data.List as List import Data.List.Split (splitOn) import qualified Data.Map as Map import Data.Maybe import Data.String.HT (trim) import MagicStrings import MediaWikiParseTree import Network.URI import Text.ParserCombinators.Parsec import Tools import WikiHelper -- | flattens out the HTML 'a' tags. That is it replaces each 'a' element with -- its content. That is everything that is between its opening and its closing -- tag. The only parameter of this function is the parse tree to be processed. -- This function returns the parse tree with the 'a' HTML elements flattened | reducea :: [Anything Char] -> [Anything Char] reducea ll = concat (map go ll) where go :: Anything Char -> [Anything Char] go (Environment Tag (TagAttr "a" _) l) = l go (Environment x y l) = [Environment x y (reducea l)] go x = [x] -- | flattens out the HTML 'div' tags, which have got a 'class' attributes -- present with the value 'noresize'. That is it replaces each 'div' element -- with the properties mentioned above by its content. That is everything that -- is between its opening and its closing tag. The only parameter of this -- function is the parse tree to be processed. This function returns the parse -- tree with the 'div' HTML elements with the properties given above flattened | reducediv :: [Anything Char] -> [Anything Char] reducediv ll = concat (map go ll) where go :: Anything Char -> [Anything Char] go (Environment Tag (TagAttr "div" m) l) | (Map.lookup "class" m) == (Just "noresize") = l go (Environment x y l) = [Environment x y (reducea l)] go x = [x] -- | a function to get HTML elements out of a parse tree. The first parameter is -- name of the tag to be looked for. The second parameter is a key in the -- attributes of that element that has to be present for the element to be -- considered. The third parameter is a value that has to be found under the -- given key in the attributes of the element, in order for the element to be -- part of the returned output list. The fourth parameter is the parse tree. | deepGet :: [Char] -> String -> [Char] -> [Anything a] -> [Anything a] deepGet t k v ll = concat $ map go ll where go (Environment Tag (TagAttr tag m) l) | (tag == t) && ((Map.lookup k m) == (Just v)) = [Environment Tag (TagAttr tag m) l] go (Environment _ _ l) = (deepGet t k v l) go _ = [] deepGetFigCaption :: [Anything a] -> [Anything a] deepGetFigCaption ll = concat $ map go ll where go (Environment Tag (TagAttr "figcaption" m) l) = [Environment Tag (TagAttr "figcaption" m) l] go (Environment _ _ l) = (deepGetFigCaption l) go _ = [] deepKillFigure :: [Anything a] -> [Anything a] deepKillFigure ll = concat $ map go ll where go (Environment Tag (TagAttr "figure" _) _) = [] go (Environment s m l) = [Environment s m (deepKillFigure l)] go x = [x] deepGetFigure :: [Anything a] -> [Anything a] deepGetFigure ll = concat $ map go ll where go (Environment Tag (TagAttr "figure" m) l) = [Environment Tag (TagAttr "figure" m) l] go (Environment _ _ l) = (deepGetFigure l) go _ = [] deepGetFigRes :: [Anything Char] -> [Anything Char] deepGetFigRes ll = concat $ map go ll where go (Environment Tag (TagAttr "img" m) _) = case Map.lookup "resource" m of Just x -> map C (replace2 ("File" ++ (dropWhile (/= ':') x)) "%2B" "+") _ -> [] go (Environment _ _ l) = (deepGetFigRes l) go _ = [] -- | flattens a part of the parse tree, that is takes the characters found in -- the tree and turns them into a string dropping all other information in the -- tree deepFlatten :: [Anything t] -> [Anything t] deepFlatten ll = concat $ map go ll where go (Environment HtmlChar s l) = [Environment HtmlChar s l] go (Environment _ _ l) = (deepFlatten l) go x = [x] -- | converts a wiki source document to a parse tree to be converted to LaTeX be -- treeToLaTeX3. The first parameter is that list of parsers. That is the list -- of environments to be recognized by the parser. This is usually either only -- plain HTML, or HTML mixed with mediawiki markup. The second parameter is the -- source code to be parsed. This function returns a parse tree | parseit :: [MyParser Char] -> String -> [Anything Char] parseit pp x = ( parseit2 ( decon2 (remake pp) ( parseAnything2 [ MyStackFrame { endparser = pzero, startdata = Str "", environment = Root, badparser = \_ -> pzero, parsernumber = 0, nestingdepth = 0 } ] (remake pp) [] ) ) ('\n' : x) ) -- | helper function of parseit, not to be called directly. This function takes -- the parser for the grammar, in the sense of a parser of the parsec library, -- (so that is the final combined parser) as first argument. It takes the source -- code to be parsed (usually HTML of mediawiki markup mixed with HTML) as -- second and runs the parser on the source code. It returns the resulting parse -- tree. | parseit2 :: Parser [Anything Char] -> String -> [Anything Char] parseit2 p input = case (parse p "" input) of Left _ -> [] Right x -> x -- | A parser for one particular element of the mediawiki grammar data MyParser tok = MyParser { bad :: [Anything tok] -> GenParser tok () (), start :: MyStack tok -> GenParser tok () StartData, end :: StartData -> GenParser tok () (), allowed :: [EnvType], self :: EnvType, modify :: StartData -> [Anything tok] -> [Anything tok], reenv :: EnvType -> EnvType } -- | the stack of the parser. See documentation on MyStackFrame in this module -- for details. type MyStack tok = [MyStackFrame tok] -- | A stack frame on the parsers stack. A stack frame represents an environment -- that was opened. So something like an opening HTML tag. The value endparser. -- Is a parser that should match exactly the closing bracket of the environment. -- The value startdata is the return value of the start parser of the -- enviroment. This stack frame is created immediately after the startparser of -- an environment has matches and is given the return value of that startparser -- as startdata. The value environment is the environment this stack frame -- belongs to in case of an HTML tag this would be Tag. See the type EnvType in -- the module MediaWikiParseTree for a full list of possible environments. In -- the parse tree that is finally generated each node with arbitrarily nested -- children has got an EnvType associated with it. The badparser is a parser -- that is repeatedly tries while processing the current environment, if it -- matches the current environment is considered to be invalid. Backtracking -- occurs an the characters currently under consideration are parser (possible -- very) different manner. So with badparser you can signal that an environment -- is invalid if a creating parser (the badparser) matches within the -- environment. The parserenumber is just a number that uniquely identifies each -- parsers in the list of parsers active for the whole parsing process. These -- numbers are usually generated by the remake function. The nestingdepth is a -- bit of a misnomer. It is a unique number for each stack frame. So each stack -- frame that is newly created gets a different number. data MyStackFrame tok = MyStackFrame { endparser :: GenParser tok () (), startdata :: StartData, environment :: EnvType, badparser :: [Anything tok] -> GenParser tok () (), parsernumber :: Int, nestingdepth :: Int } -- | takes a result returned by parseAnything3 and converts it into a parse tree -- for further processing. The only purpose of this function is to convert the -- notation of bracket. The bracket a denoted by the Open and Close parse tree -- elements of the type Anything be the function parseAnything3. The need to be -- converted to environments, that is node with children in the parse tree. The -- environments will be denoted by the 'Environment' data constructors of the -- type Anything| decon2 :: (Monad m) => [(a1, MyParser a)] -> m (t, [Anything a]) -> m [Anything a] decon2 l x = do (_, s) <- x return (findMatchingBrackets l (reverse s)) -- | Usually bracket can be closed in an order different from the reverse one in -- which they were opened. But for certain environments this is not allowed, and -- the order has to be strictly followed. This value is the list of those -- environments. preserving :: [EnvType] preserving = [ Math, Source, Comment, Gallery, NoWiki, NoInclude, BigMath, Preformat, TableCap, TableRowSep, TableColSep, TableHeadColSep, TemplateInside, Wikitable, TableTag ] -- | Helper function for parseAnyClosingBracket. Should not be called directly. -- The only parameter is the current parser stack. Returns the depth on the -- stack of the stack frame whose closing bracket matched. parseAnyClosingBracket2 :: (Show tok, Eq tok) => MyStack tok -> GenParser tok () Integer parseAnyClosingBracket2 = (parseAnyClosingBracket3 0) . (List.map (\x -> endparser x)) -- | Helper function for parseAnyClosingBracket. Should not be called directly. -- The this will take stack frame by stack frame of the stack. The first -- parameter is an integer and indicates how many stack frames have allready -- been take of the stack. Returns the depth on the stack of the stack frame -- whose closing bracket matched. parseAnyClosingBracket3 :: Integer -> [GenParser tok () ()] -> GenParser tok () Integer parseAnyClosingBracket3 i (x : xs) = try ( do x return i ) <|> (parseAnyClosingBracket3 (i + 1) xs) parseAnyClosingBracket3 _ [] = pzero -- | Remove the n'th elements from a list. n is an integer an given is first -- parameter. The list to be processed is given as second parameter myremove :: Integer -> [a] -> [a] myremove _ [] = [] myremove 0 (_ : xs) = myremove (-1) xs myremove i (x : xs) = x : (myremove (i - 1) xs) -- | Enumerates a list of parsers. needed to prepare a list of parsers for use -- with parseAnything2 remake :: [a] -> [(Int, a)] remake x = zip (iterate (+ 1) 0) x -- | predicate to test whether the current stack-frame-index is in a stack. The -- first parameter is the stack-frame-index the second parameter is the stack. -- Returns true if it could be found isin :: (Show tok, Eq tok) => Int -> (MyStack tok) -> Bool isin i s = i `elem` (List.map nestingdepth s) -- | tries to parse exactly one specific opening bracket. The parameters are -- identical to the ones of parseAnyOpeningBracket, which the exception of the -- second parameter. The second parameter is that parser for the bracket -- currently under consideration. This function 'catch' the BBad 'exception' -- 'thrown' by parseAnything. In this case it returns pzero, causing the parser -- to backtrack. parseSpecificOpeningBracket :: (Show tok, Eq tok) => Int -> (Int, MyParser tok) -> (MyStack tok) -> [(Int, MyParser tok)] -> [Anything tok] -> GenParser tok () (Either2 (MyStack tok, [Anything tok])) parseSpecificOpeningBracket v (n, x) s l i = do r <- do sd <- try (start x s) parseAnything (v + 1) ( MyStackFrame { endparser = (end x) sd, startdata = sd, environment = self x, badparser = bad x, parsernumber = n, nestingdepth = v } : s ) l ((Open (length s) (self x) sd n) : i) case r of BBad (ss, y) -> if isin v ss then pzero else return (BBad (ss, y)) _ -> return r -- | tried to parse any of the opening brackets given by the parsers passed as -- the third parameter. The first parameter is the stack number (see -- documentation of the parseAnything function for more details on that). The -- second parameter is the current parser stack (see documentation of the -- parseAnything2 function for more details on that). The forth parameter is the -- list of parsers to b taken into account by the general parsing process. In -- contrast the third parameter contains only a list of parsers that are allowed -- to match in the current step of the parsing process. The fifth parameter is -- the current parser output stream. That is the information returned by the -- parser up to the current step. It is kind of an accumulator for parser -- results. parseAnyOpeningBracket :: (Show tok, Eq tok) => Int -> MyStack tok -> [(Int, MyParser tok)] -> [(Int, MyParser tok)] -> [Anything tok] -> GenParser tok () (Either2 (MyStack tok, [Anything tok])) parseAnyOpeningBracket _ _ [] _ _ = pzero parseAnyOpeningBracket v s (x : xs) l i = try (parseSpecificOpeningBracket v x s l i) <|> parseAnyOpeningBracket v s xs l i -- | insert a list of closing brackets into the parser output stream. Later on -- matching opening and closing brackets will be found and parse tree will be -- generated this way. The first parameter is an integer it is the number of -- brackets which should be close. The second parameter is the parser stack. It -- says which kind of brackets should be closed. It returns a parser output -- stream just containing the opening brackets generateClosingBrackets :: (Num a, Eq a, Show tok, Eq tok) => a -> MyStack tok -> [Anything tok] generateClosingBrackets 0 (s : xs) = [Close (length xs) (environment s)] generateClosingBrackets mi (s : xs) = (Close (length xs) (environment s)) : (generateClosingBrackets (mi - 1) xs) generateClosingBrackets _ _ = [] -- | insert a list of opening brackets into the parser output stream. Later on -- matching opening and closing brackets will be found and parse tree will be -- generated this way. The first parameter is an integer it is the number of -- brackets which should be opened. The second parameter is the parser stack. It -- says which kind of brackets should be opened. It returns a parser output -- stream just containing the opening brackets generateOpeningBrackets :: (Num a, Eq a, Show tok, Eq tok) => a -> MyStack tok -> [Anything tok] generateOpeningBrackets 0 _ = [] generateOpeningBrackets mi (s : xs) = (Open (length xs) (environment s) (startdata s) (parsernumber s)) : (generateOpeningBrackets (mi - 1) xs) generateOpeningBrackets _ _ = [] -- | a version of either with the difference that the left and right types are -- the same. RRight stands for sucessful parse of a token. BBad stands for parse -- failure in which the next possiblity is tried. data Either2 b = RRight b | BBad b -- | tries to match any of the currently possible closing brackets. Brackets -- closed in a order different from the reverse to the one in which they were -- opened are usually possible. And exception are the so called preserving -- elements, they can only be closed in the correct order. In the general case -- of this kind of crossbracketing it is necessary to add some opening and -- closing brackets to the output stream and to take the right stack frame of -- the stack keeping all others on it in the right order. parseAnyClosingBracket :: (Show tok, Eq tok) => Int -> MyStack tok -> [(Int, MyParser tok)] -> [Anything tok] -> GenParser tok () (Either2 (MyStack tok, [Anything tok])) parseAnyClosingBracket v s l i = do mi <- try ( do mmi <- parseAnyClosingBracket2 s guard ( case s of (g : _) -> (mmi == 0) || ((environment g) == Link2) || ( (not ((environment g) `elem` preserving)) && ( not ( (environment (s !! (fromIntegral mmi))) `elem` preserving ) ) ) [] -> False ) return mmi ) let ss = myremove mi s parseAnything v ss l ( ( reverse ( (generateClosingBrackets mi s) ++ (reverse (generateOpeningBrackets mi ss)) ) ) ++ i ) -- | this function tries to match the bad parser of the current environment. If -- it matches it returns BBAD, otherwise it returns RRight. See also comment of -- the parserAnything function. trybadparser :: (Show tok, Eq tok) => MyStack tok -> [Anything tok] -> GenParser tok () (Either2 (MyStack tok, [a2])) trybadparser s i = do x <- case s of (g : _) -> ( do _ <- (badparser g) i return True ) <|> return False [] -> return False if x == True then return (BBad (s, [])) else return (RRight (s, [])) -- | this is the main function of the parser which calls itself recursively. To -- run the parser you should not call this function directly but rather use -- parseAnything2. The parameter are the same as the parameters to the -- parameters to the function parseAnything2. So look at the documentation for -- their meaning. But there is one additional parameter namely the first one. -- This is the stack frame number, it is increase for every stack frame and -- never decreased this way each stack frame has got a unique identifier this -- way. An other difference is the return type this function returns the always -- same type as the function parseAnything2, but wrapped in the Either2 monad. -- The Either2 monad has an additional bit to signal whether the parse was good -- or bad. The bad bit signals so called bad parser of the current environment -- has matched signaling that the environment is to be considered invalid, and -- we have to backtrack. But what we do here is just stop paring and return a -- successful parse, but return the bad flag as set in the return type. This -- will propagate through to the parser that was trying to open the environment -- that caused the current problem. If that recognizes the problem it can flag -- the environment as failed by returning pzero. So again here we just return -- BBad. So we kind of throw an exception. And in parseSpecificOpeningBracket we -- will catch BBad and signal the actual problem by returning pzero and that way -- kick of backtracking. parseAnything :: (Show tok, Eq tok) => Int -> MyStack tok -> [(Int, MyParser tok)] -> [Anything tok] -> GenParser tok () (Either2 (MyStack tok, [Anything tok])) parseAnything v s l i = ( do eof return $ RRight (s, i ++ (generateClosingBrackets (length s) s)) ) <|> do nb <- trybadparser s i case nb of RRight _ -> try (parseAnyClosingBracket v s l i) <|> case s of (g : _) -> do try ( parseAnyOpeningBracket v s [ x | x <- l, (environment g) `elem` (allowed (snd x)) ] l i ) [] -> return (RRight ([], i)) <|> do c <- anyToken parseAnything v s l ((C c) : i) BBad _ -> case s of (g : _) -> try ( parseAnyOpeningBracket v s [x | x <- l, (environment g) `elem` (allowed (snd x))] l i ) <|> return (BBad (s, i)) [] -> pzero -- | This is the main entry point of the parser. So the function you need to -- call when you want to convert the source into the parse tree. The first -- parameter is the stack. I usually should contain only and exactly the root -- stack frame. The second parameter is an enumerated list of parsers. You -- usually take a list like the list parsers from this module and enumerate it -- by running remake on it. So thats the list of environments the parser is able -- to recognize. The third parameter is the parse results that have been created -- so far. Since we are just starting the parse this has to be the empty list. -- The function returns a parser. See the documentation of the parse module for -- more details on the type GenParser. Roughly is means that this parser takes -- an input list whose items are of type tok and that the parsers does not have -- state (hence the void type '()') and return a tuple. The first elements of -- that tuple is a stack. Where a new stack frame is added to the stack for each -- new environment that is found to open by the parser, like an opening HTML -- tag. And the second elements of the tuple is a parse tree, that is a list of -- parse tree elements, where each parse tree element may contain sublists of -- parse tree element. This way it is a real tree. parseAnything2 :: (Show tok, Eq tok) => MyStack tok -> [(Int, MyParser tok)] -> [Anything tok] -> GenParser tok () (MyStack tok, [Anything tok]) parseAnything2 s l i = do x <- parseAnything 0 s l i case x of BBad (_, b) -> return (s, b) RRight b -> return b -- | this find the matching closing bracket for an opening bracket. It returns a -- tuple. Its first element is the environment created form the given opening -- bracket together with its closing bracket and the content between opening and -- closing bracket. Its second elements is the remaining list of parsed -- elements, after the closing bracket. This list does still contain the Open -- and Close parser tree elements for opening and closing bracket, and those are -- not yet converted to environments. This function takes the list of parse tree -- elements after the opening bracket as first input parameter. It takes the -- index of the parser that created the opening bracket as second input -- parameter. That is the index created by the remake function in this module. -- It takes the size of the stack at the time when the opening bracket was found -- as third input parameter. It takes the EnvType of the environment of the -- opening bracket as fourth input parameter. It takes the StartData parse -- result associated with the opening bracket as fifth parameter. The sixth -- parameter is the accumulator an should be the empty list when calling this -- function externally. The seventh parameter is the remaining parse tree after -- the opening bracket without the opening and closing brackets converted to -- environments findMatchingClosingBracket :: [(a1, MyParser a)] -> Int -> Int -> EnvType -> StartData -> [Anything a] -> [Anything a] -> (Anything a, [Anything a]) findMatchingClosingBracket l n i e s b ((Close i2 e2) : xs) = if (i, e) == (i2, e2) then ( Environment ((reenv (snd (l !! n))) e) s ((modify (snd (l !! n))) s (findMatchingBrackets l (reverse b))), xs ) else findMatchingClosingBracket l n i e s ((Close i2 e2) : b) xs findMatchingClosingBracket l n i e s b (x : xs) = findMatchingClosingBracket l n i e s (x : b) xs findMatchingClosingBracket l n _ e s b [] = ( Environment ((reenv (snd (l !! n))) e) s ((modify (snd (l !! n))) s (findMatchingBrackets l (reverse b))), [] ) -- | run findMatchingBrackets on the inner part environment given as second -- parameter. This function takes the enumerated list of parsers created by -- remake as first input parameter findMatchingBrackets2 :: [(a1, MyParser a)] -> Anything a -> Anything a findMatchingBrackets2 l (Environment e s b) = Environment e s (findMatchingBrackets l b) findMatchingBrackets2 l xs = Environment Root (Str "") (findMatchingBrackets l [xs]) -- | the parser (Anything3) creates a list of parser elements, which is not a -- tree. The environments which will form the nodes with children in the final -- tree are denoted as opening and closing brackets in this list. This function -- takes that list as second input parameter, finds matching pairs of opening -- and closing brackets and converts the to environments. The opening an closing -- brackets are already balanced because of the way Anything3 works, that means -- there is exactly one matching closing bracket for each opening one and they -- open and close in to proper order. This function takes the enumerated list of -- parsers as first input parameter, that is the same list also given to the -- function Anything. findMatchingBrackets :: [(a1, MyParser a)] -> [Anything a] -> [Anything a] findMatchingBrackets l ((Open i e s n) : xs) = let (t, xxs) = findMatchingClosingBracket l n i e s [] xs in (findMatchingBrackets2 l t) : (findMatchingBrackets l xxs) findMatchingBrackets l (x : xs) = x : (findMatchingBrackets l xs) findMatchingBrackets _ [] = [] -- | a list of environments. Most parsers use this list as their 'allowed' -- variable. Meaning that the parser is only allowed to match within the -- environments given in the 'allowed' list everywhere :: [EnvType] everywhere = [Wikitable] ++ everywheretbl -- | list containing the Italic and Bold environments, see documentation on the -- list 'everywhere' in this module bi :: [EnvType] bi = [Italic, Bold] -- | list containing the same environments as the list 'everywhere' except the -- Wikitable environment, see documentation on the list 'everywhere' in this -- module everywheretbl :: [EnvType] everywheretbl = bi ++ everywherebi -- | list containing the same environments as the list 'everywhere' except the -- environment Wikitable, Bold and Italic, see documentation on the list -- 'everywhere' in this module everywherebi :: [EnvType] everywherebi = basicwhere ++ [Wikilink] -- | list containing the same environments as the list 'everywhere' except the -- environment Wikitable, Bold, Italic and Wikilink see documentation on the -- list 'everywhere' in this module basicwhere :: [EnvType] basicwhere = [Link] ++ verybasicwhere -- | list containing the same environments as the list 'everywhere' except the -- environment Wikitable, Bold, Italic, Wikilink and Link see documentation on -- the list 'everywhere' in this module verybasicwhere :: [EnvType] verybasicwhere = [ Itemgroup, Root, Wikiheading, TableCap, Chapter, Tag, TableTag, TemplateInside, IncludeOnly ] -- | list containing the environments where the parser linkp is allowed to -- match. Currently this seems to be everywhere. So this possibly can go away everywherel :: [EnvType] everywherel = basicwhere ++ bi ++ [Wikitable, Wikilink] -- | list containing the same environments as the list 'everywhere' except the -- Link environment see documentation on the list 'everywhere' in this module everywherel2 :: [EnvType] everywherel2 = verybasicwhere ++ bi ++ [Wikitable, Wikilink] -- | list containing the TableColSep and TableHeadColSep environments, see -- documentation on the list 'everywhere' in this module. the environments mean -- table header column separator and table column separator wikilinkwhere :: [EnvType] wikilinkwhere = [TableColSep, TableHeadColSep] -- | the list of parsers needed for processing the HTML output created by -- MediaWiki minparsers :: [MyParser Char] minparsers = [ doctagparser, metatagparser, supp, subp, dhunurlp, itagparser, pagebreakp, htmlcharp, p302p, attrp, greekp, brparser, wbrparser, hrparser, mytablep, mytrsepp2, mytcolsepp2, mytcapp2, mythcolsepp2, annop, tagparser, tagparserp, tagparser2, tagparser2p, tagparsert, tagparsert, tagparser2t, stagparser, commentp, numhtmlp, rtagparser ] -- | the list of parsers for parsing contributor information for images on -- MediaWiki websites htmlminparsers :: [MyParser Char] htmlminparsers = [ doctagparser, metatagparser, supp, subp, dhunurlp, itagparser, pagebreakp, htmlcharp, p302p, attrp, greekp, brparser, wbrparser, hrparser, htmytablep, htmytrsepp, htmytcolsepp, htmytcapp, htmythcolsepp, tagparser, tagparserp, tagparser2, tagparser2p, tagparsert, tagparsert, tagparser2t, tagparsers, stagparser, commentp, numhtmlp, rtagparser ] -- | the list of parsers needed for processing the image title description so -- that is the content a HTML attributes imgparsers :: [MyParser Char] imgparsers = [supp, subp, htmlcharp, p302p, greekp, numhtmlp] -- | the list of parsers needed for parsing source code in the MediaWiki markup -- language parsers :: [MyParser Char] parsers = [ doctagparser, metatagparser, supp, subp, dhunurlp, itagparser, chapterp, prep, pagebreakp, htmlcharp, p302p, attrp, greekp, brparser, wbrparser, hrparser, wikilinkp, wikitablep, mytablep, wikiheadingp, itempgrouppt, itempgroupp, itemlinep, boldp, italicp, tablecapp, tablecapp2, tablecapp3, rowsepp, mytrsepp, colsepp, colsepp2, mytcolsepp, mytcapp, headcolsepp, headcolsepp2, mythcolsepp, galleryp, imagemapp, nowikip, noincludep, mathp, annop, imagemapp, ttagparser, ttagparser2, ttagparsert, ttagparser2t, ttagparsers, tagparser, tagparser2, tagparsert, tagparser2t, tagparsers, stagparser, commentp, reservedp, templatewikilinkp, wikiparamp, wikitemplatep, templateinsideverbatimp, templateinsidep, gallerywlp, imagemapwlp, hdevlinep, linkp, linkp2, poemp, presectionp, presectionpt, numhtmlp, rtagparser ] -- | the parser record, with some fields initialized with default values baseParser :: MyParser tok baseParser = MyParser { bad = \_ -> pzero, start = undefined, end = \_ -> return (), allowed = everywhere, self = undefined, modify = \_ x -> x, reenv = id } -- | this function takes a string and returns a parser that matches any of the -- given strings oneOfTheStrings :: [String] -> Parser String oneOfTheStrings (x : xs) = try (string x) <|> (oneOfTheStrings xs) oneOfTheStrings [] = pzero -- | parses a HTML entity, that is a character escaped with the ampersand -- notation htmlcharp :: MyParser Char htmlcharp = baseParser { start = \_ -> do _ <- char '&' s <- (oneOfTheStrings [fst x | x <- htmlchars]) _ <- char ';' return (Str (s)), allowed = Preformat : SpaceIndent : NoWiki : everywhere, self = HtmlChar } -- | parses a HTML entity, escaped with numeric ampersand notation numhtmlp :: MyParser Char numhtmlp = baseParser { start = \_ -> do _ <- string "&#" s <- try (many1 digit) <|> do ss <- try (string "x") <|> try (string "X") sss <- try (many1 hexDigit) return $ ss ++ sss _ <- char ';' return (Str (s)), allowed = Preformat : SpaceIndent : NoWiki : everywhere, self = NumHtml } -- | parses a HTML #302 character. Special parser needed since it acts on the -- preceding character p302p :: MyParser Char p302p = baseParser { start = \_ -> do c <- anyChar _ <- string "̂" return (Str (c : [])), self = P302 } -- | parses a HTML &sub entity. subp :: MyParser Char subp = baseParser { start = \_ -> do _ <- string "&sub" c <- anyChar _ <- string ";" return (Str (c : [])), self = Sub } -- | parses a HTML &sup entity. supp :: MyParser Char supp = baseParser { start = \_ -> do _ <- string "&sup" c <- anyChar _ <- string ";" return (Str (c : [])), self = Sup } -- | parses the start of a new URL. That is the place where a page begin that -- was downloaded from an URL different from the previous one dhunurlp :: MyParser Char dhunurlp = baseParser { start = \_ -> do _ <- string "\ndhunparserurl " return (Str ""), end = \_ -> string "\n" >> return (), self = DhunUrl, allowed = [Root, Tag] } -- | parses a Greek HTML entity. So a Greek letter or something similar greekp :: MyParser Char greekp = baseParser { start = \_ -> do _ <- char '&' s <- (oneOfTheStrings greek) _ <- char ';' return (Str (s)), self = Greek } -- | parses the mediawiki poem tag. That is a little bit like verbatim but -- allowes some inner tags poemp :: MyParser Char poemp = (maketagparser ["poem"]) { allowed = SpaceIndent : everywhere ++ wikilinkwhere, self = SpaceIndent } -- | parses the mediawiki math tag. That is a latex formula in the wiki mathp :: MyParser Char mathp = (maketagparser ["math"]) { allowed = SpaceIndent : everywhere ++ wikilinkwhere, self = Math } annop :: MyParser Char annop = (maketagparser ["annotation"]) { allowed = SpaceIndent : everywhere ++ wikilinkwhere, self = Math, reenv = const Tag } -- | parses a new chapter heading chapterp :: MyParser Char chapterp = baseParser { start = \_ -> do _ <- try ( do _ <- string "\n" many (char ' ') ) string "dhunincludechaper" >> return (Str ""), end = \_ -> string "/dhunincludechaper" >> return (), self = Chapter } -- | parses a horizontal dividing line hdevlinep :: MyParser Char hdevlinep = baseParser { start = \_ -> do _ <- string "----" skipMany (string "-") return (Str ""), allowed = [Root], self = HDevLine } -- | parses the mediawiki 'nowiki' tag nowikip :: MyParser Char nowikip = baseParser { start = \_ -> string "" >> return (Str ""), end = \_ -> string "" >> return (), allowed = everywhere ++ wikilinkwhere ++ [SpaceIndent], self = NoWiki } -- | parses a linebreak with mu math units inside a math tag muinsidemathp :: MyParser Char muinsidemathp = baseParser { start = \_ -> do _ <- string "\\\\[" f <- many (oneOf "0123456789.+-Ee") _ <- string "mu]" return (Str f), allowed = [Root], self = MuInsideMath } -- | parses the mediawiki 'noinclude' tag noincludep :: MyParser Char noincludep = baseParser { start = \_ -> string "" >> return (Str ""), end = \_ -> try (string "" >> return ()) <|> lookAhead (eof >> return ()), self = NoInclude } -- | parses the mediawiki 'includeonly' tag includep :: MyParser Char includep = baseParser { start = \_ -> string "" >> return (Str ""), end = \_ -> string "" >> return (), self = IncludeOnly } -- | parses the mediawiki 'onlyinclude' tag includep2 :: MyParser Char includep2 = baseParser { start = \_ -> string "" >> return (Str ""), end = \_ -> string "" >> return (), self = IncludeOnly } -- | parses the mediawiki 'gallery' tag galleryp :: MyParser Char galleryp = baseParser { start = \_ -> do _ <- string " return [] _ <- char '>' return (Str ""), end = \_ -> string "" >> return (), self = Gallery } -- | parses a wikilink inside a gallery gallerywlp :: MyParser Char gallerywlp = baseParser { bad = \_ -> do _ <- lookAhead (try (string "")) return (), start = \_ -> string "\n" >> return (Str ""), end = \_ -> do _ <- lookAhead (string "\n") return (), modify = \_ x -> dropWhile (== (C ' ')) x, allowed = [Gallery], self = Wikilink } -- | parses the mediawiki 'imagemap' tag imagemapp :: MyParser Char imagemapp = baseParser { start = \_ -> do _ <- string " return [] _ <- char '>' return (Str ""), end = \_ -> string "" >> return (), self = ImageMap } -- | parses a wikilink inside and imagemap imagemapwlp :: MyParser Char imagemapwlp = baseParser { bad = \_ -> do _ <- lookAhead (try (string "")) return (), start = \_ -> ( do _ <- string "\n" try (lookAhead (string "Image:")) <|> try (lookAhead (string "File:")) <|> (lookAhead (string "Datei:")) ) >> return (Str ""), end = \_ -> do _ <- lookAhead (string "\n") return (), allowed = [ImageMap], self = Wikilink } -- | matches a sequence of arbitrary characters up to the character (an -- excluding it) where one of the strings given as first parameter matches myany :: [String] -> Parser String myany x = do b <- (try (lookAhead (oneOfTheStrings x) >> return False)) <|> return True if b then do c <- anyChar cs <- (myany x) return (c : cs) else return "" -- | parses the mediawiki template wikitemplatep :: MyParser Char wikitemplatep = baseParser { start = \_ -> do _ <- string "{{" s <- myany ["}}", "|"] return (Str s), end = \_ -> string "}}" >> return (), allowed = everywhere ++ wikilinkwhere ++ [TemplateInsideVerbatim, SpaceIndent], self = Template } -- | a special stack frame for parsing the inside of a template madframe :: MyStackFrame Char madframe = MyStackFrame { endparser = (try (lookAhead (oneOfTheStrings ["}}", "|", "="]))) >> return (), startdata = Str "", environment = TemplateInside, badparser = \_ -> pzero, parsernumber = 0, nestingdepth = 0 } -- | parses the inside of a mediawiki template templateinsidep :: MyParser Char templateinsidep = baseParser { start = \_ -> do _ <- string "|" (_, bb) <- lookAhead (try (parseAnything2 [madframe] (remake parsers) [])) if all ( \g -> case g of Open _ _ _ _ -> False _ -> True ) bb then try ( do s <- myany ["|", "}}", "="] b <- (try (string "=") >> return True) <|> return False if b then return (Str s) else pzero ) <|> return (Str "") else return (Str ""), end = \_ -> lookAhead (oneOfTheStrings ["|", "}}"]) >> return (), allowed = [Template], self = TemplateInside } -- | parses the inside of a mediawiki template, it is parser verbatim that means -- inner structures are parsed, but returned as plain characters in the parse -- tree. Needed for templates use for source codes templateinsideverbatimp :: MyParser Char templateinsideverbatimp = baseParser { start = \sta -> case sta of (g : _) -> case (startdata g) of Str gg -> if (trim gg) `elem` [ "HaskellGHCiExample", "\"HaskellGHCi\",Visual Basic .NET: Vorlage:Code", "C++-Programmierung/ Vorlage:Syntax", "syntax", "Syntax", "C++-Programmierung/ Vorlage:Code", "BigJava", "LaTeX/Usage", "LaTeX/LaTeX", "java", "Java", "Latex Index" ] then do _ <- string "|" try ( do s <- myany ["|", "}}", "="] b <- (try (string "=") >> return True) <|> return False if b then return (Str s) else pzero ) <|> return (Str "") else pzero _ -> pzero [] -> pzero, end = \_ -> lookAhead (oneOfTheStrings ["|", "}}"]) >> return (), allowed = [Template], self = TemplateInsideVerbatim, reenv = const TemplateInside } -- | parses the inside of a template parameter wikiparamp :: MyParser Char wikiparamp = baseParser { start = \_ -> string "{{{" >> return (Str ""), end = \_ -> string "}}}" >> return (), allowed = everywhere ++ wikilinkwhere ++ [SpaceIndent], self = Parameter } -- | parses a wikilink wikilinkp :: MyParser Char wikilinkp = baseParser { start = \_ -> string "[[" >> return (Str ""), end = \_ -> string "]]" >> return (), bad = \pchr -> if not $ (C '|') `elem` ( takeWhile ( \g -> case g of Open _ Wikilink _ _ -> False _ -> True ) pchr ) then do _ <- lookAhead ( ( try ((string "]") >> notFollowedBy (string "]")) <|> (try (string "[" >> return ())) <|> (try (string "\n") >> return ()) ) ) return () else pzero, allowed = everywhere ++ wikilinkwhere ++ [SpaceIndent], self = Wikilink } -- | parses a wikilink template for wikipedia links templatewikilinkp :: MyParser Char templatewikilinkp = baseParser { start = \_ -> string "{{w|" >> return (Str ""), end = \_ -> string "}}" >> return (), allowed = everywhere ++ wikilinkwhere, modify = \_ x -> (C 'w') : (C ':') : x, self = Wikilink } -- | parses a link linkp :: MyParser Char linkp = baseParser { bad = \_ -> do _ <- lookAhead (do char '\n') return (), start = \_ -> do _ <- string "[" skipMany (char ' ') s <- oneOfTheStrings ["http", "https", "mailto", "//"] return (Str (if s == "//" then "http://" else s)), end = \_ -> string "]" >> return (), allowed = everywherel, self = Link } -- | parses a link, in contrast to linkp this does not match inside links and -- does not require the square bracket notation linkp2 :: MyParser Char linkp2 = baseParser { start = \_ -> do s <- oneOfTheStrings ["http://", "https://"] return (Str s), end = \_ -> lookAhead (oneOf " \n\r\t<>|\"") >> return (), allowed = everywherel2, self = Link2, reenv = const Link } -- | parses a wikitable wikitablep :: MyParser Char wikitablep = baseParser { start = \_ -> do _ <- try (char '\n') <|> return '\n' skipMany (char ' ') _ <- try (string "{|") <|> try (string "{{(!}}") s <- many (noneOf "\n") return (Str s), end = \_ -> do _ <- string "\n" skipMany (char ' ') _ <- try (string "|}") <|> try (string "{{!)}}") return (), self = Wikitable } -- | parses a heading, can be a chapter heading as well as a section heading and -- so on wikiheadingp :: MyParser Char wikiheadingp = baseParser { bad = \_ -> lookAhead ( do _ <- string "\n" return () ), start = \_ -> do a1 <- string "\n=" a2 <- try (string "=") <|> return "" a3 <- try (string "=") <|> return "" a4 <- try (string "=") <|> return "" a5 <- try (string "=") <|> return "" a6 <- try (string "=") <|> return "" case (a1 ++ a2 ++ a3 ++ a4 ++ a5 ++ a6) of (_ : xs) -> return (Str xs) [] -> pzero, end = \y -> case y of (Str x) -> do _ <- string x _ <- notFollowedBy (char '=') return () _ -> mzero, self = Wikiheading, allowed = everywherel2 } -- | parses an italic text italicp :: MyParser Char italicp = baseParser { start = \_ -> do _ <- string "''" return (Str "''"), end = \_ -> do ( do _ <- try (string "''") _ <- notFollowedBy (string "'") return () ) <|> notFollowedBy (noneOf "\n") return (), allowed = SpaceIndent : Wikitable : Bold : everywherebi, self = Italic } -- | parses a bold text boldp :: MyParser Char boldp = baseParser { start = \_ -> do _ <- string "'''" return (Str "'''"), end = \_ -> do ( do _ <- try (string "'''") return () ) <|> notFollowedBy (noneOf "\n") return (), allowed = SpaceIndent : Wikitable : Italic : everywherebi, self = Bold } -- | parses a table caption tablecapp :: MyParser Char tablecapp = baseParser { bad = \_ -> lookAhead ( try ( do _ <- string "||" return () ) <|> try ( do _ <- char '\n' _ <- notFollowedBy (try (char '|') <|> (char '!')) return () ) <|> do _ <- string "!!" return () ), start = \_ -> do _ <- string "\n" skipMany (char ' ') _ <- string "|+" _ <- notFollowedBy (oneOf "-}") return (Str ""), end = \_ -> lookAhead ( do _ <- char '\n' _ <- try (char '|') <|> char '!' notFollowedBy . char $ '}' return () ), allowed = [Wikitable], self = TableCap } -- | parses a table caption with additional parameter given to the beginning of -- the caption element in the wiki source tablecapp2 :: MyParser Char tablecapp2 = baseParser { start = \_ -> do _ <- string "\n" skipMany (char ' ') _ <- string "|+" _ <- many (noneOf "|") _ <- char '|' _ <- notFollowedBy (oneOf "-}") return (Str ""), end = \_ -> lookAhead ( try ( do _ <- char '\n' _ <- try (char '|') <|> char '!' notFollowedBy . char $ '}' return () ) <|> (try ((string "||" >> return ())) <|> (string "!!" >> return ())) ), allowed = [Wikitable], self = TableCap } -- | parses a table caption tablecapp3 :: MyParser Char tablecapp3 = baseParser { start = \_ -> do _ <- string "\n" skipMany (char ' ') _ <- string "|+" _ <- notFollowedBy (oneOf "-}") return (Str "2"), allowed = [Wikitable], self = TableCap } -- | parses a table row separator rowsepp :: MyParser Char rowsepp = baseParser { start = \_ -> do _ <- string "\n" skipMany (char ' ') _ <- try (string "|-") <|> try (string "{{!-}}") s <- many (noneOf "\n") return (Str s), allowed = [Wikitable], self = TableRowSep } -- | parses a table column separator, with additional parameters parser to the -- beginning of the environment. This parser actually parses only the beginning -- elements and whats inside it See colsepp :: MyParser Char colsepp = baseParser { bad = \_ -> lookAhead ( try ( do _ <- try (string "||") <|> try (string "{{!!}}") return () ) <|> try ( do _ <- char '\n' return () ) <|> do _ <- try (string "!!") return () ), start = \_ -> try ( try ( do _ <- string "\n" skipMany (char ' ') _ <- try (string "|") <|> try (string "{{!}}") _ <- notFollowedBy (oneOf "-}") return (Str "") ) <|> do _ <- try (string "||") <|> try (string "{{!!}}") return (Str "") ), end = \_ -> try ( do _ <- try (string "|") <|> try (string "{{!}}") _ <- notFollowedBy (oneOf "}|") return () ), allowed = [Wikitable], self = TableColSep } -- | parses a column separator without anything inside it colsepp2 :: MyParser Char colsepp2 = baseParser { start = \_ -> try ( do _ <- string "\n" skipMany (char ' ') _ <- try (string "|") <|> try (string "{{!}}") _ <- notFollowedBy (oneOf "-}") return (Str "2") ) <|> do _ <- try (string "||") <|> try (string "{{!!}}") return (Str "2"), allowed = [Wikitable], self = TableColSep } -- | parses a table header column separator, with additional parameters parser -- to the beginning of the environment. This parser actually parses only the -- beginning elements and whats inside it See headcolsepp :: MyParser Char headcolsepp = baseParser { bad = \_ -> lookAhead ( try ( do _ <- try (string "||") <|> (string "{{!!}}") return () ) <|> try ( do _ <- char '\n' return () ) <|> do _ <- try (string "!!") return () ), start = \_ -> try ( do _ <- string "\n" skipMany (char ' ') _ <- string "!" _ <- notFollowedBy (oneOf "-}") return (Str "") ) <|> do _ <- string "!!" return (Str ("")), end = \_ -> do _ <- try (char '|') <|> ((string "{{!}}") >> return '|') notFollowedBy (oneOf "-}|") return (), allowed = [Wikitable], self = TableHeadColSep } -- | parses a header column separator without anything inside it headcolsepp2 :: MyParser Char headcolsepp2 = baseParser { start = \_ -> try ( do _ <- string "\n" skipMany (char ' ') _ <- string "!" _ <- notFollowedBy (oneOf "-}") return (Str "") ) <|> do _ <- string "!!" return (Str ""), allowed = [Wikitable], self = TableHeadColSep } attrinside :: String -> GenParser Char () Char attrinside x = try (string "&" >> return '&') <|> (noneOf x) -- | matches a key value pair . So an attribute of an HTML element attr :: GenParser Char () ([Char], [Char]) attr = do try (skipMany1 (oneOf " \t\n")) <|> (lookAhead (char '=') >> return ()) k <- try (many1 (try (alphaNum) <|> oneOf ":-")) <|> (((lookAhead (char '=')) >> return "class")) v <- try ( do skipMany (oneOf " \t\n") _ <- char '=' skipMany (oneOf " \t\n") vv <- try ( do _ <- try (char '"') vvv <- many (attrinside "\"") _ <- try (char '"') <|> try (noneOf "<|>") <|> return ' ' return vvv ) <|> try ( do _ <- (char '\'') vvv <- many (attrinside "'") _ <- try (char '\'') <|> try (noneOf "<|>") <|> return ' ' return vvv ) <|> ( do vvv <- many (attrinside "\"'/| ") _ <- try (char '\'') <|> try (char '"') <|> try (noneOf " ") <|> return ' ' return vvv ) return vv ) <|> return "" return (k, v) -- | Matches a key value pair. So an attribute of an HTML element attrns :: GenParser Char u ([Char], [Char]) attrns = do k <- many1 (try (alphaNum) <|> oneOf ":-") v <- do _ <- char '=' skipMany (oneOf " \n") vv <- try ( do _ <- try (char '"') <|> char '\'' vvv <- many (noneOf "\"'><|") _ <- try (char '"') <|> try (noneOf "<|>") <|> return ' ' return vvv ) <|> ( do vvvv <- (noneOf "\"'> try (char '\'') <|> try (noneOf " ") <|> return ' ' return (vvvv : vvv) ) return vv _ <- try (many (oneOf " \n")) <|> return [] return (k, v) -- | Matches a list of key value pairs . So all attributes of an HTML element attrp :: MyParser Char attrp = baseParser { start = \_ -> do atr <- try (attrns) return (Attr atr), allowed = [TableHeadColSep, TableColSep, TableCap], self = Attribute } -- | Parses the HTML 'pre' tag prep :: MyParser Char prep = baseParser { start = \_ -> do _ <- string "<" p <- try (string "pre") <|> try (string "PRE") <|> try (string "xmp") <|> string "XMP" atr <- many (try (attr)) _ <- try (many (oneOf " \n")) <|> return [] _ <- char '>' return (TagAttr p (Map.fromList atr)), end = \y -> case y of (TagAttr x _) -> do _ <- char '<' _ <- char '/' _ <- string x _ <- char '>' return () _ -> mzero, allowed = everywhere, self = Preformat } -- | Parses the HTML 'br' tag brparser :: MyParser Char brparser = baseParser { start = \_ -> do _ <- string "<" _ <- try (string "/") <|> return "" _ <- try (string "br") <|> string ("BR") skipMany (try (attr)) _ <- try (many (oneOf " \n")) <|> return [] _ <- try (string "/") <|> return "" _ <- try (many (oneOf " \n")) <|> return [] _ <- char '>' return (TagAttr "br" Map.empty), allowed = SpaceIndent : everywhere, self = Tag } -- | Parses the HTML 'wbr' tag wbrparser :: MyParser Char wbrparser = baseParser { start = \_ -> do _ <- string "<" _ <- try (string "/") <|> return "" _ <- try (string "wbr") <|> string ("WBR") skipMany (try (attr)) _ <- try (many (oneOf " \n")) <|> return [] _ <- try (string "/") <|> return "" _ <- try (many (oneOf " \n")) <|> return [] _ <- char '>' return (TagAttr "wbr" Map.empty), allowed = SpaceIndent : everywhere, self = Tag } -- | Parses the HTML 'hr' tag (horizontal rule) hrparser :: MyParser Char hrparser = baseParser { start = \_ -> do _ <- string "<" _ <- try (string "/") <|> return "" _ <- string "hr" skipMany (try (attr)) _ <- try (many (oneOf " \n")) <|> return [] _ <- try (string "/") <|> return "" _ <- try (many (oneOf " \n")) <|> return [] _ <- char '>' return (TagAttr "hr" Map.empty), allowed = SpaceIndent : everywhere, self = Tag } -- | Returns a Parser that matches all HTML elements, given by the list of -- strings given as first input parameter. The parser does not match inside -- tables. Use makettagparser for that maketagparser :: [String] -> MyParser Char maketagparser tags = baseParser { start = \_ -> do _ <- string "<" t <- (oneOfTheStrings tags) atr <- many (try (attr)) _ <- try (many (oneOf " \n")) <|> return [] _ <- char '>' return (TagAttr (t) (Map.fromList atr)), end = \y -> case y of (TagAttr x _) -> do _ <- char '<' _ <- try (many (oneOf " ")) <|> return [] _ <- if x `elem` nonNestTags then try (char '/') <|> (return '/') else (char '/') _ <- string x _ <- char '>' return () _ -> mzero, allowed = SpaceIndent : everywheretbl, self = Tag } -- | Parser for the 'meta' and 'link' tag of HTML metatagparser :: MyParser Char metatagparser = baseParser { start = \_ -> do _ <- string "<" t <- (oneOfTheStrings ["meta", "link", "area", "img", "track", "source"]) atr <- many (try (attr)) _ <- try (many (oneOf " \n")) <|> return [] _ <- try (char '/') <|> (return '/') _ <- try (char '>') <|> (return '>') return (TagAttr (t) (Map.fromList atr)), allowed = SpaceIndent : everywhere, self = Tag } -- | Parser for the !DOCTYPE tag of HTML doctagparser :: MyParser Char doctagparser = baseParser { start = \_ -> do _ <- string "<" t <- (oneOfTheStrings ["!DOCTYPE"]) _ <- many (noneOf ">") _ <- char '>' return (TagAttr (t) (Map.fromList [])), allowed = SpaceIndent : everywhere, self = Tag } -- | Parser for closing HTML tags that have not matching opening tag. ctagparser :: [String] -> GenParser Char () () ctagparser tags = do _ <- string " return [] _ <- char '>' return () -- | Returns a parser that matches all HTML elements, given by the list of -- strings given as first input parameter. The parser matches only the opening -- part of the tag. The inside of it is not processed by this parser. The -- opening tag may also self closing like
    because of the tailing /. maketagparser2 :: [String] -> MyParser Char maketagparser2 tags = baseParser { start = \_ -> do _ <- string "<" t <- (oneOfTheStrings tags) atr <- many (try (attr)) _ <- try (many (oneOf " \n")) <|> return [] _ <- try (char '/') <|> (return '/') _ <- char '>' return (TagAttr (t) (Map.fromList atr)), allowed = Wikitable : SpaceIndent : everywheretbl, self = Tag } -- | Returns a parser that matches all HTML elements, given by the list of -- strings given as first input parameter. The parser matches only the opening -- part of the tag. The inside of it is not processed by this parser. The -- opening tag may not be self closing so not like
    because of the tailing -- /. maketagparser3 :: [String] -> MyParser Char maketagparser3 tags = baseParser { start = \_ -> do _ <- string "<" t <- (oneOfTheStrings tags) atr <- many (try (attr)) _ <- try (many (oneOf " \n")) <|> return [] _ <- char '>' return (TagAttr (t) (Map.fromList atr)), allowed = SpaceIndent : everywheretbl, self = Tag } -- | tags that can not be nested and are thus allowed to closed by an opening -- tag instead of a closing one nonNestTags :: [String] nonNestTags = [ "tt", "pre", "TT", "PRE", "b", "B", "i", "I", "sc", "SC", "code", "CODE" ] -- | Returns a parser that matches all HTML elements, given by the list of -- strings given as first input parameter. The parser matches only inside -- tables. Use maketagparser for that makettagparser :: [String] -> MyParser Char makettagparser tags = baseParser { bad = \_ -> do _ <- lookAhead (do try (string "\n|") <|> (string "||")) return (), start = \_ -> do _ <- string "<" t <- (oneOfTheStrings tags) atr <- many (try (attr)) _ <- try (many (oneOf " \n")) <|> return [] _ <- char '>' return (TagAttr (t) (Map.fromList atr)), end = \y -> case y of (TagAttr x _) -> do _ <- char '<' _ <- try (many (oneOf " ")) <|> return [] _ <- if x `elem` nonNestTags then try (char '/') <|> (return '/') else (char '/') _ <- string x _ <- char '>' return () _ -> mzero, allowed = [Wikitable], self = Tag } -- | Returns a parser that matches all HTML elements, given by the list of -- strings given as first input parameter. The parser matches only the opening -- part of the tag. The inside of it is not processed by this parser. The -- opening tag may also self closing like
    because of the tailing /. -- Matches only inside tables makettagparser2 :: [String] -> MyParser Char makettagparser2 tags = baseParser { bad = \_ -> do _ <- lookAhead ( do _ <- anyChar try (string "\n|") <|> (string "||") ) return (), start = \_ -> do _ <- string "<" t <- (oneOfTheStrings tags) atr <- many (try (attr)) _ <- try (many (oneOf " \n")) <|> return [] _ <- char '/' _ <- char '>' return (TagAttr (t) (Map.fromList atr)), allowed = [Wikitable], self = Tag } -- | maketagparser for all HTML elements see documentation on function -- maketagparser tagparser :: MyParser Char tagparser = maketagparser listOfTags -- | maketagparser for the 'pre' HTML tag see documentation on function -- maketagparser tagparserp :: MyParser Char tagparserp = maketagparser ["pre"] -- | maketagparser for the HTML tags for HTML tables see documentation on -- function maketagparser tagparsert :: MyParser Char tagparsert = (maketagparser listOfTableTags) { self = TableTag, reenv = const Tag } -- | makettagparser for all HTML elements see documentation on function -- makettagparser ttagparser :: MyParser Char ttagparser = makettagparser listOfTags -- | makettagparser for the 'pre' HTML tag see documentation on function -- makettagparser ttagparserp :: MyParser Char ttagparserp = makettagparser ["pre"] -- | makettagparser for the HTML tags for HTML tables see documentation on -- function makettagparser ttagparsert :: MyParser Char ttagparsert = (makettagparser listOfTableTags) { self = TableTag, reenv = const Tag } -- | maketagparser2 for all HTML elements see documentation on function -- maketagparser2 tagparser2 :: MyParser Char tagparser2 = maketagparser2 listOfTags -- | maketagparser2 for the 'pre' HTML tag see documentation on function -- maketagparser2 tagparser2p :: MyParser Char tagparser2p = maketagparser2 ["pre"] -- | maketagparser2 for the HTML tags for HTML tables see documentation on -- function maketagparser2 tagparser2t :: MyParser Char tagparser2t = (maketagparser2 listOfTableTags) { self = TableTag, reenv = const Tag } -- | makettagparser2 for all HTML elements see documentation on function -- makettagparser2 ttagparser2 :: MyParser Char ttagparser2 = makettagparser2 listOfTags -- | makettagparser2 for the 'pre' HTML tag see documentation on function -- makettagparser2 ttagparser2p :: MyParser Char ttagparser2p = makettagparser2 ["pre"] -- | makettagparser2 for the HTML tags for HTML tables see documentation on -- function makettagparser2 ttagparser2t :: MyParser Char ttagparser2t = (makettagparser2 listOfTableTags) { self = TableTag, reenv = const Tag } -- | a parser for mediawiki source extension tags tagparsers :: MyParser Char tagparsers = (maketagparser ["source", "syntaxhighlight"]) {self = Source} -- | a parser for mediawiki source extension tags inside tables ttagparsers :: MyParser Char ttagparsers = (maketagparser ["source", "syntaxhighlight"]) { self = Source, allowed = [Wikitable] } tagparsers2 :: MyParser Char tagparsers2 = (maketagparser2 ["source", "syntaxhighlight"]) {self = Source} -- | a parser for mediawiki source extension tags inside tables ttagparsers2 :: MyParser Char ttagparsers2 = (maketagparser2 ["source", "syntaxhighlight"]) { self = Source, allowed = [Wikitable] } -- | a parser for HTML tables mytablep :: MyParser Char mytablep = (maketagparser ["table"]) { self = TableTag, reenv = const Wikitable, allowed = Wikitable : SpaceIndent : everywheretbl } -- | a parser for HTML table rows mytrsepp :: MyParser Char mytrsepp = (maketagparser3 ["tr"]) { reenv = const TableRowSep, allowed = everywhere } -- | a parser for normal HTML table cells mytcolsepp :: MyParser Char mytcolsepp = (maketagparser3 ["td"]) { reenv = const TableColSep, allowed = everywhere } -- | a parser for HTML table captions cells mytcapp :: MyParser Char mytcapp = (maketagparser ["caption"]) { reenv = const TableCap, allowed = everywhere } -- | a parser for HTML table header cells, so th tags mythcolsepp :: MyParser Char mythcolsepp = (maketagparser3 ["th"]) { reenv = const TableHeadColSep, allowed = everywhere } mytrsepp2 :: MyParser Char mytrsepp2 = (maketagparser ["tr"]) { reenv = const TableRowSep, allowed = everywhere } -- | a parser for normal HTML table cells mytcolsepp2 :: MyParser Char mytcolsepp2 = (maketagparser ["td"]) { reenv = const TableColSep, allowed = everywhere } -- | a parser for HTML table captions cells mytcapp2 :: MyParser Char mytcapp2 = (maketagparser ["caption"]) { reenv = const TableCap, allowed = everywhere } -- | a parser for HTML table header cells, so th tags mythcolsepp2 :: MyParser Char mythcolsepp2 = (maketagparser ["th"]) { reenv = const TableHeadColSep, allowed = everywhere } -- | a parser for HTML tables for html parse mode only htmytablep :: MyParser Char htmytablep = (maketagparser ["table"]) -- | a parser for HTML table rows for html parse mode only htmytrsepp :: MyParser Char htmytrsepp = (maketagparser ["tr"]) -- | a parser for normal HTML table cells for html parse mode only htmytcolsepp :: MyParser Char htmytcolsepp = (maketagparser ["td"]) -- | a parser for HTML table captions cells for html parse mode only htmytcapp :: MyParser Char htmytcapp = (maketagparser ["caption"]) -- | a parser for HTML table header cells, so th tags for html parse mode only htmythcolsepp :: MyParser Char htmythcolsepp = (maketagparser ["th"]) -- | a parser for closing HTML tags which don't have an opening partner. This -- parser is only allowed to match within itemization enumerations etc. itagparser :: MyParser Char itagparser = baseParser { start = \_ -> do _ <- string "<" skipMany (char '/') t <- (oneOfTheStrings ["small"]) atr <- many (try (attr)) _ <- try (many (oneOf " \n")) <|> return [] _ <- char '>' return (TagAttr (t) (Map.fromList atr)), allowed = [Itemgroup], self = Tag } -- | a parser for closing HTML tags which don't have an opening partner rtagparser :: MyParser Char rtagparser = baseParser { start = \_ -> do _ <- string "<" skipMany (char '/') s <- (oneOfTheStrings (listOfTags ++ listOfTableTags)) atr <- many (try (attr)) _ <- try (many (oneOf " \n")) <|> return [] _ <- char '>' return (TagAttr ("bad" ++ s) (Map.fromList atr)), allowed = everywhere, self = Tag } -- | a parser for HTML opening tags which might be self closing but never have a -- matching closing partner stagparser :: MyParser Char stagparser = baseParser { start = \_ -> do _ <- string "<" t <- (oneOfTheStrings (listOfTags ++ listOfTableTags)) atr <- many (try (attr)) _ <- try (many (oneOf " ")) <|> return [] _ <- try (char '/') <|> return 'f' _ <- char '>' return (TagAttr t (Map.fromList atr)), self = Tag, allowed = [] } -- | a parser for HTML page breaks pagebreakp :: MyParser Char pagebreakp = baseParser { start = \_ -> do _ <- string "
    " return (Str ""), end = \_ -> return (), allowed = everywhere, self = PageBreak } -- | a parser for HTML comments commentp :: MyParser Char commentp = baseParser { start = \_ -> do _ <- string "" return (), self = Comment } -- | a parser for mediawiki reserved words reservedp :: MyParser Char reservedp = baseParser { start = \_ -> do s <- try (string "__NOTOC__") <|> try (string "__NOEDITSECTION__") <|> try (string "__notoc__") <|> try (string "__TOC__") <|> try (string "__Toc__") <|> try (string "__INHALTSVERZEICHNIS__") <|> try (string "__KEIN_INHALTSVERZEICHNIS__") <|> try (string "__FORCETOC__") <|> string " " return (Str s), self = Reserved, allowed = SpaceIndent : everywhere } -- | See documentation on evaluateItemgroup and itemParserLevelTwo itemStartString :: Anything Char -> String itemStartString (ItemStart x) = x : [] itemStartString _ = "" -- | See documentation on evaluateItemgroup and itemParserLevelTwo itemStopString :: Anything Char -> String itemStopString (ItemStop x) = x : [] itemStopString _ = "" -- | see documentation on evaluateItemgroup. Parser to parse the ItemStart and -- ItemStop elements which are essentially bracket into environments which are -- essentially nodes with children in the parse tree itemParserLevelTwo :: MyParser (Anything Char) itemParserLevelTwo = MyParser { bad = \_ -> pzero, start = \_ -> do pos <- getPosition z <- token show (\_ -> pos) (\x -> if (itemStartString x == []) then Nothing else Just x) return (Str (itemStartString z)), end = \z -> case z of (Str y) -> do pos <- getPosition _ <- token show (\_ -> pos) (\x -> if (itemStopString x == y) then Just x else Nothing) return () _ -> mzero, allowed = [Root, ItemEnv], self = ItemEnv, modify = \_ x -> x, reenv = id } -- | see documentation on evaluateItemgroup. helper function to generate a list -- of only opening or only closing brackets, that is ItemStart or ItemStop -- values. The string given as first parameter states which kinds of bracket -- shall be opened or closed. For Openning brackets you have to call this -- function ItemStart as second and True as third parameter. For closing -- brackets you have to use ItemStop and False generateEnvironmentTagsHelper :: String -> (Char -> Anything Char) -> Bool -> [Anything Char] generateEnvironmentTagsHelper (c : cs) t b = if b then (t c) : ([Item c]) ++ (generateEnvironmentTagsHelper cs t b) else (generateEnvironmentTagsHelper cs t b) ++ [(t c)] generateEnvironmentTagsHelper [] _ _ = [] -- | see documentation on evaluateItemgroup and insertEnvironmentTags. The first -- parameter is a string consisting of the characters #:* that is the begging of -- the last Itemline. The second is the same for the current ItemLine. This -- function return a list of ItemStart and ItemStop values for the difference -- between the first and the second parameter generateEnvironmentTags :: String -> String -> [Anything Char] generateEnvironmentTags (o : os) (n : ns) = if (o == n) then generateEnvironmentTags os ns else (generateEnvironmentTagsHelper (o : os) ItemStop False) ++ (generateEnvironmentTagsHelper (n : ns) ItemStart True) generateEnvironmentTags (o : os) [] = generateEnvironmentTagsHelper (o : os) ItemStop False generateEnvironmentTags [] (n : ns) = generateEnvironmentTagsHelper (n : ns) ItemStart True generateEnvironmentTags [] [] = [] -- | see documentation on evaluateItemgroup. The first parameter is a string -- consisting of the characters #:* that is the begging of the last Itemline. -- The second parameter is the content of an Itemgroup. This function returns -- the parse tree with the ItemStart and ItemStop values inserted insertEnvironmentTags :: String -> [Anything Char] -> [Anything Char] insertEnvironmentTags s ((Environment ItemLine (Str x) _) : xs) = (generateEnvironmentTags s x) ++ ( ( if ( ((length s) > (length x)) && ( if length (generateEnvironmentTags s x) > 0 then ( case last (generateEnvironmentTags s x) of Item _ -> False _ -> True ) else True ) && (x /= "") ) || (s == x) then [Item (last s)] else [] ) ++ insertEnvironmentTags x xs ) insertEnvironmentTags s (x : xs) = x : insertEnvironmentTags s xs insertEnvironmentTags _ [] = [] -- | see documentation on evaluateItemgroup. Inserts the ItemStart and ItemStop -- values as preparation for running the second level parse on the content of an -- ItemGroup. The first pararmenter is a string consisting of the characters #:* -- that is the begging of the first Itemline. The second parameter is the -- content of an Itemgroup. This function returns the parse tree with the -- ItemStart and ItemStop values inserted toEnvironmentTags :: String -> [Anything Char] -> [Anything Char] toEnvironmentTags s l = insertEnvironmentTags "" ( (Environment ItemLine (Str s) []) : l ++ [(Environment ItemLine (Str "") [])] ) -- | see documentation on evaluateItemgroup. Get the second level parse result, -- back to the first level parse result convertFromParsingLevelTwoToLevelOne :: [Anything (Anything Char)] -> [Anything Char] convertFromParsingLevelTwoToLevelOne ((C x) : xs) = x : convertFromParsingLevelTwoToLevelOne xs convertFromParsingLevelTwoToLevelOne ((Environment Root _ x) : xs) = (convertFromParsingLevelTwoToLevelOne x) ++ (convertFromParsingLevelTwoToLevelOne xs) convertFromParsingLevelTwoToLevelOne ((Environment ItemEnv s l) : xs) = ( Environment ItemEnv s ( findMatchingBrackets (remake parsers) ((convertFromParsingLevelTwoToLevelOne l)) ) ) : convertFromParsingLevelTwoToLevelOne xs convertFromParsingLevelTwoToLevelOne (_ : xs) = (convertFromParsingLevelTwoToLevelOne xs) convertFromParsingLevelTwoToLevelOne [] = [] -- | see documentation on evaluateItemgroup. Runs the parser itemParserLevelTwo -- on the inner part of an ItemGroup runItemGroupPraserLevelTwo :: GenParser (Anything Char) () [Anything (Anything Char)] -> [Anything Char] -> [Anything (Anything Char)] runItemGroupPraserLevelTwo p input = case (parse p "" input) of Left _ -> [] Right x -> x -- | this is for parsing itemization. It is implemented as two step process in -- the first step Itemgroup is created with ItemLine s in it. An ItemLine is a -- line starting with any combination of *#: . And Itemgroup is a sequence of -- lines of that kind. After this is done this function gets called with the -- content of an itemgroup. In the second step ItemStart and ItemStop elements -- are created, those are essentially the bracketed of the opening an closing -- part of the enumerations itemizations etc. . The function toEnvironmentTags -- does the insertion of the ItemStop and ItemStart values and remove the -- ItemLine values. parseAnything2 is run on it using the itemParserLevelTwo. -- This is turned into the parse tree by being passed to decon2 and put out of -- the parser monad by runItemGroupPraserLevelTwo. The resulting parse tree is -- one of type [Anything (Anything Char)] this needs to be but one level down to -- [Anything Char] this is done be convertFromParsingLevelTwoToLevelOne. The -- first parameter is a string consisting of the characters #:* that is the -- beginning of the first Itemline. The second parameter is the content of an -- Itemgroup evaluateItemgroup :: String -> [Anything Char] -> [Anything Char] evaluateItemgroup s l = convertFromParsingLevelTwoToLevelOne ( runItemGroupPraserLevelTwo ( decon2 (remake [itemParserLevelTwo]) ( parseAnything2 [ MyStackFrame { endparser = pzero, startdata = Str "", environment = Root, badparser = \_ -> pzero, parsernumber = 0, nestingdepth = 0 } ] (remake [itemParserLevelTwo]) [] ) ) (toEnvironmentTags s l) ) -- | a parser for a group of lines starting with one of *:;# representing in -- enumeration itemization etc. . This particular parser is allowed to match -- nearly everywhere itempgroupp :: MyParser Char itempgroupp = MyParser { bad = \_ -> pzero, start = \_ -> ( do _ <- string "\n" a <- many1 (oneOf ['*', ':', ';', '#']) return (Str a) ), end = \_ -> lookAhead ( try ( do _ <- string "\n" notFollowedBy ((oneOf ['*', ':', ';', '#'])) ) ), allowed = [Root, Wikitable, TemplateInside, Tag], self = Itemgroup, modify = \z -> case z of (Str x) -> evaluateItemgroup x _ -> id, reenv = id } -- | a parser for a group of lines starting with one of *:;# representing in -- enumeration itemization etc. . This particular parser is only allowed to -- match within templates itempgrouppt :: MyParser Char itempgrouppt = MyParser { bad = \_ -> pzero, start = \_ -> do _ <- string "\n" a <- many1 (oneOf ['*', ':', ';', '#']) return (Str a), end = \_ -> ( try ( lookAhead (string "}}") <|> (lookAhead (string "\n" >> (many (char ' ')) >> string "|")) ) >> return () ), allowed = [TemplateInside], self = Itemgroup, modify = \z -> case z of (Str x) -> evaluateItemgroup x _ -> id, reenv = id } -- | a parser for a preformat created by indenting with space presectionp :: MyParser Char presectionp = MyParser { bad = \_ -> try (string "}}") >> (return ()), start = \stack -> do if TableTag `elem` (map environment stack) then mzero else return () _ <- string "\n" _ <- char ' ' return (Str ""), end = \_ -> lookAhead ( do _ <- string "\n" notFollowedBy (char ' ') ), allowed = [Root, Tag], self = SpaceIndent, modify = \_ x -> (C ' ') : x, reenv = id } -- | a parser for a preformat created by indenting with space withing templates presectionpt :: MyParser Char presectionpt = MyParser { bad = \_ -> try (string "}}") >> (return ()), start = \_ -> do _ <- string "\n" _ <- notFollowedBy ((many1 (char ' ')) >> (char '|')) _ <- char ' ' return (Str ""), end = \_ -> lookAhead ( do _ <- string "\n" notFollowedBy (char ' ') ), allowed = [TemplateInside], self = SpaceIndent, modify = \_ x -> (C ' ') : x, reenv = id } -- | a parser for a line starting with one of *:;# representing in enumeration -- itemization etc. itemlinep :: MyParser Char itemlinep = MyParser { bad = \_ -> pzero, start = \_ -> do _ <- string "\n" a <- many1 (oneOf ['*', ':', ';', '#']) return (Str a), end = \_ -> (return ()), allowed = [Itemgroup], self = ItemLine, modify = \_ x -> x, reenv = id } droplinks :: [Anything Char] -> [Anything Char] droplinks ll = concat (map go ll) where go :: Anything Char -> [Anything Char] go (Environment Tag (TagAttr "div" m) _) | ((Map.lookup "class" m) == (Just "NavContent")) = [] go (Environment _ (TagAttr _ m) _) | ((Map.lookup "class" m) == (Just "navbox-abovebelow")) = [] go (Environment _ (TagAttr _ m) _) | ((Map.lookup "class" m) == (Just "navbox-group")) = [] go (Environment _ (TagAttr _ m) _) | (maybe False (isInfixOf "navbox-list") (Map.lookup "class" m)) = [] go (Environment _ (TagAttr _ m) _) | (maybe False (isInfixOf "nv-edit") (Map.lookup "class" m)) = [] go (Environment _ (TagAttr _ m) _) | (maybe False (isInfixOf "nv-talk") (Map.lookup "class" m)) = [] go (Environment _ (TagAttr _ m) _) | (maybe False (isInfixOf "nv-view") (Map.lookup "class" m)) = [] go (Environment _ (TagAttr _ m) _) | (maybe False (isInfixOf "collaps") (Map.lookup "class" m)) = [] go (Environment Tag (TagAttr "a" _) l) = droplinks l go (Environment x y l) = [Environment x y (droplinks l)] go x = [x] kartopred :: Map.Map [Char] [Char] -> Bool kartopred m = case (Map.lookup "class" m) of Just x -> isInfixOf "mw-kartographer-container" x _ -> False -- | takes a parse tree that was created form the HTML returned by MediaWiki -- when being requested for the print version of a wiki page. And returns a -- modified version of that parse tree ready for being converted to LaTeX with -- treeToLaTeX3 printPrepareTree2 :: Bool -> [Anything Char] -> [Anything Char] printPrepareTree2 vt ll = printPrepareTree vt ((getLemma ll) ++ (List.nub (getHead ll)) ++ (getContent ll)) getStyles :: [Anything Char] -> [Anything Char] getStyles ((Environment Tag (TagAttr "style" m) lll) : xs) = [(Environment Tag (TagAttr "style" m) lll)] ++ (getStyles xs) getStyles ((Environment _ _ lll) : xs) = (getStyles lll) ++ (getStyles xs) getStyles (_ : xs) = getStyles xs getStyles [] = [] getLemma :: [Anything Char] -> [Anything Char] getLemma ((Environment DhunUrl s l) : _) = [Environment DhunUrl s l] getLemma ((Environment _ _ lll) : xs) = (getLemma lll) ++ (getLemma xs) getLemma (_ : xs) = getLemma xs getLemma [] = [] getContent :: [Anything Char] -> [Anything Char] getContent ((Environment Tag (TagAttr "div" m) lll) : _) | (check (Map.lookup "class" m)) = lll where check (Just s) = isInfixOf "mw-parser-output" s check _ = False getContent ((Environment _ _ lll) : xs) = (getContent lll) ++ (getContent xs) getContent (_ : xs) = getContent xs getContent [] = [] getHead :: [Anything Char] -> [Anything Char] getHead ((Environment Tag (TagAttr "span" m) lll) : _) | ((Map.lookup "class" m) == (Just "mw-page-title-main")) = [Environment Tag (TagAttr "h1" Map.empty) lll] getHead ((Environment _ _ lll) : xs) = (getHead lll) ++ (getHead xs) getHead (_ : xs) = getHead xs getHead [] = [] printPrepareTree :: Bool -> [Anything Char] -> [Anything Char] printPrepareTree vt ll = concat (map printPrepareNode ll) where printPrepareNode :: Anything Char -> [Anything Char] printPrepareNode (Environment Tag (TagAttr "table" m) lll) | vt = [(Environment Wikitable (TagAttr "table" m) lll)] printPrepareNode (Environment Wikitable (TagAttr "table" m) lll) | vt = [(Environment Wikitable (TagAttr "table" m) lll)] printPrepareNode (Environment Tag (TagAttr "div" m) lll) | kartopred m = [(Environment Tag (TagAttr "div" m) lll)] printPrepareNode (Environment Tag (TagAttr "div" mm) l) | (Map.lookup "class" mm) == (Just "thumbinner") = case do (m, llll) <- case filter (mypred "a") (reducediv l) of [(Environment Tag (TagAttr "a" mmm) lll)] -> return (mmm, lll) _ -> mzero tt <- case filter (mypred "div") (reducediv l) of [(Environment Tag (TagAttr "div" mmm) tt)] | ( Map.lookup "class" mmm ) == (Just "thumbcaption") -> return . (dropWhile (== (C '\n'))) . (filter magnpred) $ tt _ -> mzero return $ imgfun m (printPrepareTree vt llll) (Just (printPrepareTree vt tt)) of Just x -> x _ -> printPrepareTree vt l printPrepareNode (Environment Wikitable (TagAttr "table" m) _) | (Map.lookup "class" m) == (Just "toc") = [] printPrepareNode (Environment Tag (TagAttr "tbody" _) x) = printPrepareTree vt x printPrepareNode (Environment Tag (TagAttr "div" m) _) | ( (Map.lookup "class" m) == (Just "toc") || (Map.lookup "id" m) == (Just "toc") ) = [] printPrepareNode (Environment Tag (TagAttr "input" _) l) = printPrepareTree vt l printPrepareNode (Environment Tag (TagAttr "main" _) l) = printPrepareTree vt l printPrepareNode (Environment Tag (TagAttr "label" _) _) = [] printPrepareNode (Environment Tag (TagAttr "form" _) _) = [] printPrepareNode (Environment Tag (TagAttr "ul" m) _) | ( (Map.lookup "class" m) == (Just "vector-toc-contents") || (Map.lookup "id" m) == (Just "mw-panel-toc-list") ) = [] printPrepareNode (Environment TableRowSep (TagAttr "tr" m) _) | (Map.lookup "style" m) == (Just "display:none;") = [] printPrepareNode (Environment Tag (TagAttr "a" m) _) | (Map.lookup "class" m) == (Just "mw-logo") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "class" m) == (Just "vector-header-start") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "p-search") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "vector-user-links-dropdown") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "p-vector-user-menu-overflow") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "vector-user-links-dropdown") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "class" m) == (Just "vector-settings") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "p-personal") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "p-user-menu-anon-editor") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "vector-main-menu") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "p-tb-label") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "p-coll-print_export-label") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "vector-page-titlebar-toc") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "p-variants") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "p-views") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "p-coll-print_export-labe") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "class" m) == (Just "vector-menu-content") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "class" m) == (Just "vector-menu-heading") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "data-name" m) == (Just "vector-toc") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "p-coll-print_export-label") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "p-lang-btn") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "p-cactions") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "p-tb") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "vector-toc") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "class" m) == (Just "vector-main-menu-action vector-main-menu-action-lang-alert") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "p-coll-print_export") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "vector-page-tools-dropdown") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "vector-page-tools") = [] {- printPrepareNode (Environment Tag (TagAttr "header" m) _) | (Map.lookup "class" m) == (Just "mw-body-header vector-page-titlebar") = [] -} printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "class" m) == (Just "vector-pinnable-header vector-toc-pinnable-header vector-pinnable-header-pinned") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "class" m) == (Just "vector-menu-heading") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "style" m) == (Just "display:none") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "class" m) == (Just "LanguageBar") = [] printPrepareNode (Environment Tag (TagAttr "button" _) _) = [] printPrepareNode (Environment Wikitable (TagAttr "table" m) _) | (Map.lookup "class" m) == (Just "navbox") = [] printPrepareNode (Environment Tag (TagAttr "title" _) _) = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "siteSub") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "catlinks") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "jump-to-nav") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "footer") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "p-lang") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "contentSub") = [] printPrepareNode (Environment Tag (TagAttr "span" m) _) | (Map.lookup "style" m) == (Just "display:none") = [] printPrepareNode (Environment Tag (TagAttr "span" m) _) | (Map.lookup "style" m) == (Just "display: none;") = [] printPrepareNode (Environment Tag (TagAttr "span" m) _) | (Map.lookup "class" m) == (Just "error") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "class" m) == (Just "printfooter") = [] {- printPrepareNode (Environment Wikitable (TagAttr "table" m) l) | maybe False (\x->or (map ($ x) (map isInfixOf ["navbox", "infobox"]))) (Map.lookup "class" m) = [Environment Wikitable (TagAttr "table" m) (droplinks (printPrepareTree vt (droplinks l)))] -} printPrepareNode (Environment Tag (TagAttr "span" m) _) | (Map.lookup "class" m) == (Just "mw-cite-backlink") = [] printPrepareNode (Environment Tag (TagAttr "a" m) _) | (Map.lookup "class" m) == (Just "mw-jump-link") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "mw-navigation") = [] printPrepareNode (Environment Source _ []) = [] printPrepareNode (Environment Tag (TagAttr "sup" m) l) | (Map.lookup "class" m) == (Just "reference") = [Environment Tag (TagAttr "sup" m) (reducea l)] printPrepareNode (Environment Tag (TagAttr "li" m) l) | (Map.lookup "class" m) == (Just "gallerybox") = case ( do llll <- case deepGet "div" "class" "thumb" l of [Environment Tag (TagAttr "div" _) lll] -> return lll _ -> mzero (mmm, lll) <- case deepGet "a" "class" "image" llll of [Environment Tag (TagAttr "a" mmm) lll] -> return (mmm, lll) _ -> case deepGet "a" "class" "mw-file-description" llll of [Environment Tag (TagAttr "a" mmm) lll] -> return (mmm, lll) _ -> mzero te <- case deepGet "div" "class" "gallerytext" l of [Environment Tag (TagAttr "div" _) te] -> return (printPrepareTree vt te) _ -> mzero return $ imgfun mmm (printPrepareTree vt lll) (Just te) ) of Just x -> x _ -> printPrepareTree vt l printPrepareNode (Environment TableHeadColSep (TagAttr t m) l) = [ Environment TableHeadColSep (TagAttr t m) ( (map (\x -> Environment Attribute (Attr x) []) (Map.toList m)) ) ] ++ (printPrepareTree vt l) printPrepareNode (Environment TableColSep (TagAttr t m) l) = [ Environment TableColSep (TagAttr t m) ( (map (\x -> Environment Attribute (Attr x) []) (Map.toList m)) ) ] ++ (printPrepareTree vt l) printPrepareNode (Environment TableRowSep (TagAttr t m) l) = [ Environment TableRowSep (TagAttr t m) ((map (\x -> Environment Attribute (Attr x) []) (Map.toList m))) ] ++ (printPrepareTree vt l) printPrepareNode (Environment Tag (TagAttr "pre" m) l) = [Environment Preformat (TagAttr "pre" m) l] printPrepareNode (Environment Tag (TagAttr "span" m) _) | (Map.lookup "class" m) == (Just "editsection") = [] printPrepareNode (Environment Tag (TagAttr "span" m) _) | (Map.lookup "class" m) == (Just "mw-editsection") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "mw-navigation") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "mw-panel") = [] printPrepareNode (Environment Tag (TagAttr "script" _) _) = [] printPrepareNode (Environment Tag (TagAttr "ul" m) _) | (Map.lookup "id" m) == (Just "footer-places") = [] printPrepareNode (Environment Tag (TagAttr "ul" m) _) | (Map.lookup "id" m) == (Just "footer-icons") = [] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "id" m) == (Just "mw-panel") = [] printPrepareNode (Environment Tag (TagAttr "figure" _) l) = case ( do (l3, m3) <- case deepGet "a" "class" "mw-file-description" l of ((Environment Tag (TagAttr "a" m2) l2) : _) -> return (l2, m2) _ -> mzero llll <- case deepGetFigCaption l of ((Environment Tag (TagAttr _ _) lll) : _) -> return lll _ -> mzero return $ (imgfun m3 (printPrepareTree vt l3) (Just (printPrepareTree vt (deepKillFigure llll)))) ++ (printPrepareTree vt (deepGetFigure llll)) ) of Just x -> x _ -> case ( do res <- Just (deepGetFigRes l) llll <- case deepGetFigCaption l of [Environment Tag (TagAttr _ _) lll] -> return lll _ -> mzero return $ [Environment Wikilink (Str "") (res ++ [C '|'] ++ (printPrepareTree vt llll))] ) of Just x -> x _ -> printPrepareTree vt l printPrepareNode (Environment Tag (TagAttr "a" m) l) = case (Map.lookup "class" m) of (Just "image") -> imgfun m (printPrepareTree vt l) Nothing (Just "mw-file-description") -> imgfun m (printPrepareTree vt l) Nothing _ -> case (Map.lookup "class" m) of (Just "external free") -> [Environment Tag (TagAttr "a" m) []] _ -> [Environment Tag (TagAttr "a" m) (printPrepareTree vt l)] printPrepareNode (Environment Tag (TagAttr "div" m) _) | (Map.lookup "class" m) == (Just "bodyContent") = [] printPrepareNode (Environment Tag (TagAttr "math" m) l) = case deepGet "annotation" "encoding" "application/x-tex" l of [Environment Tag (TagAttr "annotation" _) x] -> [ Environment Math (TagAttr "math" m) ( map C ( replace2 ( replace2 ( replace2 ( replace2 (shallowFlatten x) "&" "&" ) "<" "<" ) ">" ">" ) "'" "'" ) ) ] _ -> [] printPrepareNode (Environment Tag (TagAttr "h1" _) l) = [(Environment Wikiheading (Str "=") l)] printPrepareNode (Environment Tag (TagAttr "h2" _) l) = [(Environment Wikiheading (Str "==") l)] printPrepareNode (Environment Tag (TagAttr "h3" _) l) = [(Environment Wikiheading (Str "===") l)] printPrepareNode (Environment Tag (TagAttr "h4" _) l) = [(Environment Wikiheading (Str "====") l)] printPrepareNode (Environment Tag (TagAttr "h5" _) l) = [(Environment Wikiheading (Str "=====") l)] printPrepareNode (Environment Tag (TagAttr "h6" _) l) = [(Environment Wikiheading (Str "======") l)] printPrepareNode (Environment Tag (TagAttr "img" m) l) | go (Map.lookup "class" m) = case Map.lookup "alt" m of Just x -> [ Environment Math (TagAttr "math" m) ( map C ( replace2 ( replace2 (replace2 (replace2 x "&" "&") "<" "<") ">" ">" ) "'" "'" ) ) ] Nothing -> [ ( Environment Tag (TagAttr "img" m) (printPrepareTree vt l) ) ] where go :: Maybe String -> Bool go (Just x) = or (map (\y -> isInfixOf y x) ["tex", "mwe-math-fallback"]) go _ = False printPrepareNode (Environment Tag (TagAttr "div" m) l) = case do c <- Map.lookup "class" m guard $ ((isInfixOf "source" c) || (isInfixOf "highlight" c)) return $ Environment Source ( TagAttr "source" (Map.fromList [("lang", (takeWhile (/= ' ') c))]) ) (deepFlatten l) of Nothing -> [Environment Tag (TagAttr "div" m) (printPrepareTree vt l)] Just x -> [x] printPrepareNode (Environment x y l) = [Environment x y (printPrepareTree vt l)] printPrepareNode x = [x] mypred :: String -> Anything Char -> Bool mypred x y = case y of (Environment Tag (TagAttr z _) _) | z == x -> True _ -> False magnpred :: Anything Char -> Bool magnpred y = case y of (Environment Tag (TagAttr "div" m) _) | (Map.lookup "class" m) == (Just "magnify") -> False _ -> True unEsc x = let z = unEscapeString x in if isUTF8Encoded z then decodeString z else z imgfun _ l tt = maybeToList $ do t <- case tt of Just x -> return $ [C '|'] ++ x Nothing -> return [] h <- case filter (mypred "img") l of [(Environment Tag (TagAttr "img" mmm) _)] -> case Map.lookup "src" mmm of Just s -> if length ( reverse ( splitOn "/" s ) ) >= 2 then return ( "File:" ++ ( unEsc ( ( reverse ( splitOn "/" s ) ) !! ( if "thumb" `elem` splitOn "/" s then 1 else 0 ) ) ) ) else mzero _ -> mzero _ -> mzero w <- case case filter (mypred "img") l of [(Environment Tag (TagAttr "img" mmm) _)] -> do ma <- Map.lookup "width" mmm guard $ tt == Nothing return ma _ -> Nothing of Just x -> return $ [C '|'] ++ (map C (x ++ "px")) Nothing -> return [] return (Environment Wikilink (Str "") ((map C h) ++ w ++ t)) mediawiki2latex-8.29/src/MegaFont.hs000066400000000000000000030021311504464363500173740ustar00rootroot00000000000000-- | module storing information on which ttf font should be used for which -- character and fontstyle module MegaFont where import BaseFont -- | map (written as list) storing information on which ttf font should be used -- for which character and fontstyle megafont :: [(FontStyle, [Char])] megafont = [(FontStyle {stylebase = Normal, bold = False, italic = False}, "RRRRRRRRRDDRRDRRRRRRRRRRRRRRRRRRDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDLLDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDLLLLLLLLLLLLLLLDDLLLLLDDDDDDDDDDDDDDDDLDLDDDDDDDDLDDDDDDDDDDDDDDDDDDDDDDDLDDLDDDDDDDLLLLLLLLDDDDLLLDLLLLLLLLLLLLLLDDLLDDDLLLLLLLLLLLLLLLLLDDLLRRDLLLDLRRRRDDDDDDDRDRDDDDDDDDDDDDDDDDDDDDRDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDLLDLLLDLLDDDDDDLDDDLLLLLLLLLLLLLLLDLLLDLLLLLLLLLLDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDLLDDDDDDDDDDDDDLDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDLDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDLLDDDDLLLLLLLLLLLLLLLLLLDDLLLLLLDDDDLLLLLLLLLLLLLLLLLLRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRRLLLLLLLRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRLLRRRRLRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRRRRRRRRLLLLLLLLLLLLLLLLLLLLLLLLLLLRRRRRLLLLLRRRRRRRRRRRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRLLLLLLLLLLLLLLLLLLLLLRLLLLLLLLRRRRRRRRRRRRRRRRRRRRRLRLLLLLRRRRRRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRLLLLLLLLRRLLRRLLLLLLLLLLLLLLLLLLLLLLRLLLLLLLRLRRRLLLLRRLLLLLLLLLRRLLRRLLLLRRRRRRRRLRRRRLLRLLLLLRRLLLLLLLLLLLLLLLLLLLLLLLLRRRLLLRLLLLLLRRRRLLRRLLLLLLLLLLLLLLLLLLLLLLRLLLLLLLRLLRLLRLLRRLRLLLLLRRRRLLRRLLLRRRLRRRRRRRLLLLRLRRRRRRRLLLLLLLLLLLLLLLLRRRRRRRRRRRLLLRLLLLLLLLLRLLLRLLLLLLLLLLLLLLLLLLLLLLRLLLLLLLRLLRLLLLLRRLLLLLLLLLLRLLLRLLLRRLRRRRRRRRRRRRRRRLLLLRRLLLLLLLLLLLLRRRRRRRLLLLLLLRLLLRLLLLLLLLRRLLRRLLLLLLLLLLLLLLLLLLLLLLRLLLLLLLRLLRLLLLLRRLLLLLLLLLRRLLRRLLLRRRRRRRRLLRRRRLLRLLLLLRRLLLLLLLLLLLLLLLLLLRRRRRRRRRRLLRLLLLLLRRRLLLRLLLLRRRLLRLRLLRRRLLRRRLLLRRRLLLLLLLLLLLLRRRRLLLLLRRRLLLRLLLLRRLRRRRRRLRRRRRRRRRRRRRRLLLLLLLLLLLLLLLLLLLLLRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRLLLLRLLLLLLLLRLLLRLLLLLLLLLLLLLLLLLLLLLLLRLLLLLLLLLLRLLLLLRRLLLLLLLLLRLLLRLLLLRRRRRRRLLRRRRRRRLRLLLLRRLLLLLLLLLLRLLRRRRRRRRRRRRRLLLLRLLLLLLLLRLLLRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRLLLRLLLLLLRRRRLLLLLLLLLLLLLLLLRRLLLLLLLLLLLLLLLLLLLLLLLLLLRRLLRLLLLLLLLLLLLLLLLLLRRRLLLLLLLLLLLLLLLLLLLLLLLLRLLLLLLLLLRLRRLLLLLLLRRRLRRRRLLLLLLRLRLLLLLLLLRRRRRRLLLLLLLLLLRRLLLRRRRRRRRRRRRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRRRRDLLLLLLLLLLLLLLLLLLLLLLLLLLLLRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRRRRRRRRRRRRRRRRRRRQRRQQQQQQRRRQRQRRQQQRQRQRRRRRQQRQQQRQQQQQQQQQRQQQQRRRQQQQRQQQQQQQQQQRRRRRRRRQRRRRRRRRRRRRRRRRRRRRRRQQQQQQQQQQQQQQRRQQRQQQQQQQQRRQRQQQQQQQQQRQQRQRRRRRQQRQRRQQRRRRRRRQQRQQQQQQQQQQQQQRRQQQRQRQQQQRQQQRQRQQQRQRQQQQQQQQQQQQQQQQQQQQQQQQQQRRRRRRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRLLLLRRLLLLLLLRLRLLLLRRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRLLLLRRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRLLLLRRLLLLLLLRLRLLLLRRLLLLLLLLLLLLLLLRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRLLLLRRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRRLLLLLLRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRLLLLLLLLLLLLLLLLLLLLLLLRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRRLLLLLRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRLLLLLLLLLLLLLLLLLLLLLLLLLLLLRRLLRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRLLLLLLLLLLLLLLLLLRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRLLLLLLLLLRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRRRRRDLLLLLLDLLDDLDLLLLLLLLLLDDLLDLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLDDDDDDDDDLDLDDDDDLLDDDLDDLDDLDDLLLLLLLLLLLLLLLLLLLLLLDLLLLLLLLLLLLLLLLLLLLLLLDDDDLLLDLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLDDLLDDLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRLLLLLDDDDDDDDDDDDDDDDDDDDLLLLDDDDDDDDDDDDDDDDLLDDDDLLDDDDDDDDDDDDDDDDDDDDDDDDDDDDLLLLLLLLDDDDDDDDDDDDDDDDLLLLDDDDDDDDDDDDDDDDLLLLDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDLDLLLLDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDLLLLLLDDDDDDDDDDDDDDDDDDDDDDRRDDDDDDRRDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDRRDDDDDDRRDDDDDDDDRDRDRDRDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDRRDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDRDDDDDDDDDDDDDDDRDDDDDDDDDDDDDDRRDDDDDDRDDDDDDDDDDDDDDDDDDDRRDDDRDDDDDDDDDRDDDDDDDDDDDDDDLLDDDDDLDLDDDDDDDDDDDLLLDLLDLLLLLLDDLLLLLLLDDDLDLDDLLLDDDLLLLLLLLLLLDLDLLLLLLLLLLLLLLLLRLLLLRRRRRRLLRRLLLLLLLLLLLDDLLLLLLLLLLLLLLRLLLLLLLLLLLLLRRRLDLLDLDLLDLDDLLLLLDLLLLLLLLLLLLLRRRRRRRRRRRRRRRRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRRRRRRRRRRRRRRRLLLDLLLLLLLLLLLLLLLLLLDDLLLLLLDLDLDLLLDDLLLLLLDLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRRRRDDDDLLLDDLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLDLLLLLLLLLLLDLLLLDLLDLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLDLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLDLLLLLLDDLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLDDLLLRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLDLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLDLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLDLLLLLLLLLLLLLLLLLLLLLLLLLLDLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLDLLLLLLLLLLLLLLLLLLDLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLDLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLDDLLLDLLLLLLLLLLLLLLLLLLLLLLLLLLRRRRRLRLRLLRRLLRLRRRRLLLLLLLRRRLLLLLRRRRRLRRRRRRRRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLDLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRRRLLLLLLLLLLRRRRRRLLLLLLLLLLRRRRRRRRRRRRRRRRRRRRRRLLLLLLLLLLLLRRRRRRRRRLRRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRLRRRLLLLLLLLLLLLRLLLLLLRLRRRRRRRRRRRRRRRRRRRRRRRRRRLLLLRRRRRRRRRRRRRRRRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRLLLLLLLLLLLLLLLLLDLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRRRRRRRRRRRRRRLLRRRRRRLLLLRRRRRRRRRRRRRRRRLLLLLLLLLLLLLLLRRRRLLLRRRRRRRLLLLLLLRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRLLLLLLLLLDRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRRLLLLLLLLLLLLLRLRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRQQQQQQQQQQQQQQQQQQQQQQQQQQRQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRRRRRRRRRRRRQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRQQQQRQQQQQQQQQQQQQQQQQQQQQDDQQQQQQQQQQQQQQRRRRQQRRRRRRRRQQQRRRRRRQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRRRRRRQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRRRQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRRRQQQQQQQQQQQQQQRRRRRRRRRRRRRRRRRRRRQQQQRRRRRRRRQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRRRRRRRRRRRRRRRRRRRRRRRRRRRRQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRRRQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRRRRRRRRRLLLLLLLLLLLLLLLQQQQQQQQQQQQQQQQQQQQQQQQQQQQRRRQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQLLLLLLLLLLLLLLLQQQQQQQQQQQQRRRRQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRQQQQQQQQQQQQQQQQQQQQQQQQQRRRRRRRRRRQQQQRQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRRQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRRRRRRRRRRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRDDRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRDDLLLLLLDDLLLLLLLLLLLLDDLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRLLLLLLLLLLLLLLLLLLLLLLLLLLLDDLLLLLLLLLLDLLLLLDLLDLLLLDLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRRLLLRRRRRRRRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRRRRRRLLLLLLLLLLLLLLLLLLLRLLLLRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRLLLRRLLLLLLLLLRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRLLLLLLLRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRLLRRRLRRRRRRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRDRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRDDDDDDDDDDDDDDDDRDDDDDDDDDDDDDDRRDDDRRDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDRRDDDDDDDDDDDDDDDDDDDDDDDRDDDDDDDDDDRDDDDRDDDDDDDDDDDDDDDDDDDDDDRDDDDRDDRDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDRDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDRRRRRRRRRRRRRDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDRRDRDDDDRRDRDDRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRDDDDDDDDDRDDDDDDDDDRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRDDDDDDDDDDDDDDDDDRDDDDDDDDDDDDDDRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRDRRRRDDDRRDDDDRRRRRRRDRRRRRRRRRRRRRRRRRRRRRRRRRRDDRRDRDRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRDRRRRRRRRRRRDDDDDDDDDDRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRDDDDDDDDDDDDDDDDDDDDDDDDDDRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRDRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRDDDDDDDDDDDDDDDDDDDDDDDRDDDDDDDDRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRRQRQRRQQQQQQQQQQRQRQRRQQRRRQQQQRRQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRRRRRQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRDDDDDLLRRRRRRRRRRRRLLLLLRRRRRLLLLLLLLLLLLLLLLLLLLLLLLLLRLLLLLRLRLLRLLRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRRRRRRRRRRRRRRRRRLLLLLLLLLLLLLLLLLLLLLLLRRRRRRRRRRRRRRRRRRLLLLRRLRRRRRLRRRRRLRRRLRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRLRRRRRRRRRRRRRRRLLLLLLLLRLLLLLRLLLLLRLLLLLRLLLRRRRRRRRRRRRRRLLRLLLRLLRLLLRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRLLLRRRRRRLLLLRRRRRRLLLLRRRRRRRRRRRRRRLLLLRRRRRRLLLLRRRRRRRRRRRRRRRRRRRRRRRLLLLRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRLRRRRRRRRRLRRRLLLLLLLLLLLLLLLLRRRRRRRQQRRRRRRRLLLLLLLLLLLLLLLLQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRQQQQRQQQQQQQQQQQQQDRQQQQRRRRLLLLLRLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLRRLRQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRQQQQQQQRRRRRRRRQQRRRRRRRRLLLLLRR"), (FontStyle {stylebase = Normal, bold = True, italic = False}, "RRRRRRRRRCCRRCRRRRRRRRRRRRRRRRRRCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCKKCCKCCCCCCCKKCCCCCCKKKCCKKCCKKCCCCKKCCKCCCCCCCCCCCCKKCCCCCCCCCCCCCCKKCCCCCCCCCCKKCCCCCCCCCCCCCKKKKKCKCKKKKKCCCKCKKCKKKCCCKKCKCCKKKCKCCKCCKCKCCKKKKKKCKCCKKKKCCCCCCCCCCCCCCCCCCCCCCKKKKKKKKCKKKKCCKKCCCCKKKKCCCCCCCCKKCCKKCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCKKCCKCKKKCCCKKKKKKCCKKCCKCCCCCKKKKKKKKKKKCKKKKKKKKKKCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCKKCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCKKKKKKKKKKKKKKKCCKKKKKCCCCCCCCCCCCCCCCKCKCCCCCCCCKCCCCCCCCCCCCCCCCCCCCCCCKCCKCCCCCCCKKKKKKKKCCCCKKKCKKKKKKKKKKKKKKCCKKCCCKKKKKKKKKKKKKRRRRCCRRRRCKKKCKRRRRCCCCCCCRCRCCCCCCCCCCCCCCCCCCCCRCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCKKCKKKKKKCCCCCCKCCCKKKKKKKKKKKKKKKKKKKCKKKKKKKKKKCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCKKCCCCCCCCCCCCCKCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCKCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCRRCCCCKKRRRRRRRRRRRRRRKKCCKKKKKKCCCCKKKKKKKKKKRRRRRRKKRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKRRKKKKKKKRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKRKKRRRRKRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKRRRRRRRRKKKKKKKKKKKKKKKKKKKKKKKKKKKRRRRRKKKKKRRRRRRRRRRRKKKKKKKKKKKKKKKKKKKKKKKKKKKKRRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKKKKKKKKKKKKKKKKKKKKRKKKKKKKKRRRRRRRRRRRRRRRRRRRRRKRKKKKKRRRRRRKKRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKKRKKKKKKRRRRKKRRKKKKKKKKKKKKKKKKKKKKKKRKKKKKKKRKKRKKRKKRRKRKKKKKRRRRKKRRKKKRRRKRRRRRRRKKKKRKRRRRRRRKKKKKKKKKKKKKKKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKRKKKKKKRRRKKKRKKKKRRRKKRKRKKRRRKKRRRKKKRRRKKKKKKKKKKKKRRRRKKKKKRRRKKKRKKKKRRKRRRRRRKRRRRRRRRRRRRRRKKKKKKKKKKKKKKKKKKKKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKKKRKKKKKKKKRKKKRKKKKKKKKKKKKKKKKKKKKKKKRKKKKKKKKKKRKKKKKRRKKKKKKKKKRKKKRKKKKRRRRRRRKKRRRRRRRKRKKKKRRKKKKKKKKKKRKKRRRRRRRRRRRRRKKKKRKKKKKKKKRKKKRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKRKKKRKKKKKKRRRRRRRKRRRRRRRKKKKKRRKKKKKKKKKKKKKKKKRRRKKKKKKKRRKKRKKKKKKKKKKKKKKKKKKRRRKKKKKKKKKKKKKKKKKKKKKKKKRKKKKKKKKKRKRRKKKKKKKRRRKRRRRKKKKKKRKRKKKKKKKKRRRRRRKKKKKKKKKKRRKKKRRRRRRRRRRRRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKRRRRCKKKKKKKKKKKKKKKKKKKKKKKKKKKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKKRKRRRKKKKKKKKRRKKKKKKKRRRRRRRRRKKKRRRRRRRRRRRCKKKKKKCKKCCKCKKKKKKKKKKCCKKCKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKCCCCCCCCCKCKCCCCCKKCCCKCCKCCKCCKKKKKKKKKKRRRRRRRRRRRKCRRKRRRRRRRRRRRRRRRRRRRRCCCCRRRCRRRKKKKKKKKKKKKKKKRKKKKKKKKKKKKKKKKKKKKKKKRRCCRRCCKRRRKKRKRRKRRKRKKKKKKKKKKRKKKKKKKKKRKKKKKKKKRRRRRRKKKKCCCCCCCCCCCCCCCCCCCCKKKKCCCCKKCCCCCCCCCCKKCCCCKKCCCCCCCCCCCCCCCCCCCCCCCCCCCCKKKKKKKKCCCCCCCCCCCCCCCCKKKKCCCCCCCCCCCCCCCCKKKKCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCKCKKKKCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCKKKKRRCCCCCCCCCCCCCCCCCCCCCCRRCCCCCCRRCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCRRCCCCCCRRCCCCCCCCRCRCRCRCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCRRCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCRCCCCCCCCCCCCCCCRCCCCCCCCCCCCCCRRCCCCCCRCCCCCCCCCCCCCCCCCCCRRCCCRCCCCCCCCCRCCCCCCCCCCCCCCKKCCCCCKCKCCCCCCCCCCCKKKCKKCKKKKKKCCKKKKKKKCCCKCKCCKKKCCCKKKKKKKKKKKCKCKKKKKKKKKKKKKKKKRKKKKRRRRRRKKRRKKKKKKKKKKKCCKKKKKKKKKKKKKKRKKKKKKKKKKKKKRRRKCKKCKCKKCKCCKKKKKCKKKRRKKKRKKKKRRRRRRRRRRRRRRRRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKRRRRRRRRRRRRRRRKKRCRKKKKKKKRRKKKKKKKRCCKRRKKRCKCKCKRRCCRKKKKRCKRKKKRKKKKKKKRRRRRKKKKRRRRRRKRKKRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKRRRRRRRRRKKKRRRRCCCCKKKCCKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKRRRRRRRRRRKKKKKKKKKRRRKKKKKKCKKKKKKKKKKKCKKKKCKKCKKKKKKKKKKKKKKKKKKKRRRRRRKKKKKKKKKKKRKKKKRKRRKKKRRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKRRKKKKKKKRKKKKRRKKKKKKCKKKKKKKKKKKKKKRKKKKKKKKKKKKKKKKKKKKKKKKKKKKRRRKKKKRRRRKKRKRRRRRRRKKKKRRRRKRRRRRRRRRRRRRRRKKCKRRRRRCCRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRCCRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKCKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKCKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKRRRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKCKRKKKKKKRRKKKRRRKKKKKKKKKKCKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKCKKKKKKKKKKKKKKKKKKCKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKCKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKRKKKKKKKKKKKKKKKKKKKCCKKKCKKKKKKKKKKKKKKKKKKKKKKKKKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKCKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKRRKKKRRRRRRKKKKKRRRKKRRRKKRRRRRRRKKKKKKKKKKKKRRKKKKKKKKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKKKKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKKKKKKKKKKKKKRKKKKKRRRRRRRRRRKKKRRRRRRRRRRRRRRKKRRRRRRKRRRRRKRRKKRRRRRRRRRRRRKKKKKRRKRKRRKRKKKKRRRRRRRRKRKRKRRRRRRRRRRRRRRRRRRRRRRRRRKKRKRRRRRRRRKRRRRRRRRRRRKRRKKKKRRRRRKRRRRRRRRRRRRRRRRRRRKRKKKKKKRKKKKKKKKKRRRRKKKKKKRKRKKKKKKKRRRRRRRRRRRKKKKRRRRRRRRRKKKRKKRRKKRRKKKKKKKKKKKKKKKKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKRRKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKRRRRRRRRKKRRRRRRRRRRRRRRRRKRRRRKKKKRKRRRKKKRRRRRRRRRRRRKRRRRKKKRRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKRRRRRRRRRRRRKKKKKKKKKKKKKRRRKKKKKKKKKKRRRRRRKKKKKKKKKKRRRRRRRRRRRRRRRRRRRRRRKKKKKKKKRRRRRRRRRRRRRKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKKKKKKKKRKKRRRRRKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKRKKCRRRRRRRRRKKKRRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKKKKKKKKKKKKKKKKKKKKRKKRKKKKKKKKKKKKKKKKKKKKKRKRRKRRRKKCRKKKKKKKKKKKKKKKKKKKKKKKKKKKKRRKRKKKKRRKKKRKKKKKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRCCRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKKKKKKKKKKKKKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKKKKKKKKKKKKKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRCCRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRCCRRKKRKCCRKKKRRKKRRKKCCRRRRRRRRKKRRRRRRKKRRKKRKKKKKKKKKKKKKKKKKRRRRRRRRRRRRRRRRRRRRRRRRKKRRKKKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKKKKKKKKKKKKKKKKKKKKKKKKKKCCKKKRRRRRRKCKKKKKCKKCKRRRCRRRRRRRRRRKRRRRRRRRRRRRRKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKRRRRRRKKKKKKRKKKKKRRRRRRRRRRRRRRRRRRRRRRKKRKKKKKKRKKKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKKKKKKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKKKKKKKKKKKKKKKKKKKKKKKRRKKRRKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRCRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRCCCCCCCCCCCCCCCCRCCCCCCCCCCCCCCRRCCCRRCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCRRCCCCCCCCCCCCCCCCCCCCCCCRCCCCCCCCCCRCCCCRCCCCCCCCCCCCCCCCCCCCCCRCCCCRCCRCCCCCCCCCCCCCCCCRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRCCCRRRRRRRRRRRRRCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCRRCRCCCCRRCRCCRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRCCCCCCCCCRCCCCCCCCCRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRCCCCCCCCCCCCCCCCCRCCCCCCCCCCCCCCRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRCRRRRCCCRRCCCCRRRRRRRCRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRCRRRRRRRRRRRCCCCCCCCCCRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRCRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRCCCCCKKRRRRRRRRRRRRKKKKKRRRRRKKKKKKKKKKKKKKKKKKKKKKKKKKRKKKKKRKRKKRKKRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKRRRRRRRRRRRRRRRRRKKKKKKKKKKKKKKKKKKKKKKKRRRRRRRRRRRRRRRRRRKKKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKKKKKKKRKRRKKRKRRKKRKRRKKRKRRRRRRRRRRRRRRRRKKRKRRRKKRKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKRRRRRRRRRKRRRKKKKKKKKKKKKKKKKRRRRRRRRRRRRRRRRKKKKKKKKKKKKKKKKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRCRRRRRRRRRKKKKKRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKRRKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRKKKKKRR"), (FontStyle {stylebase = Normal, bold = False, italic = True}, "RRRRRRRRRBBRRBRRRRRRRRRRRRRRRRRRBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBIIBBIIBBBBBBIIBBBBBBIIIBBIIBBIIBBBBIIBBIBBBBBBBBBBBBIIBBBBBBBBBBBBBBIIBBBBBBBBBBIIBBBBBBBBBBBBIIIIIIBIIIIIIIIBBIBIIIIIIIIIIIIIBBIIIIIIIIIIIIIBBIIIIIIBIIIIIIIIIIIIBBBBBBBBBBBBBBBBBIIIIIIIIBIIIIBBIIBBBBIIIIBBBBBBBBIIBBIIBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBIIBBIIIIIIBBIIIIIIBBIIBBIIIBIIIIIIIIIIIIIBIIIIIIIIIIIIIIBIIIIBIBBIIIIIIIIBIIIIIIIIIBIIIIIBIIIBIIIIIIIIIBIIIBIIIIBIIIIIBIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIBIIBIIIIIIIIIBBIIIIIIBBIIIIIIIIBBBBBBIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIBBBBBBBBBBBBBIIBIBIBBBBBIIIIIIIIIIIBBBBBBIIIBBBBBBBIBBIBBIIIIIIIIIIIIIIBIIIIIIIIIIIIIIIIIIIIBBIIIBIIIIIIIIIIIIIIRRRRBBRRRRBIIIBIRRRRBBBBBBBRBRBBBBBBBBBBBBBBBBBBBBRBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBIIBIIIIIIBBBBBBIBBBRRRRRRRRRRRRRRIIIIIBIIIIIIIIIIBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBIIBBBBBBBBBBBBBIBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBIBBBBIBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRBBBBRRRRRRRRRRRRRRRRIIBBRRRRRRBBBBIIRRRRRRRRRRRRRRRRRIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIRRIIIIIIIRIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIRIIRRRRIRIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIRRRRRRRRIIIIIIIIIIIIIIIIIIIIIIIIIIIRRRRRIIIIIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRIIRRRRRRRRRRRRRRRRRIIRRRRRRRRRRRRRRRRRRRRRRRRRRIIIIRIIIIIIIIRRIIRRIIIIIIIIIIIIIIIIIIIIIIRIIIIIIIRIRRRIIIIRRIIIIIIIIIRRIIRRIIIIRRRRRRRRIRRRRIIRIIIIIRRIIIIIIIIIIIIIIIIIIIIIIIIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIRRRRBIIIIIIIIIIIIIIIIIIIIIIIIIIIIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIRIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIRRRRRRRRRRRIIRRIRRRRIRRRRRRRRRRRRRRRRRRRRRRRRRRIIIIIIIIIIIIIIIRIIIIIIIIIIIIIIIIIIIIIIIRRRRRRRRIRRRIIRIRRIRRIRIIIIIIIIIIRIIIIIIIIRRIIIIIIIIRRRRRRIIIIBBBBBBBBBBBBBBBBBBBBIIIIBBBBIIBBBBBBBBBBIIBBBBIIBBBBBBBBBBBBBBBBBBBBBBBBBBBBIIIIIIIIBBBBBBBBBBBBBBBBIIIIBBBBBBBBBBBBBBBBIIIIBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBIBIIIIBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBIIIIRRBBBBBBBBBBBBBBBBBBBBBBRRBBBBBBRRBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRBBBBBBRRBBBBBBBBRBRBRBRBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRBBBBBBBBBBBBBBBRBBBBBBBBBBBBBBRRBBBBBBRBBBBBBBBBBBBBBBBBBBRRBBBRBBBBBBBBBRBBBBBBBBBBBBBBIIBBBBBIBIBBBBBBBBBBBIIIBIIBIIIIIIBBIIIIIIIBBBIBIBBIIIBBBIIIIIIIIIIIBIBIIIIIIIIIIIIIIIIRIIIIRRRRRRIIRRIIIIIIIIIIIIBIIIIIIIIIIIIIIRIIIIIIIIIIIIIRRRIBIIBIBIIBIBBIIIIIBIIIIRIIIRIIIIRRRRRRRRRRRRRRRRIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIRRRRRRRRRRRRRRRIIIBIIIIIIIIIIIIIIIIIIBBIIIIIIBIBIBIIIBBIIIIIIBIIIIIIIIIIIIIIRIIRIIIIRRRRRIIRIIRIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIRRRRRRRRRIIIRRRRBBBBIIIIIIRRRRRRRRRRIIIIRIIRRRRRRRRRIIIIRRIIIIIIIIIIIIIRRRRIIRRRIIIIIIRRRRIIIIRRRRRRRRIIIIRRRRRRRRRRRIRRRRRRRRRRIIIIIIBIIIIIIIIIIIBIIIIBIIBIIIIIIIIIIIIIIIIIIIIIRRRRIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIBIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIRIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIBBIIIIIIIIIIIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRIIIRRRRRRRRRRIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIBIIIIIIIIIIIIIIIIIIIIIIIIIIBIIIIIIIIIIIIIIIIIIIIIIIIIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRIIIIIIIIRIBIIIIIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRIIIBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRIIIIIIIIIIIIIIIIIIIIIIIIIIIIIBIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRIIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRIIIIIIIRRRRRRRRRRIIRRRRIIIRIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIRRIIIIIIIIIIIIIIIIIIIIIIIIIRRIIIIRIRIIIIIIRIIIIIIIIIRIIIIIIIIIIIRIIIIIIIIIIIIIIIRRIIIIIIIIIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIRRRRRRRRRRRRRRRRIIIRRIIIIIIIIRRRIIIIIIIIIIRRRRRRIIIIIIIIIIRRRRRRRRRRRRRRRRRRRRRRIIIIIIIIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRIIIIIIIIIRIIRRRRRIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRIRIIIRRRRRRRRRIIIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRIIIIIIIIIIIIIIIIIIIIIRIIIIIIIIIIIIIIIIIIIIIIIIRIRRIIRRIIBRIIIIIIRRRRRRRRIIIIIIIIIIIIIIRRIRIIIIRRIIIRRIIIIIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRIIIIIIIIIIIIIIIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRIIIIIIIIIIIIIIIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRBIIIIIIIBIRIIIRRIIRRRRBIRRRRRRRRRRRRRRRRIIRRIIRIRRRIIIIIIIIIIIIIRRRRRRRRRRRRRRRRRRRRRRRRIIRRIIIIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIRRRRRRIIIIIIIIIIIIRRRRRRRRRRRRRRIRRRRRRRRRRRRRIIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRIIRRRRRRIIIIIIRIIIRRRRRRRRRRRRRRRRRRRRRRRRIRRRRIIIRRRRIIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRIIIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRBBBBBBBBBBBBBBBBRBBBBBBBBBBBBBBRRBBBRRBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRBBRRRRBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRBBBRRRRRRRRRRRRRBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRBRBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRBBBBBBBBBRBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRBRBBBBRRRRBBBRRBBBBRRRRRRRBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRBRRRRRRRRRRRBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRBBBBBIIRRRRRRRRRRRRIIIIIRRRRRIIIIIIIIIIIIIIIIIIIIIIIIIIRIIIIIRIRIIRIIRIIIIIIIIIIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRIIIIIIIIIIIIIIIIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRIIIIIRR"), (FontStyle {stylebase = Normal, bold = True, italic = True}, "RRRRRRRRRAARRARRRRRRRRRRRRRRRRRRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJJAAJJAAAAAAJJAAAAAAJJJAAJJAAJJAAAAJJAAJAAAAAAAAAAAAJJAAAAAAAAAAAAAAJJAAAAAAAAAAJJAAAAAAAAAAAAJJJJJJAJJJJJJJJAAJAJJJJJJJJJJJJJAAJJJJJJJJJJJJJAAJJJJJJAJJJJJJJJJJJJAAAAAAAAAAAAAAAAAJJJJJJJJAJJJJAAJJAAAAJJJJAAAAAAAAJJAAJJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJJAAJJJJJJAAJJJJJJAAJJAAJJJAJJJJJJJJJJJJJAJJJJJJJJJJJJJJAJJJJAJAAJJJJJJJJAJJJJJJJJJAJJJJJAJJJAJJJJJJJJJJJJJAJJJJJJJJJJAJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJAJJAJJJJJJJJJAAJJJJJJAAJJJJJJJJAAAAAAJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJAAAAAAAAAAAAAJJAJAJAAAAAJJJJJJJJJJJAAAAAAJJJAAAAAAAJAAJAAJJJJJJJJJJJJJJAJJJJJJJJJJJJJJJJJJJJAAJJJAJJJJJJJJJJJJJJRRRRAARRRRAJJJAJRRRRAAAAAAARARAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJJAJJJJJJAAAAAAJAAARRRRRRRRRRRRRRJJJJJAJJJJJJJJJJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJJAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARRAAAARRRRRRRRRRRRRRRRJJAARRRRRRAAAAJJRRRRRRRRRRRRRRRRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRJJJJJJJRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRJJRRRRJRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRRRRRRRJJJJJJJJJJJJJJJJJJJJJJJJJJJRRRRRJJJJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRRRAJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJJJJJJJJJJJJJJJJJJJJJRRJJJJJJRRJJJJRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRJJJJJJJJJJJJJJJJJJJJJJRRRRRRRRRRRJJRRJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJJJJJJJJJJJJJJRJJJJJJJJJJJJJJJJJJJJJJJRRRRRRRRJRRRJJRRRRJRRJRJJJJJJJJJJRJJJJJJJJJRJJJJJJJJRRRRRRJJJJAAAAAAAAAAAAAAAAAAAAJJJJAAAAJJAAAAAAAAAAJJAAAAJJAAAAAAAAAAAAAAAAAAAAAAAAAAAAJJJJJJJJAAAAAAAAAAAAAAAAJJJJAAAAAAAAAAAAAAAAJJJJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAJJJJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARRRRRRAAAAAAAAAAAAAAAAAAAAAARRAAAAAARRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARRAAAAAARRAAAAAAAARARARARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAARAAAAAAAAAAAAAARRAAAAAARAAAAAAAAAAAAAAAAAAARRAAARAAAAAAAAARAAAAAAAAAAAAAAJJAAAAAJAJAAAAAAAAAAAJJJAJJAJJJJJJAAJJJJJJJAAAJAJAAJJJAAAJJJJJJJJJJJAJAJJJJJJJJJJJJJJJJRJJJJRRRRRRJJRRJJJJJJJJJJJJAJJJJJJJJJJJJJJRJJJJJJJJJJJJJRRRJAJJAJAJJAJAAJJJJJAJJJRRJJJRJJJJRRRRRRRRRRRRRRRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRRRRRRRRRRRRRRJJRARJJJJJJJRRJJJJJJJRAAJRRJJRAJAJAJRRAARJJJJRAJRJJJRJJJJJJJRRRRRJJJJRRRRRRJRJJRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRRRRRRRRJJJRRRRAAAAJJJJJJJJRRJJJJJJJJJJJRRRRRRRRRRRRRRRJJRRJJJJJJJJJJJJJJJJJRRRJJJJJJRRRRRRJJRRRRRRJJRRRRRRRRRRRRRRRRRRRRRRRRRRJJJJJJAJJJJJJJJJJJAJJJJAJJAJJJJJJJJJJJJJJJJJJJRRRRRRJJJJJJJJJJJRJJJJRJRRJJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRJJJJJJJRJJJJRRJJJJJJAJJJJJJJJJJJJJJRJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRRJJJJRRRRJJRJRRRRRRRJJJJRRRRJRRRRRRRRRRRRRRRRRJJRRRRRAARRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRAARRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJJJJJJRRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJAJRJJJJJJRRJJJRRRJJJJJJJJJJAJJJJJJJJJJJJJJJJJJJJJJJJJRRRRRJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRARRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJJJJJJJRJAJJJJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJJAARRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJAJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJJJJJRRJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJJJJJJJJRJJRRRRRJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJRJJJRRRRRRRRRJJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJJJJJJJJJJJJJJJJJJJJRJJRJJJRJJJRRRRRRRRRRRRRRRJRRJRRRJJARJJRRJJRRRRRRRRJJJJJJJJJJJJJJRRJRJJJJRRJJJRJJJJJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRAARRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRAARRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRARRRRRRJARRJJJRRJJRRRRAJRRRRRRRRRRRRRRRRJJRRJJRJRRRRJJJJJJJJJJJJRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRRRRRJJJJJJJJJJJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJJJJRRJRRRRRRRRRRRRRRRRRRRRRRRRRRJRRRRJJJRRRRJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRARRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRAAAAAAAAAAAAAAAARAAAAAAAAAAAAAARRAAARRAAAAAAAAAAAAAAAAAAAAAAAAAAARRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRAARRRRAAAAARRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRAAARRRRRRRRRRRRRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARRARAAARRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRAAAAAAAAARAAAAAAAAARRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRARAAAARRRRAAARRAAAARRRRRRRARRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRARRRRRRRRRRRAAAAAAAAAARRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRARRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRAAAAAJJRRRRRRRRRRRRJJJJJRRRRRJJJJRRRRRRRRJJJJJJJJJJJJJJRJJJJJRJRJJRJJRJJJJJJJJJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJJJJJJJJJJJJJJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRARRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJJJJRR"), (FontStyle {stylebase = Mono, bold = False, italic = False}, "RRRRRRRRRHHRRHRRRRRRRRRRRRRRRRRRHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHPPHHPHHHHHHHPPHHHHHHPPPHHPPHHPPHHHHPPHHPHHHHHHHHHHHHPPHHHHHHHHHHHHHHPPHHHHHHHHHHPPHHHHHHHHHHHHHPPPPPHPHPPPPPHHHPHPPHPPPHHHPPHPHHPPPHPHHPHHPHPHHPPPPPPHPHHPPPPHHHHHHHHHHHHHHHHHHHHHHPPPPPPPPHPPPPHHPPHHHHPPPPHHHHHHHHPPHHPPHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHPPHHPHPPPHHHPPPPPPHHPPHHPHHHHHPPPPPRRPPPPHPPPPRRPPPPHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHPPHHHHHHHHPPHHHHHHHHHHHHHHHHHHHHHHHHHHPPPPPPPPPPPPPPPHHPPPPPHHHHHHHHHHHHHHHHPHPHHHPPHHHPHHHHHHHHHHHHHHHHHHHHHHHPHHPHHHHHHHPPPPPPPPHHHHPPPHPPPPPPPPPPPPPPHHPPHHHPPPPPPPPPPPPPRRRRHHRRRRHPPPHPRRRRHHHHHHHRHRHHHHHHHHHHHHHHHHHHHHRHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHRPHPPPPPRHHHHHHRHHHRRRRRRRRRRRRRRPPPPPHPRRPRRPPPPHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHPPHHHHHHHHHHHHHPHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHPHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHPPHHHHPPPPPPPPPPPPPPPPPPHHRRRRRRHHHHPPRRRRPPPPRRRRRRRRRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRRPPPPPPPRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRPPRRRRPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPPPPPPPPPPPPPPPPPPPPPPRRRRRRRRPPPPPPPPPPPPPPPPPPPPPPPPPPPRRRRRPPPPPRRRRRRRRRRRPPPPRRPPPPPPPPPPPPPPPPPPPPPPPRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPPPPPPPPPPPPPPPPPPPRPPPPPPPPRRRRRRRRRRRRRRRRRRRRRPRPPPPPRRRRRRPRRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRHRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPPPPRRRRRPPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPPPRRRPPPPPPPPRRRRRRRRRRRRRPRRRRPPPRRRRRRRRRRRHPPPPPPHPPHHPHPPPPPPPPPPHHPPHPPPPPPPRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPHHHHHHHHHPHPHHHHHPPHHHPHHPHHPHHPPPPPPPPPPRRRRRRRRRRRPHRRPRRRRRRRRRRRRRRRRRRRRHHHHRRRHRRRPPPPPPPPPPPPPPPRPPPPPPPPPPPPPPPPPPPPPPPRRHHPPHHPRRRPPRPRRPRRPRPPPPPPPPPPRPPPPPPPPRRPPRPPPPPPPPRRRPPPPHHHHHHHHHHHHHHHHHHHHPPPPHHHHPPHHHHHHHHHHPPHHHHPPHHHHHHHHHHHHHHHHHHHHHHHHHHHHPPPPPPPPHHHHHHHHHHHHHHHHPPPPHHHHHHHHHHHHHHHHPPPPHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHPHRRPRHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHPPRRRRHHHHHHHHPPPPPPPPHHHHHHRRPPPPPPRRHHHHHHHHPPPPPPPPHHHHHHHHPPPPPPPPHHHHHHRRPPPPPPRRHHHHHHHHRPRPRPRPHHHHHHHHPPPPPPPPHHHHHHHHHHHHHHRRHHHHHHHHPPPPPPPPHHHHHHHHPPPPPPPPHHHHHHHHPPPPPPPPHHHHHRHHHHPHHHHHHHHHHRHHPHPHHHHHHHHHRRHHHHPHRHHHHHHHHHHHHHPHPHHHRRHHHRHHPHPHHHHRPHPHPPPHHPPPPPPPHHHHHPHPHHHHHHHHHHHPPPHPPHPPPPPPHHPPPPPPPHHHPHPHHPPPHHHPPPPPPPPPPPHPHPPPPPPPPPPPPPPPPRPPPPRRRRRRPPRRPPPPPPPPPPPHHPPPPPPPPPPPPPPRPPPPPPPPPPPPPRRRRHPPHPHPPHPHHPPPPPHPPPRRPPPRPPPPRRRRRRRRRRRRRRRRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRRRRRRRRRRRRRRRPPPHPPPPPPRRRPPPPPPPPPHHPPPRPPHRHPHRPRHHRPPPRRHRRRPRRPPPPPPPRRRRRPPPPRRRRRRPRPPRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRRRRRRRRRPPPRRRRHHHHPPPHHPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRRPPPPPPPPPPPPRRRRPPPPRPPRRRRRRPPPPPPPPPHPPPPPPPPPPPHPPPPHPPHPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPHPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRPPPPPRPPPPPPPPPRPRPPRRPPRRPPPPPPHPPPPPPHHPPRRRRRRRRRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRRRPPPPPPPPPPPPPRPPPPPPPPRRRRPPPPPPPRRRRRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPHHPPPRRRRRRRRRRRRRRRRRRRRRRRRRPPPPPPPPPPPRRRRRRRRRRRRRRRRRRRRRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPHPHPPPPPPPPPHPPPHPPPHPPPHPPPHPPPPPPPHPPPPPPPHPPPPPPPHPPPPPPPHPPPPPPPPPPPPPPPPPPPHHHHHHHHHHHHHHHHHHHHHHHHHHHHPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPHPPPPPPPPPPPPPPPPPPPPPPPPPPHPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPHPPPPPPPPPPPPPPPPPPHPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPHPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPHHPPPHPPPPPPPPPPPPPPPPPPPPPPPPPPRRRRRPRPRPPRRPPRPRRRRPPPPPPRRRRPPPPPRRRRRPRRRRRRRRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPHPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRPPPPPPPPPPRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRRRRRPPRRPPRRRRRRPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPPPPRRRRRRRPPRRRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRPPPPPPRPPRPPPPPPPPPPPPPPPPPPRRRRPPPPPPPPPPRPRPPRRPPPPRRRRRRRRRRPPPPPPPPPPPPPRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRRRPPRRPPPPPPPPPPPPPPPPPPPPPPPRRRRRRPPPPPPPPPPPPPPPPRRRRRRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRRRRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRRPPPPPPPPPRPRPRRPPPPRPPPRPPPPPRRRPPPPPPPPRRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRRRRRRRRRRRRRRRRPPPRRPPPPPPPPRRRPPPPPPPPPRRRRRRRPPPPPPPPPPRRRRRRRRRRRRRRRRRRRRRRPPPPPPPPPPPPRRRRRRRRRPRRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRPRRRPPPPPPPPPPPPRPPPPPPRPRRRRRRRRRRRRRRRRRRRRRRRRRRPPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPRRRRRRRPRPPHPPRRRRRRRPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPPPPPPPPPPPPPPPPPPPRPPRPPPPPPPPPRRRRPPRRRPPPRPRRPPRRPPHRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRRPPPRPPPPPPPPPRPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRHHRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPPPPPPPPPPPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPPPPPPPPPPPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRHHRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRHHRRPPRPHHRPPPRRRPRRRPHHRRRRRRRRRRRRRRRRPPRRRRRPPPPRPPPPPPPPPPPPRRPRRRRRRRRRRRRRRRRRRRRRRRRRPPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPPPPPPPPPPPPPPPPPPPPPPPPPHHPPPRRRRRRPHRRRRRHRRHPRRRHRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPRRRRRRPPPPPRRPRRPPRRRRRRRRRRRRRRRRRRRRRRPPRRRPPPPRPPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPRRPPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPPPPPPPPPPPPPPPPPPPPPPRRRPRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRHRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRHHHHHHHHHHHHHHHHRHHHHHHHHHHHHHHRRHHHRRHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHRRHHHHHHHHHHHHHHHHHHHHHHHRHHHHHHHHHHRHHHHRHHHHHHHHHHHHHHHHHHHHHHRHHHHRHHRHHHHHHHHHHHHHHHHRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRHHHRRRRRRRRRRRRRHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHRRRRRRRRRRRRRRRRRRRRRRRRHHHHHHRRHRHHHHRRHRHHRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRHHHHHHHHHRHHHHHHHHHRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRHHHHHHHHHHHHHHHHHRHHHHHHHHHHHHHHRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRHRRRRRRRRRRHRRRRHHHRRHHHHRRRRRRRHRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRHRRRRRRRRRRRHHHHHHHHHHRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRHRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRHHHHHHHHRRRRRRRRRRRPPPPPRRRRRPPPPPPPPPPPPPPPPPPPPPPPPPPRPPPPPRPRPPRPPRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRRRRRRRRRRRRRRRRRPPPPPPPPPPPPPPPPPPPPPPPRRRRRRRRRRRRRRRRRRPPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPRRRRRRRRRPRRRPPPPPPPPPPPPPPPPRRRRRRRRRRRRRRRRPPPPPPPPPPPPPPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRHRRRRRRRRRPPPPPRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRRPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPPPRR"), (FontStyle {stylebase = Mono, bold = True, italic = False}, "RRRRRRRRRGGRRGRRRRRRRRRRRRRRRRRRGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGNNGGNNGGGGGGNNGGGGGGNNNGGNNGGNNGGGGNNGGNGGGGGGGGGGGGNNGGGGGGGGGGGGGGNNGGGGGGGGGGNNGGGGGGGGGGGGNNNNNNGNNNNNNNGGGNGNNNNNNNNNNNNNGGNNNNNGGNNNNNNGGNNNNNNGNNNNNNNNNNNNGGGGGGGGGGGGGGGGGNNNNNNNNGNNNNGGNNGGGGNNNNGGGGGGGGNNGGNNGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGNNGGNRNNNNGGNNNNNNGGNNGGRRRGRRRRRNRRRNNNRGRRRRRRRRRRGNNNGRNNGGRGGRRNNNNRRGNNNNNNRNRGNNNNNGNRRGNNNNNNNNNNNNRGNNRRGGGNNNGNNNNNNGNNGNGNNNNRRRRRRRRRRRRRGNGGGNNGGGNNGNNNNNNNNNGGNNNNNNNNNNNNNNNNGGGGGGNNNGGGNNNNNNNNNNNNNNNNNNNNNNNNNNNNGGGGGGGGGGGGGNNGNGNGGGNNNNNNNNNNNNNGGGGGGNNNGGGGGGGNGGNGGNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNGGNNNGNNNNNNNNNNNNNNRRRRGGRRRRGNNNGNRRRRGGGGGGGRGRGGGGGGGGGGGGGGGGGGGGRGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGRNGNNNNNRGGGGGGRGGGRRRRRRRRRRRRRRNNNNNGNRRNRRNNNNGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGRRGGGGGGGGGGGGGRGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGNGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGRRGGGGNNRRRRRRRRRRNRRRNNGGRRRRRRGGGGNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNNNNNNNNNNNNNNNNNNRRRRRRRRNNNNNNNNNNNNNNNNNNNNNNNNNNNRRRRRNNNNNRRRRRRRRRRRNNNRRRNNNNNNNNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNNNNNNNNNNNNNNNRNNNNNNNNRRRRRRRRRRRRRRRRRRRRRNRNNNNNRRRRRRNRRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRGRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRGGRGGGGGGRGRGGGGGRRGGGRGGRGGRGGRRRRRRRRRRRRRRRRRRRRRRGRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRGGGGGGGGGGGGGGGGGGGGNNNNGGGGNNGGGGGGGGGGNNGGGGNNGGGGGGGGGGGGGGGGGGGGGGGGGGGGNNNNNNNNGGGGGGGGGGGGGGGGNNNNGGGGGGGGGGGGGGGGNNNNGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGNGRRRRGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGRRRRRRGGGGGGGGNNNNNNNNGGGGGGRRNNNNNNRRGGGGGGGGNNNNNNNNGGGGGGGGNNNNNNNNGGGGGGRRNNNNNNRRGGGGGGGGRNRNRNRNGGGGGGGGNNNNNNNNGGGGGGGGGGGGGGRRGGGGGGGGNNNNNNNNGGGGGGGGNNNNNNNNGGGGGGGGNNNNNNNNGGGGGRGGGGNGGGGGGGGGGRGGNGNGGGGGGGGGRRGGGGNGRGGGGGGGGGGGGGNGNGGGRRGGGRGGNGNGGGGRNGNGNNNGGNNNNNNNGGGGGNGNGGGGGGGGGGGNNNGNNGNNNNNNGGNNNNNNNGGGNGNGGNNNGGGNNNNNNNNNNNGNGNNNNNNNNNNNNNNNNRNNNNRRRRRRNNRRNNNNNNNNNNNGGNNNNNNNNNNNNNNRNNNNNRRRRRRRRRRRRGRNGNGNRGNGGNNRRNGNNNRRNNNRNNRNRRRRRRRRRRRRRRRRNNNNNNNNRRRNNNNNNNNNNNNNNNNNNNNNNRRRRRRRRRRRRRRRNNRGRNNNRNRRRRNNRNNNRRGGNRRRNRGRGNGRRRGGRNNNRRGRRRNRRNNNNRNNRRRRRNNNNRRRRRRNRNNRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRRRRRRRRRNNNRRRRGGGGNNNNNNRRRRRRRRRRNNNNRRRRRRRRRRRRRNRRRNRRNNNNNNNNNNNNNNNNNRRRNNNNNNRRRRRRRRRRRRRRNNRRRRRRRRRRRRRRRNRRRRRRRRRRNNNNNNGNNNNNNNNNNNGNNNNGNNGNNNNNNRRNRNRNNNNNNRRRRRRRNNNNNNNNNNRRRRNNRNRRNRNNNRRRNNNNNNRNNNNRNRRNNNNNNNNNRRNNRRRRRRNNRRRRRRRRRRRRRRNNNNNNRRRRRNNRRRRRRNRNRNRRRRRRRRRRRNRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNRNGRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNRNRRRRRNNNNRRRRNRNRRRRRNNRRRRRRNNNNRRRRRGGRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRGGRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRGNGNNNNNNNNNGNNNGNNNGNNNGNNNGNNNNNNNGNNNNNNNGNNNNNNNGNNNNNNNGNNNNNNNNNNNNNNNNNNNGGGGGGGGGGGGGGGGGGGGGGGGGGGGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNRRNNNNNNNNNNGNNNNNNNNNNNNNNNNNRRRRRRRRRRRRRRRNNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRGRRNNNNNNNNRNNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNNRNGNNNNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNGGRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRGRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNRNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNNNRRRRNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNRRRRRRRRRRRRRRRRNNNRRRRNNNNNNRRRNNNNNNRRNRRRRRRRNNNNNNNNNNRRRRRRRRRRRRRRRRRRRRRRNNNNNNNNRRRRRRRRRRRRRNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNNNRRRRRRRRNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRGRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNNNNNNNNNNNNNNNRNNRNNNRRRRRRRRRRRRRRRRRRRNRRNRRRNNGRNNRRNNRRRRRRRRNNNNNNNNNNNNNNRRNRNNRNRRNNNRNNNNNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRGGRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRGGRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRGGRRRRRNGGRNNNRRRRRRRRGGRRRRRRRRRRRRRRRRNNRRRRRNRNRRNNNNNNNRNNNNRRNRRRRRRRRRRRRRRRRRRRRRRRRRNNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNRRRRRRNNNNNRRNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNRRRRNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNRNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRGRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRGGGGGGGGGGGGGGGGRGGGGGGGGGGGGGGRRGGGRRGGGGGGGGGGGGGGGGGGGGGGGGGGGRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRGGRRRRGGGGGRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRGGGRRRRRRRRRRRRRGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGRRRRRRRRRRRRRRRRRRRRRRRRGGGGGGRRGRGGGGRRGRGGRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRGGGGGGGGGRGGGGGGGGGRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRGRRRRGGGRRGGGGRRRRRRRGRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRGRRRRRRRRRRRGGGGGGGGGGRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRGRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRGGGGGRRRRRRRRRRRRRRRRRRRRRRRRNNNNRRRRRRRRRNNNNNNNNNNNNNRNNNNNRNRNNRNNRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRRRRRRRRRRRRRRRRRNNNNNNNNNNNNNNNNNNNNNNNRRRRRRRRRRRRRRRRRRNNNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNRRRRRRRRRNRRRNNNNNNNNNNNNNNNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRGRRRRRRRRRNNNNNRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNRR"), (FontStyle {stylebase = Mono, bold = False, italic = True}, "RRRRRRRRRFFRRFRRRRRRRRRRRRRRRRRRFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFOOFFOOFFFFFFOOFFFFFFOOOFFOOFFOOFFFFOOFFOFFFFFFFFFFFFOOFFFFFFFFFFFFFFOOFFFFFFFFFFOOFFFFFFFFFFFFOOOOOOFOOOOOOOOFFOFOOOOOOOOOOOOOFFOOOOOOOOOOOOOFFOOOOOOFOOOOOOOOOOOOFFFFFFFFFFFFFFFFFOOOOOOOOFOOOOFFOOFFFFOOOOFFFFFFFFOOFFOOFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFOOFFOROOOOFFOOOOOOFFOOFFRRRFRROOOOORROOOOFOOOORROOOOOOOOFOOOOFOFFOOOOOOOOFOOOOOOOOOFOOOOOFOOOFOOOOOOOOOOOOOFOOOOOOOOOOFOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOFOOFOOOOOOOOOFFOOOOOOOOOOOOOOOOFFFFFFOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOFFFFFFFFFFFFFOOFOFOFFFOOOOOOOOOOOOOFFFFFFOOOFFFFFFFOFFOFFOOOOOOOOOOOOOOFOOOOOOOOOOOOOOOOOOOOFFOOOFOOOOOOOOOOOOOORRRRFFRRRRFOOOFORRRRFFFFFFFRFRFFFFFFFFFFFFFFFFFFFFRFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFROFOOOOORFFFFFFRFFFRRRRRRRRRRRRRROOOOOFORRORROOOOFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFOOFFFFFFFFFFFFFOFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFOFFFFOFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFOOFFFFRRRRRRRRRRRRRRRROOFFRRRRRRFFFFOORRRROOOORRRRRRRRROOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOORROOOOOOOROOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOROORRRRORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROOOOOOOOOOOOOOOOOOOOOOOORRRRRRRROOOOOOOOOOOOOOOOOOOOOOOOOOORRRRROOOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRFRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROOOOOOOOOOOOOOOOOOOOORRROOOOORRROOOORORRRRRROOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOORROOOOOOOOOOOOOOOOOOOOOORRRRRRRRRRROORRORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROOOOOOOOOOOOOOOROOOOOOOOOOOOOOOOOOOOOOORROOOOOORRRROORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRFFFFFFFFFFFFFFFFFFFFOOOOFFFFOOFFFFFFFFFFOOFFFFOOFFFFFFFFFFFFFFFFFFFFFFFFFFFFOOOOOOOOFFFFFFFFFFFFFFFFOOOOFFFFFFFFFFFFFFFFOOOOFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFOFRRRRFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFRRRRRRFFFFFFFFOOOOOOOOFFFFFFRROOOOOORRFFFFFFFFOOOOOOOOFFFFFFFFOOOOOOOOFFFFFFRROOOOOORRFFFFFFFFROROROROFFFFFFFFOOOOOOOOFFFFFFFFFFFFFFRRFFFFFFFFOOOOOOOOFFFFFFFFOOOOOOOOFFFFFFFFOOOOOOOOFFFFFRFFFFOFFFFFFFFFFRFFOFOFFFFFFFFFRRFFFFOFRFFFFFFFFFFFFFOFOFFFRRFFFRFFOFOFFFFROFOFOOOFFOOOOOOOFFFFFOFOFFFFFFFFFFFOOOFOOFOOOOOOFFOOOOOOOFFFOFOFFOOOFFFOOOOOOOOOOOFOFOOOOOOOOOOOOOOOOROOOORRRRRROORROOOOOOOOOOOOFOOOOOOOOOOOOOOROOOOOOOOOOOOORRRRFOOFOFOOFOFFOOOOOFOOORROOOROORORRRRRRRRRRRRRRRROOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOORRRRRRRRRRRRRRROOOFOOOOOORRROOOOOOOOOFFOOOROOFRFOFRORFFROOORRFRRRORROOOOOOORRRRROOOORRRRRROROOROOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOORRRRRRRRROOORRRRFFFFOOOOOORRRRRRRRRROOOOOOORRRRRRRRROORRRRRROOOOOOOOORORRRROORRROOOOOORRRRRROORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROOOOOOFOOOOOOOOOOOFOOOOFOOFOOOOOOOOOOOOOOOOOORRRRRRROOOOOOOOOORRROOORORROROOORRROOOOOOROOOOROOOOOOROOOOORRRRRRRRRRRRRRRRRRRRRRRRRROOOOOORRRRRRRRRRRRROOOOOOOOORRRROOOOOOORRRRRRRRROOOORRRRRRRRRRRROOOOFRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRORORRRRRRRRRRRRROROROORROORRRRRRRROOOOOOOFFOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRFFRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOFRFRRRRRRRRRFRRRFRRRFRRRFRRRFRRRRRRRFRRRRRRRFRRRRRRRFRRRRRRRFRRRRRRRRRRRRRRRRRRRFFFFFFFFFFFFFFFFFFFFFFFFFFFFRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOFOOOOOOOOOOOOOOOOOOOOOOOOOOFOOOOOOOOOOOOOOOOOOOOOOOOOORROROORRORRRROORRRRRRRRRROOOOOOOROOOOOOOOOOOFOORRRRRRRROOOOOOORRRRRRRRRRRRRRRRRRRRROOOOOOOOOOOOOOOOOOOOROFOOOOOOORRRRRRRRRRRRROOOOOOOOOOORRRRRRRRRRRRRRRRORRRRRORRRRRRRRROOOFFROORRRRRRRRRRROOROOOORRRRRRRORRRRRRORORRRRRRORRRRRRRROOOORRRRRRRRORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRFRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROOOOOOOOOOOOOOOOOOOOOOOOOOOOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROOORRRRRRRORORRRRRRRRRRROORRROORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROORRRRRRRRRRRRRRRRRRRRRRRRRRROROROOOORRRRRRROOOOORRRRRRRRRRORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROORORRRRRRRRRRRRRRRRRRRROOOOOOORRORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROOOOOOOOROOOOOOOOOOOOOOOOOOOOORRRRRRRRRRRRRRRROOORRRROOOOOORRROOOOOORRORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROOOOOOOOORRRRRRRRORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRORRRRRRRRROOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROOOOOOOOOOOOOOOOOOOOOROOROOOROOORRRRRRRRRRRRRRRORRORRROOFROORROORRRRRRRROOOOOOOOOOOOOORROROORORROOOROOOOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRFFRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRFFRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRFORRRRROFRROOORRRRRRRRFRRRRRRRRRRRRRRRRROORRRRRRRRRROOOOOOOOOOOORRORRRRRRRRRRRRRRRRRRRRRRRRROOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROORRRRRRRROORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROORRRRRROOOOORRORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROOOOROOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRFRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRFFFFFFFFFFFFFFFFRFFFFFFFFFFFFFFRRFFFRRFFFFFFFFFFFFFFFFFFFFFFFFFFFRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRFFRRRRFFFFFRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRFFFRRRRRRRRRRRRRFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFRRRRRRRRRRRRRRRRRRRRRRRRFFFFFFRRFRFFFRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRFFFFFFFFFRFFFFFFFFFRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRFRFFFFRRRRFFFRRFFFFRRRRRRRFRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRFRRRRRRRRRRRFFFFFFFFFFRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRFRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRFFFFFRRRRRRRRRRRRRROOOOORRRRROOOOOOOOOOOOOOOOOOOOOOOOOOROOOOOROROOROOROOOOOOOOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROOOOOOOOOOOOOOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRFRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROOOOORR"), (FontStyle {stylebase = Mono, bold = True, italic = True}, "RRRRRRRRREERRERRRRRRRRRRRRRRRRRREEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRREEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEMMEEMMEEEEEEMMEEEEEEMMMEEMMEEMMEEEEMMEEMEEEEEEEEEEEEMMEEEEEEEEEEEEEEMMEEEEEEEEEEMMEEEEEEEEEEEEMMMMMMEMMMMMMMEEEMEMMMMMMMMMMMMMEEMMMMMEEMMMMMMEEMMMMMMEMMMMMMMMMMMMEEEEEEEEEEEEEEEEEMMMMMMMMEMMMMEEMMEEEEMMMMEEEEEEEEMMEEMMEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEMMEEMRMMMMEEMMMMMMEEMMEERRRERRRRRMRRRMMMRERRRRRRRRRREMMMERMMEEREERRMMMMRREMMMMMMRMREMMMMMERRREMMMMMMMMMMMMREMMRREEEMMMEMMMMMMEMMEMEMMMMRRRRRRRRRRRRREMEEEMMEEEMMEMMMMMMMMMEEMMMMMMMMMMMMMMMMEEEEEEMMMEEEMMMMMMMMMMMMMMMMMMMMMMMMMMMMEEEEEEEEEEEEEMMEMEMEEEMMMMMMMMMMMMMEEEEEEMMMEEEEEEEMEEMEEMMMMMMMMMMMMMMEMMMMMMMMMMMMMMMMMMMMEEMMMEMMMMMMMMMMMMMMRRRREERRRREMMMEMRRRREEEEEEEREREEEEEEEEEEEEEEEEEEEEREEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEERMEMMMMMREEEEEEREEERRRRRRRRRRRRRRMMMMMEMRRMRRMMMMEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEERREEEEEEEEEEEEEREEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEMEEEEMEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEERREEEERRRRRRRRRRRRRRRRMMEERRRRRREEEEMMRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRMMMMMMMMMMMMMMMMMMMMMMMMRRRRRRRRMMMMMMMMMMMMMMMMMMMMMMMMMMMRRRRRMMMMMRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRREEREEEEEEREREEEEERREEEREEREEREERRRRRRRRRRRRRRRRRRRRRRERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRREEEEEEEEEEEEEEEEEEEEMMMMEEEEMMEEEEEEEEEEMMEEEEMMEEEEEEEEEEEEEEEEEEEEEEEEEEEEMMMMMMMMEEEEEEEEEEEEEEEEMMMMEEEEEEEEEEEEEEEEMMMMEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEMERRRREEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEERRRRRREEEEEEEEMMMMMMMMEEEEEERRMMMMMMRREEEEEEEEMMMMMMMMEEEEEEEEMMMMMMMMEEEEEERRMMMMMMRREEEEEEEERMRMRMRMEEEEEEEEMMMMMMMMEEEEEEEEEEEEEERREEEEEEEEMMMMMMMMEEEEEEEEMMMMMMMMEEEEEEEEMMMMMMMMEEEEEREEEEMEEEEEEEEEEREEMEMEEEEEEEEERREEEEMEREEEEEEEEEEEEEMEMEEERREEEREEMEMEEEERMEMEMMMEEMMMMMMMEEEEEMEMEEEEEEEEEEEMMMEMMEMMMMMMEEMMMMMMMEEEMEMEEMMMEEEMMMMMMMMMMMEMEMMMMMMMMMMMMMMMMRMMMMRRRRRRMMRRMMMMMMMMMMMEEMMMMMMMMMMMMMMRMMMMMRRRRRRRRRRRRERMEMERREMEEMMRRMEMMMRRMMMRMMRMRRRRRRRRRRRRRRRRMMMMMMMMRRRMMMMMMMMMMMMMMMMMMMMMMRRRRRRRRRRRRRRRMMRERMMMRMRRRRMRRMMMRREEMRRRMREREMERRREERMMMRRERRRMRRMMMMRMMRRRRRMMMMRRRRRRMRMMRMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMRRRRRRRRRMMMRRRREEEEMMMMMMRRRRRRRRRRMMMMRRRRRRRRRRRRRRRRRMRRMMMMMMMMMMMMMMMMMRRRMMMMMMRRRRRRRRRRRRRRMMRRRRRRRRRRRRRRRRRRRRRRRRRRMMMMMMEMMMMMMMMMMMEMMMMEMMEMMMMMRRRMRMRMMMMMMRRRRRRRMMMMMMMMMMRRRRMMRMRRMRMMMRRRMMMMMMRMMMMRMRRMMMRMMMMMRRRRRRRRRRMMRRRRRRRRRRRRRRMMMMMMRRRRRMMRRRRRRRRRRRRRRRRRRRRRRMRRRRRRRRRRRRRRRRRRRRRRRRRRRRMMRMERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRMRMRRRRRRRRRRRRRMRRRRRRRMMRRRRRRRRRRRRRRREERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRREERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRERERRRRRRRRRERRRERRRERRRERRRERRRRRRRERRRRRRRERRRRRRRERRRRRRRERRRRRRRRRRRRRRRRRRREEEEEEEEEEEEEEEEEEEEEEEEEEEERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMEMMMMMMMMMMMMMMRRMMMMMMMMMMEMMMMMMMMMMMMMMMMMRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRMMMMMMMMRMEMMMMMRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRMMMEERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRMMRMRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRMMMMMMMMRMMMMMMMMMMMMMMMMMMMMMRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRMMMMMMRRMRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRMMMMMMMMMRRRRRRRRMRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRMMMMMMMMMMMMMMMMMMMMRRMMRMMMRRRRRRRRRRRRRRRRRRRMRRMRRRMMERMMRRMMRRRRRRRRMMMMMMMMMMMMMMRRMRMMRMRRMMMRMMMMMMRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRREERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRREERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRREMRRRRRMERRMMMRRRRRRRRERRRRRRRRRRRRRRRRRMMRRRRRMRRRRMMMMMMMRMMMMRRMRRRRRRRRRRRRRRRRRRRRRRRRRMMMRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRMMRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRMMRRRRRRMMMMMRRMRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRMMRRRRMMRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRMRMRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRREEEEEEEEEEEEEEEEREEEEEEEEEEEEEERREEERREEEEEEEEEEEEEEEEEEEEEEEEEEERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRREERRRREEEEERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRREEERRRRRRRRRRRRREEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEERRRRRRRRRRRRRRRRRRRRRRRREEEEEERREREEERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRREEEEEEEEEREEEEEEEEERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRERRRREEERREEEERRRRRRRERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRERRRRRRRRRRREEEEEEEEEERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRREEEEERRRRRRRRRRRRRRRRRRRRRRRRMMMMRRRRRRRRRMMMMMMMMMMMMMRMMMMMRMRMMRMMRMMMMMMMMMMRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRMMMMMMMMMMMMMMMMRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRMMMMMRR"), (FontStyle {stylebase = Smallcaps, bold = False, italic = False}, "RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"), (FontStyle {stylebase = Smallcaps, bold = True, italic = False}, "RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"), (FontStyle {stylebase = Smallcaps, bold = False, italic = True}, "RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"), (FontStyle {stylebase = Smallcaps, bold = True, italic = True}, "RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR")] mediawiki2latex-8.29/src/MyState.hs000066400000000000000000000364531504464363500172750ustar00rootroot00000000000000{-# LANGUAGE DefaultSignatures #-} {-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DeriveGeneric #-} -- | A module for mutable states used in the programm module MyState where import BaseFont import Control.Monad.Trans.State (State) import qualified Data.Map as Map import Data.Map.Strict (Map) import Data.Serialize import GHC.Generics import MediaWikiParseTree -- | a type used as mutable state while processing a table. See documentation of -- the TableHelper module data TableState = TableState { -- | the row index of the current row in the table rowCounter :: Int, -- | The row index of the last row of the header, may be used to create the -- endhead command for the last line of the table header in the second run -- of the table rendering facility inputLastRowOfHeader :: Int, -- | This is used to calculate the row index of the last row of the header -- in a first run of the table rendering facility outputLastRowOfHeader :: Int, -- | This is used to calculate if a table has header columns in the first -- run of the table rendering facility. outputTableHasHeaderRows :: Bool, -- | This signal if the multirowmap of the last row was empty. The -- multirowmap is a facility to keep track of cells which span multiple -- rows. This is true if the last column process had no such cells in -- itself. lastRowHadEmptyMultiRowMap :: Bool, -- | This is true if the current row is the first row of the table. As each -- row it starts with a tr HTML tag or similar start maker in the wiki. But -- in LaTeX no such marker is possible in the first row, so the marker needs -- to be ignored in the first column, this is why this bit is here. isFirstRow :: Bool, -- | This true if the last cell was a header cell. In HTML this is denoted -- by a th tag and in wiki notation by the single or double exclamation -- mark. lastCellWasHeaderCell :: Bool, -- | This is true if the current cell is still part of the header of the -- table. The table header consists of the adjacent cells denoted with th -- tags in HTML or single or double exclamation mark in wiki notation in the -- beginning of the table. stillInTableHeader :: Bool, -- | The columns index of the current column of the table currentColumn :: Int, -- | A map of currently active multi row cells. Its a map. the keys of the -- map are the column indices. The values of the map are tuples. The first -- element of each tuple is row multiplicity the second on is the column -- multiplicity. See `TableHelper.multiRowDictChangeStart` for details. multiRowMap :: Map Int (Int, Int), -- | the total number of columns in the table numberOfColumnsInTable :: Int, -- | True if the last cell spans multiple rows lastCellWasMultiRow :: Bool, -- | True if the horizontal and vertical rules of the table shall be drawn. -- See `TableHelper.seperatingLinesRequested` for details. seperatingLinesRequestedForTable :: Bool, -- | True if the current row contains cells denoted by th in HTML notation -- or single or double exclamation mark in wiki notation. Note that this -- alone is not enough to be part of the header of the table. Only the -- adjacent lines which contain at least one cell for which -- currentRowIsHeaderRow is true in the beginning of the table are -- considered header rows. currentRowIsHeaderRow is set to true th cell and -- reset to falls by any tr tag. So it is only guaranteed to be right at the -- end of the current row. currentRowIsHeaderRow :: Bool, -- | True if the last cell was the first cell of a row of the table. lastCellWasNotFirstCellOfRow :: Bool, -- | The list of width of the column in units of the line width. See -- `LatexRenderer.wdth3` for details. columnsWidthList :: [Float], -- | True if the last cell spans multiple columns lastCellWasMultiColumn :: Bool, -- | Used for the table column pre compliation with LaTeX to calculate the -- column widths in an automated manner. If it has the value Just i then -- only the content of the column with index i is returned as LaTeX output -- and all other columns are written to the LaTeX output without with empty -- content. activeColumn :: Maybe Int } -- | see documentation of the makeLables function in WikiHelper module data UrlState = UrlState { -- | The number of the current label. iUrlState :: Int, -- | The page name of the downloaded page currently being processed by the -- algorithm. sUrlState :: String, -- | A mapping from combined page and chapter, section etc. names (like -- urls) to their label numbers. mUrlState :: Map String String } deriving (Show, Eq, Read, Serialize, Generic) -- | see initial value of the type `UrlState` initialUrlState :: UrlState initialUrlState = UrlState {iUrlState = 0, sUrlState = "", mUrlState = Map.empty} -- | a type used as mutable state during the course of the LaTeXRederer data MyState = MyState { -- | the list of image names from the wiki. This list is generated during the run of the LaTeX- or HTML- renderers. getImages :: [String], -- | the number of images in the whole document getJ :: Int, -- | The scale factor. Roughly the space available in the current column of -- the table. Is equal to one if currently not inside a table. getF :: Float, -- | The number of chess diagrams. Gets calculated during the LaTeX- -- renderer run. getC :: Int, -- | The nesting depth of tables. Is equal to zero if currently not in a -- table environment. getInTab :: Int, -- | True if currently in a gallery environment, false otherwise. getInGallery :: Bool, -- | True if currently in a footnote, false otherwise. getInFootnote :: Bool, -- | True if currently in a heading, false otherwise. getInHeading :: Bool, -- | True if currently inside a center environment, false otherwise. getInCenter :: Bool, -- | True if currently inside a source code environment getInCode :: Bool, -- | The main title of the document currently being processed. Generated -- from the template Druckversion Titelseite if found in the wiki code being -- processed, with template expansion set to internal or user defined -- mapping file. getTitle :: String, -- | User defined or internal mapping of MediaWiki templates to LaTeX -- commands. See `LatexRenderer.getUserTemplateMap` for details. templateMap :: Map String [String], -- | A mapping of links (URLs) to labels in the LaTeX document. This is an -- input parameter for `LatexRenderer.treeToLaTeX3`. -- `LatexRenderer.treeToLaTeX3` also takes the parse tree with the labels -- added as input parameter. See documentation on `WikiHelper.makeLables` -- for details. urls :: Map String String, -- | The URL of the main document currently being processed. It has the type -- `WikiUrlData`. See `WikiLinkHelper.analyseNetloc` for details. urld :: WikiUrlData, -- | Stores the image numbers of the images inside galleries. It gets -- generated during the run of `LatexRenderer.treeToLaTeX3`. This is needed -- so the dithering of the resolution of images inside galleries can be -- modified independent of that of normal images. getGalleryNumbers :: [Integer], -- | The lemma of the page currently being processed. In pages which include -- multiple sub pages this refers to the current sub page currentUrl :: String, -- | A map of the name attributes of the ref tags in the wiki to their -- content (from the starting ref tag until the closing of the same ref -- tag). This multiple references to the same content can occur an will be -- printed as footnotes as many times as ref tags with the same name occur. fndict :: Map String [Anything Char], -- | The list has the same length as the number of tables in the document. -- For each table it contains a sublist. Each sublist contains as many -- entries as there are columns in the respective table. Each element of the -- sublist is the LaTeX source of the respective table with only the -- respective column active and all other cells populated by the empty -- string. This is needed for the precompilation of the LaTeX tables in -- order to determine the optimal with of the columns. tablist :: [[String]], -- | A map. The keys are the table numbers the values are a second map. The -- keys of the second map are the column numbers of the respective table. -- The values of the second map are the maximum column width determined by -- the first run of LaTeX. These are needed in order to calculate the -- optimal column widths in the final LaTeX document. See also -- `LatexRender.wdth` for details. tabmap :: Map Int (Map Int Double), -- | A stack of FontStyle instances. The top is the currently active -- fontstyle and is used to determine the current font. See -- `BaseFont.FontStyle` for details. fontStack :: [FontStyle], -- | The currently active Font. See `BaseFont.Font` for details. font :: Font, -- | The language code of the wiki website currently being processed. i.e. -- de for German and en for English. Extracted from the HTML tag of the -- current website. langu :: Maybe String, -- | A map. The key is a hash code of a formula in wiki notation. The value -- is the width of the formula in pixels. This is used to create the -- embedding of the png files of the formulas when generating HTML code. forms :: Map String Int, -- | The character that was written to the output just before the current -- character lastChar :: Char, -- | True if the `BaseFont.FontStyle` has changed and no other character but -- (zero or more) space characters has been processed since then. lastFontChanged :: Bool, -- | The nesting level of captions of Wikilinks. Here image and other files -- are also processed as Wikilinnks with possible captions. Especially if an -- image has got a caption which contains a Wikilink with another caption -- this caption is processed with getCaptionLevel greater than 1. getCaptionLevel :: Integer, -- | True if the current run is configured to use vector graphics (pdf files -- converted from svg files) for images instead of png raster images -- converted from svg files vector :: Bool, -- | A list of HTML Strings. It contains all tables as well as all images -- that contain position markers which shall be converted to PDF by the -- chromium browser for inclusion as PDF files in the LaTeX document. htmlTables :: [String], -- | True if all tables shall be typeset with LaTeX and none with chromium. -- If it is false complex tables will be converted to PDF by the chromium -- browser and included by the LaTeX code as PDFs. latexTabs :: Bool, -- | A list HTML Strings. It contains all maps included in the wiki from the -- openstreetmap. They are included by the LaTeX code as PDF files which -- will be generated by the chromium browser htmlMaps :: [String], -- | True if currently processing data inside an space indented environment. -- That means that the current environment is written in the wiki by -- beginning every line of the environment with a space character. It is -- similar to the pre HTML tag but allows some wiki markup inside itself. isSpaceIndent :: Bool, -- | A map of footnotes for which the footnotenumer (footnotemark) has -- already been written to the LaTeX document, but for which the content of -- the footnote has not yet been written to the LaTeX document. This is -- because footnote inside tables or image caption can not be directly -- written to the LaTeX document. So that the footenote mark is written -- directly and the content of the footnote get written to the LaTeX -- document after the table of image environment in the LaTeX document has -- been closed. footnoteMap :: Map Integer String, -- | The current number of the footnote currently being processed. See also -- `footnoteMap` footnoteNumber :: Integer, -- | The HTML style tags in the HTML document downloaded from the server -- running MediaWiki parsed by the HTML parser. Theses are needed for -- rendering the HTML correctly with the chromium browser. styles :: [Anything Char], -- | The wiki source code of the chess boards in the wiki. chessBoards :: [String] } deriving (Show, Eq, Serialize, Generic) -- | True if currently processing content inside a caption of an image of -- wikilink. getInCaption :: -- | The current state of the renderer MyState -> -- | True if currently inside a caption Bool getInCaption st = (getCaptionLevel st) > 0 -- | Renderer is the State monad using MyState as mutable state type Renderer = State MyState -- | the initial value for MyState initialState :: MyState initialState = MyState { getImages = [], getJ = 1, getF = 1, getC = 1, getInTab = 0, getInGallery = False, getInFootnote = False, getInHeading = False, getInCenter = False, getInCode = False, getTitle = "", templateMap = Map.fromList [], urls = Map.empty, urld = BaseUrl (WikiBaseUrl ""), getGalleryNumbers = [], currentUrl = "", fndict = Map.empty, tablist = [], tabmap = Map.empty, fontStack = [FontStyle {stylebase = Normal, bold = False, italic = False}], font = ComputerModernRoman, langu = Nothing, forms = Map.empty, lastChar = ' ', lastFontChanged = False, getCaptionLevel = 0, vector = False, htmlTables = [], latexTabs = False, htmlMaps = [], isSpaceIndent = False, footnoteMap = Map.empty, footnoteNumber = 1, styles = [], chessBoards = [] } -- | represents an URL to a wiki (not to a page thereof), which is not a sister -- project of wikipedia, so not wikibooks wikisource, etc. data WikiBaseUrl = WikiBaseUrl { -- | the hostname of a wiki which is not an wikimedia wiki. So a hostname that is not wikibooks, wikipedia, etc. baseUrl :: String } deriving (Show, Eq, Serialize, Generic) -- | represents an URL to a wiki (not to a page thereof), which is a sister -- project of wikipedia, so wikibooks wikisource, etc. data WikiUrlInfo = WikiUrlInfo { -- | The language code of wikimedia project (en for English or de for German) language :: String, -- | The type code of the wikimedia project (wikipedia, wikibooks, -- wikisource, etc.) wikitype :: String } deriving (Show, Eq, Serialize, Generic) -- | represents an URL to a wiki (not to a page thereof), which is either a -- sister project of wikipedia, so wikibooks wikisource, etc. or isn't a sister -- project of wikipedia data WikiUrlData = -- | A hostname to a non wikimedia wiki (see `WikiBaseUrl` for details) BaseUrl WikiBaseUrl | -- | A hostname of a wikimedia wiki (see `WikiUrlInfo` for details) UrlInfo WikiUrlInfo deriving (Show, Eq, Serialize, Generic) -- | represents an URL to a page on a wiki data WikiLinkInfo = WikiLinkInfo { -- | The host name of the wiki in a parsed form. urldata :: WikiUrlData, -- | The lemma (name of the article) on wiki currently being processed page :: String } deriving (Show, Eq, Serialize, Generic) mediawiki2latex-8.29/src/Parallel.hs000066400000000000000000000110761504464363500174350ustar00rootroot00000000000000-- | module for parallel computations. The paralellism is reached by forking -- threads with liftIO. When starting a thread and empty MVar is returned -- immediately. The MVar is filled on completing of the thread. Normal function -- can be lifted to threaded function operation on MVar of the parameters -- instead of the parameters themself. Thus it is possible to define -- dependencies of function on the return values of other functions and let the -- order of excecution evolove automatically, so a function is called as soon as -- all its parameters have been calculated. All functions considered in this -- module are understood to have an IO return type. This module is mainly used -- for paraller downloading from the web. module Parallel where import Control.Concurrent.MVar -- | takes a function of return type IO which takes on parameter and an MVar -- containing at the same type as the parameter of the function and returns and -- IO action containing an MVar containing the same type as the tyoe contained -- in the IO Action returned by the function. This function retuns immediately -- and passed an empty MVar as return type. As soon as the MVar containing the -- same type as the parameter of the function is ready for reading the the -- function is executed in a new thread. As soon as the function return a value, -- the it is written into the returned MVar. (<$$>) :: MVar Int -> (a -> IO b) -> MVar a -> IO (MVar b) (<$$>) vv f x = do var <- newEmptyMVar _ <- myFork vv (go var) return var where go v = do xx <- readMVar x result <- f xx putMVar v result -- | takes a value and returns an IO action that contain a filled MVar -- conatining the value base :: MVar Int -> a -> IO (MVar a) base v x = ((ppure v) . return) x -- | takes an IO action and return an MVar containing the and IO action the -- returns an MVar containing the same type as contained by the IO action passed -- to this function. The IO action passed as first parameter to this function is -- executed in a new thread. As soon as it finishes its result is written into -- the returned MVar ppure :: MVar Int -> IO a -> IO (MVar a) ppure vv x = do var <- newEmptyMVar _ <- myFork vv (go var) return var where go v = do result <- x putMVar v result -- | alias to switch between forkOS and forkIO for testing myFork :: MVar Int -> IO () -> IO () myFork _ x = x -- | takes a function which takes a list and return an IO action as first -- parameter. It takes a list of MVar containing the same type as the type -- contained in the list as second parameter. It returnes an empty MVar -- immediately. As soon as all MVar in the list given as second parameter could -- be read, the function is started in a new thread. As soon as it finishes, the -- returend MVar is filled with the value returend by the function liftList :: MVar Int -> ([a] -> IO b) -> [MVar a] -> IO (MVar b) liftList vv f x = do var <- newEmptyMVar _ <- myFork vv (go var) return var where go v = do xx <- mapM readMVar x result <- f xx putMVar v result -- | the same as liftList. Only difference is that the seconds parameter is not -- a list of MVars containing values but an MVar containing a list of MVars -- containing values. So an addinal step is made to read the out MVar liftList2 :: MVar Int -> ([a] -> IO b) -> MVar [MVar a] -> IO (MVar b) liftList2 vv f x = do var <- newEmptyMVar _ <- myFork vv (go var) return var where go v = do xxx <- readMVar x xx <- mapM readMVar xxx result <- f xx putMVar v result -- | prefix version of the angle bracked dollar operator described above liftA :: MVar Int -> (a -> IO b) -> MVar a -> IO (MVar b) liftA v f x = (<$$>) v f x -- | same as liftA. Just function must have exactly two parameter instead of -- only one liftA2 :: MVar Int -> (a -> b -> IO c) -> MVar a -> MVar b -> IO (MVar c) liftA2 vv f x y = do var <- newEmptyMVar _ <- myFork vv (go var) return var where go v = do xx <- readMVar x yy <- readMVar y result <- f xx yy putMVar v result -- | same as liftA. Just function must have exactly three parameter instead of -- only one liftA3 :: MVar Int -> (a -> b -> c -> IO d) -> MVar a -> MVar b -> MVar c -> IO (MVar d) liftA3 vv f x y z = do var <- newEmptyMVar _ <- myFork vv (go var) return var where go v = do xx <- readMVar x yy <- readMVar y zz <- readMVar z result <- f xx yy zz putMVar v result mediawiki2latex-8.29/src/SelfTest.hs000066400000000000000000000001361504464363500174250ustar00rootroot00000000000000module SelfTest where runSelfTest :: Integer -> Integer -> IO () runSelfTest _ _ = return () mediawiki2latex-8.29/src/Server.hs000066400000000000000000001105541504464363500171500ustar00rootroot00000000000000{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-} -- | Server module, allows mediawiki2latex to run as web server module Server where import Control.Concurrent import Control.DeepSeq import Control.Monad import Control.Monad.Trans import Data.ByteString.Lazy hiding ( dropWhile, pack, reverse, takeWhile, ) import Data.ByteString.UTF8 import Data.List import Data.Map.Strict import Data.Maybe import Data.Text (Text, pack) import Data.Time.Clock.POSIX import Happstack.Server hiding (body) import Hex import ImperativeState hiding (name) import System.Directory import System.Exit import System.IO import System.Process hiding (cwd) import qualified Text.Blaze.Html5 as H import qualified Text.Blaze.Html5.Attributes as A import Text.Blaze.Internal -- | Convert a string to an HTML element. mytext :: -- | The input string to be converted to an HTML element. String -> -- | The output HTML element containing the string given as first parameter. H.Html mytext = text . pack -- | Construct the servers general HTML page embedding a specific sub element to -- be display in the middle of it. pageFrame :: -- | The specific sub element to be embedded H.Html -> -- | The general server HTML page with the sub element embedded in it. H.Html pageFrame input = H.table H.! A.style "min-width:100%;border:0px;padding:0;border-spacing:0px 0px;" $ do H.tr H.! A.style "min-width:100%;border:0px;padding:0" $ do H.td H.! A.style "background-color:#444444" H.! A.colspan "3" $ do H.div H.! A.style "color:white;font-size:60;border:20px;font-family:Arial,Helvetica,sans-serif;" $ H.b $ do mytext "MediaWiki2LaTeX" H.tr H.! A.style "min-width:100%;border:0px;padding:0" $ do H.td H.! A.style "background-color:#222222" H.! A.colspan "3" $ H.div H.! A.style "padding: 5px;padding-left: 10px" $ H.div H.! A.style "padding:3px;display:inline;background-color:#595959;border-radius:3px" $ H.div H.! A.style "font-family: times, serif;display:inline;font-size:20;color:#cccccc" $ "Home" H.tr $ do H.td $ H.table H.! A.style "padding:20px" $ do H.tr $ infoBox "MediaWiki to LaTeX" "MediaWiki to LaTeX converts Wiki pages to LaTeX and PDF. It works with any website running MediaWiki, especially Wikipedia and Wikibooks. MediaWiki to LaTeX is purely written in the purely functional language Haskell. It was mainly developed by Dirk H\252nniger. The source code is freely available under the terms of the GNU General Public License. Binary releases for the most common operating systems are available for download. The Debian package is maintained by Georges Khaznadar." H.tr $ infoBox "Contact" $ do mytext "Dirk H\252nniger" H.br mytext "Emil Schweitzer Str. S 10" H.br mytext "D-47506 Neukirchen Vluyn" H.br mytext "Germany" H.br mytext "Telephone ++49-2845-3799993" H.br H.a H.! A.href "mailto:dirk.hunniger@googlemail.com?Subject=MediaWiki2LaTeX" $ "dirk.hunniger@googlemail.com" input H.td $ H.table H.! A.style "padding:20px" $ do H.tr $ infoBox "Documentation and Links" $ do H.ul $ do H.li $ H.a H.! A.href "http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/wb2pdf/manual" $ "Users Manual" H.li $ H.a H.! A.href "http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/wb2pdf" $ "Project Wiki Page" H.li $ H.div H.! A.style "font-size:x-large" $ do H.b $ H.a H.! A.href "https://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/wb2pdf" $ "Download Full Version for Free" H.li $ H.a H.! A.href "http://sourceforge.net/p/wb2pdf/git/ci/master/tree/" $ "Git Sourcecode Repository" H.li $ H.a H.! A.href "http://de.wikibooks.org/wiki/Benutzer_Diskussion:Dirk_Huenniger/wb2pdf/Requests" $ "Bug Tracker" H.tr $ infoBox "Web Interface" $ do mytext "The web interface was artistically designed by Thomas Blume using " H.a H.! A.href "http://www.yaml.org/" $ "YAML" mytext ". It was technically implemented by Dirk H\252nniger using the Blaze Html Framework in Haskell. Important ideas on the design of the user interface were contributed by Georges Khaznadar and Martin Wermers. The server this interface is running on is run by a WMF, who have to cover the costs, so " H.b "please consider downloading the full version for free" mytext " and running at on your own hardware instead of using this server." -- | construct a HTML info box with a given heading and content infoBox :: -- | The heading of the info box String -> -- | The content of the info box H.Html -> -- | The info box containing the heading given in the first parameter as well -- as the content given in the second parameter. H.Html infoBox heading ccontent = H.td $ H.div H.! A.style "padding:10px" $ H.div H.! A.style "text-align:jusitfy;text-justify:inter-word;padding:20px;border-color:#aaaaaa;background-color:#f4f4f4;border-radius:5px;border-width:1px;border-style:solid;font-family:Arial,Helvetica,sans-serif" $ do H.div H.! A.style "font-size:30" $ H.b (mytext heading) H.br H.div H.! A.style "text-align:jusitfy" $ ccontent -- | Datatype to track progress of the background process calculating the result -- and provide information about the related progress bar shown in the web -- interface. data ProgressInfo = ProgressInfo { -- | The last relative progress (between zero and one inclusive) that has been reached. Meaning that the command line version of mediawiki2latex processing the document in the background has emitted the progress indicator for the given relative process. progress :: Double, -- | The output filename wrapped into a Just value of the Maybe monad as -- soon as the output has been fully calculated. The Nothing value of the -- Maybe monad if the output has not yet been fully calculated or the -- calculation of the output has failed. filename :: Maybe String, -- | The time when the background process to calculate the result has been -- started as a UNIX timestamp. startTime :: Double, -- | The progress shown in the progress bar (between zero and one inclusive) -- at the last time the progress bar has been updated barValue :: Double, -- | The UNIX timestamp when the last progress update to the relative -- progress of the background process doing the calculation in the -- background has been received. lastStepTime :: Double, -- | The runtime (in seconds) of the background process calculating the -- result, at the last time the progress bar has been updated. lastRuntime :: Double, -- | The extension for the filename of result file to be calculated extension :: String, -- | True if the process calculating the result has failed. So no result -- could be calculated failed :: Bool } deriving (Show) instance NFData ProgressInfo where rnf a = a `seq` () -- | IO action to run the server on a given port serve :: -- | The port to run the server on Int -> -- | The IO action running the server IO () serve p = do a <- newMVar Data.Map.Strict.empty simpleHTTP nullConf {port = p, timeout = 100000} $ msum [ dirs "progress" $ path $ \subject -> progressBar a subject, dirs "file" $ path $ \subject -> fileFrame a subject, dirs "fill" $ path $ \subject -> formPage a subject, formPage a "" ] -- | Template for the start page of the server. template :: -- | The title of the page. Text -> -- | The HTML body of the page. H.Html -> -- | The HTTP response returning the given title and body. Response template ttitle bbody = toResponse $ H.docTypeHtml $ do H.head $ do H.meta H.! A.charset "utf-8" H.title (H.toHtml ttitle) H.body $ do bbody -- | Takes an URL to a wiki article and a filename for the temporary file to be -- created and return a shell command line parameter to run mediawiki2latex to -- compile a PDF document from the given URL and write it to the given temporary -- filename mainAction :: FullConfig -> IO String mainAction oldcfg = do cwd <- getCurrentDirectory let cfg = oldcfg {mainPath = cwd} return (hex (show cfg)) -- | Takes a given relative progress milestone as Double and returns the next -- progress milestone as a Double. getNextRelativeProgress :: -- | The list of relative progress milestones. [(String, Double)] -> -- | The current relative progress milestone. Double -> -- | The next relative progress milestone. Double getNextRelativeProgress ((_, v) : xs) vv = if vv == v then case xs of (h : _) -> (snd h) _ -> v else getNextRelativeProgress xs vv getNextRelativeProgress [] vv = vv -- | Return a HTTP response containing the progress bar showing the progress of -- a given compilation process. progressBar :: -- | The MVar containing a map from process identifier (Int) to progress -- status information. MVar (Map Int ProgressInfo) -> -- | The process identifier given as a string to be converted to an integer to -- be looked up in the map given in the first parameter . String -> -- | The HTTP response showing the current progress bar for the given process -- identifier. ServerPart Response progressBar t sub = do let theIndex = case (reads (Data.List.takeWhile (/= '.') sub)) :: [(Int, String)] of ((k, _) : _) -> k _ -> 1 m <- liftIO (takeMVar t) let uu = (fromMaybe progressInfoZero (Data.Map.Strict.lookup theIndex m)) let nextKnownRelativeProgressToBeReached = getNextRelativeProgress progressMileStones (progress uu) let lastReachedKnownRelativeProgress = progress uu let timeOfLastReachedKnownRelativeProgress = lastStepTime uu ttime <- liftIO getPOSIXTime let time = (realToFrac ttime) let expectedRuntime = if lastReachedKnownRelativeProgress < 1.0e-2 then 60.0 else (time - (startTime uu)) / lastReachedKnownRelativeProgress let runtime = time - startTime uu let p = lastReachedKnownRelativeProgress + ( 1 - exp ( -(time - timeOfLastReachedKnownRelativeProgress) / ( expectedRuntime * ( nextKnownRelativeProgressToBeReached - lastReachedKnownRelativeProgress ) ) ) ) * ( nextKnownRelativeProgressToBeReached - lastReachedKnownRelativeProgress ) let oldProgressBarValue = barValue uu let progressBarValue = oldProgressBarValue + ( max ((p - oldProgressBarValue) * (runtime - (lastRuntime uu)) / 5.0) 0.0 ) let prog = if lastReachedKnownRelativeProgress == 1.0 then 1000 else if failed uu then 0 else round (progressBarValue * 1000.0) :: Integer liftIO $ if not (member theIndex m) then putMVar t m else putMVar t $!! ( Data.Map.Strict.insert theIndex uu {barValue = progressBarValue, lastRuntime = runtime} m ) case filename uu of Nothing -> do method GET ok $ template "Converting" $ pageFrame $ infoBox ( if not (member theIndex m) then "Not enough resources available to process your request! Your request has been dropped! Please download the full version for free and run it on your own computer!" else ( if not (failed uu) then "Conversion Running" else "Conversion Failed due to timeout or non zero exit code" ) ) $ do H.meta H.! A.httpEquiv "refresh" H.! A.content "1" H.table $ do H.tr $ do H.td $ do H.progress H.! A.style wwidth H.! A.value (stringValue (show (prog))) H.! A.max "1000" $ "" Just _ -> do method GET ok $ template "Conversion Finished" $ pageFrame $ infoBox "Conversion Finished. Click on the arrow in the right upper corner of your browser in order to view the result." $ do H.meta H.! A.httpEquiv "refresh" H.! A.content ( stringValue ( "0;url=/file/" ++ (show theIndex) ++ "." ++ (extension uu) ) ) H.table $ do H.tr $ do H.td $ do H.progress H.! A.style wwidth H.! A.value (stringValue (show (1000 :: Integer))) H.! A.max "1000" $ "" -- | Returns HTTP response for a process that has finished. In case the process -- produced a file, this file is returned in this response. Otherwise an error -- message is shown. fileFrame :: -- | The MVar containing a map from process identifier (Int) to progress -- status information. MVar (Map Int ProgressInfo) -> -- | The process identifier given as a string to be converted to an integer to -- be looked up in the map given in the first parameter. String -> -- | The HTTP response signaling the conclusion of the process. ServerPart Response fileFrame t sub = do let theIndex = case (reads (Data.List.takeWhile (/= '.') sub)) :: [(Int, String)] of ((k, _) : _) -> k _ -> 1 m <- liftIO (takeMVar t) liftIO $ putMVar t m let uu = (fromMaybe progressInfoZero (Data.Map.Strict.lookup theIndex m)) case filename uu of Just x -> do f <- serveFile (guessContentTypeM mimeTypes) x _ <- liftIO ( forkIO ( do threadDelay 200000000 removeFile x ) ) return f Nothing -> do method GET ok $ template "Conversion Failed" $ pageFrame $ infoBox "Conversion Failed" $ (mytext "We are sorry the conversion failed, please contact our us") -- | Calculate the number of rendering processes currently running currentlyrunning :: -- | The MVar containing a map from process identifier (Int) to progress -- status information. Map Int ProgressInfo -> -- | The number of processes which were already started but have not yet -- concluded. Int currentlyrunning m = sum ( Data.List.map (fromEnum . ((\x -> (isNothing (filename x)) && (not (failed x))))) (Data.Map.Strict.elems m) ) -- | The width of the HTML form to request the start a rendering process as a -- string. wwidth2 :: -- | The HTML string to set the width of the form to request the start of a -- rendering process. String wwidth2 = "width:400px" -- | The width of the HTML form to request the start a rendering process as a -- HTML attribute. wwidth :: -- | The HTML attribute to set the width of the form to request the start of a -- rendering process. AttributeValue wwidth = stringValue wwidth2 -- | The HTTP response showing a form in which the start of a rendering process -- can be requested. formPage :: -- | The MVar containing a map from process identifier (Int) to progress -- status information. MVar (Map Int ProgressInfo) -> -- | The default entry for the URL in field in the form to be returned. String -> -- | The HTTP response containing the form to request the start of a rendering -- process. ServerPart Response formPage m s = do decodeBody (defaultBodyPolicy "/tmp/" 0 1000000 1000000) msum [viewForm, processForm] where viewForm :: ServerPart Response viewForm = do method GET ok $ template "MediaWiki2LaTeX" $ pageFrame $ infoBox "Create Your PDF" $ do mytext "To compile MediaWiki pages via LaTeX to PDF choose any URL from " H.a H.! A.href "http://en.wikipedia.org/" $ "Wikipedia" mytext " or any other website running MediaWiki. If you intent to compile a wikibook make sure you use the link to the printable version of the book." H.br H.div H.! A.style "font-size:20" $ H.b $ mytext "Send your request" H.form H.! A.action "/form" H.! A.enctype "multipart/form-data" H.! A.method "POST" $ H.div $ do H.table $ do H.tr $ do H.td "Full web URL of the book page" H.td $ do H.input H.! A.style wwidth H.! A.type_ "text" H.! A.id "msg" H.! A.name "msg" H.! A.value (stringValue s) H.tr $ do H.td "Output Format" H.td $ do H.select H.! A.style wwidth H.! A.name "output" $ do H.option H.! A.value "pdf" $ "PDF" H.option H.! A.value "zip" $ "LaTeX zip" H.option H.! A.value "epub" $ "EPUB" H.option H.! A.value "odt" $ "ODT (Word Processor)" H.tr $ do H.td "Template expansion" H.td $ do H.select H.! A.style wwidth H.! A.name "expansion" $ do H.option H.! A.value "Print" $ "Standard" H.option H.! A.value "BookMode" $ "Book / Collection" H.option H.! A.value "BookNoParent" $ "Book Contents Page" H.option H.! A.value "MediaWiki" $ "Expand Templates by MediaWiki" H.option H.! A.value "Normal" $ "Expand Templates Internally" H.tr $ do H.td "Page size" H.td $ do H.select H.! A.style wwidth H.! A.name "paper" $ do H.option H.! A.value "A4" $ "A4" H.option H.! A.value "A5" $ "A5" H.option H.! A.value "B5" $ "B5" H.option H.! A.value "letter" $ "Letter" H.option H.! A.value "legal" $ "Legal" H.option H.! A.value "executive" $ "Executive" H.tr $ do H.td "Table typesetting" H.td $ do H.select H.! A.style wwidth H.! A.name "table" $ do H.option H.! A.value "Chromium" $ "Chromium" H.option H.! A.value "LaTeX" $ "LaTeX" H.tr $ do H.td "Vector graphics" H.td $ do H.select H.! A.style wwidth H.! A.name "vector" $ do H.option H.! A.value "Rasterize" $ "Rasterize" H.option H.! A.value "Keep Vector Form" $ "Keep Vector Form" H.tr $ do H.td "" H.td $ do H.input H.! A.style (stringValue (wwidth2 ++ ";height:60px")) H.! A.type_ "submit" H.! A.value "Start!" H.div H.! A.style "text-decoration:underline" $ mytext "Please note:" H.br do mytext "The LaTeX source code will be compiled several times to make sure all references are resolved. The whole process will usually take about one minute." H.br H.br H.div H.! A.style "font-size:large" $ H.b "There is a time limit of four hours (≈ 2000 pages in PDF) on this server!" H.br mytext "Requests taking longer will be terminated and a \"Conversion Failed due to timeout or non zero exit code\" message will be displayed. There is no limit in the downloadable version of the software, see link on right." getRunmode "Print" = ImperativeState.HTML ImperativeState.No getRunmode "MediaWiki" = ImperativeState.ExpandedTemplates ImperativeState.No getRunmode "Normal" = ImperativeState.StandardTemplates ImperativeState.No getRunmode "BookMode" = ImperativeState.HTML ImperativeState.Yes getRunmode "BookNoParent" = ImperativeState.HTML ImperativeState.Yes getRunmode _ = ImperativeState.HTML ImperativeState.No processForm :: ServerPart Response processForm = do msg <- lookBS "msg" paperOpt <- lookBS "paper" vectorOpt <- lookBS "vector" tableOpt <- lookBS "table" expansion <- lookBS "expansion" output <- lookBS "output" zzz <- liftIO $ do tmpDir <- getTemporaryDirectory (name, handle) <- openTempFile tmpDir ( "MediaWiki2LaTeX" ++ if (toString (toStrict output)) == "zip" then "zip" else if (toString (toStrict output)) == "epub" then "epub" else if (toString (toStrict output)) == "odt" then "odt" else "pdf" ) hClose handle >> removeFile name act <- mainAction FullConfig { ltxproc = Nothing, testMode = False, headers = Nothing, resolution = 300, outputFilename = name, inputUrl = (toString (toStrict msg)), runMode = if ( isInfixOf ("Book:" :: [Char]) (toString (toStrict msg)) ) then getRunmode ("BookMode" :: [Char]) else getRunmode (toString (toStrict expansion)), paper = (toString (toStrict paperOpt)), vector = (toString (toStrict vectorOpt)) == "Keep Vector Form", ImperativeState.copy = Nothing, mainPath = "", server = Nothing, outputType = if (toString (toStrict output)) == "zip" then ImperativeState.ZipArchive else if (toString (toStrict output)) == "epub" then ImperativeState.EPubFile else if (toString (toStrict output)) == "odt" then ImperativeState.OdtFile else ImperativeState.PlainPDF, compile = Nothing, convert = Nothing, noparent = "BookNoParent" == (toString (toStrict expansion)), imgctrburl = Nothing, ctrb = Nothing, latexTables = ( (toString (toStrict tableOpt)) == "LaTeX" ) } yy <- newEmptyMVar mm <- takeMVar m _ <- if ((currentlyrunning mm) <= 3) then do _ <- forkIO $ do (i, o, e, h) <- runInteractiveCommand ("mediawiki2latex -x " ++ act) tt <- getPOSIXTime let ss = ( if (toString (toStrict output)) == "zip" then "zip" else if (toString (toStrict output)) == "epub" then "epub" else if (toString (toStrict output)) == "odt" then "odt" else "pdf" ) zz <- forkProgressDriver o m name ss putMVar yy zz ex h i e ((realToFrac tt) + (4 * 3600.0)) m zz name return () else do putMVar yy (-1) return () putMVar m mm zzzz <- takeMVar yy return zzzz method POST ok $ toResponse $ template "Redirect" $ do H.meta H.! A.httpEquiv "refresh" H.! A.content ( stringValue ( "0;url=/progress/" ++ (show zzz) ++ "." ++ ( if (toString (toStrict output)) == "zip" then "html" else "html" ) ) ) -- | Communicate with a rendering process of mediawiki2latex. Terminate the -- rendering process if it runs into timeout by sending it a newline character. ex :: -- | the process handle of the rendering process. It can be checked for the -- termination of the rendering process ProcessHandle -> -- | The handle to the input stream of the rendering process. This is where a -- newline character can be send to the rendering process in order to ask it -- to terminate. Handle -> -- | The handle to the error output stream of rendering process. This has to -- be read regularly to avoid buffer overflows of the error output stream Handle -> -- | The UNIX time stamp when the process shall be terminated due to timeout. Double -> -- | The MVar containing a map from process identifier (Int) to progress -- status information. MVar (Map Int ProgressInfo) -> -- | The process identifier where to look up the progress information in the -- map wrapped into an MVar given in the preceding parameter. Int -> -- | The filename of the output file. String -> -- | The IO action running the rendering process IO () ex h i e t m n s = do tt <- getPOSIXTime threadDelay 100 if (realToFrac tt) > t then do System.IO.hPutStr i "\n" mm <- takeMVar m putMVar m (Data.Map.Strict.update (\x -> Just x {failed = True}) n mm) else return () xi <- hIsOpen i if xi then hFlush i else return () xo <- hIsOpen e _ <- if xo then System.IO.hGetContents e else return "" y <- getProcessExitCode h case y of Just ee -> if ExitSuccess == ee then do threadDelay 3000000 mm <- takeMVar m putMVar m ( Data.Map.Strict.insertWith ( \new old -> old {progress = progress new, lastStepTime = realToFrac tt} ) n progressInfoZero {progress = 1.0} mm ) mmm <- takeMVar m putMVar m mmm case Data.Map.Strict.lookup n mmm of Just yy -> do _ <- takeMVar m putMVar m (Data.Map.Strict.insert n yy {filename = Just s} mmm) _ -> return () else do mm <- takeMVar m putMVar m (Data.Map.Strict.update (\x -> Just x {failed = True}) n mm) _ -> if (realToFrac tt) > t then return () else ex h i e t m n s -- | A list of pairs. The first element of pair is the progress information -- string emitted by the mediawiki2latex command line application as soon a a -- certain (average) relative progress had been reached. The second element is -- the reached relative progress as a double between zero and one. Zero an one -- are included in the possible range. progressMileStones :: -- | The list of progress milestones. [([Char], Double)] progressMileStones = [ ( "downloading article and contributor information", 2.540431143798292e-2 ), ("parsing article text", 5.7625916241286344e-2), ( "forking threads to download of images and contributor information on them", 5.8045207449988465e-2 ), ("precompiling table columns", 8.075814224942594e-2), ( "joining threads to download the images and contributor information on them", 0.37003149457779727 ), ("preparing for PDF generation", 0.5479855803098518), ("preparing images for LaTeX document", 0.637605216120732), ("generating PDF file. LaTeX run 1 of 4", 0.6911489294291799), ("generating PDF file. LaTeX run 2 of 4", 0.7673758195622185), ("generating PDF file. LaTeX run 3 of 4", 0.8463397892914045), ("generating PDF file. LaTeX run 4 of 4", 0.9231746180088297), ("finished", 1.0) ] -- | Wait for the given handle to contain information the can be read from it. wwait :: -- | The handle to wait for . Handle -> -- | The IO action to wait for the handle. IO () wwait h = do b <- hIsEOF h if b then do threadDelay 1000 wwait h else return () -- | Read progress information from a rendering process, and update the progress -- information structure given in the third parameter. progressDriver :: -- | The process identifier to look up the process in the map wrapped into an -- MVar given in the third parameter Int -> -- | The handle to the standard output of rendering process Handle -> -- | The MVar containing a map from process identifier (Int) to progress -- status information. MVar (Map Int ProgressInfo) -> -- | The filename where the rendering process should store its result. String -> -- | The IO action to read the progress information. IO () progressDriver n o t s = do xo <- hIsOpen o threadDelay 100 tt <- getPOSIXTime l <- if xo then do wwait o hGetLine o else return "" case msum ( Data.List.map (\(k, v) -> if isInfixOf k l then Just v else Nothing) progressMileStones ) of Just x -> do m <- takeMVar t putMVar t ( Data.Map.Strict.insertWith ( \new old -> old {progress = progress new, lastStepTime = realToFrac tt} ) n progressInfoZero {progress = x} m ) _ -> return () m <- readMVar t case Data.Map.Strict.lookup n m of Just yy | (progress yy) == 1.0 -> do _ <- takeMVar t putMVar t (Data.Map.Strict.insert n yy {filename = Just s} m) Just yy | (failed yy) -> return () _ -> progressDriver n o t s -- | The default instance of the progress information structure progressInfoZero :: -- | The default instance of the progress information structure. It indicates -- that no progress has been made by the respective process yet. ProgressInfo progressInfoZero = ProgressInfo { progress = 0.0, filename = Nothing, startTime = 0.0, failed = False, barValue = 0.0, lastStepTime = 0.0, lastRuntime = 0.0, extension = "" } -- | Fork a thread that will keep track of the progress a rendering process -- makes. forkProgressDriver :: -- | The handle to the standard output of the rendering process to be tracked. Handle -> -- | The MVar containing a map from process identifier (Int) to progress -- status information. MVar (Map Int ProgressInfo) -> -- | The filename where the tracked rendering process will store its result. String -> -- | The extension of the filename where the tracked rendering process will -- store its result String -> -- | IO action to fork the tracking thread tracking a rendering process and -- return the process identifier of the process to be tracked, which can be -- used to look up the progress of the rendering process in the data structure -- given as second parameter. IO Int forkProgressDriver o t s ext = do m <- takeMVar t tt <- getPOSIXTime let mm = case (keys m) of (x : xs) -> Data.List.maximum (x : xs) _ -> 0 putMVar t ( Data.Map.Strict.insert (mm + 1) ProgressInfo { progress = 0.0, filename = Nothing, startTime = realToFrac tt, barValue = 0.0, lastStepTime = 0.0, lastRuntime = 0.0, extension = ext, failed = False } m ) _ <- forkIO (progressDriver (mm + 1) o t s) return (mm + 1) mediawiki2latex-8.29/src/SimpleContributors.hs000066400000000000000000000206751504464363500215550ustar00rootroot00000000000000-- | module to load information on the contributors in images from the wiki -- website module SimpleContributors where import Codec.Binary.UTF8.String import Control.DeepSeq import Control.Monad import Data.Functor.Identity import Data.List import Data.Map hiding (delete, filter, map) import Data.Maybe import HtmlParser (parseHtmlFast) import ImperativeState import LatexRenderer import Licenses import MediaWikiParseTree import MediaWikiParser import Network.URL import Text.Parsec.Char import Text.Parsec.Prim hiding (runParser, try) import Text.ParserCombinators.Parsec.Combinator hiding (count) import Text.ParserCombinators.Parsec.Prim import Tools import UrlAnalyse makeUrl2 :: String -> String -> [Char] makeUrl2 theLemma theHost = (unify . exportURL) ( URL { url_path = "w/index.php", url_params = [ ("title", (replace2 (replace2 theLemma "%27" "'") "%" "%25")), ("offset", ""), ("limit", "500000"), ("action", "history") ], url_type = Absolute (Host {protocol = HTTP True, host = theHost, port = Nothing}) } ) makeUrl4 :: String -> [Char] makeUrl4 uuu = fromMaybe uuu ( do uu <- (importURL uuu) ti <- Data.List.lookup "title" (url_params uu) return $ (unify . exportURL) ( URL { url_path = (url_path uu), url_params = [ ("title", (replace2 (replace2 ti "%27" "'") "%" "%25")), ("offset", ""), ("limit", "500000"), ("action", "history") ], url_type = url_type uu } ) ) makeUrl3 :: String -> String -> [Char] makeUrl3 theLemma theHost = (unify . exportURL) ( URL { url_path = "w/index.php", url_params = [("title", (replace2 (replace2 theLemma "%27" "'") "%" "%25"))], url_type = Absolute (Host {protocol = HTTP True, host = theHost, port = Nothing}) } ) deepGet2 :: [Char] -> [Anything a] -> [Anything a] deepGet2 tag ll = concat $ map go ll where go (Environment Tag (TagAttr t m) l) | t == tag = [Environment Tag (TagAttr tag m) l] ++ (deepGet2 tag l) go (Environment _ _ l) = (deepGet2 tag l) go _ = [] getLicense :: [Anything Char] -> Maybe [Char] getLicense l = (go (killTree l)) where go :: [Anything Char] -> Maybe String go ll = msum (map (dg ll) licenses) dg ll (x, c) = case deepGet "a" "href" x ll of (_ : _) -> Just c _ -> Nothing killTree ll = concat (map killNode ll) killNode (Environment Tag (TagAttr "footer" _) _) = [] killNode (Environment x y ll) = [Environment x y (killTree ll)] killNode x = [x] getAuthor :: [Anything Char] -> Maybe [Anything Char] getAuthor x = listToMaybe (concat (map go (deepGet2 "tr" x))) where go (Environment _ _ l) = let gg = (deepGet "td" "id" "fileinfotpl_aut" l) ++ (deepGet "th" "id" "fileinfotpl_aut" l) in case gg of (f : _) -> case delete f (deepGet2 "td" l) of ((Environment _ _ ll) : _) -> [ll] _ -> [] _ -> [] go _ = [] simpleContributors :: [Char] -> [Char] -> Maybe URL -> ImperativeState -> IO [(String, String, Int, Maybe String)] simpleContributors theLemma theHost uu st = do let theUrl3 = case uu of Just u -> exportURL u _ -> makeUrl3 theLemma theHost yy <- geturl theUrl3 let gg = (deepGet "li" "id" "ca-history" (parseHtmlFast yy)) let theUrl = makeUrl4 ( case gg of ((Environment Tag (TagAttr _ _) l) : []) -> case deepGet2 "a" l of [ Environment Tag (TagAttr _ mm) _ ] -> case Data.Map.lookup "href" mm of ( Just x ) -> if (Data.List.take 8 x == "https://") then (replace2 x "&" "&") else "https://" ++ theHost ++ ( replace2 x "&" "&" ) _ -> [] _ -> [] _ -> [] ) let y = decodeString yy out <- getCtrbFromUrl theUrl let ht = (parseHtmlFast y) case (getAuthor ht) of Just zz -> return [ ( fst ( treeToLaTeX3 zz initialState {urld = analyseNetloc (hostname . fullUrl $ st)} ), "", 1 :: Int, getLicense ht ) ] _ -> return out where go :: Anything Char -> (String, String) go (Environment Tag (TagAttr _ m) l) = ((shallowFlatten (deepFlatten l)), findWithDefault "" "href" m) go _ = ("", "") go2 (c, (a, h)) = (a, h, c, Nothing) getCtrbFromUrl :: String -> IO [(String, String, Int, Maybe String)] getCtrbFromUrl theUrl = do xx <- geturl theUrl let x = decodeString xx let ff = (force (parseHtmlFast x)) let dd = ( ( (deepGet "a" "class" "new mw-userlink" ff) ++ (deepGet "a" "class" "mw-userlink" ff) ) ) :: [Anything Char] let ll = (filter pre (map go dd)) let n = (nub ll) :: [(String, String)] let nextlink = nub (deepGet "a" "class" "mw-nextlink" ff) next <- case nextlink of [Environment Tag (TagAttr _ m) _] -> case findWithDefault "" "href" m of "" -> return [] nexturl -> getCtrbFromUrl ( "https://" ++ theHost ++ ( replace2 nexturl "&" "&" ) ) _ -> return [] return ((map go2 (zip (map (count ll) n) n)) ++ next) count :: (Eq a) => [a] -> a -> Int count l s = length (filter (== s) l) pre :: (String, String) -> Bool pre s = case (runParser ipaddr () "" (fst s)) of Right _ -> False Left _ -> True intdigit :: Parser Int intdigit = do a <- digit case reads [a] of [(i, [])] -> return i _ -> pzero ipnum3 :: ParsecT String () Identity Int ipnum3 = do a <- intdigit b <- intdigit c <- intdigit return (a * 100 + b * 10 + c) ipnum2 :: ParsecT String () Identity Int ipnum2 = do a <- intdigit b <- intdigit return (a * 10 + b) ipnum1 :: Parser Int ipnum1 = do intdigit ipnum :: ParsecT [Char] () Identity () ipnum = do n <- (try (ipnum3)) <|> (try (ipnum2)) <|> ipnum1 if ((n <= 255) && (n >= 0)) then return () else pzero ipaddr :: Text.Parsec.Prim.ParsecT [Char] () Data.Functor.Identity.Identity () ipaddr = try (ipv4addr) <|> ipv6addr ipv4addr :: Text.Parsec.Prim.ParsecT [Char] () Data.Functor.Identity.Identity () ipv4addr = do _ <- ipnum _ <- char '.' _ <- ipnum _ <- char '.' _ <- ipnum _ <- char '.' _ <- ipnum return () ipv6num :: Text.Parsec.Prim.ParsecT [Char] () Data.Functor.Identity.Identity () ipv6num = try ((ipv4addr)) <|> do _ <- try (hexDigit) <|> return '0' _ <- try (hexDigit) <|> return '0' _ <- try (hexDigit) <|> return '0' _ <- try (hexDigit) <|> return '0' return () ipv6addr :: Text.Parsec.Prim.ParsecT [Char] () Data.Functor.Identity.Identity () ipv6addr = do _ <- try (ipv6num) <|> return () _ <- char ':' _ <- try (ipv6num) <|> return () _ <- try (char ':') <|> return ':' _ <- try (ipv6num) <|> return () _ <- try (char ':') <|> return ':' _ <- try (ipv6num) <|> return () _ <- try (char ':') <|> return ':' _ <- try (ipv6num) <|> return () _ <- try (char ':') <|> return ':' _ <- try (ipv6num) <|> return () _ <- try (char ':') <|> return ':' _ <- try (ipv6num) <|> return () _ <- try (char ':') <|> return ':' _ <- try (ipv6num) <|> return () _ <- eof return () mediawiki2latex-8.29/src/Static.hs000066400000000000000000000075561504464363500171400ustar00rootroot00000000000000{-# LANGUAGE TemplateHaskell #-} -- | latex and config files embedded into the binary application . module Static where import Data.ByteString import Data.ByteString.UTF8 import Data.FileEmbed import System.Directory import System.FilePath -- {-| webImage -} -- mainImage :: [(FilePath, ByteString)] mainImage = $(embedFile -- "src/mainImage.png") -- | needed LaTeX Headers headerFiles :: [(FilePath, ByteString)] headerFiles = $(embedDir "./document/headers") -- | language configuration file of mediawiki2latex babelFiles :: [(FilePath, ByteString)] babelFiles = $(embedDir "./src/babel") -- | test cases for self test of mediawiki2latex testFiles :: [(FilePath, ByteString)] testFiles = $(embedDir "./test") -- | function to create the necessary directories for the LaTeX tree in the -- temporary directory. The pathname of the temporary directory has to be -- supplied as first parameter createDirectories :: String -> IO [()] createDirectories pathname = mapM ( \s -> (createDirectoryIfMissing True (pathname ++ "/document/" ++ s)) ) ["images", "headers", "main", "formulas"] -- | function to write files to an already created directory in the temporary -- directory. The first parameter is the pathname of the temporary directory. -- The second parameter is a list tuples. The first element of each tuple is the -- relative pathname of the file to be created. The second element of each tuple -- is the binary data to be written into the file writeFiles :: String -> [(FilePath, Data.ByteString.ByteString)] -> IO () writeFiles pathname filelist = do _ <- ( mapM ( \(name, content) -> Data.ByteString.writeFile (pathname name) content ) filelist ) return () -- | the header of the main latex file latexHeader :: ByteString latexHeader = $(embedFile "./latex/my-head.tex") -- | the footer of the main latex file latexFooter :: ByteString latexFooter = $(embedFile "./latex/my-tail.tex") -- | the preamble of the list of figures in the main latex file latexPreamble :: ByteString latexPreamble = $(embedFile "./latex/preamble.tex") -- | the header for a latex file which contains only a single comlumn of a -- table. This header is used when precompiling latex table columns in order to -- calculate optimized column widths for each table automaticaly latexTableHeader :: ByteString latexTableHeader = $(embedFile "./latex/my-tabhead.tex") -- | the header for a latex file which contains only a single comlumn of a -- table. This header is used when precompiling latex table columns in order to -- calculate optimized column widths for each table automaticaly latexTableFooter :: ByteString latexTableFooter = $(embedFile "./latex/my-tabtail.tex") -- | the templates.user file. This file contains a mapping of mediawikis -- templates to latex commands. This is the default file. It is used when -- suppliing the -i command line option. The user may override it with the -t -- command line option. This file contains a list of lists in Haskell notaion. -- Each sublists contains strings. The first string in each sublist is the name -- of the template as it is used in the wiki notation, the second string is the -- name of the latex command to be called. The following strings are the names -- of the parameters in wiki notation which should be passed to the latex -- command in the order they are denoted. userTemplates :: String userTemplates = toString $(embedFile "./latex/templates.user") -- | a function to write all files that are embedded into the binary application -- which are needed for the LaTeX tree in the temporary directory to disk. The -- first parameter is the name of the temporary directory in which the latex -- tree which the necessary files shall be created. extract :: String -> IO () extract pathname = do _ <- createDirectories pathname writeFiles (pathname ++ "/document/headers/") headerFiles mediawiki2latex-8.29/src/TableHelper.hs000066400000000000000000001042121504464363500200630ustar00rootroot00000000000000-- | Helper functions to convert tables from the parse tree notation to the -- latex notation module TableHelper where import Control.Monad import Data.Char import Data.List (intercalate, isInfixOf) import qualified Data.Map as Map import Data.Map.Strict (Map, keys) import Data.Maybe import MediaWikiParseTree import MyState import Text.Printf -- | The width of a columns as float wrapped in a Just value of the maybe monad -- if it could be determined. Return the value Nothing of the maybe monad -- otherwise. The only parameter is of part of the parse tree that describe the -- opening part of the table cell element. widthOfColumn :: -- | the inner part of the table cell element as parse tree representation. [Anything Char] -> -- | the fraction of the width of the width of the whole tables spanned by the -- current column. Maybe Float widthOfColumn = msum . (map f) where f (Environment Attribute (Attr (k, v)) _) = listToMaybe $ do (z, _) <- reads v guard (k == "width") guard ('%' `elem` v) return (1.0e-2 * z) f _ = Nothing -- | The column multiplicity for calculation of the `raggedArrayOfWidths`. It is -- -1 if the current column has not column multiplicity otherwise it is the -- number found in the colspan attribute of the parsetree part given as the -- first parameter columnMultiplicityForSimple :: -- | the parse tree representation of the inner part of table cell element -- (e.g. th or td HTML tag, or their wiki equivalent). [Anything Char] -> -- | the content of the colspan attribute if found, otherwise -1. Int columnMultiplicityForSimple x = case columnMultiplicity x of Just a -> a _ -> -1 -- | Returns a ragged array of column width calculated from parse tree -- representation of the inner part of a table. It returns a list of lists. The -- inner lists are the rows of the table. If a cell in a row has a known width -- it is represented by a Just value of the Maybe monad containing its width as -- a fraction of the total width of the column, otherwise it is represented by -- the Nothing value of the Maybe monad. If a cell spans multiple columns some -- Nothing values are inserted after the cell. The number of the Nothing values -- is the column span of the cell minus one. raggedArrayOfWidths :: -- | The parse tree representation of the inner part of the table [Anything Char] -> -- | accumulating variable. Has to be the empty list when calling this -- function form outside. [Maybe Float] -> -- | the ragged array of column widths. [[Maybe Float]] raggedArrayOfWidths ((Environment TableRowSep _ _) : xs) temp = if temp == [] then raggedArrayOfWidths xs [] else temp : (raggedArrayOfWidths xs []) raggedArrayOfWidths ((Environment TableColSep _ x) : xs) temp = ( raggedArrayOfWidths xs ( temp ++ [widthOfColumn x] ++ ( concat (replicate ((columnMultiplicityForSimple x) - 1) [Nothing]) ) ) ) raggedArrayOfWidths ((Environment TableHeadColSep _ x) : xs) temp = ( raggedArrayOfWidths xs ( temp ++ [widthOfColumn x] ++ ( concat (replicate ((columnMultiplicityForSimple x) - 1) [Nothing]) ) ) ) raggedArrayOfWidths (_ : xs) temp = (raggedArrayOfWidths xs temp) raggedArrayOfWidths [] temp = [temp] -- | Returns the number of columns in a table. numberOfColumns :: -- | the parse tree representation of the inner parse of table. [Anything Char] -> -- | the number of columns in the table. Cell with a colspan attribute are -- counted accordingly. Int numberOfColumns a = (maximum ([length x | x <- (raggedArrayOfWidths a [])])) -- | Create a list of Nothing values of the Maybe monad, which has got a length -- of the number of columns of the parse tree representation of the inner part -- of a table given as the first parameter. The result stands for a list of -- table column widths, where the width of each column is unknown (hence the -- Nothing values). initialListofWidths :: -- | The parse tree representation of an inner part of a table [Anything Char] -> -- | A list of widths of columns where each column has an unknown width. [Maybe Float] initialListofWidths x = replicate (numberOfColumns x) Nothing -- | This function takes two lists of widths of columns and returns the maximum -- of both again as a list of width of column. An Nothing value of the Maybe -- monad in this list is interpreted as a column with unknown width. So any Just -- value is considered greater than any Nothing value. If two just values are -- compared the one with the higher value inside the Just is used. If one list -- is too short, it is handled as if it was long enough but contained only -- Nothing values on any position after it ended. listMax :: -- | A list of widths of columns. [Maybe Float] -> -- | Another list of width of columns . [Maybe Float] -> -- | The maximum of the two lists of columns. [Maybe Float] listMax (Just x : xs) (Just y : ys) = Just (max x y) : listMax xs ys listMax (x : xs) (y : ys) = (x `mplus` y) : listMax xs ys listMax [] (y : ys) = y : listMax [] ys listMax (x : xs) [] = x : listMax xs [] listMax [] [] = [] -- | Calculates the preliminary width of columns from the `raggedArrayOfWidths` -- given as first parameter and the `initialListofWidths` given in the second -- parameter. See also `listMax` for how the calculating works. preliminaryWidths :: -- | The `raggedArrayOfWidths` [[Maybe Float]] -> -- | The `initialListofWidths` [Maybe Float] -> -- | A list of width of columns [Maybe Float] preliminaryWidths l k = foldl (listMax) k l -- | Calculates the default width of column for which no width is explicitly -- defined. Return the Nothing value of the Maybe monad if it could not be -- determined. Otherwise it return the result wrapped in a Just value of the -- Maybe monad. standardColumnWitdh :: -- | The parse tree representation of the inner part of table [Anything Char] -> -- | The default width of columns which don't have an explicitly defined -- width. Maybe Float standardColumnWitdh a = if columns > columnsWithDefinedWidth then if sumOfDefinedWidths > 1.0 then Nothing else Just $ (1.0 - sumOfDefinedWidths) / fromIntegral (columns - columnsWithDefinedWidth) else if sumOfDefinedWidths > 1.001 then Nothing else Just 0.0 where l = rawWidths a columns = numberOfColumns a columnsWithDefinedWidth = length (filter isJust l) sumOfDefinedWidths = sum (map fromJust (filter isJust l)) -- | It takes the parse tree representation of the inner part of a table and -- returns a list of widths of columns. It contains Just values of the Maybe -- monad for each column which has an explicitly defined with and a Nothing -- value of the Maybe monad for the column which don't have an explicitly -- defined width. rawWidths :: -- | The parse tree representation of the inner part of a table. [Anything Char] -> -- | The list of the widths of the columns in the table. [Maybe Float] rawWidths a = ( preliminaryWidths (raggedArrayOfWidths a []) (initialListofWidths a) ) -- | Fallback function for the width of columns if the precompilation procedure -- for the width of columns is not available yet. So particularly when the -- precompilation is just running. Takes the parse tree representation of the -- table as first input parameter. Returns the list of widths of the columns. -- The final width of the columns don't have anything to do with the width -- calculated here, still these preliminary widths are needed for the -- precompilation procedure. columnWidths :: -- | The parse tree representation of the inner part of a table [Anything Char] -> -- | the widths of the columns of the table given in the first parameter [Float] columnWidths a = w where l = rawWidths a m = numberOfColumns a mf = fromIntegral m f = 1.0 - (scalefactor mf) w = fromMaybe (concat (replicate m [f / mf])) $ do ww <- standardColumnWitdh a return [x * f | x <- map (fromMaybe ww) l] -- | Part of the correction calculation for the space between columns inside a -- table. Takes the number of columns as first input parameter returns a scaling -- factor. Scalefactor must not be 1.0 or higher to avoid stack overflow error -- by infinite loop in LaTeXRenderer, therefore limiting it to 34 columns per -- table scalefactor :: (Fractional a, Ord a) => -- | The number of columns in the table. a -> -- | The scalefactor. That is the part of the space of the table needed for -- vertical separation between the columns. a scalefactor n | n <= 34 = 12.8 * (n) / 448.0 scalefactor _ = 12.8 * (34.0) / 448.0 -- | Part of the correction calculation for the space between columns inside a -- table. Takes the number of columns as first input parameter returns a scaling -- factor. That is roughly the amount of space available for a single cell as a -- fraction of the linewidth tableScale :: -- | The number of columns in the table. Int -> -- | The scaling factor. Float tableScale nColumns = (1.0 / n) * (1.0 - (scalefactor n)) where n = fromIntegral nColumns -- | Returns the latex environment name for a table environments. If the float -- passes as first parameter it 1.0 the result is longtable, otherwise it is -- tabular. This function is usually called with the width of the current cell -- in units of the line width as first parameter. Outside any table this value -- is 1.0 inside a table it is always smaller than 1.0. So this function will -- return tabular in case of a nested table, which is necessary since longtables -- can not be nested inside other longtables, but tabulars can be nested within -- longtables as well as tabulars. tableEnvironment :: -- | The scaling factor Float -> -- | The name of the table environment for use in the LaTeX document. String tableEnvironment 1.0 = "longtable" tableEnvironment _ = "tabular" -- | Return the inner part of the table header of a table for the LaTeX document innerTableSpecifier :: -- | The number of columns in the table Int -> -- | The list of column widths of the table in units of the linewidth . [Float] -> -- | Column separator. Vertical bar if rules shall be drawn, empty string -- otherwise. String -> -- | The inner part of the table header of the table for the LaTeX document String innerTableSpecifier 1 (f : xs) t = ">{\\RaggedRight}p{" ++ (printf "%0.5f" f) ++ "\\linewidth}" ++ t ++ (innerTableSpecifier 1 xs t) innerTableSpecifier i (f : xs) t = ">{\\RaggedRight}p{\\dhuncolwidth{" ++ (printf "%0.5f" f) ++ "}}" ++ t ++ (innerTableSpecifier i xs t) innerTableSpecifier _ [] _ = [] -- | Returns the table header which represents the width of the columns of a -- table in units of the line width. It takes a list of widths as second -- parameter. It is understood that necessary correction for the width to -- compensate for the space needed by separations of columns have already been -- applied. The is the first boolean parameter is true rules will be drawn in -- the table, otherwise they won't. See also documentation of the -- `LatexRenderer.wdth3` function in the module `LatexRenderer`. tableSpecifier :: -- | The number of columns in the table. Int -> -- | True if the rules of the table shall be drawn, False otherwise. Bool -> -- | The list of column width of the table. [Float] -> -- | The table header for use in the LaTeX document. String tableSpecifier i True f = '|' : (innerTableSpecifier i f "|") tableSpecifier i False f = (innerTableSpecifier i f "") -- | Takes the multirowmap as first input parameter. See documentation on the -- function `multiRowDictChangeStart` in this module for details on the -- multirowmap. It returns true if there are currently no multirow cells active -- in the given multirowdict myempty :: -- | The multirowmap, see `multiRowDictChangeStart` Map Int (Int, Int) -> -- | True if the a no active cells in the multirowmap given in the first -- parameter. Bool myempty d = [x | x <- Map.toList d, (fst (snd x)) /= 0] == [] -- | Takes the string found in the header symbol of a table or the opening tag -- of the HTML table tag. That is the place where the attributes are, but only -- understood as string so without parsing the attributes as map, and returns a -- boolean. It this boolean is true the rules of the table need to be drawn, -- otherwise they must not be drawn seperatingLinesRequested :: -- | Contents of the opening HTML tag for a table. String -> -- | True if rules of the table shall be drawn, False otherwise. Bool seperatingLinesRequested s = (isInfixOf "Prettytable" (map toLower s)) || (isInfixOf "prettytable" (map toLower s)) || (isInfixOf "wikitable" (map toLower s)) -- | Returns the latex symbol for a horizontal line on the last row of a table, -- that is a horizontal rule, if the first boolean parameter is true, otherwise -- the empty string is returned. This function is usually being called with the -- first parameter indicating whether or not rules should be drawn with the -- table rowDelimiter :: -- | True if the rules in the table shall be drawn, False otherwise. Bool -> -- | The end symbol for the last line of the table for use in the LaTeX -- document. String rowDelimiter True = "\\\\ \\hline" rowDelimiter False = "" -- | Returns the latex symbol for a horizontal line in a table, that is a -- horizontal rule, if the first boolean parameter is true, otherwise the empty -- string is returned. This function is usually being called with the first -- parameter indicating whether or not rules should be drawn with the table horizontalLine :: -- | True if rule in the table shall be drawn, False otherwise Bool -> -- | the LaTeX Command to draw a horizontal rule, if the first parameter is -- True, the empty string otherwise. String horizontalLine True = " \\hline" horizontalLine False = "" -- | Return the latex symbol for a partly drawn inner horizontal line in a -- table, that is a horizontal rule. It has to be drawn only partly since -- multirow cells intersect with it. makeCLines :: -- | an index that is incremented during the course of this function and has -- to be 1 when called this function from outside Int -> -- | the multirowmap (the documentation on the function -- `multiRowDictChangeStart` in this module for details). Map Int (Int, Int) -> -- | The total number of columns in the table. Int -> -- | The latex symbol for a partly drawn inner horizontal line in a table. [Char] makeCLines m d t = if m <= t then fromMaybe def $ do (a, b) <- Map.lookup m d guard (a /= 0) return $ makeCLines (m + (if b > 0 then b else 1)) d t else "" where def = "\\cline{" ++ (show m) ++ "-" ++ (show m) ++ "}" ++ (makeCLines (m + 1) d t) -- | Return the latex symbol for an inner horizontal line in a table, that is a -- horizontal rule. If multirow cells interfere with this rule the rule is only -- drawn in parts as required. innerHorizontalLine :: -- | Boolean parameter: if true the rule is drawn otherwise it is not. Bool -> -- | The multirowmap (the documentation on the function -- `multiRowDictChangeStart` in this module for details). Map Int (Int, Int) -> -- | The total number of columns in the table. Int -> -- | the latex symbol for an inner horizontal line in a table. String innerHorizontalLine b d m = if b then if myempty d then horizontalLine True else ' ' : makeCLines 1 d m else "" -- | The symbol in latex for separating columns. It is returned if the fist -- boolean parameter is true otherwise the empty string is returned. This -- function is usually called with the first parameter being true if the current -- column was not the first column of a row since the symbol is not needed -- before the start of the first column of a row. This is a contrast to html -- where the first cell of a row has its own td or th tag. The mediawiki markup -- notation is similar to html in this respect. columnSeperator :: -- | Boolean parameter: true if the current column was not the first column -- of a row Bool -> -- | The symbol in latex for separating columns String columnSeperator True = "&" columnSeperator False = "" -- | Reads an integer from a map of attributes of th or td tag or corresponding -- column separator or header column separator at a given key. genMultiplicity :: -- | The key for this map of attributes String -> -- | The parse result of the attributes of a th tag or td tag or a -- corresponding header column separator or column separator containing a map -- of attributes [Anything Char] -> -- | The value for the key (given in the first parameter) in the map of -- attributes (given in the second parameter) parsed to an integer an wrapped -- in to a Just value of the Maybe monad if the value was found and -- successfully parse to an integer. The Nothing value of the Maybe monad -- otherwise. Maybe Int genMultiplicity s = msum . (map f) where f (Environment Attribute (Attr (k, v)) _) = listToMaybe $ do (z, _) <- reads v guard (k == s) return z f _ = Nothing -- | Reads a string from It takes a key for this map of attributes as string as -- first parameter wrapped into the Maybe monad. genLookup :: -- | The key for this map of attributes String -> -- | The parse result of the attributes of a th tag or td tag or a -- corresponding header column separator or column separator. [Anything Char] -> -- | The result of a lookup of the key in the map (so the value) as string -- wrapped into a Just value of the Maybe monad. If no value for the key could -- be found in the map it returns the value Nothing of the Maybe monad. Maybe String genLookup s = msum . (map f) where f (Environment Attribute (Attr (k, v)) _) = listToMaybe $ do return () guard (k == s) return v f _ = Nothing -- | Returns the column multiplicity of the current cell. columnMultiplicity :: -- | The parse result of the inner part of the column separator or header -- column separator, that corresponds to the attributes of the th or td HTML -- element [Anything Char] -> -- | The column multiplicity of the current cell wrapped into a Just value of -- the Maybe Monad if found. The value Nothing of the Maybe monad is returned -- if the attribute colspan is not present (or did not have a value parseable -- as Integer) within the first parameter Maybe Int columnMultiplicity = genMultiplicity "colspan" -- | Returns the row multiplicity of the current cell. -- | The row multiplicity of the current cell. rowMultiplicity :: -- | The parse result of the inner part of the column separator or header -- column separator, that corresponds to the attributes of the th or td HTML -- element. [Anything Char] -> -- | The row multiplicity of the current cell wrapped into a Just value of the -- Maybe Monad if found. The value Nothing of the Maybe monad is returned if -- the attribute rowspan is not present (or did not have a value parseable as -- Integer) within the first parameter Maybe Int rowMultiplicity = genMultiplicity "rowspan" -- | The column multiplicity of the current cell. columnMultiplicityForCounting :: -- | The parse result of the inner part of the column separator or header -- column separator, that corresponds to the attributes of the th or td HTML -- elements [Anything Char] -> -- | The column multiplicity of the current cell if found. The value one is -- returned if the attribute colspan is not present (or did not have a value -- parseable as Integer) within the first parameter. Int columnMultiplicityForCounting = (fromMaybe 1) . columnMultiplicity -- | Return the symbol for the start of a multicolumn cell in latex. multiColumnStartSymbol :: -- | the parse result of the inner part of the column separator of header -- column separator, that corresponds to the attributes of the th or td HTML -- elements. [Anything Char] -> -- | The nesting depth of table. Is equal to zero the current table is not a -- inner table of an outer table. Int -> -- | The list of the final widths of all columns of the table [Float] -> -- | The column index of the current column Int -> -- | A boolean parameter. If it is true rules will be drawn in the table -- otherwise they won't. Bool -> -- | The fifth parameter is the table state, that is the mutable state that -- exists during rendering of a table. TableState -> -- | The symbol for the start of a multicolumn cell in latex. String multiColumnStartSymbol l j f i t st = fromMaybe "" $ do n <- columnMultiplicity l return $ "\\multicolumn{" ++ (show n) ++ "}{" ++ (spec n) ++ "}{" where spec mm = case activeColumn st of Nothing -> tableSpecifier j t (mylist mm) _ -> "l" mylist nn = [ min 1.0 ( ((1.0 - (scalefactor 1)) * (sum (take nn (drop (i - 1) f)))) / (1.0 - (scalefactor (fromIntegral nn))) ) ] -- | Return the symbol for the end of a multicolumn cell in LaTeX. multiColumnEndSymbol :: -- | Boolean parameter, true if the cell is actually a multicolumn cell. Bool -> -- | The symbol for the end of a multicolumn cell in latex, if the cell is a -- multicolumn cell. The empty string otherwise. String multiColumnEndSymbol True = "}" multiColumnEndSymbol False = "" -- | Return the symbol for the end of a multirow cell in LaTeX. multiRowEndSymbol :: -- | Boolean parameter, true if the cell is actually a multirow cell Bool -> -- | The symbol for the end of a multirow cell in LaTeX, if the cell is a -- multirow cell. The empty string otherwise. String multiRowEndSymbol True = "}" multiRowEndSymbol False = "" -- | It tries to find a two tuple of Ints (that is value) in the map (given in -- the firth parameter) under the given key (given in the fourth parameter). If -- it finds one and the predicate (given in the second parameter) returns true -- on the first element of that two tuple it returns the result of the function -- (given in the third parameter) applied on the two tuple (the value). In any -- other case it returns the default value withDefault :: -- | The default value t -> -- | A predicate from int to boolean to be applied to the first element of the -- two tuple given as value in the map given as fifth parameter (Int -> Bool) -> -- | a function mapping a two tuple of Int to the same type as the default -- value (Int -> Int -> t) -> -- | a key for that map given in the fifth parameter Int -> -- | a map from Int to a two tuple of Int Map Int (Int, Int) -> -- | the result t withDefault def p f i d = fromMaybe def $ do (a, b) <- Map.lookup i d guard $ p a return $ f a b -- | This function returns the vertical separator symbol for column for the -- table header in LaTeX. verticalSeperator :: -- | Boolean parameter. True if the rules in the table shall be drawn. Bool -> -- | vertical separator symbol for column in LaTeX. [Char] verticalSeperator True = "|" verticalSeperator False = "" -- | The function returns the a string to be inserted into a latex document for -- multirows when a new column (that is a new cell) starts, that's when a column -- separator, or header column separator is encountered. multiRowSymbol :: -- | index of the current column. Int -> -- | The multirowdict (see documentation of the `multiRowDictChangeStart` -- function in this module). Map Int (Int, Int) -> -- | A boolean. If it is true rules will be drawn in the table, otherwise they -- won't- Bool -> -- | The multi row symbol. String multiRowSymbol i d t = s ++ (if (any (>= i) (keys d)) && (not (((Map.lookup (i + bb) d) >>= (\(g, _) -> Just g)) `elem` [Nothing, Just 0])) then (multiRowSymbol (i + (if bb == 0 then 1 else bb)) d t) else "") where (bb, s) = ( withDefault (0, "") (> 0) ( \_ b -> ( b, "\\multicolumn{" ++ (show b) ++ "}{" ++ (if (i == 1) then (verticalSeperator t) else "") ++ "c" ++ (verticalSeperator t) ++ "}{}&" ) ) i d ) -- | The function returns the a string to be inserted into a latex document for -- multirows when a new row starts, that's when a row separator is encountered. multiRowSymbolForRowSep :: -- | The index of the current column. Int -> -- | The multirowdict (see documentation of the `multiRowDictChangeStart` -- function in this module). Map Int (Int, Int) -> -- | A boolean. If it is true rules will be drawn in the table, otherwise they -- won't. Bool -> -- | The multi row symbol for a row separator. String multiRowSymbolForRowSep i d t = (if (intercalate "&" (multiRowSymbolForRowSepInner i d t)) == "" then "" else "&") ++ (intercalate "&" (multiRowSymbolForRowSepInner i d t)) -- | The function returns the the inner parts of the string to be inserted into -- a latex document for multirows when a new row starts, that's when a row -- separator is encountered. multiRowSymbolForRowSepInner :: -- | The index of the current column Int -> -- | The multirowdict (see documentation of the `multiRowDictChangeStart` -- function in this module). Map Int (Int, Int) -> -- | A boolean. If it is true rules will be drawn in the table, otherwise they -- won't. Bool -> -- | The inner parts of the of the string to be inserted into a latex document -- for multirows when a new row starts [String] multiRowSymbolForRowSepInner i d t = (if s == "" then [] else [s]) ++ (if (any (>= i) (keys d)) && (not (((Map.lookup (i + bb) d) >>= (\(g, _) -> Just g)) `elem` [Nothing, Just 0])) then (multiRowSymbolForRowSepInner (i + (if bb == 0 then 1 else bb)) d t) else []) where (bb, s) = ( withDefault (0, "") (> 0) ( \_ b -> ( b, "\\multicolumn{" ++ (show b) ++ "}{" ++ (if (i == 1) then (verticalSeperator t) else "") ++ "c" ++ (verticalSeperator t) ++ "}{}" ) ) i d ) -- | The function returns the a string to be inserted into a latex document for -- multirows at the end of the table. multiRowSymbolForTableEnd :: -- | the index of the current column. Int -> -- | The multirowdict (see documentation of the `multiRowDictChangeStart` -- function in this module) Map Int (Int, Int) -> -- | A boolean. If it is true rules will be drawn in the table, otherwise they -- won't. Bool -> -- | A string to be inserted into a latex document for multirows at the end of -- the table. String multiRowSymbolForTableEnd = multiRowSymbolForRowSep -- | In case of a multirow, that cell has to be skipped further down. So if I -- got a multirow in row 1 column 2 with a rowspan of 2 or more I need to expand -- row 2 column 1 by 1 . So if I passed row 2 column one I am not in row 2 -- column 2 since that is where the multirow cell resides, I am rather in row 2 -- cell 3. And if there are more multicolumns involved I am more possible even -- further right. So this function just tell me how many cells I have to skip. multiRowCount :: -- | the index of the current column. Int -> -- | is the multirowdict. See also documentation on the function -- multiRowDictChangeStart in this module. Map Int (Int, Int) -> -- | The increase of the row counter for the current cell. Int multiRowCount i d = (withDefault 0 (/= 0) (\_ b -> b) i d) + (if (h /= 0) && any (>= i) (keys d) && (not (((Map.lookup (i + h) d) >>= (\(g, _) -> Just g)) `elem` [Nothing, Just 0])) then (multiRowCount (i + h) d) else 0) where h = (withDefault 0 (/= 0) (\_ b -> b) i d) -- | Calculates the change of the multiRowDict for cells ending in the current -- cell. See also documentation on `multiRowDictChangeStart`. This function -- takes the multiRowDict as second parameter and returns the modified version -- of it accounting for the cells ending in the current cell. multiRowDictChangeEnd :: -- | The index of the current column. Int -> -- | The multiRowDict (see documentation on `multiRowDictChangeStart`) in this -- module. Map Int (Int, Int) -> -- | the modified version of the multiRowDict accounting for its cells ending -- in the current cell. Map Int (Int, Int) multiRowDictChangeEnd i d = if (any (>= i) (keys d)) && (not (((Map.lookup (i + bb) xx) >>= (\(g, _) -> Just g)) `elem` [Nothing, Just 0])) then multiRowDictChangeEnd (i + bb) xx else xx where xx :: Map Int (Int, Int) (bb, xx) = withDefault (0, d) (/= 0) (\a b -> (b, ((Map.insert i (a - 1, b))) d)) i d -- | The multiRowDict is a facility for keeping track of cells spanning multiple -- rows. It is stored as mutable state in the type TableState in the parameter -- multiRowMap. It is passed to this function as second parameter. This function -- returns an updated version of it. It is a map mapping of an Int to a tuple -- whose both elements are also Ints. It the key is the column index and the -- value is a pair (rowmultiplicity, columnmultiplicity). The rowmultiplicity is -- the number of rows the cell spans. This number is decrease every time a row -- ends. So it actually says how many rows the columns spans further down from -- the current column. The column multiplicity is the number of columns the cell -- spans. This function calculates only the changes in the multirowdict for the -- opening environment of the cell. You should not use this function but rather -- use multiRowDictChange since this also considers the effect by ending of -- cells multiRowDictChangeStart :: -- | The index of the current column. Int -> -- | The multiRowDict. (see explanation below). Map Int (Int, Int) -> -- | The parse result of the opening part of the cell environment of the -- current cell. [Anything Char] -> -- | The updated multirow map where the updates due to opening multirows given -- in the third parameter have been taken into account, but not the ones due -- to closing multirow cells. Map Int (Int, Int) multiRowDictChangeStart i d l = fromMaybe d $ do n <- rowMultiplicity l return (Map.insert i ((n - 1), c) d) where c = (columnMultiplicityForCounting l) -- | Calculate the full change to the multirowdict. See documentation on the -- function `multiRowDictChangeStart` in this module for more information on the -- multirowdict. This function returns the updated multirowdict. multiRowDictChange :: -- | The index of the current column. Int -> -- | The current multirowdict. Map Int (Int, Int) -> -- | The parse result of the opening part of the cell environment of the -- current cell [Anything Char] -> -- | The updated multirow map where the updates due to opening multirows given -- in the third parameter as well as the changes due to multirow cells ending -- in the current cell have been taken into account. Map Int (Int, Int) multiRowDictChange i d l = multiRowDictChangeStart n (multiRowDictChangeEnd i d) l where n = i + (multiRowCount i d) -- | Returns the latex symbol for the start of a multirow cell. That is a cell -- spanning multiple rows. multiRowStartSymbol :: -- | The inner parse result of the row separator containing information on -- whether or not the cell is multirow [Anything Char] -> -- | activeColumn. This is an integer wrapped in the maybe monad. If it is has -- the value Just then the row is to be rendered in a special mode. This mode -- is needed to determine the width of the columns. In this special mode no -- line break occur and width of the paper is infinite, so that the width of -- the of each column is its respective natural width. So there is no limit on -- the width of the column. If the value is Nothing this means that the table -- is typeset in normal mode and the width is to be limited. Maybe Int -> -- | The state of the renderer MyState -> -- | The symbol for a start of a multirow (a cell spanning multiple rows). String multiRowStartSymbol l m st = fromMaybe "" $ do n <- rowMultiplicity l return $ if n == 1 then "" else ( "\\multirow{" ++ (show n) ++ "}{" ++ (if isJust m then "*" else (printf "%0.5f" (getF st)) ++ "\\linewidth") ++ "}" ) ++ "{" -- | A symbol to be added at the end of header cell in order to make its content -- bold. The only Otherwise the empty string is returned. headendsym :: -- | Boolean parameter. It is true if the cell currently under consideration -- is a header cell. Bool -> -- | The symbol for the end of the header cell if the current cell is a header -- cell. Otherwise the empty string. String headendsym False = "" headendsym True = "}" -- | A symbol to be added at the start of header cell in order to make its -- content bold headstartsym :: -- | Symbol to make a header cell bold. String headstartsym = "{\\bfseries " -- | The symbol to be inserted into the LaTeX document, for the end of a row in -- a table. Usually if both boolean parameters are true an endhead command -- should be inserted so that the header of table is repeated on each page. This -- feature has been disabled, since some authors use new headings in the middle -- of the table, which causes the repeated heading to be incorrect since they -- just refer to the first contiguous header rows. rowendsymb :: -- | Boolean parameter. True if the current table is not nested in an other -- one. Bool -> -- | Boolean parameter. True if the column is the last column of the header of -- the table. Bool -> -- | The multiRowMap (see `multiRowDictChangeStart` for details on that). If -- it is not empty a multirow cell is currently active and no pagebreaks -- should occur. So we tell LaTeX not do any pagebreaks by writing \\* instead -- of \\ as row end symbol in this case. See also documentation of the -- longtable latex package Map Int (Int, Int) -> -- | The LaTeX symbol for the end of a row. String rowendsymb _ _ m = "\\\\" ++ (if isEmpty then "" else "*") where isEmpty = (sum (map fst (Map.elems m))) == 0 mediawiki2latex-8.29/src/Test.hs000066400000000000000000000144461504464363500166240ustar00rootroot00000000000000-- | Automated self test of mediawiki2latex. module Test where import Data.ByteString import Data.ByteString.UTF8 import Data.List import Data.List.Split import LatexRenderer import MediaWikiParser import Static import Test.HUnit import Tools -- | Compile wiki code to LaTeX code for automated test of the software. compile :: -- | The wiki code to be compiled to LaTeX . String -> -- | The result of the compilation of the wiki code give in the first -- parameter to LaTeX. String compile s = fst ( treeToLaTeX3 (snd newtree) initialState { templateMap = getUserTemplateMap (read userTemplates :: [[String]]), urld = analyseNetloc "de.wikibooks.org/wiki/Benutzer:Dirk_H%C3%BCnniger/play", urls = mUrlState . fst $ newtree } ) where newtree = makeLables (parseit parsers s) initialUrlState -- | remove font switching commands from a LaTeX file. killfont :: -- | The input LaTeX code from which the font switching command shall be -- removed. String -> -- | The output LaTeX code which is equal the the input LaTeX code with the -- font switching commands. removed String killfont s = replace2 (replace2 (replace2 (replace2 (replace2 (replace2 (replace2 (replace2 s "\\allowbreak{}\\setmainfont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\\setmonofont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]" "") "\\allowbreak{}\\setmainfont{cmuntt.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\\setmonofont{cmuntt.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]" "") "\\allowbreak{}\\setmainfont{cmunti.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\\setmonofont{cmunti.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]" "") "\\allowbreak{}\\setmainfont{cmunbx.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\\setmonofont{cmunbx.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]" "") "\\allowbreak{}\\setmainfont{cmunbi.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\\setmonofont{cmunbi.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]" "") "\\allowbreak{}\\setmainfont{cmuntx.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\\setmonofont{cmuntx.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]" "") "\\allowbreak{}\\setmainfont{cmunit.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\\setmonofont{cmunit.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]" "") "\\allowbreak{}\\setmainfont{cmuntb.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\\setmonofont{cmuntb.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]" "" -- | Extract the files from the "test" directory structure embedded in the -- executable for a given name of a test readFiles :: -- | The embedded directory form the "test" directory. [(String, ByteString)] -> -- | The name of the test to be extracted. String -> -- | The files for the test case with the given name as a tuple containing the -- MediaWiki code as first item and the LaTeX code it should compiled to as -- second parameter. The tuple is wrapped into a Just value of the Maybe monad -- if the files were found. A Nothing value of the Maybe monad is returned -- otherwise. Maybe (String, String) readFiles files f = do w <- lookup (f ++ ".wiki") files t <- lookup (f ++ ".tex") files return (toString w, toString t) -- | Prepare a compilation self test with the name of the test given in the -- second parameter. filetest :: -- | The embedded directory structure of the "test" directory. [(String, ByteString)] -> -- | The name of the test to run String -> -- | The HUnit test case for the test with the name given in the second -- parameter. Test filetest files f = TestLabel f ( TestCase ( case (readFiles files f) of Just (wiki, tex) -> assertEqual f (killfont (strip "\n" tex)) (killfont (strip "\n" (compile wiki))) Nothing -> assertFailure "Test case not found" ) ) -- | Return test name of a test from an entry the embedded directory structure -- of the test directory. The name of the test is returned as list containing -- the name of the test as a single item if it was found. Otherwise the empty -- list is returned. wikipred :: -- | the entry of the embedded directory structure of test directory. (String, ByteString) -> -- | A list containing the name of test as single entry if a name of the test -- was found. Otherwise the empty list. [String] wikipred s = case Data.List.reverse (splitOn "." (fst s)) of (("wiki") : xs) -> [Data.List.intercalate "." (Data.List.reverse xs)] _ -> [] -- | Run all test of mediawiki2latex runTest :: -- | The IO action to run all test of mediawiki2latex IO () runTest = do _ <- runTestTT (TestList ((Data.List.map (filetest testFiles) (testFiles >>= wikipred)))) return () mediawiki2latex-8.29/src/Text/000077500000000000000000000000001504464363500162645ustar00rootroot00000000000000mediawiki2latex-8.29/src/Text/ParserMediaWiki.hs000066400000000000000000000004641504464363500216440ustar00rootroot00000000000000module Text.ParserMediaWiki where import MediaWikiParseTree import MediaWikiParser parseMediaWiki :: String -> [Anything Char] parseMediaWiki text = parseit parsers text parseMediaWikiGeneratedHTML :: String -> [Anything Char] parseMediaWikiGeneratedHTML text = printPrepareTree (parseit minparsers text) mediawiki2latex-8.29/src/Tools.hs000066400000000000000000000200431504464363500167730ustar00rootroot00000000000000-- | various helper functions module Tools where import Control.Monad import Data.Char import Data.List (isPrefixOf) import Data.List.Split (splitOn) import Data.Time.Clock.POSIX import System.IO import System.IO.Strict -- | Removes superfluous heading and tailing characters from a string. strip :: (Eq a) => -- | the list of characters which are considered superfluous. [a] -> -- | the initial string from which the superfluous characters shall be -- removed. [a] -> -- | the output string in which the superfluous characters have been removed -- from the beginning and the end of the original string. [a] strip l = reverse . (dropWhile isBad) . reverse . dropWhile isBad where isBad x = x `elem` l -- | Pads a string with spaces. Adds space characters to the beginning of a -- string until it has got a desired length. pad :: -- | The desired length for the result string Int -> -- | The input string. String -> -- | The padded string as output of this function- String pad n s = if length s < n then pad n (' ' : s) else s -- | Creates a list of line numbers as padded strings. linenumbers :: -- | The length of length that padded decimal character representation of each -- line number should have Int -> -- | The minimum line number to start with (inclusive). Int -> -- | The maximum line number to end with (inclusive). Int -> -- | The list of line numbers as strings. [String] linenumbers n mini maxi = if mini == maxi then [pad n (show mini)] else (pad n (show mini)) : (linenumbers n (mini + 1) maxi) -- | Prints out a given message together with the current Unix timestamp. Used -- everywhere in mediawiki2latex in order to display status messages. myprint :: -- | The message to be printed String -> -- | The IO action to print the given string together with the current Unix -- timestamp. IO () myprint s = do t <- getPOSIXTime Prelude.putStrLn ("mediawiki2latex (" ++ (show t) ++ "):" ++ s) hFlush stdout -- | Writes a Unicode string to a UTF8 encoded file. writeFile :: -- | The filename of the file where the string given second parameter shall be -- written. FilePath -> -- | The contend (a string) to be written to the file with the filename given -- in the first parameter. String -> -- | The IO action writing the string to the file. IO () writeFile f s = do h <- openFile f WriteMode hSetEncoding h utf8 hPutStr h s hClose h -- | Reads a UTF8 encoded file fully as a Unicode string. readFile :: -- | The filename of the file from which the string shall be red. FilePath -> -- | The content of the file wrapped in the IO monad. IO String readFile f = do h <- openFile f ReadMode hSetEncoding h utf8 z <- System.IO.Strict.hGetContents h return z -- | If the input list is not empty it returns the input list without the last -- item, otherwise the empty list. nullinit :: -- | The input list [a] -> -- | The input list with the last item removed if the input list is not the -- empty list. Otherwise the empty list. [a] nullinit l = if null l then [] else init l -- | Returns the list with the first element stripped wrapped in a Just of the -- Maybe monad. If the list is empty returns the value Nothing of the maybe -- monad. maybeTail :: -- | The input list [a] -> -- | The input list without the first element in a Just value of the Maybe -- monad if the input list if not the empty list. Otherwise the Nothing value -- of the maybe monad is returned. Maybe [a] maybeTail [] = Nothing maybeTail (_ : xs) = Just xs -- | Returns the first element of a list wrapped in a Just of the Maybe monad. -- If the list is empty returns the value Nothing of the Maybe monad. maybeHead :: -- | The input list [a] -> -- | The first element of the input list wrapped in a Just value of the Maybe -- monad if the input list is not the empty list. Otherwise the Nothing value -- of the Maybe monad. Maybe a maybeHead [] = Nothing maybeHead (x : _) = Just x -- | The first parameter is an item. the second parameter is a list. If the list -- contains the item it returns the list up to the first occurrence of the item -- with the item itself excluded, otherwise it returns the empty list. headSplitEq :: (Eq a) => -- | The item at up to which the list given in the second parameter shall be -- returned (excluding the item itself) a -> -- | The list of which the first part up to the item given in the first -- parameter shall be returned. The item given in the first parameter itself -- shall be excluded. [a] -> -- | The first part of list given as second input parameter up the item given -- as first parameter if the list contains the item given as the first -- parameter. Otherwise the empty list. The item given as the first parameter -- itself is not part of the return value in any case. [a] headSplitEq c s = case splitOn [c] s of g : _ -> g [] -> [] -- | Removes all white space characters trailing on the right hand side of a -- string rtrim :: -- | the input string of which the white space character on the right hand -- side shall be removed. String -> -- | the input string given as first parameter with the any white space -- character on the right hand side removed. String rtrim = reverse . (dropWhile isSpace) . reverse -- | This function replaces all occurrences of the original item, with the -- replacement item in the list. replace :: (Eq a) => -- | an original item to be replaced a -> -- | the replacement item the original item shall be replaced with. a -> -- | the list in which all original items shall be replaced with the -- replacement item [a] -> -- | the output list in which all occurrences of original items have been -- replaced with the replacement item. [a] replace src target = map (\x -> if x == src then target else x) -- | This function replaces all occurrences of the original list in the input -- list, with the replacement list. It replaces all needles in the haystack with -- nails. replace2 :: (Eq a) => -- | the original input (haystack) list which may contain any number -- (including zero) of the sublist (the needle) to be replaced. [a] -> -- | the sublist (the needle) which may be contained in the original list (the -- haystack) and number of times. [a] -> -- | the list (the nail) with which the sublist (the needle) shall be replaced -- in the original list (the haystack) [a] -> -- | the output list in which is the input list (the haystack) where all -- occurrences of the input sublist (the needle) have been replaced with the -- output list (the nail) [a] replace2 hay needle nail | needle `isPrefixOf` hay = nail ++ replace2 (drop (length needle) hay) needle nail replace2 (x : xs) needle nail | otherwise = x : (replace2 xs needle nail) replace2 [] _ _ = [] -- | Converts a single character in hex notation to an integer. The integer is -- wrapped in a Maybe monad. If an integer could be found it is wrapped in a -- Just value of the Maybe monad. Otherwise the value Nothing of the Maybe monad -- is returned unhexChar :: -- | the char to be converted for hexadecimal notation the integer. Char -> -- | the converted integer in a Just value of the Maybe monad if the -- conversion was successful, otherwise the Nothing value of the Maybe monad. Maybe Integer unhexChar c = lookup c hexTable where hexTable = zip ['0' .. '9'] [0 .. 9] ++ zip ['a' .. 'f'] [10 .. 15] ++ zip ['A' .. 'F'] [10 .. 15] -- | Converts a sequence of characters in hex notation to an integer. The -- integer is wrapped in a Maybe monad. If an integer could be found it is -- wrapped in a Just of the Maybe monad. Otherwise the value Nothing of the -- Maybe monad is returned unhex :: -- | the hexadecimal string to be converted to an integer. String -> -- | the converted integer wrapped in a Just value of the Maybe monad if the -- conversion was successful, otherwise the Nothing value of the Maybe monad. Maybe Integer unhex = foldM f 0 where f acc ch = maybe Nothing (\val -> Just $ 16 * acc + val) (unhexChar ch) mediawiki2latex-8.29/src/UrlAnalyse.hs000066400000000000000000000616661504464363500177720ustar00rootroot00000000000000{-# LANGUAGE DefaultSignatures #-} {-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE StandaloneDeriving #-} -- | module for processing URLs and downloading their content with respect to -- MediaWiki module UrlAnalyse where import Codec.Binary.UTF8.String import Control.Exception import Control.Exception as X import Control.Monad import qualified Data.ByteString as BStr import qualified Data.ByteString.Lazy as L import Data.ByteString.Lazy.Internal import qualified Data.ByteString.UTF8 as UTF8Str import Data.List import Data.List.Split import Data.Maybe import Data.Serialize import Data.Tree.NTree.TypeDefs import GHC.Generics import Network.HTTP.Client import qualified Network.HTTP.Client.Internal as I import Network.HTTP.Client.TLS import qualified Network.HTTP.Types as T import qualified Network.HTTP.Types.Version as V import Network.URL as URL import Text.XML.HXT.Core import Tools (replace2) deriving instance Read URL.URL deriving instance Read URL.Host deriving instance Read URL.Protocol deriving instance Read URL.URLType deriving instance Serialize URL deriving instance Generic URL deriving instance Serialize URLType deriving instance Generic URLType deriving instance Serialize Host deriving instance Generic Host deriving instance Serialize Protocol deriving instance Generic Protocol -- | This represents the main URL of a wiki page. So the URL of the wiki page -- that should be converted to latex. It is a tuple wrapped into the maybe -- monad, to deal with case in which the URL could not be parsed. The first -- element of the tuple is just the main URL parsed with Network.URL The second -- element is a list of URLs. These URLs are possible base URLs for wiki pages. -- So https://en.wikipedia.org/wiki/Foobar has got the main URL -- https://en.wikipedia.org/wiki/Foobar and one of the base URLs us -- https://en.wikipedia.org/wiki/ and an other baseurl is -- https://en.wikipedia.org . Base URLs are important since the wiki source -- related to the main URL might include sub page in wiki notation that is -- [[John_Dow]]. The actual URL to look up John_Dow is the baseurl plus John_Dow -- so that is https://en.wikipedia.org/wiki/John_Dow . Since also images in the -- commons and similar things are possible, there are usually some baseurls to -- be looked at. This way the baseurls have to be a list. type WikiUrl = Maybe (URL, [URL]) -- | Converts a `FullWikiUrl` to a `WikiUrl` wikiUrl :: -- | The `FullWikiUrl` to be converted FullWikiUrl -> -- | Returns a `WikiUrl` pointing to the same article as the `FullWikiUrl` -- given in the first parameter WikiUrl wikiUrl fu = return (url fu, alternatives fu) -- | A type describing a reference to an article on a MediaWiki server. The -- entry `url` is the URL under which the article is located. The entry -- `alternatives` is a list of baseurls of the wiki. See documentation on type -- 'WikiUrl' for more information about baseurls. The entry `hostname` contains -- the hostname of the server. The entry lemma contains the lemma (that is the -- name of the article on the wiki) data FullWikiUrl = FullWikiUrl { -- | URL where the wiki article is located url :: URL, -- | List of base URLs where to look for neighboring articles. See -- documentation on type `WikiUrl` for more information on base URLs . alternatives :: [URL], -- | The host name of the server the wiki is running on. For example -- en.wikipedia.org . hostname :: String, -- | The lemma on the wiki the URL points to. For example the URL -- https://en.wikipedia.org/wiki/John_Dow has the lemma John_Dow . lemma :: String } deriving (Eq, Ord, Serialize, Generic, Show) -- | base instance of type `FullWikiUrl`, to be filled with useful data using -- the record syntax. fullWikiUrlZero :: -- | empty instance of the type `FullWikiUrl`. FullWikiUrl fullWikiUrlZero = FullWikiUrl { url = URL { URL.url_type = Absolute ( Host { URL.protocol = HTTP True, URL.host = "", URL.port = Nothing } ), url_path = "", url_params = [] }, alternatives = [], hostname = "", lemma = "" } -- | returns the list of baseurls of an WikiUrl. The list may be empty if the -- WikiUrl has none. See documentation on the type `WikiUrl` to understand what -- a baseurl is. parses :: -- | The `WikiUrl` to be converted to a list of its baseurls. WikiUrl -> -- | Returns the list of baseurls of the the `WikiUrl` given as first -- parameter. Returns the empty list if the list of baseurls could not be -- determined. [URL] parses u = do uu <- maybeToList u snd uu -- | takes a baseurl and creates the beginning URL under which the wiki source -- code any lemma can be retrieved. So the URL -- https://en.wikipedia.org/wiki/FoorBar has the baseurls -- https://en.wikipedia.org and https://en.wikipedia.org/wiki . The wiki source -- of the lemma John_Dow can be retrieved from the wiki via the URL -- https://en.wikipedia.org/wiki/Special:Export/John_Dow. This function return -- the beginning of an URL where the wiki source code can be downloaded. In our -- example it returns https://en.wikipedia.org/wiki/Special:Export. See also -- documentation on the type `WikiUrl` on what a baseurl is. modpath :: -- | the baseurl to the wiki URL -> -- | the beginning of an URL to download the wiki source code from. URL modpath u = u { url_path = if p /= [] then p ++ "/Special:Export" else "Special:Export" } where p = (url_path u) -- | takes a baseurl an return the beginning of the URL of the special page on -- the wiki to expand the templates useful for command line option -m. See -- documentation on type `WikiUrl` for more information on what a baseurl is. -- For example the base url https://en.wikipedia.org/wiki/ get converted to -- https://en.wikipedia.org/wiki/Special:ExpandTemplates modpathForExpansion :: -- | the baseurl to the wiki URL -> -- | the beginning of an Url to expand the templates on the wiki URL modpathForExpansion u = u { url_path = ( if p /= [] then p ++ "/Special:ExpandTemplates" else "Special:ExpandTemplates" ), url_params = [] } where p = (url_path u) -- | Loads a web page via https. Returns a String. geturl :: -- | URL of the web page to be downloaded. String -> -- | The result of the request is returned as a String wrapped in the IO -- monad. IO String geturl u = if u == "" then return ([]) else Control.Exception.catch ( do req1 <- parseRequest u let req0 = req1 {requestHeaders = (T.hUserAgent, UTF8Str.fromString "mediawiki2latex") : (requestHeaders req1)} let req = ( ( urlEncodedBody ( map (\(a, b) -> (UTF8Str.fromString a, UTF8Str.fromString b)) [] ) ) req0 ) { method = method req0 } manager <- newManager tlsManagerSettings res <- (httpLbs req manager) `X.catch` (statusExceptionHandler req) return ((unpackChars (responseBody res))) ) fun where fun :: ErrorCall -> IO String fun _ = return "" statusExceptionHandler :: I.Request -> SomeException -> IO (Network.HTTP.Client.Response L.ByteString) statusExceptionHandler r _ = (return (I.Response {I.responseOriginalRequest = r, responseBody = L.empty, responseStatus = T.Status {T.statusCode = 200, T.statusMessage = BStr.empty}, responseVersion = V.http09, responseHeaders = [], responseCookieJar = I.CJ [], I.responseClose' = I.ResponseClose (return ())})) -- | Loads the data stored under an URL from the web. Returns a ByteString. -- Mainly useful for loading HTML for further processing, as well as binary -- image files. geturl2 :: -- | the URL to download the content from. String -> -- | the result of the request wrapped into the IO monad. IO BStr.ByteString geturl2 uuu = let u = replace2 uuu "%20" "_" in if u == "" then return (BStr.pack []) else Control.Exception.catch ( do req1 <- parseRequest u let req0 = req1 {requestHeaders = (T.hUserAgent, UTF8Str.fromString "mediawiki2latex") : (requestHeaders req1)} let req = ( ( urlEncodedBody ( map (\(a, b) -> (UTF8Str.fromString a, UTF8Str.fromString b)) [] ) ) req0 ) { method = method req0 } manager <- newManager tlsManagerSettings res <- (httpLbs req manager) `X.catch` (statusExceptionHandler req) return (L.toStrict (responseBody res)) ) fun where fun :: ErrorCall -> IO BStr.ByteString fun _ = return (BStr.pack []) statusExceptionHandler :: I.Request -> SomeException -> IO (Network.HTTP.Client.Response L.ByteString) statusExceptionHandler r _ = (return (I.Response {I.responseOriginalRequest = r, responseBody = L.empty, responseStatus = T.Status {T.statusCode = 200, T.statusMessage = BStr.empty}, responseVersion = V.http09, responseHeaders = [], responseCookieJar = I.CJ [], I.responseClose' = I.ResponseClose (return ())})) -- | loads the wiki source code stored under a lemma in on a server running -- MediaWiki. geturl4 :: -- | the lemma for which the wiki source code shall be downloaded String -> -- | the beginning of the URL to the special:export page on the wiki String -> -- | the wiki source code of the wiki article at the given lemma IO String geturl4 s u = if u == "" then return ([]) else Control.Exception.catch ( do req2 <- parseRequest (u ++ "/" ++ s) let req1 = req2 {requestHeaders = (T.hUserAgent, UTF8Str.fromString "mediawiki2latex") : (requestHeaders req2)} let req0 = req1 {queryString = UTF8Str.fromString "", path = if (head . reverse $ s) == '?' then (UTF8Str.fromString . (++ "%3F") . UTF8Str.toString) (path req1) else path req1} let req = ( ( urlEncodedBody ( map (\(a, b) -> (UTF8Str.fromString a, UTF8Str.fromString b)) [("mw-input-pages", s), ("curonly", "1"), ("wpExportTemplates", "0"), ("wpDownload", "1")] ) ) req0 ) manager <- newManager tlsManagerSettings res <- (httpLbs req manager) `X.catch` (statusExceptionHandler req) return ((unpackChars (responseBody res))) ) fun where fun :: ErrorCall -> IO String fun _ = return "" statusExceptionHandler :: I.Request -> SomeException -> IO (Network.HTTP.Client.Response L.ByteString) statusExceptionHandler r _ = (return (I.Response {I.responseOriginalRequest = r, responseBody = L.empty, responseStatus = T.Status {T.statusCode = 200, T.statusMessage = BStr.empty}, responseVersion = V.http09, responseHeaders = [], responseCookieJar = I.CJ [], I.responseClose' = I.ResponseClose (return ())})) -- | Loads the wiki source code of a wiki article from a server running -- MediaWiki, with all MediaWiki templates expanded into wiki source code. geturl3 :: -- | beginning of the URL to Special:Expand page on the server. String -> -- | the wiki source code including the templates which should be expanded. String -> -- | the name of the lemma on the wiki server where the wiki source code given -- in the second parameter is hosted on the MediaWiki server. String -> -- | The wiki source code given in the second parameter with all templates -- expanded by MediaWiki. IO String geturl3 u d s = if u == "" then return ([]) else Control.Exception.catch ( do req1 <- parseRequest u let req0 = req1 {requestHeaders = (T.hUserAgent, UTF8Str.fromString "mediawiki2latex") : (requestHeaders req1)} let req = ( urlEncodedBody ( map (\(a, b) -> (UTF8Str.fromString a, UTF8Str.fromString b)) [ ("wpInput", d), ("removecomments", "1"), ("removenowiki", "1"), ("generate_xml", "0"), ("contexttitle", s) ] ) ) req0 manager <- newManager tlsManagerSettings res <- (httpLbs req manager) `X.catch` (statusExceptionHandler req) return ((unpackChars (responseBody res))) ) fun where fun :: ErrorCall -> IO String fun _ = return "" statusExceptionHandler :: I.Request -> SomeException -> IO (Network.HTTP.Client.Response L.ByteString) statusExceptionHandler r _ = (return (I.Response {I.responseOriginalRequest = r, responseBody = L.empty, responseStatus = T.Status {T.statusCode = 200, T.statusMessage = BStr.empty}, responseVersion = V.http09, responseHeaders = [], responseCookieJar = I.CJ [], I.responseClose' = I.ResponseClose (return ())})) -- | Helper function to get the actual wiki source as string out of a part of -- and xml tree returned by the xml parser. Only used for the function -- getTextContent. toText :: -- | the XML tree (returned by the MediaWiki server) to extract the wiki -- source code from. [NTree XNode] -> -- | the wiki source code extracted from the XML tree. Maybe String toText [NTree _ [NTree (XText l) []]] = Just l toText _ = Nothing -- | This function gets the actual wiki source of a wiki page out of the result -- String returned by the Special:Export function of mediawiki. You should not -- call this function directly since it may break the flow of control. Better -- use the function getTextContent2. getTextContent :: -- | the content from the MediaWiki servers export page containing the wiki -- source code String -> -- | Returns the Just value of the Maybe monad containing the wiki source code -- extracted from the response of the MediaWiki server given as first -- parameter if it could be extracted. Returns the Nothing value of the Maybe -- monad otherwise. IO (Maybe String) getTextContent z = do h <- runX ( (readString [withValidate no, withParseHTML yes] z) >>> (deep (isElem >>> hasName "text")) ) x <- return . toText $ h return (seq x x) -- | This function gets the actual wiki source of a wiki page out of the result -- String returned by the Special:Export function of mediawiki. This function -- returns its result wrapped in a maybe monad so it can return the maybe value -- Nothing in case of failure but does not break the flow of control. It is also -- wrapped in the IO monad since the xml parser used is bound to the IO monad. getTextContent2 :: -- | the content from the MediaWiki servers export page containing the wiki -- source code String -> -- | Returns the Just value of the Maybe monad containing the wiki source code -- extracted from the response of the MediaWiki server given as first -- parameter if it could be extracted. Returns the Nothing value of the Maybe -- monad otherwise. IO (Maybe String) getTextContent2 z = catchJust mycatchfun (getTextContent z) (\_ -> return Nothing) -- | This function extracts the expanded wiki source of out of the result String -- returned by the Special:ExpandTemplates function of MediaWiki. This function -- returns its result wrapped in a maybe monad so it can return the maybe value -- Nothing in case of failure but does not break the flow of control. It is also -- wrapped in the IO monad since the XML parser used is bound to the IO monad. -- You should not call this function directly since it may break the flow of -- control. Better use the function getExpandedTextContent2. getExpandedTextContent :: -- | The String returned MediaWiki servers Special:ExpandTemplates page. String -> -- | Returns a Just value of the Maybe monad containing the wiki source code -- with all templates expanded by the MediaWiki Server if it could be -- extracted. Returns the Nothing value of the Maybe monad otherwise. IO (Maybe String) getExpandedTextContent z = do h <- runX ( (readString [withValidate no, withParseHTML yes] z) >>> ( deep ( isElem >>> hasName "textarea" >>> (hasAttrValue "id" (\g -> g == "output")) ) ) ) x <- return . toText $ h return (seq x x) -- | this function extracts the expanded wiki source of out of the result String -- returned by the Special:ExpandTemplates function of mediawiki. This function -- returns its result wrapped in a maybe monad so it can return the maybe value -- Nothing in case of failure but does not break the flow of control. It is also -- wrapped in the IO monad since the XML parser used is bound to the IO monad. -- Possible IO errors are caught an rethrown as Nothing in the Maybe Monad. getExpandedTextContent2 :: -- | The String returned MediaWiki servers Special:ExpandTemplates page. String -> -- | Returns a Just value of the Maybe monad containing the wiki source code -- with all templates expanded by the MediaWiki Server if it could be -- extracted. Returns the Nothing value of the Maybe monad otherwise. IO (Maybe String) getExpandedTextContent2 z = catchJust mycatchfun (getExpandedTextContent z) (\_ -> return Nothing) -- | exception predicate interested in all exceptions. Thats means we catch all -- exceptions. This needed in getTexTContent2 and getExpandedTextContent2 so -- that the maybe value nothing is returned in case of an exception but the -- control flow is not interrupted. mycatchfun :: -- | The Exception to be caught SomeException -> -- | return a Just value of the Maybe Monad containing the void type Maybe () mycatchfun _ = return () -- | gets the wiki source code of a lemma on a wiki. getpage :: -- | the lemma on the wiki (example: John_Dow for -- https://en.wikipedia.org/wiki/John_Dow ). String -> -- | a 'WikiUrl' specifying from which wiki the data shall be downloaded. Hint -- a 'WikiUrl' can be created by calling the function 'analyse' . WikiUrl -> -- | returns the wiki source code of the lemma as a Just value of the Maybe -- monad if it could be retrieved, otherwise returns the Nothing value of the -- Maybe monad in case of failure. The return value is wrapped in the IO monad -- in any case since the download requires an IO action. IO (Maybe String) getpage sss u = do let ss = replace2 (replace2 sss " " "_") "%" "%25" l <- mapM ((geturl4 ss) . unify . exportURL . modpath) (parses u) ll <- mapM getTextContent2 l lll <- return (seq ll ll) return $ (listToMaybe $ concat (map maybeToList lll)) >>= (return . decodeString) -- | Loads a page from a wiki when mediawiki2latex is running with command line -- option --bookmode. Loads the HTML (generated by MediaWiki) for a lemma from a -- wiki pointed to by a `WikiUrl` getBookpage :: -- | The lemma to load from the wiki. String -> -- | The `WikiUrl` to the MediaWiki server hosting the wiki. WikiUrl -> -- | The HTML for the given lemma returned by the MediaWiki server specified -- by the given `WikiUrl`. IO (Maybe String) getBookpage ss u = do l <- mapM ((geturl2) . unify) ((map attach) (map exportURL (parses u))) lll <- return (seq l l) return $ (listToMaybe $ concat (map maybeToList (map go lll))) >>= (return) where go x = if (x == (UTF8Str.fromString [])) then Nothing else Just (UTF8Str.toString x) attach x = case reverse x of '/' : xs -> ((reverse xs) ++ ("/" ++ ss)) xs -> ((reverse xs) ++ ("/" ++ ss)) -- | Loads the wiki source code of an article form a MediaWiki server when -- mediawiki2latex is running with the --mediawiki option. This function -- downloads the original wiki source code without expanding the templates. The -- templates are going to be expanded later by call to `getExpandedPage`. getpage2 :: -- | The lemma to load . String -> -- | The `WikiUrl` to the MediaWiki server hosting the wiki. WikiUrl -> -- | Return a Just value of the Maybe monad containing a pair if successful. -- The first element of the pair is the wiki source of the article. The second -- element of it is the URL under which the article was downloaded. In case of -- failure the Nothing value of the Maybe monad is returned. IO (Maybe (String, URL)) getpage2 sss u = do let ss = replace2 (replace2 sss " " "_") "%" "%25" l <- mapM ((geturl4 ss) . unify . exportURL . modpath) (parses u) ll <- mapM getTextContent2 l lll <- return (seq ll ll) return $ (listToMaybe $ concat (map go (zip lll (parses u)))) where go (Just xx, uu) = [(decodeString xx, uu)] go _ = [] -- | This function expands all templates in a wikitext source using MediaWiki. getExpandedPage :: -- | The lemma to be processed. String -> -- | The wiki source code of the article stored under the lemma. String -> -- | The third parameter is URL to Special:ExpandTemplates page on the -- mediawiki server. URL -> -- | Returns a Just value of the Maybe monad containing the wiki source code -- with all templates expanded by MediaWiki if successful. Return the Nothing -- value of the Maybe Monad otherwise. IO (Maybe String) getExpandedPage ss d u = do l <- mapM ((\x -> geturl3 x d ss) . unify . exportURL . modpathForExpansion) [u] ll <- mapM getExpandedTextContent2 l lll <- return (seq ll ll) return $ (listToMaybe $ concat (map maybeToList lll)) >>= (return . decodeString) -- | unescapes the special character underscore and % from url notation. unify :: -- | The string to be unescaped String -> -- | Returns the unescaped string String unify ('%' : ('2' : ('0' : xs))) = '_' : unify xs unify ('%' : ('2' : ('5' : xs))) = '%' : unify xs unify (x : xs) = x : (unify xs) unify [] = [] -- | converts an url given as String into a 'WikiUrl'. See description on type -- 'WikiUrl' on what that means. analyse :: -- | a string containing an URL to be converted into a 'WikiUrl' for further -- processing. String -> -- | return the 'WikiUrl'. WikiUrl analyse s = do vv <- v ww <- importURL "https://commons.wikimedia.org/wiki" return (vv, (reverse z) ++ [ww]) where v = importURL s z :: [URL] z = do u <- maybeToList $ v l <- return $ splitOn "/" $ (unify (url_path u)) x <- ( map ( \i -> if (length l) > i then [intercalate "/" (take i l)] else mzero ) [2, 0, 1] ) map (\i -> u {url_path = i}) x -- | converts an URL given as String into the lemma it points to on the wiki. -- For example the URL https://en.wikipedia.org/wiki/John_Dow gets converted to -- John_Dow getLemma :: -- | The URL to be converted to a lemma. String -> -- | Returns the lemma as a Just value of the Maybe monad, if the conversion -- was successful or the Nothing value of the Maybe monad if the conversion -- was not possible. Maybe String getLemma s = z where v = importURL s z :: Maybe String z = do u <- v l <- return $ splitOn "/" $ (unify (url_path u)) let x = if (length l) > 1 then drop 1 l else l let xx = if "index.php" `elem` x then case dropWhile (/= "index.php") x of (_ : ys) -> ys _ -> [] else x return $ intercalate "/" xx -- | converts an URL given as String into the host (as string) it points to on -- the wiki. getHost :: -- | The URL to the wiki article. String -> -- | The hostname of the wiki server the URL given as first parameter points -- to. Maybe String getHost s = z where v = importURL s z :: Maybe String z = do u <- v case (url_type u) of Absolute h -> return (URL.host h) _ -> mzero -- | Parse an URL supplied as string in the first parameter into a 'FullWikiUrl' -- which is returned. See documentation on the types 'WikiUrl' and 'FullWikiUrl' -- for more information. analyseFull :: -- | String representation of and the URL to be analysed String -> -- | A Just value of the Maybe monad containing a 'FullWikiUrl' if the URL -- could be parsed successfully or a Nothing value of the Maybe monad if it -- could not. Maybe FullWikiUrl analyseFull theUrl = do ana <- analyse theUrl l <- getLemma theUrl h <- getHost theUrl return $ FullWikiUrl { url = fst ana, alternatives = snd ana, hostname = h, lemma = l } mediawiki2latex-8.29/src/Wiki2Fen.hs000066400000000000000000000125471504464363500173230ustar00rootroot00000000000000-- | Module to handle the typesetting of chessboards module Wiki2Fen where import Data.Char import Data.List hiding (drop, lookup, take) import Data.List.Split import Data.Map.Strict hiding (drop, foldr, map, take) import Tools (strip) -- | mapping of integers to their respective chessboard column indices. letters :: -- | Take an integer to its respective chessboard column index. Map Integer Char letters = fromList (zip [0 ..] ['a' .. 'h']) -- | Reads a single chess square in wiki notation. Outputs a Nothing value of -- the Maybe monad if the square is marked. Output a Just value containing the -- empty list if the square is empty. Outputs a Just value contain a list which -- contains a single character in case there is chess piece on the square. This -- character is the symbol representing the chess piece in FEN chess notation. bf :: -- | The contents of the chess square in wiki notation. String -> -- | The parsed version of the chess square partly to be converted in FEN -- chess notation. Maybe String bf (x : 'd' : []) | pre x = Just [toLower x] bf (x : 'l' : []) | pre x = Just [toUpper x] bf ('x' : 'x' : []) = Nothing bf _ = Just [] -- | A predicate returning true if and only if the given character represents a -- dark chess piece in FEN chess notation. pre :: -- | The character to be checked Char -> -- | True if the character to be checked represents a dark chess piece in FEN -- chess notation. Bool pre x = x `elem` "rnbqkp" -- | Convert a row in parsed notation to a row into highlighting notation of the -- chessboard LaTeX package. fun :: -- | A pair. The first element of it is the row index. The second element of -- it is a list of pairs. The first element of each pair in the list is the -- column index. The second element each pair in the list is the parsed -- notation of the content of the chess square as returned by the `bf` -- function. (Integer, [(Integer, Maybe String)]) -> -- | Temporary accumulator. Should be the empty list when called externally. [String] -> -- | The row in the highlighting notation of the chessboard LaTeX package. [String] fun (r, x) acu = acu ++ (foldr (fun2 r) [] (reverse x)) -- | Convert a single chess square from the parsed notation to the highlighting -- notation of the chessboard LaTeX package. fun2 :: -- | The row index. Integer -> -- | A pair. The first element is the column index. The second element is the -- parsed version of the content of the chess square as returned by the `bf` -- function. (Integer, Maybe String) -> -- | Temporary accumulator. Should be the empty list when called externally. [String] -> -- | The chess square in the highlighting notation of the chessboard LaTeX -- package. [String] fun2 r (c, Nothing) acu = acu ++ case Data.Map.Strict.lookup c letters of Just z -> [[z] ++ (show (8 - r))] _ -> [] fun2 _ _ acu = acu -- | Convert a row in parsed notation to a row into FEN chess notation. fun3 :: -- | A pair. The first element of it is the row index. The second element of -- it is a list of pairs. The first element of each pair in the list is the -- column index. The second element each pair in the list is the parsed -- notation of the content of the chess square as returned by the `bf` -- function. (Integer, [(Integer, Maybe String)]) -> -- | Temporary accumulator. Should be the empty list when called externally. [String] -> -- | The row in the FEN chess notation. [String] fun3 (r, x) acu = acu ++ [a ++ (if i > 0 then (show i) else "")] where (a, i) = (foldr (fun4 r) ([], 0) (reverse x)) -- | Convert a single chess square from the parsed notation to the FEN chess -- notation. fun4 :: -- | The row index Integer -> -- | A pair. The first element is the column index. The second element is the -- parsed version of the content of the chess square as returned by the `bf` -- function. (Integer, Maybe String) -> -- | A pair. The first element accumulates the String in FEN chess notation. -- The second element is an integer that tracks the number of empty chess -- squares since the last addition to the accumulating first element of the -- tuple. (String, Integer) -> -- | A pair. The first element is the row in FEN chess notation without -- possible tailing empty squares. The number of empty squares following in -- the end of the row (String, Integer) -- \^ A pair. The first element is a String representing the row in FEN chess -- notation without possibly tailing empty squares. The second element is an -- Integer representing the number of empty squares in the end of the row. fun4 _ (_, Just "") (acu, i) = (acu, i + 1) fun4 _ (_, Just x) (acu, i) = (acu ++ (if i > 0 then (show i) else "") ++ x, 0) fun4 _ _ (acu, i) = (acu, i + 1) -- | Convert a wiki chessboard notation to FEN chess notation and the -- highlighting notation LaTeX chessboard package. toBoard :: -- | The chessboard in Wiki notation String -> -- | A pair, the first element is the chessboard in FEN chess notation. The -- second element is the chessboard in highlighting notation of the LaTeX -- chessboard package. (String, String) toBoard x = ((intercalate "/" (foldr fun3 [] (reverse l))) ++ " b - - 0 1", intercalate "," ((foldr fun [] (reverse l)) :: [String])) where sp = splitOn "|=" x l = zip [0 ..] (map (\y -> zip [0 ..] (map (bf . (strip "\n\r\t ")) ((drop 1) ((splitOn "|") y)))) (take 8 sp)) mediawiki2latex-8.29/src/WikiHelper.hs000066400000000000000000000403511504464363500177420ustar00rootroot00000000000000-- | general helper function for converting from the parsetree to latex module WikiHelper where import Data.Char import Data.List import Data.List.Split import qualified Data.Map as Map import Data.String.HT (trim) import MagicStrings import MediaWikiParseTree import MyState import Tools -- | add latex label elements to the parse tree. chapter section subsection and -- so on will be referenced by these labels. It takes the initial UrlState as -- second parameter. And the parse tree to be processed as first parameter. It -- returns a tuple. The first element is the modified urlstate and the second is -- the modified parse tree with the labels added. The field sUrlState of -- UrlState contains the page name of the downloaded page currently being -- processed by the algorithm. the filed iUrlState of UrlState is the number of -- the current label. An mUrlState is a mapping from combined page and chapter, -- section etc. names (like urls) to their label numbers. makeLables :: [Anything Char] -> UrlState -> (UrlState, [Anything Char]) makeLables ll states = let (f, s) = mapAccumL makeLablesForNode states ll in (f, concat s) where makeLablesForNode :: UrlState -> Anything Char -> (UrlState, [Anything Char]) makeLablesForNode st (Environment DhunUrl ss l) = ( st { iUrlState = (iUrlState st) + 1, sUrlState = yy, mUrlState = Map.insert yy lab (mUrlState st) }, [Environment DhunUrl ss l] ++ [Environment Label (Str lab) []] ) where yy = (replace2 (shallowFlatten l) " " "_") lab = (show . iUrlState $ st) makeLablesForNode st (Environment Wikiheading (Str ss) l) = ( st { iUrlState = (iUrlState st) + 1, mUrlState = Map.insert ((sUrlState st) ++ "#" ++ yy) lab (mUrlState st) }, [Environment Wikiheading (Str ss) l] ++ [Environment Label (Str lab) []] ) where lab = (show . iUrlState $ st) yy = (replace2 (trim (shallowFlatten l)) " " "_") makeLablesForNode st (Environment e s l) = (fst zz, [Environment e s (snd $ zz)]) where zz = makeLables l st makeLablesForNode st x = (st, [x]) -- | remove superfluous br html tags from the parse tree. Always run before -- converting the parse tree to latex removeBr :: [Anything Char] -> [Anything Char] removeBr ((C '\n') : ((Environment Tag (TagAttr "br" _) _) : xs)) = (C '\n') : removeBr xs removeBr ( (Environment Tag (TagAttr "br" _) _) : ((Environment Tag (TagAttr "br" a2) l2) : xs) ) = removeBr ((Environment Tag (TagAttr "br" a2) l2) : xs) removeBr ( (Environment Wikilink s1 l1) : ((Environment Tag (TagAttr "br" a2) l2) : xs) ) = if isImage (shallowFlatten l1) then removeBr ((Environment Wikilink s1 l1) : xs) else (Environment Wikilink s1 l1) : (removeBr ((Environment Tag (TagAttr "br" a2) l2) : xs)) removeBr ((Environment SpaceIndent x l) : xs) = (Environment SpaceIndent x (removeBr l)) : removeBr xs removeBr (x : xs) = x : removeBr xs removeBr [] = [] -- | checks if a given string is an image inclusion in wiki notation. In wiki -- notation an image is included by [[Image:FooBar.png]], but image may be -- replace by localized versions like Bild in German, so this function checks -- for those and return true if it seems to be an image isImage :: String -> Bool isImage x = ( [z | z <- map (++ ":") imgtags, z `isPrefixOf` (map toLower x)] /= [] ) -- | flattens a parse tree shallowly. that is take all characters on the surface -- level of the parse tree and combines them into a single string. It does not -- decent into substructures of the parse and so neglects all characters there -- and does not return those with the exception of character in SpaceIndent -- environments directly attached to the surface level shallowFlatten :: [Anything Char] -> String shallowFlatten ((C a) : xs) = a : (shallowFlatten xs) shallowFlatten ((Environment HtmlChar (Str "quot") _) : xs) = '"' : (shallowFlatten xs) shallowFlatten ((Environment HtmlChar (Str "amp") _) : xs) = '&' : (shallowFlatten xs) shallowFlatten ((Environment HtmlChar (Str "lt") _) : xs) = '<' : (shallowFlatten xs) shallowFlatten ((Environment HtmlChar (Str "gt") _) : xs) = '>' : (shallowFlatten xs) shallowFlatten ((Environment NumHtml (Str s) _) : xs) = let h = ( case reads s of [] -> case do z <- case s of ('x' : xxs) -> Just xxs ('X' : xxs) -> Just xxs _ -> Nothing g <- unhex z return g of Just x -> chr . fromIntegral $ x Nothing -> '?' (x : _) -> chr . fst $ x ) in h : (shallowFlatten xs) shallowFlatten ((Environment SpaceIndent _ l) : xs) = '\n' : ((shallowFlatten l) ++ (shallowFlatten xs)) shallowFlatten (_ : xs) = shallowFlatten xs shallowFlatten [] = [] -- | A link in wiki notation is given by [foorbar.com a caption]. This function -- returns the location the link points to so foobar.com as String. It takes the -- parse tree representation of the link as input parameter linkLocation :: [Anything Char] -> String linkLocation l = case yy of [] -> "" (z : _) -> z where xx = (splitOn " " (shallowFlatten l)) yy = splitOn "|" ( case xx of [] -> "" (g : _) -> g ) -- | changes the extension for a filename given in the wiki source to the -- extension to be used in the HTML document. For example gif documents are -- converted to png documents. So this function converts the string 'gif' to the -- string 'png' normalizeExtensionHtml :: String -> String normalizeExtensionHtml ('s' : ('v' : ('g' : _))) = "svg" normalizeExtensionHtml ('j' : ('p' : ('e' : ('g' : _)))) = "jpg" normalizeExtensionHtml ('j' : ('p' : ('g' : _))) = "jpg" normalizeExtensionHtml ('g' : ('i' : ('f' : _))) = "gif" normalizeExtensionHtml ('p' : ('n' : ('g' : _))) = "png" normalizeExtensionHtml ('t' : ('i' : ('f' : ('f' : _)))) = "png" normalizeExtensionHtml ('t' : ('i' : ('f' : _))) = "png" normalizeExtensionHtml ('s' : ('t' : ('l' : _))) = "png" normalizeExtensionHtml ('x' : ('c' : ('f' : _))) = "png" normalizeExtensionHtml ('d' : ('j' : ('v' : ('u' : _)))) = "png" normalizeExtensionHtml ('w' : ('e' : ('b' : ('p' : _)))) = "png" normalizeExtensionHtml (' ' : xs) = normalizeExtension xs normalizeExtensionHtml (x : xs) = x : (normalizeExtension xs) normalizeExtensionHtml [] = [] -- | changes the extension for a filename given in the wiki source to the -- extension to be used in the latex document. For example gif documents are -- converted to png documents. So this function converts the string 'gif' to the -- string 'png' normalizeExtension :: String -> String normalizeExtension ('s' : ('v' : ('g' : _))) = "\\SVGExtension" normalizeExtension ('j' : ('p' : ('e' : ('g' : _)))) = "jpg" normalizeExtension ('j' : ('p' : ('g' : _))) = "jpg" normalizeExtension ('g' : ('i' : ('f' : _))) = "png" normalizeExtension ('p' : ('n' : ('g' : _))) = "png" normalizeExtension ('t' : ('i' : ('f' : ('f' : _)))) = "png" normalizeExtension ('t' : ('i' : ('f' : _))) = "png" normalizeExtension ('s' : ('t' : ('l' : _))) = "png" normalizeExtension ('x' : ('c' : ('f' : _))) = "png" normalizeExtension ('d' : ('j' : ('v' : ('u' : _)))) = "png" normalizeExtension ('w' : ('e' : ('b' : ('p' : _)))) = "png" normalizeExtension (' ' : xs) = normalizeExtension xs normalizeExtension (x : xs) = x : (normalizeExtension xs) normalizeExtension [] = [] -- | changes the extension for a filename given in the wiki source to the -- extension to be used in as filename when storing the image in the latex tree. normalizeExtension2 :: String -> String normalizeExtension2 ('s' : ('v' : ('g' : _))) = "svg" normalizeExtension2 ('j' : ('p' : ('e' : ('g' : _)))) = "jpg" normalizeExtension2 ('j' : ('p' : ('g' : _))) = "jpg" normalizeExtension2 ('g' : ('i' : ('f' : _))) = "gif" normalizeExtension2 ('p' : ('n' : ('g' : _))) = "png" normalizeExtension2 ('t' : ('i' : ('f' : ('f' : _)))) = "tif" normalizeExtension2 ('t' : ('i' : ('f' : _))) = "tif" normalizeExtension2 ('s' : ('t' : ('l' : _))) = "stl" normalizeExtension2 ('x' : ('c' : ('f' : _))) = "xcf" normalizeExtension2 ('d' : ('j' : ('v' : ('u' : _)))) = "djvu" normalizeExtension2 ('w' : ('e' : ('b' : ('p' : _)))) = "webp" normalizeExtension2 (' ' : xs) = normalizeExtension xs normalizeExtension2 (x : xs) = x : (normalizeExtension xs) normalizeExtension2 [] = [] -- | returns the extension of a filename. fileNameToExtension :: String -> String fileNameToExtension s = last (splitOn "." (map toLower s)) -- | a predicate that can be run on an element of a parse tree that returns true -- if the element is a wikilink. A wikilink is denoted as [[Foobar]] in the wiki -- notation, an links to an other mediawiki page on the same or a different wiki isWikiLink :: (Anything Char) -> Bool isWikiLink (Environment Wikilink _ []) = False isWikiLink (Environment Wikilink _ _) = True isWikiLink _ = False -- | changes Math elements on the surface level of a parse tree to bigmath -- elements. Those will be rendered as equation environments. Normal math is -- usually only display be the dollar math environment in latex. shallowEnlargeMath :: [Anything Char] -> [Anything Char] shallowEnlargeMath ((Environment Math s l) : xs) = (Environment BigMath s l) : shallowEnlargeMath xs shallowEnlargeMath (x : xs) = x : shallowEnlargeMath xs shallowEnlargeMath [] = [] -- | this function modified chapter headings. It is used when converting a -- chapter heading from the parse tree to latex. In the wiki often the page name -- is used as chapter heading and thus only the parts after the slashes and -- colons are to be taken into account. Also underscores have to be replaced by -- spaces chapterTransform :: String -> String chapterTransform s = replace '_' ' ' (last (splitOn ":" (last (splitOn "/" s)))) -- | returns the separator to separate items in enumeration, itemizations and so -- on. Currently this is always \\item{} but this may change depending on which -- latex package is used to display enumerations and so on. Takes the char for -- this type of enumeration etc. in wiki notation. That is a hash for -- enumeration and a asterisk for itemization and so on itemSeperator :: Char -> String itemSeperator c = itemSeperator2 [c] -- | see documentation on itemSeperator. The only difference is that this -- function takes a string containing a single character instead of the single -- character itself itemSeperator2 :: String -> String itemSeperator2 "#" = "\\item{}" itemSeperator2 ":" = "\\item{}" itemSeperator2 ";" = "\\item{}" itemSeperator2 "*" = "\\item{}" itemSeperator2 _ = "\\item{}" -- | returns the name of a latex environment for an itemization enumeration -- etc.. The first parameter is a string in wiki notation and declare which type -- environment should be used. The second parameter is a float giving the width -- of the current cell in units of the line width when inside a table and is 1.0 -- if currently not inside any table. itemEnvironmentName :: String -> Float -> String itemEnvironmentName "#" _ = "myenumerate" itemEnvironmentName ":" _ = "myquote" itemEnvironmentName ";" _ = "mydescription" itemEnvironmentName "*" _ = "myitemize" itemEnvironmentName _ _ = "list" -- | returns additional parameter for the opening of a latex environment for an -- itemization enumeration etc. The second parameter is a float giving the width -- of the current cell in units of the line width when inside a table and is 1.0 -- if currently not inside any table. itemEnvironmentParameters :: String -> Float -> String itemEnvironmentParameters "#" _ = "" itemEnvironmentParameters ":" _ = "" itemEnvironmentParameters ";" _ = "" itemEnvironmentParameters "*" _ = "" itemEnvironmentParameters _ _ = "{\\labelitemi}{\\leftmargin=1em}" -- | do multple replacements in a row. The first argument is haystack. The -- second one a list of pair of a needle and a corresponding nail. The haystack -- with each needle replaced by a nail is returned multireplace :: (Eq a) => [a] -> [([a], [a])] -> [a] multireplace haystack ((needle, nail) : xs) = multireplace (replace2 haystack needle nail) xs multireplace haystack [] = haystack -- | list of replacements to be applied to contents of math tags in wiki -- notation for use in the latex equation environment replist :: [([Char], [Char])] replist = [ ("\\or", "\\vee{}"), ("%", "\\%"), ("\\and", "\\wedge{}"), ("\\begin{align}", "\\begin{aligned}"), ("\\end{align}", "\\end{aligned}"), ("\\\\%", "\\%"), ("\\part ", "\\partial "), ("\\part{", "\\partial{"), ("\\;", ""), ("\\|", "\\Vert"), ("\\!", ""), ("\\part\\", "\\partial\\"), (" ", "{\\newline}"), ("'", "'") ] -- | helper function for line breaking in source code and preformatted block. -- Not to be called from outside this module. Converts character to parse tree -- entities, to be process by breakLinesHelper3 breakLinesHelper4 :: [Anything Char] -> [Anything Char] breakLinesHelper4 ((C '\n') : xs) = (Environment Tag (TagAttr "br" Map.empty) []) : breakLinesHelper4 xs breakLinesHelper4 ((C '\t') : xs) = Tab : breakLinesHelper4 xs breakLinesHelper4 ((C ' ') : xs) = Quad : breakLinesHelper4 xs breakLinesHelper4 (x : xs) = x : breakLinesHelper4 xs breakLinesHelper4 [] = [] -- | the width of a tab character in spaces tabwidth :: Int tabwidth = 4 -- | helper function for line breaking in source code and preformatted block. -- Not to be called from outside this module. Inserts br tags where line breaks -- are needed, the first parameter is an integer which represents the current -- column in the text, it should be zero when this function is called -- externally. The second parameter is an integer an represents the maximum -- length of the line in characters. The third input parameter is the code block -- to which the line breaks should be added in parse tree notation. The function -- returns the code block with added br tags for the line breaks in parse tree -- notation breakLinesHelper3 :: Int -> Int -> [Anything Char] -> [Anything Char] breakLinesHelper3 _ m ((Environment Tag (TagAttr "br" y) []) : xs) | y == Map.empty = (Environment Tag (TagAttr "br" Map.empty) []) : breakLinesHelper3 0 m xs breakLinesHelper3 i m (Tab : xs) = if i + wl >= m then (Environment Tag (TagAttr "br" Map.empty) []) : Tab : breakLinesHelper3 0 m xs else Tab : breakLinesHelper3 (i + tabwidth) m xs where wlb = length (takeWhile fun xs) wl = if (wlb < m) then wlb else 0 fun x = (x /= Quad) && (x /= (Environment Tag (TagAttr "br" Map.empty) [])) breakLinesHelper3 i m (x : xs) = if i + wl >= m then (Environment Tag (TagAttr "br" Map.empty) []) : x : breakLinesHelper3 0 m xs else x : breakLinesHelper3 (i + 1) m xs where wlb = length (takeWhile (fun) xs) wl = if (wlb < m) then wlb else 0 fun xx = (xx /= Quad) && (xx /= (Environment Tag (TagAttr "br" Map.empty) [])) breakLinesHelper3 _ _ [] = [] -- | Breaks lines in source code and preformatted block. Inserts br tags where -- line breaks are needed. The first parameter is an integer an represents the -- maximum length of the line in characters. The second input parameter is the -- code block to which the line breaks should be added in parse tree notation. -- The function returns the code block with added br tags for the line breaks in -- parse tree notation breakLines3 :: Int -> [Anything Char] -> [Anything Char] breakLines3 m s = rebreak (breakLinesHelper3 0 m (breakLinesHelper4 s)) -- | Adds quads in between double br line breaks, needed since double \\newline -- is not allowed in latex rebreak :: [Anything Char] -> [Anything Char] rebreak ( (Environment Tag (TagAttr "br" a) l) : ((Environment Tag (TagAttr "br" a2) l2) : xs) ) = (Environment Tag (TagAttr "br" a) l) : Quad : (rebreak ((Environment Tag (TagAttr "br" a2) l2) : xs)) rebreak (x : xs) = x : (rebreak xs) rebreak [] = [] -- | Replaces several parse tree item representations of white space characters -- with the corresponding whitespace characters themselves in parse tree -- notation. renormalize :: Anything Char -> Anything Char renormalize (Environment Tag (TagAttr "br" _) []) = C '\n' renormalize Quad = C ' ' renormalize Tab = C '\t' renormalize x = x mediawiki2latex-8.29/src/WikiLinkHelper.hs000066400000000000000000000211211504464363500205520ustar00rootroot00000000000000-- | helper functions to convert from parse tree notation to latex notation module WikiLinkHelper where import Control.Monad import Data.Char import Data.List import Data.List.Split import qualified Data.Map as Map import qualified Data.Set as Set import MagicStrings import MediaWikiParseTree import MyState import Network.HTTP import Tools import WikiHelper -- | takes a list of language prefixes and sister project prefixes and return a -- the first one or two elements of that list as tuple of Strings wrapped into -- maybe monads, returns nothing at the appropriate elements to the tuple if the -- list does not have enough elements. The first element of the tuple is -- populated first getprefixes :: [String] -> (Maybe String, Maybe String) getprefixes ss = case ss of [] -> (Nothing, Nothing) (x : xs) -> ( Just $ filter (not . isSpace) (map toLower x), case xs of [] -> Nothing (y : _) -> Just $ filter (not . isSpace) (map toLower y) ) -- | in the wiki source a heading is given by == foo bar == where the number of -- space gives the level of the heading. In latex this is done with string like -- 'section. This function translates from wiki notation to latex notation getsec :: String -> String getsec "=" = "chapter" getsec "==" = "section" getsec "===" = "subsection" getsec "====" = "subsubsection" getsec "=====" = "paragraph" getsec "======" = "subparagraph" getsec _ = "subparagraph" -- | in the wiki source a heading is given by == foo bar == where the number of -- space gives the level of the heading. In latex this is done with string like -- 'section'. Some of with need additional commands after the actual heading -- command. Those are returned by this function getsecpost :: String -> String getsecpost "=" = "\n\\myminitoc\n" getsecpost "==" = "" getsecpost "===" = "" getsecpost "====" = "" getsecpost "=====" = "{$\\text{ }$}\\newline" getsecpost "======" = "{$\\text{ }$}\\newline" getsecpost _ = "{$\\text{ }$}\\newline" -- | a predicate that returns true if the string is a valid image size in wiki -- notation. In the wiki an image is include like [[Image:FoorBar.png|300px]] -- where 300px means that the image should be displayed at a width of 300 pixel. -- This function takes strings and looks whether it looks like an integer number -- flowed by 'px' and is thus a valid width definition for an image in wiki -- notation isImageSize :: String -> Bool isImageSize x = if (isSuffixOf "px" x) then if (reads (take ((length x) - 2) x)) == ([] :: [(Float, [Char])]) then False else True else False -- | this predicate returns true if the string seems to be a caption of an image -- in wiki notation. And image give like [[Image:JohnDow.png|foo bar]] where -- 'foo bar' is the caption of the image. So this function just tests whether -- the string looks like one of the reserved keyword of mediawiki or like an -- image size definition (see function isImageSize) and return true if none of -- that fits isCaption :: String -> Bool isCaption x = if isImageSize x then False else if x `elem` ["thumb", "right", "left", "center"] then False else True -- | escapes all charters of a string for use a a link with the hyperref package -- in latex escapelink :: String -> String escapelink s = concat (map chartransforlink s) -- | analyzes a host name. If it belongs to a wikimedia project it returns an -- UrlInfo value otherwise it returns a WikiBaseUrl value. In any case it is the -- type WikiUrlData. This information is needed when building writing down links -- to subpages in latex or downloading images from the wiki. analyseNetloc :: String -> WikiUrlData analyseNetloc nl = myurldata where langm = do p <- prefix guard $ p `elem` foreignPrefixes guard $ (length splits) > 1 prefix wtypem = case langm of Nothing -> do p <- prefix guard $ (length splits) > 1 guard $ Set.member p wikiset prefix Just _ -> do guard $ (length splits) > 2 p2 <- prefix2 guard $ Set.member p2 wikiset prefix2 myurldata = case (langm, wtypem) of (Just lang, Just wtype) -> UrlInfo (WikiUrlInfo {language = lang, wikitype = wtype}) _ -> BaseUrl (WikiBaseUrl nl) splits = splitOn "." nl (prefix, prefix2) = getprefixes splits wikiset = Set.fromList . Map.elems . Map.fromList $ multilangwikis -- | splits a wikilink in caption and link target and returns the target. So a -- wkilink is given like [[FooBar|John Dow]]. This link links to the lemma -- FooBar and is displayed with the caption 'John Dow'. So this function returns -- FooBar for that link. localWikiLinkLocation :: String -> String localWikiLinkLocation s = headSplitEq '|' s -- | This function takes the contend of a wikilink in wiki markup notation as -- first input parameter in parse tree notation. It takes the state of the Latex -- Renderer as second input parameter. It returns the absolute url of the given -- wikilink as string wikiLinkLocationesc :: [Anything Char] -> MyState -> String wikiLinkLocationesc l st = getUrlFromWikiLinkInfoesc . getWikiLinkInfo (shallowFlatten l) . urld $ st -- | converts a WikiLinkInfo value pointing to a page on a wiki to the full url -- of that page as string. It is escaped for the use with the hyperref latex -- package getUrlFromWikiLinkInfoesc :: WikiLinkInfo -> String getUrlFromWikiLinkInfoesc i = case (urldata i) of UrlInfo x -> "https://" ++ (language x) ++ "." ++ (wikitype x) ++ ".org/wiki/" ++ (escapelink (urlEncode (page i))) BaseUrl (WikiBaseUrl x) -> "https://" ++ x ++ "/wiki/" ++ (escapelink (urlEncode (page i))) -- | converts a WikiLinkInfo value pointing to a page on a wiki to the full url -- of that page as string. It is not is escaped in any way, so ready for use in -- a webbrowers getUrlFromWikiLinkInfo :: WikiLinkInfo -> String getUrlFromWikiLinkInfo i = case (urldata i) of UrlInfo x -> "https://" ++ (language x) ++ "." ++ (wikitype x) ++ ".org/wiki/" ++ (urlEncode (page i)) BaseUrl (WikiBaseUrl x) -> "https://" ++ x ++ "/wiki/" ++ (urlEncode (page i)) -- | converts a WikiUrlData value pointing to a wiki and a string (like a part -- of a url) pointing to a page relative to that wiki and returns the full url -- of that page as string wikiUrlDataToString :: WikiUrlData -> String -> String wikiUrlDataToString w i = case w of UrlInfo x -> "https://" ++ (language x) ++ "." ++ (wikitype x) ++ ".org" ++ i BaseUrl (WikiBaseUrl x) -> "https://" ++ x ++ i -- | This function takes the contend of a wikilink in wiki markup notation as -- first input parameter. So for the wiki link (mediawiki markup notation) -- [[en:JohnDow|John Dow]] this is 'en:JohnDow|John Dow' (the single quotes were -- added to make the string distinguishable from the text and are not part of -- the passed parameter). It takes the WikiUrlData value describing the wiki the -- page currently being processed belongs to as second parameter. It returns a -- WikiLinkInfo value describing the target of the link given as first parameter -- when evaluated with respect to the second parameter getWikiLinkInfo :: String -> WikiUrlData -> WikiLinkInfo getWikiLinkInfo s i = WikiLinkInfo {urldata = udata, page = pagen} where udata = case (langmm, wtypemm) of (Just l, Just w) -> UrlInfo WikiUrlInfo {language = l, wikitype = w} _ -> i wtypem = do p <- prefix guard $ (length splits) > 1 Map.lookup p (Map.fromList allwikis) langm = case wtypem of Nothing -> do p <- prefix _ <- find (== p) foreignPrefixes guard $ (length splits) > 1 prefix Just _ -> do p2 <- prefix2 _ <- find (== p2) foreignPrefixes guard $ (length splits) > 2 prefix2 langmm = case langm of Nothing -> langi x -> x wtypemm = case wtypem of Nothing -> wtypei x -> x langi = case i of UrlInfo ui -> Just (language ui) BaseUrl _ -> Nothing wtypei = case i of UrlInfo ui -> Just (wikitype ui) BaseUrl _ -> Nothing pagen = intercalate ":" ((mapn langm) . (mapn wtypem) $ splits) mapn h = case h of Nothing -> id Just _ -> drop 1 splits = splitOn ":" (headSplitEq '|' s) (prefix, prefix2) = getprefixes splits mediawiki2latex-8.29/src/babel/000077500000000000000000000000001504464363500164055ustar00rootroot00000000000000mediawiki2latex-8.29/src/babel/af000066400000000000000000000002571504464363500167220ustar00rootroot00000000000000\usepackage[afrikaans]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{bladsy} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{afrikaans} mediawiki2latex-8.29/src/babel/an000066400000000000000000000002601504464363500167240ustar00rootroot00000000000000\usepackage[aragonese]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{aragonese} mediawiki2latex-8.29/src/babel/ang000066400000000000000000000002641504464363500170770ustar00rootroot00000000000000\usepackage[anglo-saxon]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{anglo-saxon} mediawiki2latex-8.29/src/babel/ar000066400000000000000000000002521504464363500167310ustar00rootroot00000000000000\usepackage[arabic]{babel} \newcommand{\mychapterbabel}{فصل} \newcommand{\mypagebabel}{صفحة} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{arabic} mediawiki2latex-8.29/src/babel/ba000066400000000000000000000002541504464363500167130ustar00rootroot00000000000000\usepackage[bashkir]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{bashkir} mediawiki2latex-8.29/src/babel/bo000066400000000000000000000002541504464363500167310ustar00rootroot00000000000000\usepackage[tibetan]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{tibetan} mediawiki2latex-8.29/src/babel/ca000066400000000000000000000002541504464363500167140ustar00rootroot00000000000000\usepackage[catalan]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{catalan} mediawiki2latex-8.29/src/babel/ce000066400000000000000000000002541504464363500167200ustar00rootroot00000000000000\usepackage[chechen]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{chechen} mediawiki2latex-8.29/src/babel/co000066400000000000000000000002561504464363500167340ustar00rootroot00000000000000\usepackage[corsican]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{corsican} mediawiki2latex-8.29/src/babel/da000066400000000000000000000002461504464363500167160ustar00rootroot00000000000000\usepackage[danish]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{side} \newcommand{\myfigurebabel}{figur} \newcommand{\mylangbabel}{danish} mediawiki2latex-8.29/src/babel/de000066400000000000000000000003251504464363500167200ustar00rootroot00000000000000\HyphSubstLet{ngerman}{ngerman-x-latest} \usepackage[ngerman]{babel} \newcommand{\mychapterbabel}{Kapitel} \newcommand{\mypagebabel}{auf Seite} \newcommand{\myfigurebabel}{Abb.} \newcommand{\mylangbabel}{ngerman} mediawiki2latex-8.29/src/babel/el000066400000000000000000000002661504464363500167340ustar00rootroot00000000000000\usepackage[greek]{babel} \newcommand{\mychapterbabel}{Κεφάλαιο} \newcommand{\mypagebabel}{σελίδα} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{greek} mediawiki2latex-8.29/src/babel/en000066400000000000000000000002541504464363500167330ustar00rootroot00000000000000\usepackage[english]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{english} mediawiki2latex-8.29/src/babel/es000066400000000000000000000002561504464363500167420ustar00rootroot00000000000000\usepackage[spanish]{babel} \newcommand{\mychapterbabel}{Capítulo} \newcommand{\mypagebabel}{página} \newcommand{\myfigurebabel}{figura} \newcommand{\mylangbabel}{spanish} mediawiki2latex-8.29/src/babel/fi000066400000000000000000000002471504464363500167310ustar00rootroot00000000000000\usepackage[finnish]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{sivu} \newcommand{\myfigurebabel}{kuva} \newcommand{\mylangbabel}{finnish} mediawiki2latex-8.29/src/babel/fr000066400000000000000000000002501504464363500167340ustar00rootroot00000000000000\usepackage[french]{babel} \newcommand{\mychapterbabel}{Chapitre} \newcommand{\mypagebabel}{page} \newcommand{\myfigurebabel}{FIGURE} \newcommand{\mylangbabel}{french} mediawiki2latex-8.29/src/babel/ga000066400000000000000000000002501504464363500167140ustar00rootroot00000000000000\usepackage[irish]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{deilbh} \newcommand{\mylangbabel}{irish} mediawiki2latex-8.29/src/babel/gl000066400000000000000000000002561504464363500167350ustar00rootroot00000000000000\usepackage[galician]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{páxina} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{galician} mediawiki2latex-8.29/src/babel/gu000066400000000000000000000002561504464363500167460ustar00rootroot00000000000000\usepackage[gujarati]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{gujarati} mediawiki2latex-8.29/src/babel/he000066400000000000000000000002511504464363500167220ustar00rootroot00000000000000\usepackage[hebrew]{babel} \newcommand{\mychapterbabel}{פרק} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{hebrew} mediawiki2latex-8.29/src/babel/hu000066400000000000000000000002541504464363500167450ustar00rootroot00000000000000\usepackage[hungarian]{babel} \newcommand{\mychapterbabel}{Fejezet} \newcommand{\mypagebabel}{lap} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{hungarian} mediawiki2latex-8.29/src/babel/hy000066400000000000000000000002611504464363500167470ustar00rootroot00000000000000\usepackage[armenian]{babel} \newcommand{\mychapterbabel}{Գլուխ} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{armenian} mediawiki2latex-8.29/src/babel/ia000066400000000000000000000002641504464363500167230ustar00rootroot00000000000000\usepackage[interlingua]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{interlingua} mediawiki2latex-8.29/src/babel/ie000066400000000000000000000002641504464363500167270ustar00rootroot00000000000000\usepackage[interlingue]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{interlingue} mediawiki2latex-8.29/src/babel/io000066400000000000000000000002441504464363500167370ustar00rootroot00000000000000\usepackage[ido]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{ido} mediawiki2latex-8.29/src/babel/is000066400000000000000000000002561504464363500167460ustar00rootroot00000000000000\usepackage[icelandic]{babel} \newcommand{\mychapterbabel}{Kafli} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{icelandic} mediawiki2latex-8.29/src/babel/it000066400000000000000000000002541504464363500167450ustar00rootroot00000000000000\usepackage[italian]{babel} \newcommand{\mychapterbabel}{Capitolo} \newcommand{\mypagebabel}{pagina} \newcommand{\myfigurebabel}{figura} \newcommand{\mylangbabel}{italian} mediawiki2latex-8.29/src/babel/ka000066400000000000000000000002661504464363500167270ustar00rootroot00000000000000\usepackage[georgian]{babel} \newcommand{\mychapterbabel}{თავში} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{georgian} mediawiki2latex-8.29/src/babel/km000066400000000000000000000002501504464363500167340ustar00rootroot00000000000000\usepackage[khmer]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{khmer} mediawiki2latex-8.29/src/babel/ku000066400000000000000000000002541504464363500167500ustar00rootroot00000000000000\usepackage[kurdish]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{kurdish} mediawiki2latex-8.29/src/babel/la000066400000000000000000000002521504464363500167230ustar00rootroot00000000000000\usepackage[latin]{babel} \newcommand{\mychapterbabel}{Capitulum} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{latin} mediawiki2latex-8.29/src/babel/li000066400000000000000000000002621504464363500167340ustar00rootroot00000000000000\usepackage[limburgian]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{limburgian} mediawiki2latex-8.29/src/babel/my000066400000000000000000000002541504464363500167560ustar00rootroot00000000000000\usepackage[burmese]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{burmese} mediawiki2latex-8.29/src/babel/ne000066400000000000000000000002521504464363500167310ustar00rootroot00000000000000\usepackage[nepali]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{nepali} mediawiki2latex-8.29/src/babel/nn000066400000000000000000000003041504464363500167400ustar00rootroot00000000000000\usepackage[norwegian (nynorsk)]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{norwegian (nynorsk)} mediawiki2latex-8.29/src/babel/no000066400000000000000000000003041504464363500167410ustar00rootroot00000000000000\usepackage[norwegian (bokmål)]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{norwegian (bokmål)} mediawiki2latex-8.29/src/babel/pa000066400000000000000000000002541504464363500167310ustar00rootroot00000000000000\usepackage[punjabi]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{punjabi} mediawiki2latex-8.29/src/babel/pi000066400000000000000000000002461504464363500167420ustar00rootroot00000000000000\usepackage[pali]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{pali} mediawiki2latex-8.29/src/babel/pt000066400000000000000000000002641504464363500167550ustar00rootroot00000000000000\usepackage[portuguese]{babel} \newcommand{\mychapterbabel}{Capítulo} \newcommand{\mypagebabel}{página} \newcommand{\myfigurebabel}{figura} \newcommand{\mylangbabel}{portuguese} mediawiki2latex-8.29/src/babel/qu000066400000000000000000000002541504464363500167560ustar00rootroot00000000000000\usepackage[quechua]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{quechua} mediawiki2latex-8.29/src/babel/rm000066400000000000000000000002541504464363500167470ustar00rootroot00000000000000\usepackage[romansh]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{romansh} mediawiki2latex-8.29/src/babel/ro000066400000000000000000000002561504464363500167530ustar00rootroot00000000000000\usepackage[romanian]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{pagină} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{romanian} mediawiki2latex-8.29/src/babel/ru000066400000000000000000000003001504464363500167470ustar00rootroot00000000000000\usepackage[russian]{babel} \newcommand{\mychapterbabel}{Глава} \newcommand{\mypagebabel}{страница} \newcommand{\myfigurebabel}{рисунок} \newcommand{\mylangbabel}{russian} mediawiki2latex-8.29/src/babel/se000066400000000000000000000002701504464363500167360ustar00rootroot00000000000000\usepackage[northern sami]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{northern sami} mediawiki2latex-8.29/src/babel/sh000066400000000000000000000002721504464363500167430ustar00rootroot00000000000000\usepackage[serbo-croatian]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{serbo-croatian} mediawiki2latex-8.29/src/babel/si000066400000000000000000000002601504464363500167410ustar00rootroot00000000000000\usepackage[sinhalese]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{sinhalese} mediawiki2latex-8.29/src/babel/sk000066400000000000000000000002521504464363500167440ustar00rootroot00000000000000\usepackage[slovak]{babel} \newcommand{\mychapterbabel}{Kapitola} \newcommand{\mypagebabel}{strana} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{slovak} mediawiki2latex-8.29/src/babel/sl000066400000000000000000000002571504464363500167520ustar00rootroot00000000000000\usepackage[slovenian]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{strani} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{slovenian} mediawiki2latex-8.29/src/babel/so000066400000000000000000000002521504464363500167500ustar00rootroot00000000000000\usepackage[somali]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{somali} mediawiki2latex-8.29/src/babel/sq000066400000000000000000000002561504464363500167560ustar00rootroot00000000000000\usepackage[albanian]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{albanian} mediawiki2latex-8.29/src/babel/sw000066400000000000000000000002511504464363500167570ustar00rootroot00000000000000\usepackage[swahili]{babel} \newcommand{\mychapterbabel}{Sura} \newcommand{\mypagebabel}{ukurasa} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{swahili} mediawiki2latex-8.29/src/babel/ta000066400000000000000000000002501504464363500167310ustar00rootroot00000000000000\usepackage[tamil]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{tamil} mediawiki2latex-8.29/src/babel/te000066400000000000000000000002521504464363500167370ustar00rootroot00000000000000\usepackage[telugu]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{telugu} mediawiki2latex-8.29/src/babel/tg000066400000000000000000000002531504464363500167420ustar00rootroot00000000000000\usepackage[tajik]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{сафҳа} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{tajik} mediawiki2latex-8.29/src/babel/th000066400000000000000000000002461504464363500167450ustar00rootroot00000000000000\usepackage[thai]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{thai} mediawiki2latex-8.29/src/babel/to000066400000000000000000000002521504464363500167510ustar00rootroot00000000000000\usepackage[tongan]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{tongan} mediawiki2latex-8.29/src/babel/ug000066400000000000000000000002521504464363500167420ustar00rootroot00000000000000\usepackage[uyghur]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{uyghur} mediawiki2latex-8.29/src/babel/uk000066400000000000000000000002601504464363500167450ustar00rootroot00000000000000\usepackage[ukrainian]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{ukrainian} mediawiki2latex-8.29/src/babel/ur000066400000000000000000000002461504464363500167600ustar00rootroot00000000000000\usepackage[urdu]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{urdu} mediawiki2latex-8.29/src/babel/vi000066400000000000000000000002621504464363500167460ustar00rootroot00000000000000\usepackage[vietnamese]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{vietnamese} mediawiki2latex-8.29/src/babel/yi000066400000000000000000000002541504464363500167520ustar00rootroot00000000000000\usepackage[yiddish]{babel} \newcommand{\mychapterbabel}{Chapter} \newcommand{\mypagebabel}{on page} \newcommand{\myfigurebabel}{Figure} \newcommand{\mylangbabel}{yiddish} mediawiki2latex-8.29/src/babel/zh000066400000000000000000000003471504464363500167550ustar00rootroot00000000000000\HyphSubstLet{ngerman}{ngerman-x-latest} \usepackage{xeCJK} \setCJKmainfont{WenQuanYi Zen Hei} \newcommand{\mychapterbabel}{章} \newcommand{\mypagebabel}{页} \newcommand{\myfigurebabel}{图形} \newcommand{\mylangbabel}{chinese} mediawiki2latex-8.29/src/com.py000066400000000000000000000027341504464363500164760ustar00rootroot00000000000000import os def comment(s): start=True c=False a=False acu="" for x in s: if a : acu=acu+x continue if x==" " and start: continue if x=="-" and start: c=True start=False continue if x=="-" and c: a=True else: return "" return acu def countspaces(s): counter=0 for x in s: if x==" ": counter=counter+1 else: break return counter def lastspace(s,n): index=n for i,x in enumerate(s): if x==" " and i!=0: index=i if i>=n: return index return index def breakline(s,n): acu=[] while True: if len(s)<=n: return acu+[s] else: i=lastspace(s,n) acu=acu+[s[:i]] s=s[i:] def gets(t): acu=[] for s in t.split("\n"): if comment(s)!="": sp=countspaces(s) l=breakline(comment(s),80-2-sp) for x in l: acu=acu+ [(" "*sp)+"--"+"".join(x)] else: acu=acu+[s] return "\n".join(acu) def puts(t): localacu=[] acu=[] for s in t.split("\n"): if comment(s)!="": sp=countspaces(s) localacu=localacu+[comment(s)] else: if localacu!=[]: acu=acu+[(" "*sp)+"--"+"".join(localacu)] localacu=[] acu=acu+[s] if localacu!=[]: acu=acu+[(" "*sp)+"--"+"".join(localacu)] return "\n".join(acu) for f in os.listdir("."): if f.split(".")[-1]=="hs": handle=open(f) t=handle.read() handle.close s= (gets(puts(t))) t=open(f,"w").write(s) mediawiki2latex-8.29/src/mediawiki2latex.hs000066400000000000000000000462551504464363500207730ustar00rootroot00000000000000-- | This is the main entry point of mediawiki2latex it parses the command line -- and delegatesto the requested submodules module Main where import All import Compiler (runCompile, runNewTree, runTreeToLaTeX) import Control.Monad.Except import Control.Monad.State import qualified Data.ByteString as B import Data.Maybe import Data.Serialize as S (decode) import GetImages import Hex import ImperativeState import Load import Server import System.Console.GetOpt import System.Directory import System.Environment import System.Exit import System.FilePath.Posix import System.Info import Test (runTest) -- | Data structure to represent a single option on the command line. data Flag = Verbose | Vector | Version | Templates String | Resolution String | Paper String | Copy String | Headers String | Input String | Output String | LibDir String | Test | MediaWiki | BookMode | HTML | InternalTemplates | Hex String | Zip | EPub | Odt | NoParent | LaTeXTables | ChromiumTables | Server String deriving (Show, Eq) -- | String constant on for the version command line option. versionOption :: String versionOption = "version" -- | String constant on for the resolution command line option. resolutionOption :: String resolutionOption = "resolution" -- | String constant on for the output command line option. output :: String output = "output" -- | String constant on for the zip command line option. zip :: String zip = "zip" -- | String constant on for the hex command line option. hexen :: String hexen = "hex" -- | String constant on for the templates command line option. templates :: String templates = "templates" -- | String constant on for the headers command line option. headers :: String headers = "headers" -- | String constant on for the url command line option. url :: String url = "url" -- | String constant on for the medaiwiki command line option. mediawiki :: String mediawiki = "mediawiki" -- | String constant on for the book-namespace command line option. bookmode :: String bookmode = "bookmode" -- | String constant on for the html command line option. html :: String html = "html" -- | String constant on for the paper command line option. paperOption :: String paperOption = "paper" -- | String constant on for the internal command line option. internal :: String internal = "internal" -- | String constant on for the self test command line option. test :: String test = "test" -- | String constant on for the vector command line option. vectorOption :: String vectorOption = "vector" -- | String constant on for the copy command line option. copyOption :: String copyOption = "copy" -- | String constant for the noparent command line option. noparentOption :: String noparentOption = "noparent" -- | String constant on for the server command line option. serverOption :: String serverOption = "server" -- | String constant on for the epub command line option. epubOption :: String epubOption = "epub" -- | String constant on for the odt command line option. odtOption :: String odtOption = "odt" -- | String constant on for the tableslatex command line option. tableslatex :: String tableslatex = "tableslatex" -- | String constant on for the tableslatex command line option. tableschromium :: String tableschromium = "tableschromium" -- | Datastructure describing all possible command line options options :: [OptDescr Flag] options = [ Option ['V', '?', 'v'] [versionOption, "help"] (NoArg Version) "show version number", Option ['o'] [output] (ReqArg Output "FILE") "output FILE (REQUIRED)", Option ['x'] [hexen] (ReqArg Hex "CONFIG") "hex encoded full configuration for run", Option ['s'] [serverOption] (ReqArg Server "PORT") "run in server mode listen on the given port", Option ['t'] [templates] (ReqArg Templates "FILE") "user template map FILE", Option ['r'] [resolutionOption] (ReqArg Resolution "INTEGER") "maximum image resolution in dpi INTEGER", Option ['u'] [url] (ReqArg Input "URL") "input URL (REQUIRED)", Option ['p'] [paperOption] (ReqArg Paper "PAPER") "paper size, on of A4,A5,B5,letter,legal,executive", Option ['m'] [mediawiki] (NoArg MediaWiki) "use MediaWiki to expand templates", Option ['h'] [Main.html] (NoArg Main.HTML) "use MediaWiki generated html as input (default)", Option ['e'] [tableslatex] (NoArg Main.LaTeXTables) "use LaTeX to generate tables", Option ['a'] [tableschromium] (NoArg Main.ChromiumTables) "use Chromium to generate tables", Option ['n'] [noparentOption] (NoArg Main.NoParent) "only include urls which a children of start url", Option ['k'] [bookmode] (NoArg Main.BookMode) "use book-namespace mode for expansion", Option ['z'] [Main.zip] (NoArg Main.Zip) "output zip archive of latex source", Option ['b'] [epubOption] (NoArg Main.EPub) "output epub file", Option ['d'] [odtOption] (NoArg Main.Odt) "output odt file", Option ['g'] [vectorOption] (NoArg Main.Vector) "keep vector graphics in vector form", Option ['i'] [internal] (NoArg Main.InternalTemplates) "use internal template definitions", Option ['f'] [test] (NoArg Main.Test) "run self test", Option ['l'] [Main.headers] (ReqArg Main.Headers "DIRECTORY") "use user supplied latex headers", Option ['c'] [copyOption] (ReqArg Main.Copy "DIRECTORY") "copy LaTeX tree to DIRECTORY" ] -- | parsed the options given on the command line via the getopt library compilerOpts :: [String] -> IO ([Flag], [String]) compilerOpts argv = case getOpt Permute options argv of (o, n, []) -> return (o, n) (_, _, errs) -> ioError (userError (concat errs ++ usageInfo header options)) -- | header string for the usage help header :: String header = "Usage: mediawiki2latex [OPTION...]" -- | header string giving the current version string of mediawiki2latex versionHeader :: String versionHeader = "mediawiki2latex version 8.29\n" ++ (usageInfo header options) -- | print the version string of mediawiki2latex. Takes the output of the -- compilerOpts function as input. Prints the version string if no options were -- given or the version command was given does noting otherwise printVersion :: (Eq a) => ([Flag], [a]) -> IO () printVersion o = if (Version `elem` (fst o)) || o == ([], []) then putStrLn versionHeader >> exitSuccess else return () -- | checks whether the given option exists exactly once in the given (getopt -- parsed) command line. Takes a predicate (returning a Maybe type) as first -- input parameter. Takes the decription string for the option under -- consideration as second parameter. Takes the (getopt parsed) command line as -- third input parameter. Return an either monad giving Right together with the -- value of the option in cases the option exists exacatly once in the command -- line, gives Left with an Error values otherwise exactlyOne :: (a -> Maybe b) -> String -> [a] -> Either MyError b exactlyOne predicate s o = case filter isJust (map predicate o) of ((Just x) : []) -> Right x _ -> Left (NotExcatlyOneError s) -- | checks whether the given option exists at most once in the given (getopt -- parsed) command line. Takes a predicate (returning a Maybe type) as first -- input parameter. Takes the decription string for the option under -- consideration as second parameter. Takes the (getopt parsed) command line as -- third input parameter. Return an either monad giving Right together with the -- value of the option in cases the option exists at most once once in the -- command line, gives Left with an Error values otherwise atMostOne :: (a1 -> Maybe a) -> String -> [a1] -> Either MyError (Maybe a) atMostOne predicate s o = case filter isJust (map predicate o) of (x : []) -> Right x ([]) -> Right Nothing _ -> Left (NotAtMostOneError s) -- | predicate for the resolution option. see atMostOne and exactlyOne functions -- for details resolutionPredicate :: Flag -> Maybe String resolutionPredicate (Resolution x) = Just x resolutionPredicate _ = Nothing -- | predicate for the copy option. see atMostOne and exactlyOne functions for -- details copyPredicate :: Flag -> Maybe String copyPredicate (Copy x) = Just x copyPredicate _ = Nothing -- | predicate for the output option. see atMostOne and exactlyOne functions for -- details outputPredicate :: Flag -> Maybe String outputPredicate (Output x) = Just x outputPredicate _ = Nothing -- | predicate for the input option. see atMostOne and exactlyOne functions for -- details inputPredicate :: Flag -> Maybe String inputPredicate (Input x) = Just x inputPredicate _ = Nothing -- | predicate for the templates option. see atMostOne and exactlyOne functions -- for details templatesPredicate :: Flag -> Maybe String templatesPredicate (Templates x) = Just x templatesPredicate _ = Nothing -- | predicate for the headers option. see atMostOne and exactlyOne functions -- for details headersPredicate :: Flag -> Maybe String headersPredicate (Headers x) = Just x headersPredicate _ = Nothing -- | predicate for the hex option. see atMostOne and exactlyOne functions for -- details hexPredicate :: Flag -> Maybe String hexPredicate (Hex x) = Just x hexPredicate _ = Nothing -- | predicate for the server option. see atMostOne and exactlyOne functions for -- details serverPredicate :: Flag -> Maybe String serverPredicate (Server x) = Just x serverPredicate _ = Nothing -- | predicate for the paper option. see atMostOne and exactlyOne functions for -- details paperPredicate :: Flag -> Maybe String paperPredicate (Paper x) = Just x paperPredicate _ = Nothing -- | default images resolution. All images with a right resolution will be -- dithered to this resolution unless is is overridden with the resolution -- command line option defaultResolution :: Integer defaultResolution = 300 -- | the default paper format defaultPaper :: String defaultPaper = "A4" -- | function to count the number of given command lines options which are part -- of a certain set of possible command line options. Takes a Maybe value -- representing whether the command line option is present and returns 1 on Just -- and 0 otherwise maybeToInt :: (Num a) => Maybe t -> a maybeToInt (Just _) = 1 maybeToInt _ = 0 -- | function to count the number of given command lines option which are part -- of a certain set of possible command line options. Takes a Bool values -- representing whether the command line option is present and returns 1 on True -- and 0 otherwise boolToInt :: (Num a) => Bool -> a boolToInt True = 1 boolToInt _ = 0 -- | Calculates a configuration information for the run of program from the -- options given on the command line. It takes the pathname of the current -- working directory as first input parameter. It takes the (getopt parsed) -- command line as second input parameter.It returns an Either Monad. In case -- the command line made sense the Right type containing the configuration is -- returned otherwise the Left values with a Error Values describing the problem -- is returned checkOpts :: FilePath -> [Flag] -> Either MyError FullConfig checkOpts cwd o = do serverVal <- atMostOne serverPredicate serverOption o case serverVal of Just x -> case reads x of [(z, _)] -> return FullConfig { ImperativeState.headers = Nothing, resolution = 300, outputFilename = "", inputUrl = "", runMode = ImperativeState.HTML ImperativeState.No, paper = "A4", vector = False, ImperativeState.copy = Nothing, mainPath = "", server = Just z, outputType = PlainPDF, compile = Nothing, convert = Nothing, noparent = False, imgctrburl = Nothing, ctrb = Nothing, latexTables = False, ltxproc = Nothing, testMode = False } _ -> Left (NotIntegerError serverOption) _ -> do hexVal <- atMostOne hexPredicate hexen o case hexVal of Just x -> do return ((read . unhex) x) _ -> do resolutionOpt <- atMostOne resolutionPredicate resolutionOption o resolutionVal <- case resolutionOpt of (Just x) -> case reads x of [(z, _)] -> Right z _ -> Left ( NotIntegerError resolutionOption ) _ -> Right defaultResolution let testVal = (Main.Test `elem` o) outputVal <- if testVal then return "" else exactlyOne outputPredicate output o inputVal <- if testVal then return "" else exactlyOne inputPredicate url o templatesVal <- atMostOne templatesPredicate templates o headersVal <- atMostOne headersPredicate templates o copyVal <- atMostOne copyPredicate copyOption o paperOpt <- atMostOne paperPredicate paperOption o paperVal <- case paperOpt of Just x -> if x `elem` [ "A4", "A5", "B5", "letter", "legal", "executive" ] then Right x else Left PaperError _ -> Right defaultPaper let mediaWikiVal = (MediaWiki `elem` o) let latexTablesVal = (LaTeXTables `elem` o) let chromiumTablesVal = (ChromiumTables `elem` o) let bookModeVal = if (Main.BookMode `elem` o) then ImperativeState.Yes else ImperativeState.No let htmlVal = (Main.HTML `elem` o) let zipVal = (Main.Zip `elem` o) let epubVal = (Main.EPub `elem` o) let noparentVal = (Main.NoParent `elem` o) let odtVal = (Main.Odt `elem` o) let temVal = (Main.InternalTemplates `elem` o) let vectorVal = (Main.Vector `elem` o) let mysum = (boolToInt temVal) + (boolToInt mediaWikiVal) + (boolToInt htmlVal) + (maybeToInt templatesVal) if mysum > 1 then Left ToManyOptionsError else Right () if testVal && ((length o) > 1) then Left ToManyTestOptionsError else Right () let mytablesum = ((boolToInt latexTablesVal) + (boolToInt chromiumTablesVal)) :: Integer if mytablesum > 1 then Left ToManyTableOptionsError else Right () if ( (boolToInt zipVal) + (boolToInt epubVal) + (boolToInt odtVal) ) > (1 :: Integer) then Left ToManyOutputOptionsError else Right () runModeVal <- if mysum == (1 :: Integer) then case templatesVal of Just xx -> Right (UserTemplateFile bookModeVal xx) _ -> if mediaWikiVal then Right (ExpandedTemplates bookModeVal) else if htmlVal then Right (ImperativeState.HTML bookModeVal) else Right (StandardTemplates bookModeVal) else Right (ImperativeState.HTML bookModeVal) return ( FullConfig { ImperativeState.headers = headersVal >>= (return . (cwd )), resolution = resolutionVal, outputFilename = outputVal, inputUrl = inputVal, runMode = runModeVal, paper = paperVal, vector = vectorVal, copy = copyVal >>= (return . (cwd )), mainPath = cwd ++ (if os == "linux" then "" else "\\"), server = Nothing, outputType = if zipVal then ZipArchive else if epubVal then EPubFile else if odtVal then OdtFile else PlainPDF, compile = Nothing, ltxproc = Nothing, convert = Nothing, noparent = noparentVal, imgctrburl = Nothing, ctrb = Nothing, latexTables = if latexTablesVal then True else (if chromiumTablesVal then False else True), testMode = testVal } ) -- | main entry point of mediawiki2latex main :: IO () main = do a <- getArgs o <- compilerOpts a printVersion o stz <- imperativeStateZero cwd <- getCurrentDirectory case (checkOpts cwd (fst o)) of Right x -> if testMode x then runTest else case (convert x) of Just stx -> case stx of NewTree fn -> do _ <- (runStateT (runExceptT (runNewTree fn)) stz) return () TreeToLaTeX instfn fn -> do _ <- (runStateT (runExceptT (runTreeToLaTeX instfn fn)) stz) return () NewLoad fn -> do _ <- (runStateT (runExceptT (runqBookIncludeAction fn)) stz) return () _ -> case (compile x) of Just dir -> do _ <- (runStateT (runExceptT (runCompile dir x)) stz) return () _ -> case (ctrb x) of Just fn -> do _ <- (runStateT (runExceptT (getContribCallBack fn)) stz) return () _ -> case (server x) of Just zz -> serve zz _ -> case (imgctrburl x) of Just (cufile, host) -> do _ <- (runStateT (runExceptT (runCtrbUrl cufile host)) stz) return () _ -> case (ltxproc x) of Just ltxpath -> do t <- liftIO $ B.readFile (ltxpath "config") ltxconf <- case S.decode t of Right ltxcfg -> return (ltxcfg :: LatexConfig) _ -> error "could not read state ltxconf" _ <- runLaTeXCallback ltxconf ltxpath return () _ -> do print x (xx, _) <- ( runStateT (runExceptT (All.all x)) stz {vectorr = (vector x)} ) case xx of Left n -> print n _ -> return () Left y -> print y return () mediawiki2latex-8.29/src/tachyon/000077500000000000000000000000001504464363500170055ustar00rootroot00000000000000mediawiki2latex-8.29/src/tachyon/tachyon.cpp000066400000000000000000000161231504464363500211610ustar00rootroot00000000000000#include #include #include #include int filecounter; void dumpNode( TidyNode tnod, FILE* pfile, TidyDoc tdoc, int cen ) { TidyNode child; TidyNode grandchild; for ( child = tidyGetChild(tnod); child; child = tidyGetNext(child) ) { ctmbstr name; switch ( tidyNodeGetType(child) ) { case TidyNode_Root: case TidyNode_DocType: case TidyNode_Comment: case TidyNode_ProcIns: case TidyNode_Text: case TidyNode_CDATA: case TidyNode_Section: case TidyNode_Asp: case TidyNode_Jste: case TidyNode_Php: case TidyNode_XmlDecl: case TidyNode_End: case TidyNode_StartEnd: name ="none";break; default: name = tidyNodeGetName( child ); break; } assert( name != NULL ); TidyBuffer buf; tidyBufInit (&buf); char c='#'; if ((tidyNodeGetType(child)==TidyNode_Text)) { tidyNodeGetText ( tdoc, child, &buf) ; while(!tidyBufEndOfInput(&buf)){ c=tidyBufGetByte(&buf); switch (c) { case '\'': fprintf(pfile,"%s", "\\textquotesingle{}");break; case '[' : fprintf(pfile,"%s", "{$\\text{[}$}");break; case ']' : fprintf(pfile,"%s", "{$\\text{]}$}");break; case '&' : fprintf(pfile,"%s", "\\&");break; case '%' : fprintf(pfile,"%s", "\\%");break; case '{' : fprintf(pfile,"%s", "\\{");break; case '}' : fprintf(pfile,"%s", "\\}");break; case '_' : fprintf(pfile,"%s", "\\_");break; case '$' : fprintf(pfile,"%s", "\\${}");break; case '#' : fprintf(pfile,"%s", "\\#");break; case '~' : fprintf(pfile,"%s", "\\~{}");break; case '^' : fprintf(pfile,"%s", "\\^{}");break; case '"' : fprintf(pfile,"%s", "\\symbol{34}");break; case '\\' : fprintf(pfile,"%s", "\\textbackslash{}");break; case '<' : fprintf(pfile,"%s", "<{}");break; case '>' : fprintf(pfile,"%s", ">{}");break; case '-' : fprintf(pfile,"%s", "-{}");break; default: fprintf(pfile, "%c", c); } } } TidyAttr attr=tidyAttrGetById (child,TidyAttr_CLASS ) ; ctmbstr val =tidyAttrValue (attr ) ; TidyAttr idattr=tidyAttrGetById (child,TidyAttr_ID ) ; ctmbstr idval =tidyAttrValue (idattr ) ; if ((val!=NULL)&&(!(strcmp (val,"image")))) { grandchild = tidyGetChild(child); TidyAttr grandattr=tidyAttrGetById (grandchild,TidyAttr_SRC ) ; ctmbstr grandval =tidyAttrValue (grandattr) ; while (0==0) { if ((grandval[0]=='.')&&(grandval[1]=='.')&&(grandval[2]=='/')) grandval=grandval+3; else break; } char fn[1000]; filecounter++; sprintf(fn,"./%d",filecounter); rename(grandval, fn); char cmd[1000]; sprintf(cmd,"convert %s %s.png",fn,fn); system(cmd); sprintf(fn,"./%d.png",filecounter); fprintf(pfile,"\n\n\\begin{minipage}{1.0\\linewidth}\n\\begin{center}\n\\includegraphics[width=1.0\\linewidth,height=6.5in,keepaspectratio]{%s}\n\\end{center}\n\\raggedright{}\\myfigurewithcaption{%d}{unknown caption}\n\\end{minipage}\\vspace{0.75cm}\n\n",fn,filecounter); continue; } if (!(strcmp (name,"math"))) { TidyAttr mattr; for ( mattr = tidyAttrFirst(child); mattr; mattr = tidyAttrNext(mattr) ) { ctmbstr mattrname = tidyAttrName(mattr) ; if ((mattrname!=NULL)&&(!(strcmp (mattrname,"alttext")))) { ctmbstr mattrval =tidyAttrValue(mattr); size_t l=strlen(mattrval); if (cen){ fprintf(pfile,"%s","\\begin{equation*}"); } else { fprintf(pfile,"%s","{$"); } for (size_t i=0; i< l;i++) { if (mattrval[i]=='\n') {fprintf(pfile,"%s"," ");} else {fprintf(pfile,"%c",mattrval[i]);} } if (cen){ fprintf(pfile,"%s","\\end{equation*}"); } else { fprintf(pfile,"%s","$}"); } } } continue; } if ((val!=NULL)&&(!(strcmp (val,"mw-editsection")))) continue; if ((val!=NULL)&&(!(strcmp (val,"toc")))) continue; if ((idval!=NULL)&&(!(strcmp (idval,"mw-navigation")))) continue; if ((idval!=NULL)&&(!(strcmp (idval,"footer")))) continue; if ((name!=NULL)&&(!(strcmp (name,"script")))) continue; if (!(strcmp (name,"h1"))) fprintf(pfile,"%s","\\chapter{"); if (!(strcmp (name,"h2"))) fprintf(pfile,"%s","\\section{"); if (!(strcmp (name,"h3"))) fprintf(pfile,"%s","\\subsection{"); if (!(strcmp (name,"h4"))) fprintf(pfile,"%s","\\subsubsection{"); if (!(strcmp (name,"h5"))) fprintf(pfile,"%s","\\paragraph{"); if (!(strcmp (name,"h6"))) fprintf(pfile,"%s","\\subparagraph{"); if (!(strcmp (name,"b"))) fprintf(pfile,"%s","{\\bfseries "); if ((name!=NULL)&&(!(strcmp (name,"center")))){ dumpNode( child, pfile , tdoc, 1==1); } else { dumpNode( child, pfile , tdoc, cen); } if (!(strcmp (name,"b"))) fprintf(pfile,"%s","}"); if (!(strcmp (name,"p"))) fprintf(pfile,"%s","\n"); if (!(strcmp (name,"h1"))) fprintf(pfile,"%s","}"); if (!(strcmp (name,"h2"))) fprintf(pfile,"%s","}"); if (!(strcmp (name,"h3"))) fprintf(pfile,"%s","}"); if (!(strcmp (name,"h4"))) fprintf(pfile,"%s","}"); if (!(strcmp (name,"h5"))) fprintf(pfile,"%s","}"); if (!(strcmp (name,"h6"))) fprintf(pfile,"%s","}"); } } int main(int argc, char **argv ) { const char * bab= "\\usepackage[english]{babel}\n\\newcommand{\\mychapterbabel}{Chapter}\n\\newcommand{\\mypagebabel}{on page}\n\\newcommand{\\myfigurebabel}{Figure}\n\\newcommand{\\mylangbabel}{english}"; filecounter=0; FILE * pfile; system("cp -r ../../document/headers ../headers"); pfile =fopen ("../headers/babel.tex","w"); fprintf(pfile,"%s",bab); fclose(pfile); pfile =fopen ("../headers/svg.tex","w"); fprintf(pfile,"%s","\\newcommand{\\SVGExtension}{png}"); fclose(pfile); pfile =fopen ("../headers/paper.tex","w"); fprintf(pfile,"%s","\\KOMAoption{paper}{A4}"); fclose(pfile); pfile =fopen ("../headers/title.tex","w"); fprintf(pfile,"%s","\\title{unknown}"); fclose(pfile); system("cp ../../latex/my-head.tex ./myfile.tex"); pfile =fopen ("myfile.tex","a"); char str[10000]; char str2[10000]; strcpy(str, "wget -E -H -k -p "); strcat(str,argv[1]); strcpy(str2, (argv[1])+8); strcat(str2,".html"); //return 0; system(str); TidyBuffer errbuf = {0}; TidyDoc tdoc = tidyCreate(); tidyOptSetBool( tdoc, TidyXhtmlOut, yes ); tidySetErrorBuffer( tdoc, &errbuf ); tidyParseFile(tdoc, str2 ) ; tidyCleanAndRepair( tdoc ); TidyNode bdy=tidyGetBody (tdoc); dumpNode(bdy,pfile,tdoc,1==0); tidyBufFree( &errbuf ); tidyRelease( tdoc ); fclose(pfile); system("cat ../../latex/my-tail.tex >> ./myfile.tex"); system("xelatex --interaction=nonstopmode myfile.tex >/dev/null"); system("xelatex --interaction=nonstopmode myfile.tex >/dev/null"); system("xelatex --interaction=nonstopmode myfile.tex >/dev/null"); return 0; //g++ -I/usr/include/tidy tachyon.cpp -ltidy } mediawiki2latex-8.29/test/000077500000000000000000000000001504464363500155305ustar00rootroot00000000000000mediawiki2latex-8.29/test/bold_italic_tt.tex000066400000000000000000000162321504464363500212320ustar00rootroot00000000000000\label{0} {\ttfamily \begin{myitemize} \item{} \allowbreak{}\setmainfont{cmuntt.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmuntt.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]\ttfamily one \item{} two \end{myitemize}}\allowbreak{}\setmainfont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx] three {\itshape \begin{myitemize} \item{} \allowbreak{}\setmainfont{cmunti.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmunti.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]\itshape one \item{} two \end{myitemize}}\allowbreak{}\setmainfont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx] three {\bfseries \begin{myitemize} \item{} \allowbreak{}\setmainfont{cmunbx.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmunbx.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]\bfseries one \item{} two \end{myitemize}}\allowbreak{}\setmainfont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx] three lorem{\itshape {$\text{ }$}\allowbreak{}\setmainfont{cmunti.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmunti.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]\itshape lorem {\bfseries {$\text{ }$}\allowbreak{}\setmainfont{cmunbi.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmunbi.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]\bfseries \itshape lorem {\ttfamily {$\text{ }$}\allowbreak{}\setmainfont{cmuntx.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmuntx.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]\ttfamily \bfseries \itshape lorem}\allowbreak{}\setmainfont{cmunbi.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmunbi.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]\bfseries \itshape}\allowbreak{}\setmainfont{cmunti.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmunti.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]\itshape}\allowbreak{}\setmainfont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx] {\ttfamily {$\text{ }$}\allowbreak{}\setmainfont{cmuntt.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmuntt.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]\ttfamily lorem {\itshape {$\text{ }$}\allowbreak{}\setmainfont{cmunit.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmunit.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]\ttfamily \itshape lorem}\allowbreak{}\setmainfont{cmuntt.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmuntt.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]\ttfamily}\allowbreak{}\setmainfont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx] {\bfseries {$\text{ }$}\allowbreak{}\setmainfont{cmunbx.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmunbx.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]\bfseries lorem {\ttfamily {$\text{ }$}\allowbreak{}\setmainfont{cmuntb.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmuntb.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]\ttfamily \bfseries lorem}\allowbreak{}\setmainfont{cmunbx.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmunbx.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]\bfseries} mediawiki2latex-8.29/test/bold_italic_tt.url000066400000000000000000000000711504464363500212260ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/bold_italic_tt.wiki000066400000000000000000000003731504464363500213740ustar00rootroot00000000000000 dhunparserurl Benutzer:Dirk_Huenniger/play *one *two three *one *two three *one *two three lorem lorem lorem lorem lorem lorem lorem lorem mediawiki2latex-8.29/test/bracket_in_image_caption.tex000066400000000000000000000054031504464363500232340ustar00rootroot00000000000000 \label{0} A Link {\ttfamily \allowbreak{}\setmainfont{cmuntt.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmuntt.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]\ttfamily \allowbreak{}|1,2,3,4\footnotemark[1]\myhref{1}{https://de.wikibooks.org/wiki/1\%2C2\%2C3\%2C4}}\allowbreak{}\setmainfont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx] No Link {\ttfamily \allowbreak{}\setmainfont{cmuntt.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmuntt.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]\ttfamily \allowbreak{}|{$\text{[}$}1,2,3, 4{$\text{]}$}}\allowbreak{}\setmainfont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx] No Link {\ttfamily \allowbreak{}\setmainfont{cmuntt.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmuntt.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]\ttfamily \allowbreak{}|{$\text{[}$}{$\text{[}$}1,2,3,{$\text{[}$}{$\text{]}$}{$\text{]}$}{$\text{]}$}}\allowbreak{}\setmainfont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx] \begin{minipage}{1.0\linewidth} \begin{center} \includegraphics[width=1.0\linewidth,height=6.5in,keepaspectratio]{../images/1.\SVGExtension} \end{center} \raggedright{}\myfigurewithcaption{1}{Beispiel der Zerlegung eines Intervalls {$\text{[}$}a,b{$\text{]}$} in n=8 Teile (Obersumme lila und Untersumme orange)} \end{minipage}\linebreak{}\vspace{0.75cm} lorem ipsum mediawiki2latex-8.29/test/bracket_in_image_caption.url000066400000000000000000000000711504464363500232320ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/bracket_in_image_caption.wiki000066400000000000000000000005141504464363500233750ustar00rootroot00000000000000 dhunparserurl Benutzer:Dirk_Huenniger/play A Link |[[1,2,3,4]] No Link |[1,2,3, 4] No Link |[[1,2,3,[]]] [[Datei:Riemann Integral mit Obersumme und Untersumme.svg|thumb|right|Beispiel der Zerlegung eines Intervalls [a,b] in n=8 Teile (Obersumme lila und Untersumme orange)]] lorem ipsum mediawiki2latex-8.29/test/bracketing_of_html_tags.tex000066400000000000000000000002421504464363500231070ustar00rootroot00000000000000 \label{0} text \begin{center} centered \uline{ underline {\large big }} \end{center} \uline{{\large not centered }}{\large not underlined } not big mediawiki2latex-8.29/test/bracketing_of_html_tags.url000066400000000000000000000000711504464363500231110ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/bracketing_of_html_tags.wiki000066400000000000000000000002311504464363500232500ustar00rootroot00000000000000 dhunparserurl Benutzer:Dirk_Huenniger/play text
    centered underline big
    not centered not underlined not big mediawiki2latex-8.29/test/bracketing_of_html_tags_two.tex000066400000000000000000000002311504464363500237760ustar00rootroot00000000000000 \label{0} text \begin{center} centered \uline{ underline {\large big }} \end{center} \uline{{\large not centered } not big } not underlined mediawiki2latex-8.29/test/bracketing_of_html_tags_two.url000066400000000000000000000000711504464363500240020ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/bracketing_of_html_tags_two.wiki000066400000000000000000000002311504464363500241410ustar00rootroot00000000000000 dhunparserurl Benutzer:Dirk_Huenniger/play text
    centered underline big
    not centered not big not underlined mediawiki2latex-8.29/test/caption_tag.tex000066400000000000000000000007351504464363500205470ustar00rootroot00000000000000 \label{0} \begin{longtable}{>{\RaggedRight}p{0.47143\linewidth}>{\RaggedRight}p{0.47143\linewidth}} \multicolumn{2}{>{\RaggedRight}p{0.97143\linewidth}}{{\bfseries \hspace*{0pt}\ignorespaces{}\hspace*{0pt}Monthly savings}}\\ &\\ {\bfseries \hspace*{0pt}\ignorespaces{}\hspace*{0pt}Month}&{\bfseries \hspace*{0pt}\ignorespaces{}\hspace*{0pt}Savings}\\ \hspace*{0pt}\ignorespaces{}\hspace*{0pt}January&\hspace*{0pt}\ignorespaces{}\hspace*{0pt}\${}100 \end{longtable} mediawiki2latex-8.29/test/caption_tag.url000066400000000000000000000000711504464363500205420ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/caption_tag.wiki000066400000000000000000000003031504464363500207010ustar00rootroot00000000000000 dhunparserurl Benutzer:Dirk_Huenniger/play
    Monthly savings
    Month Savings
    January $100
    mediawiki2latex-8.29/test/code_and_links.tex000066400000000000000000000040021504464363500212020ustar00rootroot00000000000000\label{0} A Link {\ttfamily \allowbreak{}\setmainfont{cmuntt.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmuntt.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]\ttfamily 1,2,3,4\footnotemark[1]\myhref{1}{https://de.wikibooks.org/wiki/1\%2C2\%2C3\%2C4}}\allowbreak{}\setmainfont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx] No Link {\ttfamily \allowbreak{}\setmainfont{cmuntt.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmuntt.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]\ttfamily {$\text{[}$}1,2,3, 4{$\text{]}$}}\allowbreak{}\setmainfont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx] No Link {\ttfamily \allowbreak{}\setmainfont{cmuntt.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmuntt.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]\ttfamily {$\text{[}$}{$\text{[}$}1,2,3,{$\text{[}$}{$\text{]}$}{$\text{]}$}{$\text{]}$}} mediawiki2latex-8.29/test/code_and_links.url000066400000000000000000000000711504464363500212060ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/code_and_links.wiki000066400000000000000000000002211504464363500213440ustar00rootroot00000000000000 dhunparserurl Benutzer:Dirk_Huenniger/play A Link [[1,2,3,4]] No Link [1,2,3, 4] No Link [[1,2,3,[]]] mediawiki2latex-8.29/test/color_templates.tex000066400000000000000000000001611504464363500214440ustar00rootroot00000000000000 \label{0} \MyBlau{Beispieltext} \MyRot{Beispieltext} \MyGrun{Beispieltext} \MyBg{yellow}{Beispieltext} mediawiki2latex-8.29/test/color_templates.url000066400000000000000000000000711504464363500214460ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/color_templates.wiki000066400000000000000000000002171504464363500216110ustar00rootroot00000000000000 dhunparserurl Benutzer:Dirk_Huenniger/play {{blau|Beispieltext}} {{rot|Beispieltext}} {{grün|Beispieltext}} {{bg|yellow|Beispieltext}} mediawiki2latex-8.29/test/complex_itemize.tex000066400000000000000000000037651504464363500214620ustar00rootroot00000000000000 lorem ipsum \begin{myquote} \item{} \begin{myitemize} \item{} lorem ipsum \end{myitemize} \begin{myquote} \item{} \begin{myquote} \item{} lorem ipsum \item{} lorem ipsum \end{myquote} \end{myquote} \begin{myitemize} \item{} {\bfseries \allowbreak{}\setmainfont{cmunbx.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmunbx.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]\bfseries 1926:}{$\text{ }$}\allowbreak{}\setmainfont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx] lorem ipsum \end{myitemize} \begin{myquote} \item{} \begin{myquote} \item{} lorem ipsum \item{} lorem ipsum \end{myquote} \end{myquote} \begin{myitemize} \item{} {\bfseries \allowbreak{}\setmainfont{cmunbx.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmunbx.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]\bfseries 1928:}{$\text{ }$}\allowbreak{}\setmainfont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx] lorem ipsum \end{myitemize} \begin{myquote} \item{} \begin{myquote} \item{} lorem ipsum \end{myquote} \end{myquote} \end{myquote} lorem ipsum mediawiki2latex-8.29/test/complex_itemize.url000066400000000000000000000000711504464363500214470ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/complex_itemize.wiki000066400000000000000000000002571504464363500216160ustar00rootroot00000000000000 lorem ipsum :* lorem ipsum ::: lorem ipsum ::: lorem ipsum :* '''1926:''' lorem ipsum ::: lorem ipsum ::: lorem ipsum :* '''1928:''' lorem ipsum ::: lorem ipsum lorem ipsum mediawiki2latex-8.29/test/div_and_span_class_noprint.tex000066400000000000000000000014251504464363500236370ustar00rootroot00000000000000 \label{0} keep in 1 \begin{minipage}{0.25000\textwidth} \begin{center} \includegraphics[width=1.0\textwidth,height=6.5in,keepaspectratio]{../images/1.\SVGExtension} \end{center} \raggedright{}\myfigurewithoutcaption{1} \end{minipage}\linebreak{}\vspace{0.75cm} keep in 3 \begin{minipage}{0.25000\textwidth} \begin{center} \includegraphics[width=1.0\textwidth,height=6.5in,keepaspectratio]{../images/2.\SVGExtension} \end{center} \raggedright{}\myfigurewithoutcaption{2} \end{minipage}\linebreak{}\vspace{0.75cm} keep in 5 \begin{minipage}{0.25000\textwidth} \begin{center} \includegraphics[width=1.0\textwidth,height=6.5in,keepaspectratio]{../images/3.\SVGExtension} \end{center} \raggedright{}\myfigurewithoutcaption{3} \end{minipage}\linebreak{}\vspace{0.75cm} mediawiki2latex-8.29/test/div_and_span_class_noprint.url000066400000000000000000000000711504464363500236350ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/div_and_span_class_noprint.wiki000066400000000000000000000005541504464363500240040ustar00rootroot00000000000000 dhunparserurl Benutzer:Dirk_Huenniger/play keep in 1 [[File:Nuvola apps important.svg|100px]]
    kick out 2 [[File:Nuvola apps important.svg|100px]]
    keep in 3 [[File:Nuvola apps important.svg|100px]] kick out 4 [[File:Nuvola apps important.svg|100px]] keep in 5 [[File:Nuvola apps important.svg|100px]] mediawiki2latex-8.29/test/empty_lines_within_pre.tex000066400000000000000000000006171504464363500230360ustar00rootroot00000000000000 \TemplatePreformat{$\text{ }$\newline{} Foo$\text{ }$\newline{} Foo$\text{ }$\newline{} $\text{ }${}$\text{ }$\newline{} Foo$\text{ }$\newline{} $\text{ }${}$\text{ }$\newline{} $\text{ }${}$\text{ }$\newline{} Foo$\text{ }$\newline{} $\text{ }${}$\text{ }$\newline{} $\text{ }${}$\text{ }$\newline{} $\text{ }${}$\text{ }$\newline{} $\text{ }${}$\text{ }$\newline{} Foo$\text{ }$\newline{} } mediawiki2latex-8.29/test/empty_lines_within_pre.url000066400000000000000000000000571504464363500230360ustar00rootroot00000000000000http://www.mediawiki.org/wiki/User:Duplode/testmediawiki2latex-8.29/test/empty_lines_within_pre.wiki000066400000000000000000000000501504464363500231700ustar00rootroot00000000000000
    Foo
    Foo
    
    Foo
    
    
    Foo
    
    
    
    
    Foo
    
    mediawiki2latex-8.29/test/equal_within_template.tex000066400000000000000000000000671504464363500226410ustar00rootroot00000000000000 \label{0} \LaTeXbodynoteTemplate{{$ x = 2 + 3$}} mediawiki2latex-8.29/test/equal_within_template.url000066400000000000000000000000711504464363500226360ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/equal_within_template.wiki000066400000000000000000000001221504464363500227740ustar00rootroot00000000000000 dhunparserurl Benutzer:Dirk_Huenniger/play {{body note|x = 2 + 3}}mediawiki2latex-8.29/test/german_color_template.tex000066400000000000000000000002431504464363500226130ustar00rootroot00000000000000 \label{0} \legendColorBox{0.00000,0.60392,0.80392}{Föderation} \legendNamedColorBox{red}{Republika Srpska} \legendNamedColorBox{yellow}{Brčko-{}Distrikt} mediawiki2latex-8.29/test/german_color_template.url000066400000000000000000000000711504464363500226140ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/german_color_template.wiki000066400000000000000000000002331504464363500227550ustar00rootroot00000000000000 dhunparserurl Benutzer:Dirk_Huenniger/play {{Farblegende|#009ACD|Föderation}}{{Farblegende|red|Republika Srpska}}{{Farblegende|yellow|Brčko-Distrikt}}mediawiki2latex-8.29/test/hex_html_entity.tex000066400000000000000000000000411504464363500214510ustar00rootroot00000000000000 \label{0} a{$\text{]}$}b mediawiki2latex-8.29/test/hex_html_entity.url000066400000000000000000000000711504464363500214560ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/hex_html_entity.wiki000066400000000000000000000000701504464363500216160ustar00rootroot00000000000000 dhunparserurl Benutzer:Dirk_Huenniger/play a]b mediawiki2latex-8.29/test/html_entities.tex000066400000000000000000000000421504464363500211160ustar00rootroot00000000000000 \label{0} {\mbox{$\&$}} * mediawiki2latex-8.29/test/html_entities.url000066400000000000000000000000711504464363500211220ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/html_entities.wiki000066400000000000000000000000731504464363500212650ustar00rootroot00000000000000 dhunparserurl Benutzer:Dirk_Huenniger/play & * mediawiki2latex-8.29/test/html_tables_and_lists.tex000066400000000000000000000005621504464363500226130ustar00rootroot00000000000000\label{0} lorem ipsum \begin{myitemize} \item{}one \item{}two \end{myitemize} \begin{longtable}{>{\RaggedRight}p{0.47143\linewidth}>{\RaggedRight}p{0.47143\linewidth}} \hspace*{0pt}\ignorespaces{}\hspace*{0pt}1&\hspace*{0pt}\ignorespaces{}\hspace*{0pt}1\\ \hspace*{0pt}\ignorespaces{}\hspace*{0pt}3&\hspace*{0pt}\ignorespaces{}\hspace*{0pt}4 \end{longtable} mediawiki2latex-8.29/test/html_tables_and_lists.url000066400000000000000000000000711504464363500226100ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/html_tables_and_lists.wiki000066400000000000000000000002611504464363500227520ustar00rootroot00000000000000 dhunparserurl Benutzer:Dirk_Huenniger/play lorem ipsum
    • one
    • two
    11
    34
    mediawiki2latex-8.29/test/images_and_gallery.tex000066400000000000000000000033701504464363500220630ustar00rootroot00000000000000 \label{0} \begin{minipage}{0.25000\textwidth} \begin{center} \includegraphics[width=1.0\textwidth,height=6.5in,keepaspectratio]{../images/1.\SVGExtension} \end{center} \raggedright{}\myfigurewithoutcaption{1} \end{minipage}\linebreak{}\vspace{0.75cm} \begin{longtable}{p{0.5\linewidth}} \begin{minipage}{1.0\linewidth} \begin{center} \includegraphics[width=1.0\linewidth,height=6.5in,keepaspectratio]{../images/2.\SVGExtension} \end{center} \raggedright{}\myfigurewithoutcaption{2} \end{minipage}\linebreak{}\vspace{0.75cm} \\ \begin{minipage}{1.0\linewidth} \begin{center} \includegraphics[width=1.0\linewidth,height=6.5in,keepaspectratio]{../images/3.\SVGExtension} \end{center} \raggedright{}\myfigurewithoutcaption{3} \end{minipage}\linebreak{}\vspace{0.75cm} \\ \begin{minipage}{1.0\linewidth} \begin{center} \includegraphics[width=1.0\linewidth,height=6.5in,keepaspectratio]{../images/4.\SVGExtension} \end{center} \raggedright{}\myfigurewithoutcaption{4} \end{minipage}\linebreak{}\vspace{0.75cm} \\ \begin{minipage}{1.0\linewidth} \begin{center} \includegraphics[width=1.0\linewidth,height=6.5in,keepaspectratio]{../images/5.\SVGExtension} \end{center} \raggedright{}\myfigurewithoutcaption{5} \end{minipage}\linebreak{}\vspace{0.75cm} \\ \begin{minipage}{1.0\linewidth} \begin{center} \includegraphics[width=1.0\linewidth,height=6.5in,keepaspectratio]{../images/6.\SVGExtension} \end{center} \raggedright{}\myfigurewithoutcaption{6} \end{minipage}\linebreak{}\vspace{0.75cm} \\ \end{longtable} \begin{minipage}{0.25000\textwidth} \begin{center} \includegraphics[width=1.0\textwidth,height=6.5in,keepaspectratio]{../images/7.\SVGExtension} \end{center} \raggedright{}\myfigurewithoutcaption{7} \end{minipage}\linebreak{}\vspace{0.75cm} mediawiki2latex-8.29/test/images_and_gallery.url000066400000000000000000000000711504464363500220600ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/images_and_gallery.wiki000066400000000000000000000004631504464363500222260ustar00rootroot00000000000000 dhunparserurl Benutzer:Dirk_Huenniger/play [[File:Nuvola apps important.svg|100px]] File:Nuvola apps important.svg File:Nuvola apps important.svg File:Nuvola apps important.svg File:Nuvola apps important.svg File:Nuvola apps important.svg [[File:Nuvola apps important.svg|100px]] mediawiki2latex-8.29/test/link_in_image_caption.tex000066400000000000000000000005641504464363500225610ustar00rootroot00000000000000\label{0} lorem ipsum \begin{minipage}{1.0\linewidth} \begin{center} \includegraphics[width=1.0\linewidth,height=6.5in,keepaspectratio]{../images/1.\SVGExtension} \end{center} \raggedright{}\myfigurewithcaption{1}{lorem ipsum 123 ipsum 467\footnotemark[1]} \end{minipage}\linebreak{}\vspace{0.75cm} \myhref{1}{https://de.wikibooks.org/wiki/lorem\%20ipsum} lorem ipsum mediawiki2latex-8.29/test/link_in_image_caption.url000066400000000000000000000000711504464363500225540ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/link_in_image_caption.wiki000066400000000000000000000002321504464363500227140ustar00rootroot00000000000000 dhunparserurl Benutzer:Dirk_Huenniger/play lorem ipsum [[File:Nuvola apps important.svg|thumb|lorem ipsum 123 [[lorem ipsum|ipsum 467]]]] lorem ipsum mediawiki2latex-8.29/test/links_in_headings.tex000066400000000000000000000001011504464363500217120ustar00rootroot00000000000000 \label{0} \section{Moon} \label{1} \section{Sun} \label{2} mediawiki2latex-8.29/test/links_in_headings.url000066400000000000000000000000711504464363500217220ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/links_in_headings.wiki000066400000000000000000000001621504464363500220640ustar00rootroot00000000000000 dhunparserurl Benutzer:Dirk_Huenniger/play == [[w:Moon|Moon]] == == [http://en.wikipedia.org/wiki/Sun Sun] ==mediawiki2latex-8.29/test/math_enviroments.tex000066400000000000000000000005351504464363500216370ustar00rootroot00000000000000 \label{0} es gibt {$ a+b=c$}berechnung \begin{myquote} \item{} \begin{equation*} 1+1=2\end{equation*} \end{myquote} lorem ipsum \begin{myquote} \item{} ferner ist {$ 3+3=6$} ein ergebis \end{myquote} unserer arbeit \begin{myquote} \item{} \begin{equation*} 3+3=6\end{equation*}\begin{equation*} 3+3=6\end{equation*} \end{myquote} sadsa mediawiki2latex-8.29/test/math_enviroments.url000066400000000000000000000000711504464363500216340ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/math_enviroments.wiki000066400000000000000000000003351504464363500220000ustar00rootroot00000000000000 dhunparserurl Benutzer:Dirk_Huenniger/play es gibt a+b=cberechnung :1+1=2 lorem ipsum :ferner ist 3+3=6 ein ergebis unserer arbeit : 3+3=63+3=6 sadsa mediawiki2latex-8.29/test/math_with_attributes.tex000066400000000000000000000000701504464363500225010ustar00rootroot00000000000000 \label{0} sad {$ x=y $} asd {$ y=x $} sadsa mediawiki2latex-8.29/test/math_with_attributes.url000066400000000000000000000000711504464363500225040ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/math_with_attributes.wiki000066400000000000000000000001621504464363500226460ustar00rootroot00000000000000 dhunparserurl Benutzer:Dirk_Huenniger/play sad x=y asd y=x sadsa mediawiki2latex-8.29/test/moreitemizations.tex000066400000000000000000000014631504464363500216600ustar00rootroot00000000000000 \begin{longtable}{|>{\RaggedRight}p{0.97143\linewidth}|} \hline \hspace*{0pt}\ignorespaces{}\hspace*{0pt} sad\\ \hline \hspace*{0pt}\ignorespaces{}\hspace*{0pt}\scalebox{1.0}{\begin{tabular}{|>{\RaggedRight}p{\dhuncolwidth{0.97143}}|} \hline \hspace*{0pt}\ignorespaces{}\hspace*{0pt}\begin{myitemize}\item{} a\item{} b\end{myitemize}\\ \hline \hspace*{0pt}\ignorespaces{}\hspace*{0pt}\begin{myquote}\item{} a\item{} b\end{myquote}\\ \hline \hspace*{0pt}\ignorespaces{}\hspace*{0pt}\begin{myenumerate}\item{} a\item{} b\end{myenumerate}\\ \hline \hspace*{0pt}\ignorespaces{}\hspace*{0pt}{\bfseries\begin{mydescription}a\end{mydescription}}\begin{myquote}\item{}b\end{myquote}{\bfseries\begin{mydescription}x\end{mydescription}}\begin{myquote}\item{}y\end{myquote}\\ \hline \end{tabular}} \\ \hline \end{longtable} mediawiki2latex-8.29/test/moreitemizations.url000066400000000000000000000000711504464363500216540ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/moreitemizations.wiki000066400000000000000000000006331504464363500220210ustar00rootroot00000000000000{| cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #a0a0a0 solid; border-collapse: collapse; " rules="all" class="wikitable" | sad |- | {| cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #a0a0a0 solid; border-collapse: collapse; " rules="all" class="wikitable" | *a *b |- | :a :b |- | #a #b |- | ;a:b ;x:y |} |} mediawiki2latex-8.29/test/nested_table.tex000066400000000000000000000011421504464363500207010ustar00rootroot00000000000000 \label{0} \begin{longtable}{>{\RaggedRight}p{0.47143\linewidth}>{\RaggedRight}p{0.47143\linewidth}} \hspace*{0pt}\ignorespaces{}\hspace*{0pt} \scalebox{1.0}{\begin{tabular}{>{\RaggedRight}p{\dhuncolwidth{0.47143}}>{\RaggedRight}p{\dhuncolwidth{0.47143}}} \hspace*{0pt}\ignorespaces{}\hspace*{0pt} a &\hspace*{0pt}\ignorespaces{}\hspace*{0pt} b\\ \hspace*{0pt}\ignorespaces{}\hspace*{0pt} c &\hspace*{0pt}\ignorespaces{}\hspace*{0pt} d \end{tabular}} &\hspace*{0pt}\ignorespaces{}\hspace*{0pt} 2\\ \hspace*{0pt}\ignorespaces{}\hspace*{0pt} 3&\hspace*{0pt}\ignorespaces{}\hspace*{0pt} 4 \end{longtable} mediawiki2latex-8.29/test/nested_table.url000066400000000000000000000000711504464363500207030ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/nested_table.wiki000066400000000000000000000001471504464363500210500ustar00rootroot00000000000000 dhunparserurl Benutzer:Dirk_Huenniger/play {| | {| | a || b |- | c || d |} | 2 |- | 3 | 4 |} mediawiki2latex-8.29/test/preformat.tex000066400000000000000000000002341504464363500202500ustar00rootroot00000000000000 \label{0} lorem ipsum\TemplatePreformat{$\text{ }$\newline{} line$\text{ }${}1$\text{ }$\newline{} line$\text{ }${}2$\text{ }$\newline{} }lorem ipsum mediawiki2latex-8.29/test/preformat.url000066400000000000000000000000571504464363500202550ustar00rootroot00000000000000http://www.mediawiki.org/wiki/User:Duplode/testmediawiki2latex-8.29/test/preformat.wiki000066400000000000000000000001231504464363500204100ustar00rootroot00000000000000 dhunparserurl User:Duplode/test lorem ipsum
    line 1
    line 2
    
    lorem ipsummediawiki2latex-8.29/test/rowspan_and_headercells.tex000066400000000000000000000021561504464363500231240ustar00rootroot00000000000000 \label{0} {\scriptsize{} \begin{longtable}{>{\RaggedRight}p{0.30476\linewidth}>{\RaggedRight}p{0.30476\linewidth}>{\RaggedRight}p{0.30476\linewidth}} \multirow{3}{0.30476\linewidth}{{\bfseries \hspace*{0pt}\ignorespaces{}\hspace*{0pt}0}}&\hspace*{0pt}\ignorespaces{}\hspace*{0pt} 1 &\hspace*{0pt}\ignorespaces{}\hspace*{0pt} 2 \\* \multicolumn{1}{c}{}&\hspace*{0pt}\ignorespaces{}\hspace*{0pt} 3 &\hspace*{0pt}\ignorespaces{}\hspace*{0pt} 4 \\* \multicolumn{1}{c}{}&{\bfseries \hspace*{0pt}\ignorespaces{}\hspace*{0pt} 5 }&\multirow{3}{0.30476\linewidth}{\hspace*{0pt}\ignorespaces{}\hspace*{0pt} 6 }\\* \hspace*{0pt}\ignorespaces{}\hspace*{0pt} 7 &\hspace*{0pt}\ignorespaces{}\hspace*{0pt} 8 &\multicolumn{1}{c}{}\\* \hspace*{0pt}\ignorespaces{}\hspace*{0pt} 9 &\hspace*{0pt}\ignorespaces{}\hspace*{0pt} 10 &\multicolumn{1}{c}{}\\ \hspace*{0pt}\ignorespaces{}\hspace*{0pt} 11 &\hspace*{0pt}\ignorespaces{}\hspace*{0pt} 12 &\hspace*{0pt}\ignorespaces{}\hspace*{0pt} 13\\ \hspace*{0pt}\ignorespaces{}\hspace*{0pt} 14 &\hspace*{0pt}\ignorespaces{}\hspace*{0pt} 15 &\hspace*{0pt}\ignorespaces{}\hspace*{0pt} 16 \end{longtable} } mediawiki2latex-8.29/test/rowspan_and_headercells.url000066400000000000000000000000711504464363500231200ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/rowspan_and_headercells.wiki000066400000000000000000000003271504464363500232650ustar00rootroot00000000000000 dhunparserurl Benutzer:Dirk_Huenniger/play {| latexfontsize="scriptsize" ! rowspan="3" |0|| 1 || 2 |- | 3 || 4 |- ! 5 ||rowspan="3"| 6 |- | 7 || 8 |- | 9 || 10 |- | 11 || 12 || 13 |- | 14 || 15 || 16 |} mediawiki2latex-8.29/test/run.sh000077500000000000000000000011251504464363500166720ustar00rootroot00000000000000#!/bin/sh if [ -z "$(command -v realpath)" ]; then echo "realpath not found." exit fi URL='http://en.wikipedia.org/wiki/Asymptote_(vector_graphics_language)' SOURCEDIR="$(realpath "$0")" SOURCEDIR="${SOURCEDIR%/*}" case $1 in latex) URL='http://en.wikibooks.org/wiki/User:Dirk_H%C3%BCnniger/latex' shift 1;; lua) URL='http://en.wikipedia.org/wiki/Lua_(programming_language)' shift 1;; esac [ ! -d ~/latex-tree ] && mkdir ~/latex-tree "$SOURCEDIR"/../dist/build/mediawiki2latex/mediawiki2latex -o output.pdf \ -u "$URL" -c ~/latex-tree "$@" mediawiki2latex-8.29/test/special_space_html_entities.tex000066400000000000000000000014461504464363500240020ustar00rootroot00000000000000 \label{0} a{\,}b\allowbreak{}\setmainfont{FreeSerif.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/freefont/,UprightFont=FreeSerif,BoldFont=FreeSerifBold,ItalicFont=FreeSerifItalic,BoldItalicFont=FreeSerifBoldItalic]\setmonofont{FreeSerif.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/freefont/,UprightFont=FreeMono,BoldFont=FreeMonoBold,ItalicFont=FreeMonoOblique,BoldItalicFont=FreeMonoBoldOblique]\,\allowbreak{}\setmainfont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmunrm,BoldFont=cmunbx,ItalicFont=cmunti,BoldItalicFont=cmunbi]\setmonofont{cmunrm.ttf}[RawFeature={fallback=myfallback},Path=/usr/share/fonts/truetype/cmu/,UprightFont=cmuntt,BoldFont=cmuntb,ItalicFont=cmunit,BoldItalicFont=cmuntx]c mediawiki2latex-8.29/test/special_space_html_entities.url000066400000000000000000000000711504464363500237750ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/special_space_html_entities.wiki000066400000000000000000000001011504464363500241300ustar00rootroot00000000000000 dhunparserurl Benutzer:Dirk_Huenniger/play a b cmediawiki2latex-8.29/test/table_heading.tex000066400000000000000000000005141504464363500210200ustar00rootroot00000000000000 \label{0} \begin{longtable}{>{\RaggedRight}p{0.47143\linewidth}>{\RaggedRight}p{0.47143\linewidth}} &\\ \multicolumn{2}{>{\RaggedRight}p{0.97143\linewidth}}{{\bfseries \hspace*{0pt}\ignorespaces{}\hspace*{0pt} Test}}\\ \hspace*{0pt}\ignorespaces{}\hspace*{0pt} 1 &\hspace*{0pt}\ignorespaces{}\hspace*{0pt} 2 \end{longtable} mediawiki2latex-8.29/test/table_heading.url000066400000000000000000000000711504464363500210200ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/table_heading.wiki000066400000000000000000000001141504464363500211570ustar00rootroot00000000000000 dhunparserurl Benutzer:Dirk_Huenniger/play {| |- |+ Test |- | 1 || 2 |} mediawiki2latex-8.29/test/tag_ends_in_itemize.tex000066400000000000000000000001721504464363500222520ustar00rootroot00000000000000 lorem ipsum {\smaller \begin{myenumerate} \item{} lorem ipsum \item{} lorem ipsum \end{myenumerate} } lorem ipsum mediawiki2latex-8.29/test/tag_ends_in_itemize.url000066400000000000000000000000711504464363500222520ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/tag_ends_in_itemize.wiki000066400000000000000000000001031504464363500224070ustar00rootroot00000000000000 lorem ipsum #lorem ipsum #lorem ipsum lorem ipsum mediawiki2latex-8.29/test/template_Farblegende.tex000066400000000000000000000001101504464363500223330ustar00rootroot00000000000000 \label{0} \legendColorBox{0.20000,0.20000,0.40000}{lorem ipsum} mediawiki2latex-8.29/test/template_Farblegende.url000066400000000000000000000000711504464363500223430ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/template_Farblegende.wiki000066400000000000000000000001221504464363500225010ustar00rootroot00000000000000 dhunparserurl Benutzer:Dirk_Huenniger/play {{Farblegende|#333366|lorem ipsum}}mediawiki2latex-8.29/test/tiny_image.tex000066400000000000000000000001401504464363500203720ustar00rootroot00000000000000 \includegraphics[width=0.03000\textwidth,height=6.5in,keepaspectratio]{../images/1.png} mediawiki2latex-8.29/test/tiny_image.url000066400000000000000000000000711504464363500203770ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/tiny_image.wiki000066400000000000000000000000621504464363500205400ustar00rootroot00000000000000[[Image:Nuvola apps noatun.png|left|12px|Aufgabe]]mediawiki2latex-8.29/test/triming_of_spaces_in_headings.tex000066400000000000000000000002001504464363500242650ustar00rootroot00000000000000 \label{0} lorem ipsum\chapter{chapter one} \myminitoc \label{1} lorem ipsum \section{section two} \label{2} lorem ipsum mediawiki2latex-8.29/test/triming_of_spaces_in_headings.url000066400000000000000000000000711504464363500242750ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/triming_of_spaces_in_headings.wiki000066400000000000000000000001751504464363500244430ustar00rootroot00000000000000 dhunparserurl Benutzer:Dirk_Huenniger/play lorem ipsum = chapter one = lorem ipsum == section two == lorem ipsummediawiki2latex-8.29/test/underline.tex000066400000000000000000000000611504464363500202340ustar00rootroot00000000000000 lorem ipsum \uline{lorem ipsum} lorem ipsum mediawiki2latex-8.29/test/underline.url000066400000000000000000000000711504464363500202370ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/underline.wiki000066400000000000000000000000521504464363500203770ustar00rootroot00000000000000lorem ipsum lorem ipsum lorem ipsummediawiki2latex-8.29/test/wiki_semicolon_notation.tex000066400000000000000000000003631504464363500232020ustar00rootroot00000000000000 \label{0} lorem ispsum{\bfseries \begin{mydescription} lorem ispsum \end{mydescription} } lorem ispsum{\bfseries \begin{mydescription} lorem ispsum \end{mydescription} } \begin{myquote}\item{} lorem ispsum \end{myquote} lorem ispsum mediawiki2latex-8.29/test/wiki_semicolon_notation.url000066400000000000000000000000711504464363500232000ustar00rootroot00000000000000http://de.wikibooks.org/wiki/Benutzer:Dirk_Huenniger/playmediawiki2latex-8.29/test/wiki_semicolon_notation.wiki000066400000000000000000000002021504464363500233350ustar00rootroot00000000000000 dhunparserurl Benutzer:Dirk_Huenniger/play lorem ispsum ; lorem ispsum lorem ispsum ; lorem ispsum: lorem ispsum lorem ispsum