From 87aefa6bc9509946575089061f4c672677e9e762 Mon Sep 17 00:00:00 2001 From: anomen Date: Fri, 23 Jan 2015 10:34:30 +0100 Subject: [PATCH] www-apps/phpSANE-0.8.0 --- www-apps/phpSANE/dev/css/.htaccess | 6 + www-apps/phpSANE/dev/css/jcrop.gif | Bin 0 -> 329 bytes www-apps/phpSANE/dev/css/jquery.jcrop.css | 165 ++++++ www-apps/phpSANE/dev/css/msdropdown.css | 87 ++++ www-apps/phpSANE/dev/css/nouislider.fox.css | 94 ++++ www-apps/phpSANE/dev/css/style.css | 475 +++++++++++++++++ www-apps/phpSANE/dev/doc/.htaccess | 4 + www-apps/phpSANE/dev/doc/CHANGELOG | 70 +++ www-apps/phpSANE/dev/doc/LICENSE | 340 ++++++++++++ www-apps/phpSANE/dev/doc/README_DE.txt | 114 ++++ www-apps/phpSANE/dev/doc/README_EN.txt | 113 ++++ www-apps/phpSANE/dev/doc/README_PL.txt | 116 +++++ www-apps/phpSANE/dev/download.php | 65 +++ www-apps/phpSANE/dev/help/help_0.php | 182 +++++++ www-apps/phpSANE/dev/help/help_1.php | 182 +++++++ www-apps/phpSANE/dev/help/help_2.php | 183 +++++++ www-apps/phpSANE/dev/help/help_4.php | 167 ++++++ www-apps/phpSANE/dev/help/help_6.php | 182 +++++++ www-apps/phpSANE/dev/help/help_7.php | 183 +++++++ www-apps/phpSANE/dev/images/.htaccess | 6 + www-apps/phpSANE/dev/images/btn_accept.png | Bin 0 -> 1987 bytes www-apps/phpSANE/dev/images/btn_preview.png | Bin 0 -> 1239 bytes www-apps/phpSANE/dev/images/filetype_bmp.png | Bin 0 -> 1738 bytes www-apps/phpSANE/dev/images/filetype_jpg.png | Bin 0 -> 1657 bytes www-apps/phpSANE/dev/images/filetype_other.png | Bin 0 -> 1222 bytes www-apps/phpSANE/dev/images/filetype_pdf.png | Bin 0 -> 1537 bytes www-apps/phpSANE/dev/images/filetype_png.png | Bin 0 -> 1930 bytes www-apps/phpSANE/dev/images/filetype_pnm.png | Bin 0 -> 1904 bytes www-apps/phpSANE/dev/images/filetype_tif.png | Bin 0 -> 1692 bytes www-apps/phpSANE/dev/images/filetype_txt.png | Bin 0 -> 1501 bytes www-apps/phpSANE/dev/images/help_icon.png | Bin 0 -> 3485 bytes www-apps/phpSANE/dev/images/lang_de.gif | Bin 0 -> 1114 bytes www-apps/phpSANE/dev/images/lang_en.gif | Bin 0 -> 1256 bytes www-apps/phpSANE/dev/images/lang_fi.gif | Bin 0 -> 120 bytes www-apps/phpSANE/dev/images/lang_fr.gif | Bin 0 -> 112 bytes www-apps/phpSANE/dev/images/lang_nl.gif | Bin 0 -> 855 bytes www-apps/phpSANE/dev/images/lang_pl.gif | Bin 0 -> 110 bytes www-apps/phpSANE/dev/images/lang_ru.gif | Bin 0 -> 855 bytes www-apps/phpSANE/dev/images/lang_uk.gif | Bin 0 -> 96 bytes www-apps/phpSANE/dev/images/logo.jpg | Bin 0 -> 12198 bytes www-apps/phpSANE/dev/images/mode_color.png | Bin 0 -> 1176 bytes www-apps/phpSANE/dev/images/mode_gray.png | Bin 0 -> 339 bytes www-apps/phpSANE/dev/images/mode_lineart.png | Bin 0 -> 268 bytes www-apps/phpSANE/dev/images/msdropdown_arrow.gif | Bin 0 -> 204 bytes www-apps/phpSANE/dev/images/msdropdown_bg.gif | Bin 0 -> 154 bytes www-apps/phpSANE/dev/images/pagesize_a4.png | Bin 0 -> 1076 bytes www-apps/phpSANE/dev/images/pagesize_a5.png | Bin 0 -> 1001 bytes www-apps/phpSANE/dev/images/pagesize_a6.png | Bin 0 -> 927 bytes www-apps/phpSANE/dev/images/pagesize_custom.png | Bin 0 -> 1179 bytes www-apps/phpSANE/dev/images/scan.jpg | Bin 0 -> 21648 bytes www-apps/phpSANE/dev/images/spinner.gif | Bin 0 -> 3802 bytes www-apps/phpSANE/dev/incl/.htaccess | 4 + www-apps/phpSANE/dev/incl/config.php | 444 ++++++++++++++++ www-apps/phpSANE/dev/incl/files.php | 157 ++++++ www-apps/phpSANE/dev/incl/functions.php | 180 +++++++ www-apps/phpSANE/dev/incl/language.php | 576 +++++++++++++++++++++ www-apps/phpSANE/dev/incl/menu.php | 157 ++++++ www-apps/phpSANE/dev/incl/scan.php | 214 ++++++++ www-apps/phpSANE/dev/incl/security.php | 90 ++++ www-apps/phpSANE/dev/index.html | 1 + www-apps/phpSANE/dev/javascript/.htaccess | 6 + .../phpSANE/dev/javascript/jquery.jcrop.min.js | 22 + www-apps/phpSANE/dev/javascript/jquery.min.js | 6 + .../dev/javascript/jquery.msdropdown_custom.min.js | 77 +++ .../dev/javascript/jquery.nouislider.min.js | 11 + www-apps/phpSANE/dev/phpsane.php | 435 ++++++++++++++++ www-apps/phpSANE/dev/save.php | 49 ++ 67 files changed, 5163 insertions(+) create mode 100644 www-apps/phpSANE/dev/css/.htaccess create mode 100644 www-apps/phpSANE/dev/css/jcrop.gif create mode 100644 www-apps/phpSANE/dev/css/jquery.jcrop.css create mode 100644 www-apps/phpSANE/dev/css/msdropdown.css create mode 100644 www-apps/phpSANE/dev/css/nouislider.fox.css create mode 100644 www-apps/phpSANE/dev/css/style.css create mode 100644 www-apps/phpSANE/dev/doc/.htaccess create mode 100644 www-apps/phpSANE/dev/doc/CHANGELOG create mode 100644 www-apps/phpSANE/dev/doc/LICENSE create mode 100644 www-apps/phpSANE/dev/doc/README_DE.txt create mode 100644 www-apps/phpSANE/dev/doc/README_EN.txt create mode 100644 www-apps/phpSANE/dev/doc/README_PL.txt create mode 100644 www-apps/phpSANE/dev/download.php create mode 100644 www-apps/phpSANE/dev/help/help_0.php create mode 100644 www-apps/phpSANE/dev/help/help_1.php create mode 100644 www-apps/phpSANE/dev/help/help_2.php create mode 100644 www-apps/phpSANE/dev/help/help_4.php create mode 100644 www-apps/phpSANE/dev/help/help_6.php create mode 100644 www-apps/phpSANE/dev/help/help_7.php create mode 100644 www-apps/phpSANE/dev/images/.htaccess create mode 100644 www-apps/phpSANE/dev/images/btn_accept.png create mode 100644 www-apps/phpSANE/dev/images/btn_preview.png create mode 100644 www-apps/phpSANE/dev/images/filetype_bmp.png create mode 100644 www-apps/phpSANE/dev/images/filetype_jpg.png create mode 100644 www-apps/phpSANE/dev/images/filetype_other.png create mode 100644 www-apps/phpSANE/dev/images/filetype_pdf.png create mode 100644 www-apps/phpSANE/dev/images/filetype_png.png create mode 100644 www-apps/phpSANE/dev/images/filetype_pnm.png create mode 100644 www-apps/phpSANE/dev/images/filetype_tif.png create mode 100644 www-apps/phpSANE/dev/images/filetype_txt.png create mode 100644 www-apps/phpSANE/dev/images/help_icon.png create mode 100644 www-apps/phpSANE/dev/images/lang_de.gif create mode 100644 www-apps/phpSANE/dev/images/lang_en.gif create mode 100644 www-apps/phpSANE/dev/images/lang_fi.gif create mode 100644 www-apps/phpSANE/dev/images/lang_fr.gif create mode 100644 www-apps/phpSANE/dev/images/lang_nl.gif create mode 100644 www-apps/phpSANE/dev/images/lang_pl.gif create mode 100644 www-apps/phpSANE/dev/images/lang_ru.gif create mode 100644 www-apps/phpSANE/dev/images/lang_uk.gif create mode 100644 www-apps/phpSANE/dev/images/logo.jpg create mode 100644 www-apps/phpSANE/dev/images/mode_color.png create mode 100644 www-apps/phpSANE/dev/images/mode_gray.png create mode 100644 www-apps/phpSANE/dev/images/mode_lineart.png create mode 100644 www-apps/phpSANE/dev/images/msdropdown_arrow.gif create mode 100644 www-apps/phpSANE/dev/images/msdropdown_bg.gif create mode 100644 www-apps/phpSANE/dev/images/pagesize_a4.png create mode 100644 www-apps/phpSANE/dev/images/pagesize_a5.png create mode 100644 www-apps/phpSANE/dev/images/pagesize_a6.png create mode 100644 www-apps/phpSANE/dev/images/pagesize_custom.png create mode 100644 www-apps/phpSANE/dev/images/scan.jpg create mode 100644 www-apps/phpSANE/dev/images/spinner.gif create mode 100644 www-apps/phpSANE/dev/incl/.htaccess create mode 100644 www-apps/phpSANE/dev/incl/config.php create mode 100644 www-apps/phpSANE/dev/incl/files.php create mode 100644 www-apps/phpSANE/dev/incl/functions.php create mode 100644 www-apps/phpSANE/dev/incl/language.php create mode 100644 www-apps/phpSANE/dev/incl/menu.php create mode 100644 www-apps/phpSANE/dev/incl/scan.php create mode 100644 www-apps/phpSANE/dev/incl/security.php create mode 100644 www-apps/phpSANE/dev/index.html create mode 100644 www-apps/phpSANE/dev/javascript/.htaccess create mode 100644 www-apps/phpSANE/dev/javascript/jquery.jcrop.min.js create mode 100644 www-apps/phpSANE/dev/javascript/jquery.min.js create mode 100644 www-apps/phpSANE/dev/javascript/jquery.msdropdown_custom.min.js create mode 100644 www-apps/phpSANE/dev/javascript/jquery.nouislider.min.js create mode 100644 www-apps/phpSANE/dev/phpsane.php create mode 100644 www-apps/phpSANE/dev/save.php diff --git a/www-apps/phpSANE/dev/css/.htaccess b/www-apps/phpSANE/dev/css/.htaccess new file mode 100644 index 0000000..0c66168 --- /dev/null +++ b/www-apps/phpSANE/dev/css/.htaccess @@ -0,0 +1,6 @@ + + #one year + + Header set Cache-Control "max-age=29030400" + + \ No newline at end of file diff --git a/www-apps/phpSANE/dev/css/jcrop.gif b/www-apps/phpSANE/dev/css/jcrop.gif new file mode 100644 index 0000000000000000000000000000000000000000..72ea7ccb5321d5384d70437cfaac73011237901e GIT binary patch literal 329 zcwTe&bhEHb li { + padding: 0 0.5em 0 0.5em; + display: inline; + list-style-type: none; + text-align: left; +} + +#header_menu a { + font-weight: bold; + font-size: 110%; + color: #005580; +} + +#language_select { + width: 10.5em; + display: inline-block; +} + +/* ------------------------------------------------------------------ */ +/* body */ +#page_body { + padding: 0.0em; + margin: 1.5em auto; +} + +#page_body > tbody > tr > td { + padding: 0.6em; +} + +.input_error { + color: red; +} + +#tab_menu_error_text { + font-size: 170%; + font-weight: bold; + line-height: 170%; + color: red; + height: 8em; +} + +#tab_menu_error_button { + font-size: 150%; + height: 2em; +} + +#tab_preview, #tab_menu{ + vertical-align: top; + padding: 0.0em 0.5em; + height: 100%; +} +#preview_image { + border: solid black 1px; +} + +#tab_menu_settings { + height: 100%; + padding: 0.0em; + margin: 0.0em; +} +#tab_menu_settings td { + padding: 0.15em 0.0em; +} +#tab_menu_settings .value_column > input[type="text"] { + line-height: 30px; + width: 210px; + display: inline-block; + height: 30px; + padding: 4px 6px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + font-size: 14px; + line-height: 20px; + color: #555555; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 5px; + vertical-align: middle; + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear .2s, box-shadow linear .2s; + -moz-transition: border linear .2s, box-shadow linear .2s; + -o-transition: border linear .2s, box-shadow linear .2s; + transition: border linear .2s, box-shadow linear .2s; +} +#tab_menu_settings .value_column > input[type="text"]:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; /* IE6-9 */ + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); + -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); +} + +#tab_menu_settings #brightness_slider { + width: 155px; + display: inline-block; + vertical-align:middle; + margin-top: auto; + background-color: #e5e5e7; +} +#tab_menu_settings #brightness { + width: 44px; + margin-left: 7px; +} + +#tab_menu_settings #contrast_slider { + width: 155px; + display: inline-block; + vertical-align:middle; + margin-top: auto; + background-color: #e5e5e7; +} +#tab_menu_settings #contrast { + width: 44px; + margin-left: 7px; +} + +#tab_menu_settings select { + width: 210px; +} +#tab_menu_settings tr:first-child th{ + padding-top: 0px; + margin-top: 0px; +} +#tab_menu_settings #scanner_name { + padding-top: 0.8em; + padding-bottom: 0.8em; +} +#tab_menu_settings th { + font-weight: bold; + padding: 1em 0em 0.1em 0.0em; + text-align: left; +} +#tab_menu_settings .value_column { + padding-left: 0.75em; +} +#tab_menu_settings .unit_column, .unit_spacer { + padding: 0; + width: 2.0em; + padding-left: 0.2em; +} + +#tab_menu_buttons { + height: 100%; + vertical-align: bottom !important; + padding: 0.0em !important; + margin: 0.0em; +} +#tab_menu_buttons input { + padding: 0.6em 0em; + width: 49.5%; + text-align: left; + border: solid 1px #dcdcdc; + background-position: 10px center; + background-repeat: no-repeat; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + border-width: 1px; + color: #666666; + font: bold 130% arial,sans-serif; +} +#tab_menu_buttons input:hover { + background-color: #e2e2e4; + border-color: #b0b0b0; +} +#tab_menu_buttons_preview { + padding-left: 40px !important; + background-image: url(../images/btn_preview.png); +} +#tab_menu_buttons_accept { + padding-left: 47px !important; + background-image: url(../images/btn_accept.png); +} +#tab_menu_buttons input + input { + margin-left: 1%; +} + +#files_table_wrapper { + width: 100%; +} +#files_table_wrapper td { + margin: 0; + padding: 0; +} +#files_table_wrapper .ruler { + margin-top: -0.6em; + background-color: #888; + margin-left: -0.1em; +} + +#files_table { + background-color: #F3F3F3; + border-collapse: collapse; + width: 100%; + margin: 5px 0; + border: solid 1px #AAA; +} +#files_table th { + background-color: #666; + color: #FFF; + cursor: default; + padding: 5px 5px 5px 5px; +} +#files_table td, #files_table th { + text-align: left; + padding-top: 10px; + padding-bottom: 10px; + white-space: nowrap; +} +#files_table a { + text-decoration: none; +} +#files_table td a { + color: #444; + display: block; + padding: 5px; +} +#files_table td input { + margin: 10px; +} +#files_table .file_row_new { + background-color: #FFE599 !important; +} +#files_table .file_column_ext { + text-align: left; +} +#files_table .file_column_size, #files_table .file_column_modtime { + text-align: right; +} +#files_table .file_column_category { + display: none; +} +#files_table .file_column_name a { + background: url(../images/filetype_other.png) no-repeat 5px 50%; + padding-left: 38px; +} +#files_table .file_column_name { + width: 100%; +} +#files_table td:not(.file_column_name) a { + background-image: none !important; +} +#files_table tr:nth-of-type(odd) { + background-color: #E6E6E6; +} +#files_table tr:hover td { + background-color:#CACACA; +} +#files_table tr:hover td a { + color: #000; +} +/* icons for file types */ +#files_table .file_column_name a[href$=".bmp"] {background-image: url(../images/filetype_bmp.png);} +#files_table .file_column_name a[href$=".jpg"], #files_table .file_column_name a[href$=".jpeg"] {background-image: url(../images/filetype_jpg.png);} +#files_table .file_column_name a[href$=".pdf"] {background-image: url(../images/filetype_pdf.png);} +#files_table .file_column_name a[href$=".png"] {background-image: url(../images/filetype_png.png);} +#files_table .file_column_name a[href$=".pnm"] {background-image: url(../images/filetype_pnm.png);} +#files_table .file_column_name a[href$=".tif"], #files_table .file_column_name a[href$=".tiff"] {background-image: url(../images/filetype_tif.png);} +#files_table .file_column_name a[href$=".txt"] {background-image: url(../images/filetype_txt.png);} + +#file_buttons { + margin: 1em 0 0.2em 0; + padding: 0; +} +#file_buttons li { + float:left; + margin: 0.0em 0.4em 0.0em 0.0em; + list-style-type: none; + height: 100%; + border: none; +} +#select_menu_button, #file_delete, #file_download { + position: relative; + background: #f3f3f3; + border: solid 1px #dcdcdc; + border-collapse: separate; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + padding-left: 10px; + height: 35px; + width: 50px; + +} +#file_delete, #file_download { + display: none; + cursor: pointer; + color: #666; + font: bold 100% arial,sans-serif; + width: auto; +} +#select_menu_button:hover, #file_delete:hover, #file_download:hover { + background-color: #e2e2e4; + border-color: #b0b0b0; +} +#file_download[disabled] { + color: #aaa; +} +#file_download[disabled]:hover { + background: #f3f3f3; + border-color: #dcdcdc; +} +#file_download_spinner { + display: none; + background: url(../images/spinner.gif) no-repeat 0px 50%; + height: 35px; + line-height: 35px; + padding-left: 35px; +} +#select_menu_button tr td{ + padding: 0; +} +#select_menu_arrow { + display: inline-block; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: 5px solid #777777; +} +#select_menu_dropdown { + display: none; + position: absolute; + list-style: none; + margin: 0px; + padding: 0px; + -webkit-box-shadow: 0 4px 10px #8b8b8b; + -moz-box-shadow: 0 4px 10px #8b8b8b; + box-shadow: 0 4px 10px #8b8b8b; + font-size: 14px; + width: 80px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +#select_menu_dropdown li { + position: relative; + display: inline-block; + font: bold 75% arial,sans-serif; + text-decoration: none; + padding: 7px 0px 7px 12px; + color: #444; + background: #fff; + border: none; + width: 70px; + float: left; + cursor: pointer; +} +/* hide text selection by setting selection background color to white */ +#select_menu_dropdown li::selection { + background: color: #000000; /* safari */ +} +#select_menu_dropdown li::-moz-selection { + background: color: #000000; /* firefox */ +} +#select_menu_dropdown li:hover { + background: #EEEEEE; +} + +/* ------------------------------------------------------------------ */ +/* footer */ +#page_footer { + width: 100%; + font-size: 80%; + font-weight: normal; + line-height: 110%; + text-align: center; + border-collapse: collapse; + border: none; + margin: 150px 0.0em 0.4em 0.0em; + background-color: silver; +} + +#page_footer td { + vertical-align: top; + border: none; + padding: 0.4em 0.0em; + margin: 0.0em 0.0em; +} + +/* ------------------------------------------------------------------ */ +.ruler { + background-color: black; + width: 100%; + height: 2px; + border-style: solid; + border-width: 0px; + padding: 0px !important; +} \ No newline at end of file diff --git a/www-apps/phpSANE/dev/doc/.htaccess b/www-apps/phpSANE/dev/doc/.htaccess new file mode 100644 index 0000000..328bf33 --- /dev/null +++ b/www-apps/phpSANE/dev/doc/.htaccess @@ -0,0 +1,4 @@ + +Order allow,deny +Deny from all + diff --git a/www-apps/phpSANE/dev/doc/CHANGELOG b/www-apps/phpSANE/dev/doc/CHANGELOG new file mode 100644 index 0000000..4aa37d9 --- /dev/null +++ b/www-apps/phpSANE/dev/doc/CHANGELOG @@ -0,0 +1,70 @@ + Changelog + ~~~~~~~~~~~ + +* 0.1.1 + - phpSANE verifies that a scanner is connected and does not print + strange errors. + - phpSANE is available in English and German. + - Automatic installation with a bash-script. + +* 0.2.0 + - phpSANE supports preview now. + +* 0.3.0 + - phpSANE supports OCR now (requires gocr). + +* 0.3.1 + - You can specify your scanner manually (if phpSANE does not detect it). + - The automatic installation _should_ do all necessary things now. + +* 0.3.2 + - Fixed bug #1086548 + +* 0.3.3 + - Some feature enhancements by Stefan Bernshausen + +* 0.4.0 + - Fixed bug #1104508 + - Supports feature #1104513 + - Code cleaned up. + +* 0.4.1 + - phpSANE now works without register_global + +* 0.5.0 + - major update by John Walsh + - updated/fixed code for latest PHP 5 + - fixed all functionality for scan options and file types + - added 'Extra' user options input area + - added 'help' page to web interface + - re-write of html and css for more standard/flexible page layout + - cleaned up the config file, and made all options configurable + from the config.php so that no other files need changing + +* 0.5.1 + - minor update by John Walsh + - updated/fixed code for detecting resolutions supported, to include + ranges + +* 0.6.0 + - update by Wojciech Bronisz + - Draw a box when selecting the scan area + - Scanned file does not open pop-up windows (an option in config.php "save_type") + - Scanned files are saved in "output" directory + - While setting scan option is to broadcast the resulting + file name (form field), if the file already exists in the + directory "output" is added to the current date (YYYY-MM-dd HH-mm-ss) + - And other small fixes in the code needed for these things + - Add Polish language program. + +* 0.6.1 + - JS scripting code is not inserted directly into the HTML code + - forms are sent by POST + - changed encoding to UTF-8 with a view to creating translations in other languages + - added finish translation + - added russian translation + - added ukrainian translation + - fixed typo in lineart (monochrom) scan mode + - changed scanner detection routine to avoid webcams detected as scanners + - added support for pdf output through imagemagick + - changed mode option to support scanimage 1.0.21+ diff --git a/www-apps/phpSANE/dev/doc/LICENSE b/www-apps/phpSANE/dev/doc/LICENSE new file mode 100644 index 0000000..5b6e7c6 --- /dev/null +++ b/www-apps/phpSANE/dev/doc/LICENSE @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/www-apps/phpSANE/dev/doc/README_DE.txt b/www-apps/phpSANE/dev/doc/README_DE.txt new file mode 100644 index 0000000..7320e30 --- /dev/null +++ b/www-apps/phpSANE/dev/doc/README_DE.txt @@ -0,0 +1,114 @@ + phpSANE (Version 0.6.0) + ~~~~~~~~~ + +phpSANE ist ein in PHP geschriebenes web-basierendes Frontend für SANE. +Jetzt können Sie auch mit Ihrem Web-Browser scannen. + +Copyright (C) 2009 David Fröhlich + and John Walsh + and Wojciech Bronisz + +Dieses Programm ist freie Software. Sie können es unter den Bedingungen der GNU +General Public License, wie von der Free Software Foundation veröffentlicht, +weitergeben und/oder modifizieren, entweder gemäß Version 2 der Lizenz oder +(nach Ihrer Option) jeder späteren Version. +Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen von +Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die implizite +Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. +Details finden Sie in der GNU General Public License. +Sie sollten eine Kopie der GNU General Public License zusammen mit diesem +Programm erhalten haben. Falls nicht, schreiben Sie an die Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + + +------------------------------------------------------------------------ + +Voraussetzungen: +^^^^^^^^^^^^^^^^ +* SANE +* netpbm +* Apache web-server mit PHP-Unterstützung +* gocr (optional) + + +------------------------------------------------------------------------ + +Installation: +^^^^^^^^^^^^^ +Kopieren Sie einfach das phpSANE-Verzeichnis in Ihr www-root Verzeichnis. +Dann können Sie durch Öffnen der phpsane.php in Ihrem Web-Browser scannen. + + +------------------------------------------------------------------------ + +FAQ: +^^^^ + +F: Wie uberprufe ich, ob mein Scanner arbeitet? + +A: Stellen Sie sicher, dass Ihr Scanner erkannt wurde und auf dem lokalen +Computer ordnunsgemaess funktioniert. Um dies zu ueberpruefen, verwenden +Sie bitte eine der Scanner-Anwendungen. + +Application Menu->Graphics->Scanner Tool +Application Menu->Graphics->The GIMP, File->Aquire->XSane: Device Dialog... + +Sollte Ihr Scanner nicht lokal auf Ihrem Computer funktionieren, wird er +auch nicht mit phpSANE funktionieren. + +---------- + +Q: Mein Scanner wird nicht mit phpSANE gefunden? +Q: Mein Scanner wird erkannt, aber wenn ich Vorschau waehle oder scanne +ist die Bilddatei leer? + +A: Dies ist moeglicherweise auf ein Problem mit der Rechtevergabe +zurueckzufuehren. Versuche :- + +chmod +s /usr/bin/scanimage +chmod 775 WWW_PHPSANE_DIR/tmp + +WWW_PHPSANE_DIR = Der www Bereich, in dem phpSANE verwendet wird. + +z.B.: Stellen Sie sicher, dass Ihr Apache Benutzer scanimage verwenden +kann und Schreibrechte fuer das phpSANE tmp Verzeichnis hat. + +---------- + +Q: phpSANE zeigt fuer meinen Scanner einen anderen Namen/Model an? + +A: In verschiedenen Laendern kann ein Scanner unter unterschiedlichen +Namen und Nummern verkauft werden, obwohl die Hardware identisch ist. +Daher ist es moeglich, dass der Scanner mit einem anderen Namen +aufgefuehrt wird. Zum Beispiel wird die Scannerserie Epson Perfection +in Japan unter dem Namen GT-**** angeboten. + +---------- + +Q: phpSANE funktioniert, aber wenn ich "Scan" verwende passiert nichts? + +A: Zwei Dinge koennen falsch sein:- + +a) Der Scan Bereich ist ungueltig, z.B. haben Sie keinen Bereich zum +Scannen ausgewaehlt. + +b) Wenn ein Scan fertig ist, oeffnet sich ein neues Fenster mit der zu +speichernden Datei - dieses kann durch einen 'pop-up' blockiert +unterdrueckt worden sein. + +---------- + +Q: phpSANE funktioniert, aber wie limitiere ich die Zugangsberechtigung +auf mein internes Netzwerk? + +A: In httpd.conf :- + + + DirectoryIndex phpsane.php + Order Deny,Allow + Deny from all + Allow from 127.0.0.0/8 + Allow from 192.168.1.0/24 + + +------------------------------------------------------------------------ diff --git a/www-apps/phpSANE/dev/doc/README_EN.txt b/www-apps/phpSANE/dev/doc/README_EN.txt new file mode 100644 index 0000000..c0e8bf8 --- /dev/null +++ b/www-apps/phpSANE/dev/doc/README_EN.txt @@ -0,0 +1,113 @@ + phpSANE (Version 0.6.0) + ~~~~~~~~~ + +phpSANE is a web-based frontend for SANE written in PHP. +Now you can scan with your web-browser, too. + +Copyright (C) 2009 David Froehlich + and John Walsh + and Wojciech Bronisz + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; either version 2 of the License, or (at your option) any later +version. +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +details. +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., 59 +Temple Place, Suite 330, Boston, MA 02111-1307, USA. + + +------------------------------------------------------------------------ + +Requirements: +^^^^^^^^^^^^^ +* SANE +* netpbm +* Apache web-server with PHP-support +* gocr (optional) + + +------------------------------------------------------------------------ + +Installation: +^^^^^^^^^^^^^ +Just copy the phpSANE-directory into your www-root. +Then you can scan by opening phpsane.php in your web-browser. + + +------------------------------------------------------------------------ + +FAQ: +^^^^ + +Q: How do I check if my scanner is working ? + +A: Before trying phpSANE, it is a good idea to make sure that your +scanner is detected and working from the local machine. To do this, +just use one of the scanner applications :- + +Application Menu->Graphics->Scanner Tool +Application Menu->Graphics->The GIMP, File->Aquire->XSane: Device Dialog... + +If your scanner does not work directly from your machine, then it will +not work through phpSANE. + +---------- + +Q: My scanner isn't found by phpSANE ? +Q: My scanner is detected, but when I preview or scan, the image file +is empty ? + +A: this is probably a permissions problem, try :- + +chmod +s /usr/bin/scanimage +chmod 775 WWW_PHPSANE_DIR/tmp + +WWW_PHPSANE_DIR = the www file area you put phpSANE at. + +ie. Make sure that your apache user is able to scan with scanimage, +and your apache user must have write-access to the phpSANE tmp directory. + +---------- + +Q: phpSANE is showing my scanner by a different name/model ? + +A: In different regions of the world, a scanner may be sold by different +model names and numbers, but the internal hardware is exactly the same. +So it may be that to the SANE project, the scanner is recognised by a +different name to the one that you know your scanner as. For example, +the Epson Perfection range of scanners are sold in Japan under the +model names GT-****. + +---------- + +Q: phpSANE is working, but when I 'Scan', nothing happens ? + +A: There could be two things wrong :- + +a) the 'Scan Area' could be invalid, +ie. you have not selected an area to scan. + +b) when a scan completes, a new window is opened with the scan +results to allow you to save it - this may be blocked by a +'pop-up' blocker. + +---------- + +Q: phpSANE is working fine, but how do I restrict access to it to my +internal network only ? +A: in httpd.conf :- + + + DirectoryIndex phpsane.php + Order Deny,Allow + Deny from all + Allow from 127.0.0.0/8 + Allow from 192.168.1.0/24 + + +------------------------------------------------------------------------ diff --git a/www-apps/phpSANE/dev/doc/README_PL.txt b/www-apps/phpSANE/dev/doc/README_PL.txt new file mode 100644 index 0000000..b4dd57d --- /dev/null +++ b/www-apps/phpSANE/dev/doc/README_PL.txt @@ -0,0 +1,116 @@ + phpSANE (Version 0.6.0) + ~~~~~~~~~ + +phpSANE jest interface'em do obsługi skanera napisanym w języku PHP +wystarczy że skaner podłączony jest do komputera gdzie masz zainstalowany +serwer www wraz z php, a użytkownik końcowy wystarczy że skorzysta +z przeglądarki www - oro sposób na 'udostępnienie' dowolnego skanera w sieci +lokalnej. + +Copyright (C) 2009 David Froehlich + and John Walsh + and Wojciech Bronisz + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; either version 2 of the License, or (at your option) any later +version. +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +details. +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., 59 +Temple Place, Suite 330, Boston, MA 02111-1307, USA. + + +------------------------------------------------------------------------ + +Requirements: +^^^^^^^^^^^^^ +* SANE +* netpbm +* Apache web-server with PHP-support +* gocr (optional) + + +------------------------------------------------------------------------ + +Installation: +^^^^^^^^^^^^^ +Just copy the phpSANE-directory into your www-root. +Then you can scan by opening phpsane.php in your web-browser. + + +------------------------------------------------------------------------ + +FAQ: +^^^^ + +Q: How do I check if my scanner is working ? + +A: Before trying phpSANE, it is a good idea to make sure that your +scanner is detected and working from the local machine. To do this, +just use one of the scanner applications :- + +Application Menu->Graphics->Scanner Tool +Application Menu->Graphics->The GIMP, File->Aquire->XSane: Device Dialog... + +If your scanner does not work directly from your machine, then it will +not work through phpSANE. + +---------- + +Q: My scanner isn't found by phpSANE ? +Q: My scanner is detected, but when I preview or scan, the image file +is empty ? + +A: this is probably a permissions problem, try :- + +chmod +s /usr/bin/scanimage +chmod 775 WWW_PHPSANE_DIR/tmp + +WWW_PHPSANE_DIR = the www file area you put phpSANE at. + +ie. Make sure that your apache user is able to scan with scanimage, +and your apache user must have write-access to the phpSANE tmp directory. + +---------- + +Q: phpSANE is showing my scanner by a different name/model ? + +A: In different regions of the world, a scanner may be sold by different +model names and numbers, but the internal hardware is exactly the same. +So it may be that to the SANE project, the scanner is recognised by a +different name to the one that you know your scanner as. For example, +the Epson Perfection range of scanners are sold in Japan under the +model names GT-****. + +---------- + +Q: phpSANE is working, but when I 'Scan', nothing happens ? + +A: There could be two things wrong :- + +a) the 'Scan Area' could be invalid, +ie. you have not selected an area to scan. + +b) when a scan completes, a new window is opened with the scan +results to allow you to save it - this may be blocked by a +'pop-up' blocker. + +---------- + +Q: phpSANE is working fine, but how do I restrict access to it to my +internal network only ? +A: in httpd.conf :- + + + DirectoryIndex phpsane.php + Order Deny,Allow + Deny from all + Allow from 127.0.0.0/8 + Allow from 192.168.1.0/24 + + +------------------------------------------------------------------------ diff --git a/www-apps/phpSANE/dev/download.php b/www-apps/phpSANE/dev/download.php new file mode 100644 index 0000000..1461d16 --- /dev/null +++ b/www-apps/phpSANE/dev/download.php @@ -0,0 +1,65 @@ + 0) { + create_zip($selected_file_paths, $zipfile_path, true); + if(is_readable($zipfile_path)) { + //output path to created file + echo $zipfile_path; + } + } + } + + + /* creates a compressed zip file */ + function create_zip($files = array(),$destination = '',$overwrite = false) { + //if the zip file already exists and overwrite is false, return false + if(file_exists($destination) && !$overwrite) { return false; } + //vars + $valid_files = array(); + //if files were passed in... + if(is_array($files)) { + //cycle through each file + foreach($files as $file) { + //make sure the file exists + if(file_exists($file)) { + $valid_files[] = $file; + } + } + } + //if we have good files... + if(count($valid_files)) { + //create the archive + $zip = new ZipArchive(); + if($zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) { + return false; + } + + //add the files + foreach($valid_files as $file) { + $zip->addFile($file, basename($file)); + } + + //close the zip + $zip->close(); + + //check to make sure the file exists + return file_exists($destination); + } + else + { + return false; + } + } +?> \ No newline at end of file diff --git a/www-apps/phpSANE/dev/help/help_0.php b/www-apps/phpSANE/dev/help/help_0.php new file mode 100644 index 0000000..8a9fbd9 --- /dev/null +++ b/www-apps/phpSANE/dev/help/help_0.php @@ -0,0 +1,182 @@ + + + + + + + +phpSANE: help + + + + +phpSANE: Hilfe + + +

+Scan-Bereich +

+ +

+Das Wählen einer Seitengröße stellt die erforderlichen +Größen der Seiten ein. +

+ +

+Ein Klick auf 'Bildvorschau' setzt die gewählte Ecke +(oben linkes oder unteren rechts) an die Cursorposition. +

+ + +

+Scan-Wählen +

+ +

+Nur die grundlegendsten Einstellmöglichkeiten werden direkt +unterstützt, wie die Einstellung der Bildqualität +(-Modus und -Auflösung) +und das zu speichernde Dateiformat. +

+ +

+Extra :- +

+ +

+Für Ihren Scanner lautet die gesamte Liste von Optionen +(Hilfe: scanimage - h) :- +

+ +

+

+{$sane_help}
+
+

+ + +

+Extraoptionen, +die Sie dem Scan-Befehl hinzufügen möchten, +können Sie in das 'Extra' Feld eintragen. +

+ +

+Anmerkung: Unzulässige Buchstaben werden durch ein 'x' ersetzt. +

+ +

+z.B. Steuerung der Helligkeit :- +

+ +

+Die Angabe ist nicht bei allen Scannern gleich. +Demnach müssen Sie probieren, +welche Angabe Ihr Scanner erfordert. +Es kann ein Prozentsatz sein, +oder eine Zahl (z.B. -4..3). +

+ +

+z.B.
+--brightness=50%
+--brightness 2
+

+ + +

+Befehlsfelder +

+ +

+Vorschau :- +

+ +

+Scant den vollständigen Bereich in einer niedrigen Auflösung, +so dass Sie Ihr Dokument ansehen und Ausschnitte auswählen +können. +

+ + +

+Scannen :- +

+ +

+Scant den vorgewählten Bereich und speichert ihn in +der Ausgabedatei (Bild oder Text). +

+ + +

+OCR :- (nur vorhanden wenn 'gocr' installiert ist) +

+ +

+Scant und verwendet OCR, +um den Inhalt in eine ASCII-Textdatei umzuwandeln. +

+ +

+Empfohlen wird Grayscale bei 300dpi oder mehr. +

+ + +

+Zurücksetzen :- +

+ +

+Lädt die Seite neu, +aber veraendert sonst nichts. +

+ + +

+Zurüecksetzen :- +

+ +

+Stellt alle Parameter auf ihre Ausgangswerte zurück und +löscht die Vorschau. +

+ + +

+Scan Befehl +

+ +

+Unten auf der Seite wird die Befehlszeile angezeigt, +mit der der Scan durchgefuehrt wurde. +Dies erlaubt Ihnen, +den Befehl im Falle von Fehlern manuell zu +überprüfen und zu verändern. +

+ +EOT; + +?> + + + + diff --git a/www-apps/phpSANE/dev/help/help_1.php b/www-apps/phpSANE/dev/help/help_1.php new file mode 100644 index 0000000..39f411c --- /dev/null +++ b/www-apps/phpSANE/dev/help/help_1.php @@ -0,0 +1,182 @@ + + + + + + + +phpSANE: help + + + + +phpSANE: Help + + +

+Scan Area +

+ +

+Choosing a page size will set the required page dimensions. +

+ +

+Clicking on the 'preview image' area will set the appropriate +corner (top left or bottom right) to the mouse position. +

+ + +

+Scan Options +

+ +

+Only the most basic options are supported directly, +that give you control over the image quality +(--mode and --resolution) +and the file format type to save the image as. +

+ +

+Extra :- +

+ +

+For your scanner, +the full list of options (from: scanimage -h) is :- +

+ +

+

+{$sane_help}
+
+

+ + +

+Any extra options you want to add to the scan command, +you can add them in this 'extra' field. +

+ +

+NB. Invalid characters are replaced with an 'X'. +

+ +

+eg. To control the brightness :- +

+ +

+The value is not stanard across all scanners, +so you need to see what options your scanner takes. +It may be a percentage, +or a number in a range (eg. -4..3). +

+ +

+eg.
+--brightness=50%
+--brightness 2
+

+ + +

+Action Buttons +

+ +

+Preview :- +

+ +

+Does a scan of the whole area, +at a low resolution and displays it, +so you can view your document and select areas from it. +

+ + +

+Scan :- +

+ +

+Does a scan of the area selected and lets you save the +output file (image or text). +

+ + +

+OCR :- (only available if 'gocr' is installed) +

+ +

+Does a scan and uses OCR to convert the contents into an ASCII text file. +

+ +

+Recommend using Grayscale at 300dpi or above. +

+ + +

+Reset :- +

+ +

+Re-loads the page, +but does nothing else. +

+ + +

+Clean :- +

+ +

+Resets all parameters to their default values and clears the preview. +

+ + +

+Scan Command +

+ +

+At the bottom of the page, +the command line used to perform the scan is displayed. +This allows you to manually check the format of the command +in case of errors. +

+ +EOT; + +?> + + + + diff --git a/www-apps/phpSANE/dev/help/help_2.php b/www-apps/phpSANE/dev/help/help_2.php new file mode 100644 index 0000000..2ce6b89 --- /dev/null +++ b/www-apps/phpSANE/dev/help/help_2.php @@ -0,0 +1,183 @@ + + + + + + + +phpSANE: help + +'; + + +// Polish Help +// ============ + +$SCANIMAGE = "/usr/bin/scanimage"; +$cmd = $SCANIMAGE . " -h"; +$sane_help = `$cmd`; +unset($cmd); + +$start = strpos($sane_help, "\nOptions specific to device") + 1; +if ($start !== FALSE) +{ + $sane_help = substr($sane_help, $start); +} + +$start = strpos($sane_help, "\nType ``scanimage --help"); +if ($start !== FALSE) +{ + $sane_help = substr($sane_help, 0, $start); +} + +echo << +phpSANE: Help + + +

+Scan Area +

+ +

+Choosing a page size will set the required page dimensions. +

+ +

+Clicking on the 'preview image' area will set the appropriate +corner (top left or bottom right) to the mouse position. +

+ + +

+Scan Options +

+ +

+Only the most basic options are supported directly, +that give you control over the image quality +(--mode and --resolution) +and the file format type to save the image as. +

+ +

+Extra :- +

+ +

+For your scanner, +the full list of options (from: scanimage -h) is :- +

+ +

+

+{$sane_help}
+
+

+ + +

+Any extra options you want to add to the scan command, +you can add them in this 'extra' field. +

+ +

+NB. Invalid characters are replaced with an 'X'. +

+ +

+eg. To control the brightness :- +

+ +

+The value is not stanard across all scanners, +so you need to see what options your scanner takes. +It may be a percentage, +or a number in a range (eg. -4..3). +

+ +

+eg.
+--brightness=50%
+--brightness 2
+

+ + +

+Action Buttons +

+ +

+Preview :- +

+ +

+Does a scan of the whole area, +at a low resolution and displays it, +so you can view your document and select areas from it. +

+ + +

+Scan :- +

+ +

+Does a scan of the area selected and lets you save the +output file (image or text). +

+ + +

+OCR :- (only available if 'gocr' is installed) +

+ +

+Does a scan and uses OCR to convert the contents into an ASCII text file. +

+ +

+Recommend using Grayscale at 300dpi or above. +

+ + +

+Reset :- +

+ +

+Re-loads the page, +but does nothing else. +

+ + +

+Clean :- +

+ +

+Resets all parameters to their default values and clears the preview. +

+ + +

+Scan Command +

+ +

+At the bottom of the page, +the command line used to perform the scan is displayed. +This allows you to manually check the format of the command +in case of errors. +

+ +EOT; + +?> + + + + diff --git a/www-apps/phpSANE/dev/help/help_4.php b/www-apps/phpSANE/dev/help/help_4.php new file mode 100644 index 0000000..583abda --- /dev/null +++ b/www-apps/phpSANE/dev/help/help_4.php @@ -0,0 +1,167 @@ + + + + + + + +phpSANE: help + + + + +phpSANE: Помощь + + +

+Область сканирования +

+ +

+Установите требуемые размеры сканирования, выбрав формат страницы. +

+ +

+Отметьте требуемую область сканирования, кликнув мышью в окне предварительного просмотра, указав в начале левый верхний угол, затем правый нижний угол требуемой области сканирования. +

+ + +

+Параметры сканирования +

+ +

+Здесь доступны только основные параметры установки качества сканирования (--mode и --resolution), а также формат файла, в котором будет сохранено сканируемое изображение. +

+ +

+Дополнительно :- +

+ +

+Полный список возможных настроек сканирования для Вашего сканера (из: scanimage -h):- +

+ +

+

+{$sane_help}
+
+

+ + +

+Любые дополнительные опции сканирования вы можете ввести в поле "Дополнительные параметры" +

+ +

+NB. Все неподдерживаемые символы заменены на 'X'. +

+ +

+К примеру, для контроля яркости сканирования :- +

+ +

+Данное значение поля не является общим для всех сканеров. +Оно может быть указано как в процентах, так и в определенном номерном диапазоне (например -4..3). +

+ +

+Пример:
+--brightness=50%
+--brightness 2
+

+ + +

+Кнопки действий +

+ +

+Просмотр :- +

+ +

+Отображает в низком разрешении для просмотра всю страницу целиком, для того, чтобы можно было выбрать требуемую область для сканирования. +

+ + +

+Сканировать :- +

+ +

+Сканирует выбранную область и сохраняет ее в файл (графический или текстовый, если выбрано распознавание текста ("OCR")). +

+ + +

+OCR :- (доступно, если установлена программа 'gocr' (поддерживается только английский язык)). +

+ +

+Сканируется, распознается и сохраняется в ASCII текстовый файл. +

+ +

+Рекомендуется использовать Оттенки серого с разрешением 300dpi или выше. +

+ + +

+Сброс :- +

+ +

+Только перечитывание страницы. +

+ + +

+Очистить :- +

+ +

+Сбросить все параметры в значения по умолчанию и очистить область предварительного просмотра. +

+ + +

+Команда сканирования +

+ +

+Внизу страницы отображается командная строка с параметрами сканирования. Это позволяет вручную проверить правильность формата команды в случае ошибок. +

+ +EOT; + +?> + + + + diff --git a/www-apps/phpSANE/dev/help/help_6.php b/www-apps/phpSANE/dev/help/help_6.php new file mode 100644 index 0000000..2768745 --- /dev/null +++ b/www-apps/phpSANE/dev/help/help_6.php @@ -0,0 +1,182 @@ + + + + + + + +phpSANE: help + + + + +phpSANE: Aide + + +

+Aire de numérisation +

+ +

+Choisir le format pour fixer la dimension de la page. +

+ +

+Cliquer sur 'prévisualisation' pour fixer les coins +(haut gauche et bas droit) à la position de la souris. +

+ + +

+Options de numérisation +

+ +

+Seules les options basiques sont supportées directement, +afin de contrôler la qualité de l'image +(--mode et --resolution) +ainsi que le format du fichier à créer. +

+ +

+Extra :- +

+ +

+Pour votre scanner, +la liste complè des options (à partir de : scanimage -h) est :- +

+ +

+

+{$sane_help}
+
+

+ + +

+Chaque option suppl´mentaire que vous voulez utiliser +à la commande de numérisation peut être +ajoutée au champs 'extra'. +

+ +

+NB: Les caractères invalides sont remplac´s par 'X'. +

+ +

+ex: Pour contrôler la luminosité :- +

+ +

+La valeur n'est pas standard selon les scanners, +vous devez donc vous aviser des options que votre scanner utilise. +Ce peut être un pourcentage ou un nombre dans une plage (ex: -4..3). +

+ +

+ex:
+--brightness=50%
+--brightness 2
+

+ + +

+Boutons d'action +

+ +

+Prévisualiser :- +

+ +

+Fait une numérisation en basse résolution +de toute la page et vous donne un aperçu qui permet +de sélectionner l'aire à numériser. +

+ + +

+Numériser :- +

+ +

+Lance la numérisation de l'aire sélectionnée +sous le nom de fichier choisi (image ou text). +

+ + +

+ROC :- (si 'gocr' est installé uniquement) +

+ +

+Numérise et utilise la reconnaisance optique de caractère (ROC) +pour convertir le contenu en fichier text ASCII. +

+ +

+Il est recommandé de numériser en nuances de gris à 300 dpi (ppp). +

+ + +

+Recharger :- +

+ +

+Recharge la page, un point c'est tout. +

+ + +

+Réinitialiser :- +

+ +

+Remet le formulaire aux valeurs par défaut et vide la prévisualisation. +

+ + +

+Commande de numérisation +

+ +

+La ligne de commande utilisée pour lancer la numérisation +est affichée à la fin de la page. +Ceci vous permet de vérifier le format de la commande +en cas d'erreurs. +

+ +EOT; + +?> + + + + diff --git a/www-apps/phpSANE/dev/help/help_7.php b/www-apps/phpSANE/dev/help/help_7.php new file mode 100644 index 0000000..2ce6b89 --- /dev/null +++ b/www-apps/phpSANE/dev/help/help_7.php @@ -0,0 +1,183 @@ + + + + + + + +phpSANE: help + +'; + + +// Polish Help +// ============ + +$SCANIMAGE = "/usr/bin/scanimage"; +$cmd = $SCANIMAGE . " -h"; +$sane_help = `$cmd`; +unset($cmd); + +$start = strpos($sane_help, "\nOptions specific to device") + 1; +if ($start !== FALSE) +{ + $sane_help = substr($sane_help, $start); +} + +$start = strpos($sane_help, "\nType ``scanimage --help"); +if ($start !== FALSE) +{ + $sane_help = substr($sane_help, 0, $start); +} + +echo << +phpSANE: Help + + +

+Scan Area +

+ +

+Choosing a page size will set the required page dimensions. +

+ +

+Clicking on the 'preview image' area will set the appropriate +corner (top left or bottom right) to the mouse position. +

+ + +

+Scan Options +

+ +

+Only the most basic options are supported directly, +that give you control over the image quality +(--mode and --resolution) +and the file format type to save the image as. +

+ +

+Extra :- +

+ +

+For your scanner, +the full list of options (from: scanimage -h) is :- +

+ +

+

+{$sane_help}
+
+

+ + +

+Any extra options you want to add to the scan command, +you can add them in this 'extra' field. +

+ +

+NB. Invalid characters are replaced with an 'X'. +

+ +

+eg. To control the brightness :- +

+ +

+The value is not stanard across all scanners, +so you need to see what options your scanner takes. +It may be a percentage, +or a number in a range (eg. -4..3). +

+ +

+eg.
+--brightness=50%
+--brightness 2
+

+ + +

+Action Buttons +

+ +

+Preview :- +

+ +

+Does a scan of the whole area, +at a low resolution and displays it, +so you can view your document and select areas from it. +

+ + +

+Scan :- +

+ +

+Does a scan of the area selected and lets you save the +output file (image or text). +

+ + +

+OCR :- (only available if 'gocr' is installed) +

+ +

+Does a scan and uses OCR to convert the contents into an ASCII text file. +

+ +

+Recommend using Grayscale at 300dpi or above. +

+ + +

+Reset :- +

+ +

+Re-loads the page, +but does nothing else. +

+ + +

+Clean :- +

+ +

+Resets all parameters to their default values and clears the preview. +

+ + +

+Scan Command +

+ +

+At the bottom of the page, +the command line used to perform the scan is displayed. +This allows you to manually check the format of the command +in case of errors. +

+ +EOT; + +?> + + + + diff --git a/www-apps/phpSANE/dev/images/.htaccess b/www-apps/phpSANE/dev/images/.htaccess new file mode 100644 index 0000000..1c8c9bf --- /dev/null +++ b/www-apps/phpSANE/dev/images/.htaccess @@ -0,0 +1,6 @@ + + #one year + + Header set Cache-Control "max-age=29030400, public" + + \ No newline at end of file diff --git a/www-apps/phpSANE/dev/images/btn_accept.png b/www-apps/phpSANE/dev/images/btn_accept.png new file mode 100644 index 0000000000000000000000000000000000000000..db8e5178d4c5b62a79917bcea6f362c2bfc8bff1 GIT binary patch literal 1987 zcwPa+2R!(RP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*w= z4jKc|33>7W00%=!L_t(Y$BmX8!o}Xkro^+i_xI#|`j)KBNy+eWI#bpbw}Lk&Hwtp?-=+r4mV_U_zV(LTx9z_Ika$ z*|m4Q>z$q1ow>IUcB(=t;YdgKO84mej_%bx|D*9acJk!OU`IzsSO^j6=;#PXB9UIp zvi9k^zDEeLI}ix$@_nz?Y&vh2%jLJ4&1QCbdb-9JFzxQfG)-~p)Tu*4i2Xu{1D&0n zqp4IXnM@{QiOxhk5{^VWIy!`D8t8_Jq3h^|f$z1c*EgtEtL=0;y|}Qj@DJB@UpagB z?B#ocPoF;hNN;cNJA;FR^rU*|>FpsBiJ+vU?RiM)(P$K3Dx~x`0ZO5y zLQ1*mY6~bOO8Q6zzVtz<&0@BS@H~%7rNY|Unww6iKT4<5e|25=)#>T!+W`8hQ>VtK zrlx*z<%17EDZEyTpcTR}41^E}ZPPWOp=laI2sCYLujyz)+dKy}ZS&>s##teYWHMm4kM*R zD6w_T>JzJ!l3J~X>$-TJN4wRc-S$vQB6NXeg)vPNAq2z2!_;cEGr&2+bzRf*JY3i1 zt4}<_&z){ArRVwA?YB8Nv7c>SUG$_<2*bcIj7{Ly^(!T*R4Q!L>)5u9ZQJ<1kLP)K zzK@bp2_ZD!_wl8~X*NB_aT)-|+}vCyolcWXCNWKuZ#}$&U!50dVvv{qaGl3@-(+NH znBM+ALLm#G>!1{^b_=KJ(6DXRR#!=I72bm zBHsNxk#LM{mf~6gruLW^!sL3vV@*#*2II~%yLR-yGkfh?{_c0u0p&Q(ap~Hs{Z`XC5 zP$cM!UU9uSxz9jnKt<+q6jzeYUSO(+^?XIGFf z@8}@V5unnx$a`_)KzIAuTyFW=?Ck8k{$I^x{no8pg|4oyrzR#Qg0AB-(4VBVRzV1p zZBdiuT9_Z5_&RTu-=rOKFd`bJr8AV=$5Zz|&a)3paC{K<_ku4qa_b;;gSe%Wt++h7 zFBS}ig3t8#_y1k{R11xcjEwx`%$YMko;+|s6GA5vvG~pT414#E(rRn$NCb%|Ztz~| z0ux=6?2aA4AV}SXiUYZIpKQe=yK0juR;X_@u!PILc%8!o2FYz*yngoeKWm@Szwe)# zntJVLXU;qviN**812}D;-~Mx*iP4=1&0w@AgsE$+IvTDgY5N|lb%!hS1#*QlABe4jU_-?*-S26%mOad9Ock3TsvK5n&IEfVn5@sXZK*s|#D?L|sSCX-=lX(|6% zU?ru@=W;oH&*BeR&HvbKh0S?EG15D2hVUZq~E1F)RSapB^{7q!pR>Odgy z=nJP`IQ#tfo=@G?n{}GI~=Yf=)#cah@s#S`G0@>^`muKGl-GvM9{=oPg zuyS4Z;Op!byo5#&6Rw9V=0@h zl2&%c@He1l++#FqW-^)AUU~J^abL=(j~qFIX_`o>Bc)HNRAOaig=}`2 zrRM?#p1lh=2b6$1U<2MKX0ChK0|NsC-ya_zf2^;!FA9oE zwc5k5(1~h>-AirQf{tbyE V*3gKEF$Mqt002ovPDHLkV1jU{(Fgzl literal 0 HcwPel00001 diff --git a/www-apps/phpSANE/dev/images/btn_preview.png b/www-apps/phpSANE/dev/images/btn_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..03d73d1463c2709afeae81ca33dc7032fc70ae62 GIT binary patch literal 1239 zcwPb51StE7P)iAQ67gO0)G$%%=#N-m!DV41-ze)ziJL}_&F z`kd94aI9Kmfx&2mq{t8@2@~Vv7#?t+t?dWTRh-HDPk@TDDranrc8WKHA1d|m8EX(2H=m@U=(1eEX>knS2D)qS&=J27yq>Sxpx7NjNLST>)94*-t zpo5MkJ)#V+mV6$f?n#B{I2{K1`cQkm1UK3`L+cu=rHYyogDj#9`Exs}iYRDB1wy58I7)v{qMl9?kzEeM!L8*6T`SVj^_@{t##f z9#Mgw^k*3bJXu5+)oRV``Q*^d=S3Dnz5Qr7S&V|BuNa?zh=c^NwCZUBs2(u?_|Ism z<`c>b_cSk%DQ;fDUws2;KKm^SihTf@8(WmU5x^s$}Z$kxxUH1k~0v46Kcdi}D1S5kS&&IvvR)gIPq-P zFSvHO_VPC;igqsvC_H-dgB`mwKO6G5P-U<*7_Fg*^H?I8BoQPTyg=I1%H1?vvo1_^ z*5XoG&8v++*PZj(Xw8j3DS;L%9_r07kinded|(+(DAiz@%10#gd4hPo)E{b>*xPWW zuIAqHQ^lKoHk$hLN#2*ayI#yHaqCSOX3Wsj`;;G4?ppn802+eGkOvC5(H=N%wIWC# zVteQPeeq8OsF8o9C?_d3zLYbDV^}g_76IggJYS|{f=HU{-4h6OJ%GLICbD*HgI=%4 zvHZfxKW=xG-n`lMhEISRAH8=dbz|aFRqG-xR?ZL#7p+(#W7Y2Eq$xOidvVX!)18>G zB|biFGaBj}(DGvwp52;>@2V@yY_>bOJ^>4{|IH6$4Elh*rq!Way>9m^a%618IovTl zH~sm!@>4Sh_UFAk{p7&sQ(1}6kfOBYMBx*$fH8L_Xt)d_}tTEA$=#X-` zT?FAVK01nre~#Ez3{WF2E!`@Lq9ZIUj2cp=e&I1W_K4(RS0>ToNKW2jpq literal 0 HcwPel00001 diff --git a/www-apps/phpSANE/dev/images/filetype_bmp.png b/www-apps/phpSANE/dev/images/filetype_bmp.png new file mode 100644 index 0000000000000000000000000000000000000000..cf9be3a740df3b0f4fc78b998d58924f5b737573 GIT binary patch literal 1738 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 DD-aOf literal 0 HcwPel00001 diff --git a/www-apps/phpSANE/dev/images/filetype_other.png b/www-apps/phpSANE/dev/images/filetype_other.png new file mode 100644 index 0000000000000000000000000000000000000000..51c133fe6b5247a6be784396baa72462d3925724 GIT binary patch literal 1222 zcwPa<1UdVOP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*w@ z5dbtii5j*500c%!L_t(Y$E}vjZyQw<#=m>#72D%SW1CQ-wh9ufBGGQks+CHYMQpl( zibYpdL{zbe6p1wpBorjdhGfAeW!usfe?hlJ$qGfKjnYEKu_qIcJ-##d92S0%q}Pt2 z9O=q4_L=+hch6&vz!>}a!Grw5!osI-&CPwHl-f~B1xb=L;yB(5Tdl@ldwY#Ij$2Bp zE&y1TH28Utd4-!KF*z zzPqsSxoz9VKgG;Ql|q(f;64TdOhsCc=3Z#hSs_v0H`!Yxm*_g{fs8YTpxE5LL5X9q!3`B zX@qvW-F@z#A&3YQpi|lK$QeMABn=}pj^ll127~}JAA_1=#>@}{-{I$LMg#^Bx7+(h zXtUL7VgNHiPi{I=GJp=Rk1?4c0EA(MUy}NdjgTCxOEl^O1OKtxtsl5WOTpPbsrfX<1RP*L&?jB7)W$M1clnP+%R_AW0kAG_b$+QQ=EA`Ze3_wL<0 znZCnj(#z-b%Ba-${VdJ0h=@SU#&z}TRXl$D7(ozVdwUyq?%V+Ye1HGG`57XlX&U*y zpBW4K;lqdS`E%zs-nM!7y?e6XZ04`pTw9mfF?wQ0(Z6h#s4-n|O|SXx>dmC;e9 zL5FrIY~R@gR{V zDgEsBZ2-W=#s+TOxB)Ww3II$5FuOtsVT3BBP$(3N#0;LY;eT}fdVgbc#|JY*N?A<1 zU9-}|D3YaOu`*2}1$%qOUTX@Ol(G^`b{`d=0^!?LW>VY_XamA2ci zWm#o9k_6-I?XzbA0Dr!EHR**4CW5rAa;MX=$Hg>f+x7@JO-xTcULsghI!ThaMyMs_ ztm8P~zD*ie@N&=;PJ=Qt9LE8e%l4SwTa!|Phy+ckbmF+uSIV|+3&(M0jnGP^GCO*m zF#~T1<-SrOgg~WIshVGH`FxF!P6%%Z9ZePhip8QC>bY)pRHNex{@)RYYB4i2V}`n} zTOT;G0L1??g7#Gi$8l;#Xp$sBr`zrNzMqQ@4_W*(cTSq(O`#OS>CW>!5x3haO;hu@ z5(L3FTI-gs*T3=$h52DjwAMl?MOl`0vMh_V))6r$gEGromQ}KCyJXvT&UIZOr5ui= k;vfwF2!i12X0y5eH*q4SKnm3L-v9sr07*qoM6N<$f?m)sivR!s literal 0 HcwPel00001 diff --git a/www-apps/phpSANE/dev/images/filetype_pdf.png b/www-apps/phpSANE/dev/images/filetype_pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..57c7b5ef933d77908cd06f75e7bc37e9f2106875 GIT binary patch literal 1537 zcwPYk2LAbpP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*q+ z4+0(}?~$(n00n_bL_t(Y$CZ{}Y+Oeb#(!sa?(W*Poh^+VV@s)tLaew_2qhJDXlVop z2?t~z%413>Z$zZ3ctBJFiSke$N)eAxMB4B`M39P9#Zn}M)Q3Kx5=TuOQ^}2Om6F8W zB(>xHd+(h&JlwnM>$SJpj`r%#&Yd~meCK>~&ImiSH{SUB~|a&UZnG7ugR zNQ`cpmewzei~u&LK+M2^XJBApGz`Pvt*@^Kv$L~*n4X?)1IwvH-#l@w{N8IqX!71+ z9ayIX8k2JnsFHI+;6nlzAtG4kvEH}0Vgy7%P>>wgU->n zt1ZT+(OB=(WE}!1V26e%J@Et&OiUoE6hFV8fv-MEetbLu*)>G**i#ga9!*zhx>`V$ zN_iD)EkO`4Iyze1yLa!)zz=6y?PBfxd4^A%;Nw^S$b%S|CX*YTfhad)*>R5N+p0kW8{_PJK4lP{z>&O=Q1FYVGG6>rlzJ45xn<=VaUeDM*s5i(rQw@i@WT(;ed-kX&y*;?_$&Ix#&CD;q_Z_~sB98eRlN7)^ZE9FV+rwNN2FTG6OHLyNLL}->jBA&avf4)UZ)SRJVjtG^Hwr;$w%~ zpxFdsjKNx)P%*{^kn~4JMmT-?$6uP6nR$C;WJE+{$Bd*I(9XWK7Gq2sF#Ek+E=Lx? z`?#GgZru1ElarHCp-`YuD12(b&VJ|HdyoC3eA)@9s@sh8+RqBC>yc?qYPm=MdJgma zb663aDv?5nC-OO(>Ig~4)DbE)6hf4>pT5A?PoLhjql)1^Z3{cVsp1eEidW#kKHUEO zs0v;^4#fc;#jCP({W{LMEq2WPz*-YyRqCo#RjH|`p-R(3Zu;BA&1S+{J&_k8)zlk` zvT38O;$E3LuhhIx9_OihrH<0PdzWbBvxMHaT^gb^fhegv+emZ+P0#n{#7LEzhni0q z*A(jNS-&(#;ph}~g$7E)D^0J2Km@36_gXjg`cApWs?^k>fCs!Pu?l^qAqEdVLR}$B z$08A8uS6)G?P@l?xVFW#qDsXp74NC2QdJ0!e3}2gewM-SJxvWmU7)F+P$5h=*m=}! zPpVZV@=DeDl&PQygHw-l`<;Jt=h{^c9RC@Uj~}JHv_x(7CiTVlS)IFt+rid-)$6^- zdrzcF6``U+71+S=;CE)IL{04H_HpUOU+}M=zd-Ze8fIV+Ke~swSnNHf+3e9~s-B8> zfH3&Q#~Ay@*H}3FI%^B_c=c#{cK>tcOcL`Tz&VH8A$@)#Xf`XwKviLAVuFXJzs1KN ze8A25c|4lBT+ajTw;XweGHYftg0pgLbeF0 zC(vvhB83eFt=G9bHwW4(hM<0H9Z$w39oxoKdRFg4M~+Z@<{7HhYR3Joi+C%|C5$Bn z7KPoDk8HDTd(FMO_wD1^mww%~wCyyWEtOeO_7v0h?Z=q=7U^zvG<$>S2D-7hxOj7Q nb+y>d(5D$|5mr^I)oSJcT^RFppZJ4f00000NkvXXu0mjfle6hO literal 0 HcwPel00001 diff --git a/www-apps/phpSANE/dev/images/filetype_png.png b/www-apps/phpSANE/dev/images/filetype_png.png new file mode 100644 index 0000000000000000000000000000000000000000..f908fe529948cd38fd42c6344eeef7ef4e41072b GIT binary patch literal 1930 zcwPaD2X**~P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*q+ z4+0V`S>1#H00#<5L_t(Y$CZ|AY#dh=$A9buIt!Nh|?raf*L19G$?7* zl!BU21uDMuLt8;XJVc8SAdsMyfDb%Ws1VR1D$yd42nbXjiravw+K{G?2$EK5NSnmj zD6!*syT2yaEHNFl*Aebi-QmXBb>&(01JS#Ktg~NJh(H){$00l>eMN^y1HuFZ1&4S zh$ovK%gS8E$69F-E#8BfE=Ja`qN6Pi!0(94Xq@d^c%=cm#t;G zFo#kK*LCUZ>x&N#4n7JzFgiM_0A$PMg_i~H`QQj)qsF#fcDYoC( z%kV&o&+XkpEztC(5)CVMk@5(XQV1dF>guAuzu#ZIdhkbD>rWm$cu=V(L%SFpsMJFu ztpPal=0!e!>jp+&I}gDA_pjygXHPQR-;HfD6^jittQCtz4jnp#QVL^?@4D_|VHig0 zooLNre@~L{9r$M>Dz)Z!hfni`yKd%>FTKrNrB1rj=R|gzuYPnJue_bR>gIw0DJ460 z>}bS*F$6(CsZ?q^e}3$T%8Etg7Wz|#d5)aCfJT6jOcu(V%;q?8Zi-Sh;MXs_%>#FA zX1Y`(J5~ChG_uxWjKTA~)>ul35Q0pmw?kQDSey(N_~qy^EDkJW%#+Xk8&Ldw^aMf( zv`{?um)9FHU>n2`SBcw2z|B;190$+yP)b=fGd}i`nw>j_7Lr?J+O=~#=kwjuv=pt++*nSAa5#}B>8nvPD&vP?O$c-;~mSjK1ODL?#8 zIy>80_xKa|#$shdMr$qBSgbV*PebY@L7S|~`5Z@n@)WUz;F6wa!>Uf&-c!dbIh;Bk zFyMl41VukVe0GMk89^qJWOHwVwe+VpEP!7PM!BrKzDIhMqN7dX_qvo)6^6f3Ve`WQ zLpvnpq(cr#_R=(e|MZtQ`J3M&g+mZksYg{D>7t|umSyE#$ZsoTqLX>ij)<3uIfm30 zgZ3oEEbUtzbj~3aM#LhA>efAU-nEN~W8X)1jF4KhgQ-`)O*MHFJ*)S$hgEmyw`X-!#UZ3AI`IFg(USKpR!YBd{WRi?Gv33*_{#OD~8g)YQ$dt0r_%7 zU%HHW>rvuvf=uNIPW^76`})z_)PL^cI4K*ju0s(!2PUK8tYp0>36$Y%H6kfBbGO|@ z!hHibIE$)!luHs@xP-T&i#!V%U$|PyctGAU4v=d}l!49VJX?5g{BqttphcsMb6tijs>3f$O+{c=r`) zzBbF$T$cBK{WEM{zk{UG|prEEb;Ft070F$bIIgVN>Y1F2fAlF#Q`1g`!4Otxf$&c>Rwlp`Qo*jESUF5@`P^75uq zDZ0D6ulv!yKB24Q<{yAUp|B)q>CBlkm#<{907*qoM6N<$g6}z?DgXcg literal 0 HcwPel00001 diff --git a/www-apps/phpSANE/dev/images/filetype_pnm.png b/www-apps/phpSANE/dev/images/filetype_pnm.png new file mode 100644 index 0000000000000000000000000000000000000000..3056cc0ddd9c8ec6740524409079109755dec64b GIT binary patch literal 1904 zcwPZ;2aouPP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*q+ z4*?wE%%ea600!_$L_t(Y$CZ|8Y+P3r$A9;}`)2WY#`eUSamQPTv)KtWPKs2wNu#DL zYD@`~Mf5{kLD>Yf2!R9=q!RFfMFoUds=|kYghW7~f=~f!=YRj_yb-MOJomfj26}sX&n6NH2S5nHTF=Tg z-}mu-AJ6kxSXh{ynVI>jQtH{^;bCv(88!UT$5bJk+2mEV1PF)1T)Hyezjga&HxPEj zYR;D@YCkJ%*GPO{5*5ufH#euM)#~?ixtu#PGV+r{hYmG>#XBDT@WaK>j-TNptx(`N zSm|J`#5xiy98eN#94rn(2#j!Q^8zdY&TV5|MI@r-2XYbaI zhCSF<8zZTwyzEP$ltKtWYilcAU0vbc-k$Gjtv_-_4bL30ah7EA{KKh#8;Q59~GP$f$jjwCeJ5ph-#q%pzYjIVOiHQlq;qdC9D<7>j!uL4w$wwG_{%`c% zCXgk?#dL*mLJ@Kz41D&BL=4#eK1_cnt`nkX!w#&qjHNGNttA=VjJ38#|9YV5)2EsF z(^1YIe}PTW77DUJ!M6n3B)V#unqQ)D+ty%ums9qDa z9#tWe=Hw5aB^VJ*>Ls>!w$SvZ3W2=C`Lk8JT@a2S7mg5Gm?vQdk&ze^>DRzoy5ifH z!LN%^u1jw?K%!F-ZIXmLT=MZE{a+}u^GKDxAxR~oy^#V?V(Xm$$yy;JEi8#>t^<_#^b<%V@8({+-tEHIztlNk$2KOYGSoiT^uH z!6`8{BS>8fvy@v6iEA!YE9l$=qnReY z@q34BB}q(49(k+gz5B{2^!g=J2Q|h}^(rh(&yX5ENVXirzUxuCzWy}9!48&Ms-)hY z$9NXu!I=x1Y`&FJIly#IawRKp9TyO{-jSBd3(PG}@a8Xlf}Puj7=7m%L{9)eTA}-) z`}&vbXcj+gaO0#flH#%2gRhL)&ia{@vkkD}GL23p%>KtOVH58+shT?Y>`Huo=# z)$H8&AR9VWQxt>x(dnX7kKYb}LBVd=kZ0jWOHJMKLI0000Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*q+ z4*>~`5l5>400taML_t(Y$CZ{}Y+Oeb#(!t-?A=}O+Fr$Wyxq8o6B9w5kR~LGFl|Kv z2_Z))0s$gO@PJ4K0!2ayBqUyV;fcR*lp^RO2qZtnB0NM0H4aCM2t#XWf*#Va0PapsKTx0P?6)|`qMi3A1 z3>XDZzLeKM6!2}WAVXlIh_a}N7Ke(Ic~TCL)FURTiF7T&F|UavDSFwh-zyMg!i_VS zq?5dU{SHA8pc+FQ<6Ml3BXBW7#J9h8hHrd!uyg9Jpq*UQBkQHhh4es7wv@_ia%KpZ=IdeS>0*Nwey`)Qy1!a?4g8|J0gOU&FVQyBD_ zFV+!b$YfK5VT|t^Qc0iuKp*3yIjZ%5D2^HG_c=SBLbbMcPPd2m#mfs+H#{ES-^1in zkMZPKhUL|Om;YPk)!7kU8|8A|izX9pR5EQJxp_YE7H5%rB48m@OvyC;!Um83P) zJ!PTPpw?L9-b#aXQiz=6*(Wpfr?ZR<`HYQZ@DoCPGv;nN;C8XjN;PDt-*IG+J#)GP zv|fFUY&y;9j~rlMHVLBC8p_$D36frn5yiQH(yHU$YKYUAQn|*>rDeiK2?=`{-8b@Z zl5x(VPFXR(X5rQ%|DJdB^n3IVWDvFBTDOR^h(s9ch&2QgP+PCDx#5Td_)PjMoZ-6< zuT!Uv+?d5ZZZTf71{B#u9T=mns!%}{=fJ3u9Nr&;a z2mr2mjRu>F0AZ+jRxnnWhtgbkK!m$Gt#1_oko_Zvi_8u@lrm95u^OH4p|$ z)DS-8gXTM+vUhl$<0sENPY^YBxQdGujTMzG^H){WY13JpBBt4wOYeh#y=|~v*A$CI zd`;t%e&5xlXs34TI8M8wFuGO!Z$c0SdrJnu^E?WL!XsVM-R|4%6+}1C>g??7d&|qq mscs8BN?+SuRh3$;w*G%c!;Lk?4PHzD0000MWnqrB zho>ss`^3J3eyVRG9Uej<_INW;#8Tk{Ak4M1a>P|sR1_2xl$Ms3mzT@x7{au&vQkJ` z=xd;;gf1&9gH+9b& z(9jTv!{Ktdot>Sq4T7)-Rv|b#Iyyc+J~1&dIXMXs7r!A64h}*t!8y3Oy&0Bv?g5e) z!5$wV1(z?7x(pEBkO&aI0C5Q*VCoML*8m~_AbkPS4k67tXpL}1?Hfv35vtlZ_i5i$)1|2E zlJ^_L9yE?SWE^+cBthRa={P>g)FQ>yGToGrVoFH2Jagabe2CTgaBHUwYv^6zBH6f* zPP>!sJtG`EZ#Z~HIePu>;`7ACFUQp<&)qNA{c^6?)n@_ZKLR6@0;7_GqLL#hw8)sU z*gqepW--&UUOvjpdz{~ro&TCz*j`mtMW@pl3`SE^6C6rgTN~8#8_oNMdw0|u7~2+b z5c=_L8Hb>sfNNVr&g2jr$MEp*$jAsB!PwZ?*C|X*P4Rd*^zakki_H4S5-tMV}IcG4;(jQ;+dcA z;^jS@nitz1oKe0)Viy*0Xb~Oe-bDwDOH&+m~Q0$ns`2B&T8gmHvaF2*QPG8E(sXjYcauk z#c$qs9}k!d=NHqa`bQgTo!pG*Q_V%03|sftf*(7!W*DJFn-e&XLa5E>D`0D<@68TIwv&wz1eo_d<}7Vf#)x`&)os)uT#$%TiRlH zKXVCTH7VJlCJ(}ALKABYMw0Z1ewy4hlMcdjx1KN+t$UU!lFTj@lY#P1(d9+U zCCSE?N~|9Rnxa^2?>aS_W$Sebu!gTEH=^5abt!ttgAG-+G~r6okn0`taIfQdP_?EKjEzhm+`;utNlJ$m{{!vCOR z0&~i(EX>4Tx0C?J+Q)g6D=@vcr-tj1^HV42lZa2jn55j)S9!ipu-pd!uXCy!YnK{> z2n?1;Gf_2w45>mM5#WQz#Kz&|EGkvK~TfD`~gdX7S-06<0ofSs5oQvjd@0AR~wV&ec% zEdXFAf9BHwfSvf6djSAjlpz%XppgI|6J>}*0BAb^tj|`8MF3bZ02F3R#5n-iEdVe{ zS7t~6u(trf&JYW-00;~KFj0twDF6g}0AR=?BX|IWnE(_<@>e|ZE3OddDgXd@nX){& zBsoQaTL>+22Uk}v9w^R97b_GtVFF>AKrX_0nHe&HG!NkO%m4tOkrff(gY*4(&JM25 z&Nhy=4qq+mzXtyzVq)X|<DpKGaQJ>aJVl|9x!Kv}EM4F8AGNmGkLXs)P zCDQ+7;@>R$13uq10I+I40eg`xs9j?N_Dd%aSaiVR_W%I$yKlkNCzL=651DUOSSq$Ed=-((3YAKgCY2j1FI1_jrmEhm z3sv(~%T$l4UQ>OpMpZLYTc&xiMv2YpRx)mRPGut5K^*>%BIv?Wdil zy+ylO`+*KY$4Vz$Cr4+G&IO(4Q`uA9rwXSQO+7mGt}d!;r5mBUM0dY#r|y`ZzFvTy zOmC;&dA;ZQ9DOhSRQ+xGr}ak+SO&8UBnI0I&KNw!HF0k|9WTe*@liuv!$3o&VU=N* z;e?U7(LAHoMvX=fjA_PP<0Rv4#%;!P6gpNq-kQ#w?mvCS^p@!_XIRe=&)75LwiC-K#A%&Vo6|>U7iYP1 zgY$@siA#dZE|)$on;XX6$i3uBboFsv;d;{botv|p!tJQrukJSPY3_&IpUgC$DV|v~ zbI`-cL*P;6(LW2Hl`w1HtbR{JPl0E(=OZs;FOgTR*RZ#xcdGYc?-xGyK60PqKI1$$ z-ZI`wBrnsy*W_HW0Wrec-#cqqYFCLW#$!oKa ztOZ#u3bsO~=u}!L*D43HXJuDrzs-rtIhL!QE6wf9v&!3$H=OUE|LqdO65*1zrG`sa zEge|qy{u|EvOIBl+X~|q1uKSD2CO`|inc0k)laMKSC_7Sy(W51Yk^+D%7VeQ0c-0E zRSM;Wee2xU?Ojh;FInHUVfu!h8$K0@imnvf7nc=(*eKk1(e4|2y!JHg)!SRV_x(P}zS~s+RZZ1q)n)rh`?L2yu8FGY z_?G)^U9C=SaqY(g(gXbmBM!FLxzyDi(mhmCkJc;eM-ImyzW$x>cP$Mz4ONYt#^NJz zM0w=t_X*$k9t}F$c8q(h;Rn+nb{%IOFKR-X@|s4QQ=0o*Vq3aT%s$c9>fU<%N829{ zoHRUHc}nwC$!Xf@g42^{^3RN&m7RTlF8SPG+oHC6=VQ*_Y7cMkx)5~X(nbG^=R3SR z&Rp`ibn>#>OB6F(@)2{oV%K?xm;_x?s~noduI3P8=g1L-SoYA z@fQEq)t)&$-M#aAZ}-Lb_1_lVesU-M&da;mcPH+xyidGe^g!)F*+boj)jwPQ+}Q8j ze`>&Yp!3n(NB0JWgU|kv^^Xrj1&^7J%Z3ex>z+71IXU7#a{cN2r$f(V&nBK1{-XZN zt``^}my^G3e5L*B!0Q>W+s4Ai9=^$VGcjKDR{QP2cieX!@1x%j zPvm?ce<=TG`LXp=(5L&88IzO$1Ou4!{O>iCf&c&j24YJ`L;(K){{a7>y{D4^000Sa zNLh0L04^f{04^f|c%?sf00007bV*G`2i*t(4kRP9sWdA900P-bL_t(I%Y~H7iyUPX z#m~8~@9XNC=`J(Vv7HVw>Npq`Q8z~Mfe7vciX*7OO?0PjTx1nA{smbml8utJAPULG zSHOik6@;kCGCqPjB3T&ClnbkRYV4WzLP7D}y1zR2)~O40BKipcuyEa?OVWoCauUw( z;H()^!@0?jGYmPR*(R75H{W^-03en5Ae_I#xy6vv*7N&E;14@yn)H1*KLJDDV#uf6WJ-x5Qboi~ z5z)_idpxT8QUkoyt;uB`!C3>&i<0!2|9-{6U@*NmvljMjXO<`1d^s!uf^hx}1J2rtxNV;2%{rmCl^s^W|94 z?8Dvi!{rJP5YEd&@?2flM=(Ez0RABPSy2=-$<52ZA@_R&083!V;bxBe21~=eTE5fF z4w>27o?Rq;7tZtWBC2K)yxRR0cl-(DH%-fDXOnhMY)cUV%awA`8`G z(rkwra-rFqm%NAy{}-BV!jPBY{I-E#gY!=~YdHUA$Z3W=v|H^zpuL4wuLWYc00000 LNkvXXu0mjf!A*=` literal 0 HcwPel00001 diff --git a/www-apps/phpSANE/dev/images/lang_de.gif b/www-apps/phpSANE/dev/images/lang_de.gif new file mode 100644 index 0000000000000000000000000000000000000000..dbd8ea79819cb8254905be668bc9a8121693def3 GIT binary patch literal 1114 zcwX((|5MWi9LMq3WJ5UI`}096=-g+YeV|C4c6oL|*qpL}HrW6Hfia6O0>YR;W*ONRA}me2E`Q(}zw}r1yvM!%gO|>r zO?|#Z4hDZ?IU?dXPN`I?RI2T2?06A5VH)hzAa@I1N=IH;242=8UyA}A3iK${;}rvn zGO;TYyR)!68^zh!6Sfs4+wkf(95QkiA-+5;G2XLA>XAt=%A{>FsdpLqWYjLBjxdfo zIl9DA7f0P3^>B2Vqh5~sI6C~31=NLc73~)>!OwL@9GhfP?ujI_2 zoEZw^nPHw8;hC#EGs?4LJUh;_*TNL+go2$^ut5borC>v00()Ixrv-LKU}uF`zvj6C zO-ewMVk@K5Wpws1oi&loqB?C+)tjjC2-%O4;~1SYlhaJ+E!0#_t_o_dq?Sr*{g~WU zcn%Zi}TT8w=YOkY?6V&-BjWpt_9iw)PIWT?>*PIw~auZHWo=5NkrkW6P;kpac zpJTciGtHQ7!PhOg(TZ=rz)d&4_24@XZe7H!HcWe!Gd|^PyYhQ4=6v|Uhuc2<*p8n% z@N*}A>BRgc%y;3}ZY=cRw;n8B#+_dL-itr_aJLWl`f<;XKL>C>fCmBmbp`+TUmKQZ z`3s0zLiDNxy}RCTijqW$``rxzGb=>qCwLk&j>WAky1BMGaj;6Xzo;QmQXZF_Rj1gL zvsZ8BUwChENQj91D1Kv}LtS!Me0)uwGyUM3Ifj}f?eQqlidr+tHW|D2G~7?O#PY`c zb^kaFBleBOOV*PS3uCtR@7A!@zRcmq^|eozx=hYo*ShA`(ll>$oLyHqerGPUSkbg^ zYms!Wp(1IgBmL;Z(7xK_>`&Gj${*-s6So|Rlsud=SDi_FXFfC^ypX$h`M(o$yR?k8!d_l2!RQmuj4_iUN|DM|0JF@oGIQ5;Lh2>WEbv>dRI{ OD-M*2B#*ExkoGS)dO=nI literal 0 HcwPel00001 diff --git a/www-apps/phpSANE/dev/images/lang_en.gif b/www-apps/phpSANE/dev/images/lang_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..c2eedfc97d93d67f0b3f8b3783774bef3bfb636c GIT binary patch literal 1256 zcwPbM1Q+{9Nk%w1VIBYv0QUd@01GAn3@HE%Dgq5C1`;tSEjj=iTmT$m032ih9cKU@ zXaF8-03U1)Ax;h=QVt?k4kK6-B~lY6RTn8%7b;l>Az}t0WCkK+2P0<(Bx(mFYz!x9 z4Jd5~C2zqYfOT4jiTq z9Hzlo2qg_N>~mb{Rjw!O@`z{t74(7eOa&4Y^0gp1FGjKqhR#)+8G zhKW)qN&lky4=3L#l_6V#?Hvd z$jr>l&d$!t%Fxcv)X~Jm-@w4o(9qJ-($LV?)YR10*4EhA*xK6K+}zyW-rn2W z;={w{#>VH!$m+?-;Nalq=H}qw=;Gq(~>gww3?CkFD?(p#N^78WZ z^z`=j_W1btEC2ui03HAj000R703BI7=WUD)7%vjOZ~=x_Aws)owV24FVht#_AYrm4 zi4&=J|Ll4Bz<|Mm1zeWdq0_1sf|my}B*FE^P_uBbXoQglN>sak^tyOBnX(ScSuZmv z=>-UpGjiCZP>>O01QuqCLb2N?PfLd_%IMHxHA}-1Ux5-qE0=8w2Llag7#R@)g_mcF zO1aCYZdlkktAPE|l&PAzabikbxL_fItaJbT_2aj1pT2zf@ZC#B2Qa*J=+2olSB{)G zapAbdYIKOt9zA;U;K6g}j-8cra?6PW=ZzaRYSN@ZgXYW+)_Y#Zo?Y9HQQdKP`wlL= zxS8XJk}s!idu8W2yW`GGr%wEg86UCCNv3QW^SyiVjOA7ZT6DS6sJU(17K?@r5FngT zhCKOP)5#{$2vZDrsRZMVIp2KZhb~l1H|Fmf@lGw3h?0Z1(a zvu(yMs}Bn{cxE?WeD!LyZ5>Lzk3S~@m*y5 L^Pz1u6N5DX4Rb8L literal 0 HcwPel00001 diff --git a/www-apps/phpSANE/dev/images/lang_nl.gif b/www-apps/phpSANE/dev/images/lang_nl.gif new file mode 100644 index 0000000000000000000000000000000000000000..a280a6476d54c5dd8a1defa5afcb809db8a85a18 GIT binary patch literal 855 zcwPZl1E~B*Nk%v~VIBYv0O$Vz01GAn3@HE%Dgq5C1`;tSEjj=iTmT$m032ih9cKU@ zXaF8-03U1)Ax;h=QVt?k4kK6-B~lY6RTn8%7b;l>Az}t0WCkK+2P0<(Bx(mFYz!x9 z4Jd5~C2zqYfOT4jiTq z9Hzlo2qg_N>~mb{Rjw!O@`z{t74(7eOa&4Y^0gp1FGjKqhR#)+8G zhKW)qN&lky4=3L#l_6V#?Hvd z$jr>l&d$!t%Fxcv)X~Jm-@w4o(9qJ-($LV?)YR10*4EhA*xK6K+}zyW-rn2W z;={w{#>VH!$m+?-;Nalq=H}qw=;Gq(~>gww3?CkFD?(p#N^78WZ z^z`=j_W1btEC2ui03HAj000O)0PzSMNU)&6g9sBUT*$DY!-o(Z{+md#qQ#3CGiuz( hv7^V2AVYpMLb9aElPFWFT*vhqI|=r8~QNDTwCwZ@h^{{m)u zuHL&t;7s+^xDMSU&xvWB%M=B93Utnw$nGg!cl`Ui+dJkLT#)AKc9S<+$<2^=VMU2o JsTu==H2^sGDTn|7 literal 0 HcwPel00001 diff --git a/www-apps/phpSANE/dev/images/lang_ru.gif b/www-apps/phpSANE/dev/images/lang_ru.gif new file mode 100644 index 0000000000000000000000000000000000000000..b30fa066837c0a3b2a59c2c0717e48ecefbe0796 GIT binary patch literal 855 zcwPZl1E~B*Nk%w1VIBYv0OtSz01GAn3@HE%Dgq5C1`;tSEjj=iTmT$m032ih9cKU@ zXaF8-03U1)Ax;h=QVt?k4kK6-B~lY6RTn8%7b;l>Az}t0WCkK+2P0<(Bx(mFYz!x9 z4Jd5~C2zqYfOT4jiTq z9Hzlo2qg_N>~mb{Rjw!O@`z{t74(7eOa&4Y^0gp1FGjKqhR#)+8G zhKW)qN&lky4=3L#l_6V#?Hvd z$jr>l&d$!t%Fxcv)X~Jm-@w4o(9qJ-($LV?)YR10*4EhA*xK6K+}zyW-rn2W z;={w{#>VH!$m+?-;Nalq=H}qw=;Gq(~>gww3?CkFD?(p#N^78WZ z^z`=j_W1btEC2ui03HAj000O)0RIUbNU)&6g9sBUT*$DY!-o(ZqL@grqQ#3CGiuz( hv7^V2AVYrSL$ajFlPFWFT*Fv+y^uRQ&hfAO3xx4MhD_x$E>d*m_gS?97>r?%xWGFSru(&!~o literal 0 HcwPel00001 diff --git a/www-apps/phpSANE/dev/images/logo.jpg b/www-apps/phpSANE/dev/images/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ecce10d02f2a2d27082124ab4cd5b6002b2acbd7 GIT binary patch literal 12198 zcwUuvbx<2z5NB{{aVy20peq#JpKZZf|Wta01ONafa<>kc>D_>aJ6^UQP6nvhz2MD zaImnkv9WOeF&rEmT)e0Fc>jpx$rFO7WF+L|WF%x{6x8%I6qL`Y$jF|tJbTW-z{JEv zLBq<<%E(U7$i(=c5sZIN@o@2o@$rcnDaj}q|G(++JAe!yV2&|}g~1BIB*VZW!+7ii zFaQ9Un3z}?fd4~y_yAmN984^N|J25$01PZFOiVm%Y&?7t>?Z&K1|}9Z0EY}0kDLXc z;-!MNr5hz{NHUcWB%e(&w4knjlA2xE#yzEbibh0C>Gc~OJuBFJ-svkY(K{UU}5}Mv;RxjI9Qk%xc_tlWdDVQ3HYyK|NFv!j>*Vb{_}}L$=c0k z>6X9t&uwzu$s-Ez^j`*;WLRVXIe`0~Zn->pF*pr_=YIk$C;N@xnmWw`_$5dyO5?Qk=V zYO~ggxKHeG#+`%@u0f!K9}bhP(n8k!3cz-e1u%;J5fC81sq;5Qo{b^0tt{?d$hw77 zxXdR*iy9rJ1<_9t!e>jy_MZPtgPR^@YYk;lC+6TfB))T!q}!# ze&lJPpj*PBd@j(TGAt8Ft-9ZrRdJ&i_Cq9vu*>eFPuyJN++m&4(#XA@UfcbXqta!5 zZ=plUH5wgLivgcYVA}aS@Y%J+G_6cLX-x}y9*T-A zr)SF8Qc{}^JhLvX!{VB&n5Olj8WVicBvh&jq0XI=%(Y0AHHVuGf260kN3bon71ywCL!Q??7)J$TXfL9%8#r&&mVTai zsuXno?u#PZ`9V$L;My-0HcB^qDnT4W@<{bOC5Wy_|Fe1urrN|^{Cu{?ezbIBysCA`_GCa!-LN%PyNLbn`D96fj7xa{JxWTrq&T;BF3 zmeFczTJ^)nV&*Fn!pTFgy?w{@g9W}bxY^IQ@a1Q=YHA47ym+4N zrn|c3m7J?oQ}O&GfYc$c?8ADogA=hRkQ@8j#z01<1szhsp9g~8;~Z^}RGGY+=*h(A zRan!aSHnxj_R_0#u4q}(Ce9S7gL4`gv`a-ui8lRb$T74<(@hba(A*x3t9cxD@2G`L zU)~Bj$Sq(>AHUp3`Z07Iv6o)IEQ64+9XI^(9p2WiIW(`U@A(!m_IGVQf8f_%yfsoF z?w!lDvo@L2zOm8~6?P>O>@K{O2`xAJZP$F)``TeN^)8}Y2u-EGQryDCeLX){Yx`?{-D0~KBqQ>8$}^^!+t^mulW zGr1i$qk_$1OgoqIQKReoVnNdmku?Q)@8AxFdaRp=5sO1`7Z@G z(upB8O7BJ}7ut=b2L#X1^5N&9#fDJNcc<|*8Gd`= zG6iF>MSpw*Ft}Xsr13*Z5?&F@(K3}}J12ARi#>4NYy{=&*1copfQaiRso)=$p631f zor7Q+T-~Jfm2_0&j6^v`cZe6Vct=06751NNJo$pPDMTW?HY)n_@|$smQt9v5*Z6T1 zM;R%lG>N7mw~e^%4$83OPw6+vZ!ASA8#RJN!rT7)gxD~6*=M1{o_p5>&H0uE#-#CX zRR!Ge=gjC7w2b>uCRk8aYH+m^#&85A7ZUMe>3`;DL-!7YG5#ar9*Tw_*Gh3UDC?GEu32iLRijw&% zbGf-+;Rv;7c|SXwCMu+aQoZ6SxV#mnO^rU=&b;pSkICDaV3 z=kYA;-%Z=#;Aq6Ve0N#hUsj5uD4}9k@=>P=Xo!r(qaDN;{Mq)Ke^0q=&Q%1}cp6n6 zGQ~(C`8^k#iqRCSm!XksS%3Dvd4>lZ^`lgZn!rMlfS-=;C^GWJ-JE+;UAV{5 zv#s+A$Y6Ol)Vsjc9j4=-2a1<%Uk;Ed$u?EStoBG9Y8BJg|Mc@X@cvX7CQQLw(7*97b3w z3`qv;pt=uOKnl+`1NAno6V26~t{}q=jTcPFKg^6)AKZ!U(Z)=E z7fpY**OpSYQmi8h$f+qu5`$eWupYhuC1bKSfyyEot*cl(i9C{pGKrf>BtP^ILv5N1 zKDxH!b)mv3Dza$Q6rMQ$>ufnF3y2Ve&Dg_x$hXY+O8bTezg_>H!`Xzrraa=jVx*vB zAw5lVo%@UtJ7mE}SX9>4)%QKOx;l)o2E;|Vy(ddAL8J`DA9P(C-{s6ezU{4SRfAy0 z7NFLXR9vVv?Q%rTc&bQVc{T4TC#jK$9wa15a6mag<7MoD>KKfnk*jYbf(1kf!Tu1x ziXyI`pNc>^&NQHJ+6PmlFt24^hY%Yug;OF~$-1i-T!ESWq0SKX2+(Y(@Py6voITh6 zOl$Adb_v-Q3iqc9J1M@m_jdM5ZBVXVVQzD6Qc-&@I@l)7RfD|*z8KCT72R@{@%3xSQfBi4$`b1*GpPmo(c%;Z^l3lQV>ipRifKg~Ws(54WCZmQ;&nSxZ!zU#5 zq-e*DBkSE~@5p;Ah3^cvT!5hYaP4j|!NPFc;n+Zt?xEX}Z^9D%-~TKciLffouU2r3U!d zYUxQyzn+?sU3_HLv@XXGD4Z!`-uQ#Vc<10a&Mzuyn><%{l$4@2w+qZ+0Bpq5_Qv0F zQ*lk|{iaIaAV0Q`ga_}vi+%Y~c4W#2NC*f!6UluIm$^^0R&$-N%lL*I1evwWlu=Br=Nt`LkhC{obQoZ+p3y@xuYHzRbMauUg@?T$bh6 zlG)RmZ%Z;A?bWZneE=?yZ2C5SzQFl{SxF=vT(w#h-(fV^m9(7>HPu>~oLIKF=xcC_%$j!$_h++}zm1zwXkHTFQSc z{f3=u8ViSo;Gzl2^nbgp_1n8Pj}m=k!TQebP8D6`H0gPSXfm`2W;0nArLB7Uo?BH_ z4h{qAqpd;g3DGC(no*meNkas~%t`C?Sa`nm_pqUucP$yvHA9MvmE8BLP2#`ES&6M! z6WPld9jKUb2b2TW&UQ`;S6}C-mh1bKAmA$^-yxie|8}4ceo<+OZ;Dm^o)DI;Rw3Ko8&fA0 zmA|Q%j?r*bpX9WTbCy9O{083SdfEXDm`!|AQv6*pn9>~mY>Fuezicqyca6bO>})qv zB-<6~0o`NO(?Sl)lxVidnKLGzl02`>{l*%+yI(<~x{b$;o}wkWc=U5aY-jycivyiF z2=@kCL1m)47Dpm;0q6X<==3Z?W1VC(4Q(FBusC>F9Z1pjgC?tfb|`QR+9-lDfe|Q@ zzep>xz*tkrjY^)Fi~9CeqV@96dc#BdXZiaS?n$-b!?-t4sy}{3hsNJDzd5$4z`#IG zsU^1fNU8MHC69CZL>|3)E4PRup?gC(B28j6-6QOJI$1v6+R3tG`P43tZqy^sjfbcd|92=?|CqY%*>H@Me9&Ji#3@QFs&~)P99$ z6xbz^Fi#nHu7IqpulumVs|!-$Z>w0+362ZL{~>-y?%$fJE-Dq67VcQO?=D zKN1qyG?3lBomHI~uVuZTF!+<+S~XY`641DXVX9F98ZjdGgG^QC6yHZTvS(g+Q6(oF{iXkMlz zZwD1*%OGZc?u|7!nZ2(`aMvoECh_qprsOv~S_iHVhKBQZ%wzEFs&F**yh}(gV!pCe zu&~?8&0yWDJ$^DO z_9fQ32hH&vG)&Dej`BVg=GLz$nsAM!JPB-7mGxwpyI1m`e&dbz*>;WKYpPptC>lvZ zW4tr^gNlS+hji$gCReU*ROu+8bn48+@|M^PcH2`hY{WzG2+(i%!Nit)2SrR}hR&B) zRV^chuqKzDF`wx;94kh;M@C*iQeXmaqe@ISe`%Qb$b7thUhnBM>&|!gQ<|0+!e+Yi zf>U%U8i-eEp6;r%Gmw2nxV}Y$k}6Hvjh6u}vl)S(LN>HA`=p&}*rZ&XK@!bYe z7mmVqe6KYrvTv#ADXv`;ql+6{O`V+!6h5p|bv{WyJt9!O4ssbtXfLeNaW9qpke9wj zAX~KgH?KYN2>N=-PBz0x>9DIL%|u^b3#MSovn`YwN0ywVE(a{@R>0?$P#=rKQ~vX! zlfO~li{n+dYb*0oDHe(`XcZ_ojKlqqIpvu;y)uuB4uk@#C4YEF(ckEeaZPZO-Rh+e ze4FK9=0U?W@Lc8QtNgCYI#>8z(9U8Vev{^^Prx5i{M_-SRj^4(deUp$(g&Po^81Y8 zh^Du|${2DF22+PERM@c6T_9z@r`AmFVlgKaM2vZvzaqXUJxe>KoA-|Dv~s%Z4 zS^6ba&o(LK7gmPs-ZV^fd5os|*N=dn2-a^06eAr^4cvMfHW9A8vIL^YL(sEH8fx)b z9%5@zpu%^8spk^jX5Ct}kATVFOu1Wp?YAkPk6$IA)pm|VP{-1m_H(53aqG`jb_CKH z#^PsJO*Q2DQb=}7{WW`3)p{TF2V-V2`KOhXS~T7ZDyO=@O0}x{*_$znmEQf{aeDRn ziXd7iN}<=04QBvxNptVteNwUmegt?>f4dg@rllw6=lP{`VHzGcPLKY;{xQK>D6rmt z=#VjTAfw_ZpB3shAGVmI$E)N>T?&G9e*XHpoeOU@K?Cxe5h!kuARZYYsV*LAtc2v} zRs0UoO-)ibV4gAwXnrE48@i?~ zhwmH?a@iHwP+Y}VBR~dJ3NCNkVr!8bVH4+IdL#qO^ZiCok&Oq7utxyV2-_^1kJ0|c z51S3~PpP-DRSv$HwsXkteCStH(!(I>x_B^9>x}v7^UWyNMHSXNU7yNG0EG#|=#$Xi z9Gy;ZF1$Hr(4G)W9Lbr0l2NIts$M>5z9;(_?b1h>3nMb$WGza6)btliFUrS>M zf+A1Y4*9mWKe=muNW%>1QJ*%0~LDWdR@%M=fIQ5TfEsuq}Te!PXeskE(7)SLqHn|FqHp)2_oTHs*WE zbo}{EH0yXB5H1ZuwW3tr)Rpw;&~Z*$$oEry36kjVH*;^x-3nUfKmpCE>rEJ$bdHCr zW4lep`4Um(5Mf< zPU39CNqeLD1dk#;AJh>|X>jq_3=wG)>kzI_20D|zx z_hUxcc(mH|;pKpv>jxWiKbOu@7fwh{sFWt#6T&xp`qr zI+Q6hnH+psrGA+?2L1^>dOhe7%@t@?@s2B-ibhcvcaa-#HuYR2H{h&vt=o9?n>ZJ#O{~;7yT~qS(Ufvp3A|B~yrjr^wR-kBG(i3GMVGz>?#GeS5_5 zv*bSde@I(=!oaDftnLWee#jgCa>IeD>kKi>?W_d0i@Rl))YU{#db5r&&C*=YXz1Pz z-DZ9nt5;U4NJ^h-M0O!Jt@lf>ri5=|H|J}YTr(*D3>tdSQgI76pmP|+=JL*AYVH&yjMv+-a%PeUYSD$YR{dU^V7-+v63#gIIer)Nj`34N0V>XMb*Y^Pr{2) zo2xuQrgx731+eY*K-8|xkTuP7{ZW@8bMKUEzJ>nsgVP^6Z!uOcZ@v{I=8!^C3*j86 zmg)_hCq+$pm9zD|>M0TdMXgfzK&=f&lZaL>EHu0_*umALjoN-HjHee1)yZSoCw^P-nqCqT0 zbPOrA}xK_kUniuW)Zt|Qn%%jNKKv2KXapTP^=(Wi#b@~kji-4 zcSC)ZC4XChZ_qO_P&zzfN#UgX@RF7a@nKfX(Nl%-YR=qPg1O)p-HeX} zKVe15O3DF&V>7JXLu(m%h+W(q;#Ne`M~ER$!ji4U`ft{Ud1k*A?#U}YOl1FMNsNb< zxD>~YF$paQM9k6*rc5ys8bf?Y^E4+<@=I0BWdD{eOHsr?Exx(mIVcO?aGwt87!BH* z?F|m3SH2ny(oF9BG*Z0!>4CUgS7vtR6lrfYWy;_g(wCpxw}W-3xjB0XCICUA08dl= z%6*q0S^Z~gzQ$(}^%0T103UCEQ1#i_oaDQM9Xh4~mqn`hsd-WhI4CZ+v+plKM9AIf zG1rj$tyc9~I}LkPetD)34}BU!x~k|p>}TVvwDC@doy8X0w-GCEx(J0I_*!(yr8_j` zc!I9Z!QGQ6*6|V+cK%9FUEw*hvHp+Mv zIG2H_MTMpPVR7HBV)-4^-6H_zi!IJz8ZlkZ?XVX#2qN4ZE zs8dM4g`-p@=H^V&ic#8PEC*NZ&R*(uV!UX_ZZX{qidfO;J*N$hpRRlI_%h>JAdo8~ z0chI_owGG&uzc-?6j%I86&H41TwlM;&$ahbS+Y({=nqqq)ul74JDGo_egpfHFh~ND z?efg%+?bH&R#(2*yb!lkz0~NHvyVdSb#rIVOkQ9595_Hcb&f=c6j+AbZRm^m0gEKC zr##xcnS`6_N`Ij`fEvgVb4=y6&wJ&}fcZU`UaPw7WLn?JqjNu3e?c~p%7g&r#@*9p zx?A#NPZbkD4P7-+V}g9EeefEk_c5)&``qAN^CPSIzuWVBgo~v3%yD7H%e;SnpdJBB zs6PrOJf6B{*UCSBex4CffnZvw5&8lLJ9;#~u5PBDv6hK-LXL7;UuVD`*gMqzc-n+p zNRQN056j}PC$jbUm48}BvaZxkk$jgY$R1zIm&kT)#j}(pq{W+;=|L={yY{ZRuow4{ zQzD3=Y{_^NQ=g4AlCyo;ETKybkc<1iTmALoet$eVgOq4-S-iaWPrS}NYFq-4#8?@k z*sOt6K@X%(&7?^rFo=i_EdHuFEhM?jVm)nOG$$PzXP)>>DgU&B_-=^;HhC~);NMr| zdm?zHcNdv;O+|hYCpLenBSR?n=an2xyM3IvMb45Z|EB|MT}R665KpQ~dOs-ON?d4sDd?4i5t9=(^sEaM5=MViP@_9kkR_eXo8+`Y4oVQdEy#!houoQBZS~;lMhSsBXO(bPc_-C{hAe% zFPre5I0+SUb2WEs+#$c0gJ;pOy4HAp%Kt-TCSvycJ-b-)QI!XlOkwSHm>ww0lKMm# zIx}fg7xsPmC%*AuWfb!VFV>cpHFOXt+$Ym4YczcwdV>TGXB6cgz=yFDKXFF-Hh32= z)4Hz~t(CRJ(GnBmrfz$nckdjXSGt$Tuj%GxBzr*ENHSCZ#Mfm-UOuz)DloCAhV~`o z>&+bSxeCx$5zCEY?S}HqpkO2t;bYKimAiW6XY1jpT6p1uqAOWjHtjH5O7h%We$u*R zio?@Jnd`P7)A>$;(C~u(JThJQ=|IAg{UJ-bvAhy2p9Kh({|+Gjj`KvjExp50eE>|C z&vc~`_{x8M*{^iOi6$DplHn+2?3JOq)EiSIboUSvOECuo7uw5p%qF&!iM2T7F zs5QmJ=J$OgDDzHA!&;0-(`(0fn^3q>|JZMPlW23}?;x!KAHVMjcSL)C6WhTvy{Q~~ z`(~6rk5* zY~7fVmdjz+ccb0;eEuoN8$5O`6E{!2MD2GaD|V~S+JB0B)-%=ADcNt`*fUK88CFu> zZQsoEWI2&IU7}=G{g{WMu1$L`pK`ER(9`?Q=Tm;RUzW)iIjU?i(=NAb-6T*=N>4)r z!855zB!mhj<{C#tB`3d}rFOMtahpnr$tDpE5I-EcR0;k)lWCs=AEonnoTH4&xXK>> z3CT z-ooP$qFa?aP7*F`*P9jaOi9$S!N+Hrh{MsoT78mSSK`w0dv(w-Q+>Gazl~3@9of`` zEievcFB-T)mmr0(M>E{GE+j5&3@EpgDD z%LSCt*W?T)4yQ12e3w~fCSfz}lZEcXzdK^vZTxH$1tlY(7709~y;kDaWFdOFi!9IF znz${7KQIpBbA@y5g{2-_hv(#*Ul}&lchM|?Wz?Pc(ZyEjzhUHBp!164n3yS2SWC0x z_4FHXd#_~ZFs(b6Py+4CELxqzgr4M;#v8BX(MAk4cBK4)XdcvQC@%G=6%}wbbOiA) z|JA(ArePyF9b6Pcc^nu%nb9ca5l{-77ZNH@N+T_P1n{#{*387+kb%s@={Sac;&oDf zwboMD&ZWOu1Er6oNy!oQ)Ff~7$_DO3vy=iH&z>ip+?5f-V`Sx@J_6nl!QW-Pg=%oL z)pC`J6MC`0KAf|t$ic05b2!t8jCzp|My+?qn zv-XA@xe_Up4|gI)-Dly9JU9kht=-jhz~m?_A*}YBdnb?NCDkPNRnp`LYh&___-~mt z3HD@EfuB4j)fAtRhzce8?HdUh=$gBK@nvG!2RAQvA9jo_eQ|WB=#yUpHg~f;-0^Cv zifFS$r&rELC3c!nE`54UbM{O1Qt8v1!L8ACpzacKqS4s%{_5tMdbO>%zPg+_#Z)>{ z+PX3Iq_T5&zJ=3CSFL?4Dnf-2GNPpn+79^T-=)~{Qc`50w2@t=;wT!@mOWrCCrhaR z05bEI@DXImtY_2nH^|}+AQo|`MlEK2ox2-C!4vI`v^FO`?l8?X{Brs(9nfx6AvGjV!Y!6^FDJ_vb24#8)uOJ7RethaPJv$iZ$tB_L$ESBv z&ej-1X?`6#{v?_^fISgQcR1_EL56A+0oCGAA3{t42gE#;-~N;fwAT^d859;nHCJ1> zILpf+{m_;eZu_pKI-p5fBOF7I?r(Fg^V_oM_N5||6&vciIY_8}ibq%n#`R1`{j-M7Ae|Tp=b*8|!_$Zvd~vouEX}Kk8L}pgnO4S*R9JHmw;NA3f>qS@0TW=K)S!vO z%q@Mm5OMiuLtL}UodxCkm%n}B$(gHVva9z+ezw&g4>GV|CHRmuKft;fP;y!aE!bXG zJK@sYbh$hh`!VZc-&=>N?3ZQp41$=|{X@v<7qK;`tJta2 z9JfOqH%N>s^NSu05*I6AP+A~g)wS4d)QtmUuSxM-atSiHEXYChF0@(3N_L`{EH{Y( zjB4qFq(?yLG-W?vQQ5_|&u6Sh6TI)qwyQ6Tep<$SMG6htC9^O~_#Ll8^i?Uhi{?av zL^EIm#ILFD-Oga7Sc6EcOa^~EfgIU6_J0)`TFLtuNFchWm3O=^4z651u zet+h)b+rlAenNA7uV2|`S0#av6a-dYt9};L`Sb|A0ZXR(wNLo12cj<=mS`*?GuaFN z0SfR%?NyrzFT69(B&DQL zV#)qqF*55B0DReK>h1pWaER$sJHBzt-!}svEaNJ926_189K1a|WA%5Zw@gwP)z;=9 zDOJJBGQX5%_8jh(5v?`a4z~HCoC3a)rn`@TqE*ZNECnbtP+U3z58)o(+73;hO636# z`hbS-%fhOzDBc=vNC@aRw7X%XemcGV`yNy9)U&hMy|Av#nfN5zrgrd>$Nk2|IOzI@ z@%HE+_Rkwqb@XhkmnTF}x}V6^*Hw4a6`|wSlLdgT%xMW!9^zX!O&ZfzCh8Nx%SXSG zf@16bfa`;-JJf=yR_!Vu0qNFvX@cQ{LE|SR5|4nbhm72C?^}aI16I#1E~NXKXO8N9Xd+gYGGZWInrSg zN&Bs0N~I?lmkwThME%6e+<4|o?%lKFhW37dUL_Ewp3mY!wpu#o-uA|IFqZbUvwA?Lay;pMVTp zMLZVNpZJD0f^thGJa*n19NEtH_aBVy+=|x5V~Tj)Jcj`p6@$r%mRjL{VP&-IclGJA z=klX5t2rMK&&AY!s@bzKw3Sf!UYWy>@52LgY^H^>TZTWiJPXMBXge~Yq0p0!?JtkS zo%8fwrgL6fv@;heJVYnUl-f#P_6Ub_gSK5W2;=|`0V1tq!!_n@iu;A!+@-r$;)e;V z<|!pxs<0_3pY4P>`|E?f3|H&7FHPJ4xqCZ>UK!d={4MX` z6By&rk|h(Cum{3Gy`?2vx;tc%KR3Y7p>gSuTDKViR3oSmtG)}g(nq0;Q+HLin!}$` z#_0<;4>{XK7v+TmfRh)!<6SilA2l==kso1<5j1^EdL-dOJDTX$h8Z?l#D$?nP_pJo zFg5QLqIERJByOa8FkB}eR#L3Hl)kja)sw?{FrmFL5~zoYbrQ*r&_4SDuwAy_o%7^a zR8LWnwL(gUL6$6E7{`pX5gSr!>M9d{_<$?JOSDfU7*;5`W=$A;8p}HIC6dPxG6BZ2LsdRntiu`%P_7v* zOi=#wxj9-@#gtn`%^YF0OJJK?0*X`YOO?l%iN@z9D!aw3@iRvOh6;9_^ek`y4#4r! zW^kcNycvUcZ7W8@I|5xPO4UEZ($Ze9X$xIVrY)WP-WbYj*!jxQxD`QLAHaNCSxmhaI#~hvT`0JXmaBy3fnco%~FFBsDA%~kA}je OfzPOT5n#aM;{O0-UV+L0 literal 0 HcwPel00001 diff --git a/www-apps/phpSANE/dev/images/mode_color.png b/www-apps/phpSANE/dev/images/mode_color.png new file mode 100644 index 0000000000000000000000000000000000000000..7a9e0e26c06ef1deba791d4848d82d5bbcd2eb44 GIT binary patch literal 1176 zcwPaR1ZVq+P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*q+ z5ezi|Xv-S_00bCGL_t(Y$HkY)a^pA^?qEyiZRB?IvT+#Rgsn`;fWr6ti4X$Z800z5uW$T3ItlfnVL?N#XpEWi`6Qb7pd zQijeAEIn*OCyAa&N1$WBfP01ZI;4Oec8gkVveH$-6R=W4OyDZmYFIm%B4&Y`2tAP= z&kcV8-^k-g%VF@>~O32aAU(QH^ku#GS~UK*W_be!xcoO@-2q zGsZfV;8_)q(&kjV9<~pdeOCN{4-q_(h$p>)r$N_*j^j72+I|5C1#ep45g2G7b~#+z zC#+eq8H6B-NFcq|Luqv=pr#0#dky!wy-jv1X}?%4 z->p7te1kY;#hcCGF@sGKnpXq4rn-doD(3+Imen^1vnsam%vRSAs3o_|p1`dH$9Xz| zH{h;dTkHh-0HMm4hvMhay`qD#fL(K{R|kuyo&#M9-0^(i_$XWEBfUa*`e+qCYrXGz zj7`3^7KS9q8^aVc&~DlCI3f%r1|k!l8OQSkf0bZYfS)?1?1t%JY~d*vu+hJtW473C z;GYm@;ETlg0{asDkju7nME2;3$Bxy)P`@jF^&KZLh78^|@C(ENAzc248aLWl^!RZFzq+ZT0Bg9?h|no`!85&E{q<9-H&t0{D-|#)gJ%tw zEyLvt@P4Fv0&0Yf$U@-xp6cNztDE9qJs4F>5k(yQVq;&j{-dwgG4I;ZGb1PsHPK?+1aG zVhWXI%C&iz=6r_zx{gI)k6<0_210@q0E_5(>r{7bASE;u`?JncpRX|f@(Pnn67t#C q3-}1pX{r;Egb)$k=FFdZY5NbYy;s5wtuZ_R0000QL70(Y)*K0-AbW|YuPggqc2+@tp+0}z%|M~co-U3d9>?EK zU(3bhDAIafcKeFNTItF5I}WB8M7rERp%#(*NP9;V&%P!{lO3@!Jev%vd2c`OQ{Xva z`}1*~v4PAx0S31Q7lsL6ekobZ_r2Jate)I+Fmb36`#|&_DH$PRveexVb*N zW(Nnut-FmJaqlHHk{3E;?U<9FP|@|ecUeXA_t%WiE}ficsL|ylKfNndX2H%iTa`Rq z9!*N=NLc$de_i4wK`xeveDjKDJ11{W?Yx*0BYSD$my$I{gnpd0^Kg;-{3UdC#8G>m d)?Zs{84_7-cd0CVo(J?EgQu&X%Q~loCIGx9fw%ww literal 0 HcwPel00001 diff --git a/www-apps/phpSANE/dev/images/mode_lineart.png b/www-apps/phpSANE/dev/images/mode_lineart.png new file mode 100644 index 0000000000000000000000000000000000000000..330c0d5f7bb6476c4b70a4279c18a450b955b249 GIT binary patch literal 268 zcwXxa@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3jKx9jP7LeL$-D$|*pj^6T^PXN zr}OT5AjMhW5n0T@z%2~Ij105pNB{-dOFVsD+3&Km3X03Telz1OP^ib##WBR=_|fa0 zdtHBIS-0n6$dArt2jfjx*DZWl zz|GrQogrc4gTe~DWM4f D@aI|H literal 0 HcwPel00001 diff --git a/www-apps/phpSANE/dev/images/msdropdown_arrow.gif b/www-apps/phpSANE/dev/images/msdropdown_arrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..b069f478284a424ff108b5f0df3cf38746cac131 GIT binary patch literal 204 zcwTe&bhEHb6kt$bI3mj+uuG)AzP{^j&x{!}{{H>j-{0Ta+1b<6^XAtZ`{Pa;2X&P8 zs~tFS;M%ooEiEn0&CM@fy!id^x5OS9@jcR;UT$$Z;d!@1FL6(dS6QByo^=ra=P;hbY>q>IDGVEY^x8qZ<s{2Ja#B_20=8f5-%y4C literal 0 HcwPel00001 diff --git a/www-apps/phpSANE/dev/images/pagesize_a4.png b/www-apps/phpSANE/dev/images/pagesize_a4.png new file mode 100644 index 0000000000000000000000000000000000000000..9ef360a8383f43c9a5a80fc35c187afae1274ac2 GIT binary patch literal 1076 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

P8%N2K(`HPJP>Gs6VZ-MuJ< z#3=|#{`J-WXHZ;Hbspbfs`RJctV2QJRd$k$qZOD_9-GO+bF?pg|9$=98vy|uVGzfn z@)Kaf;*lv@KVa4znv`HL37Xnf;;99F82-3QXR&Q?dw3>FE5M>WUX|@zKjA{+S+S`e z2+7Q4viJftJ`w8O^)AcE`{%kZn$Wp+clA&O;>2a0v8f(T{KMBUSxblocX>|)IXAEU zD?G6bb`1y&_lO0rWGGS-^G*BG6E2h2Ha~bzt~bot1kaMacV$=s|InJDjg(PPTshqh zDrjIhP)3&Kdxf4zxPMPkR~4RNaB((2;X4$Jl-x(ZS+g!JuG0TqtG8>CU6||ct=4V7 z$?sy2Hl1MMe0!&ORcSBbmf69QZrj21GlHgIpC$m!{pG9kf1LsUV?xXlX0PHpnEm)e zS-rP|ZBp&#*zFL~)^=T6bH`|VfqaZ}GuH>{Bt`vTtsa$91}erZzIpY>oKTuK{AE5# z4duSRdji_jFly%J#yd(Xt}<6;%;~w7Mg}h_?`*}!>J7Wc4!`TC zinC&Nz3s%!Ttj_b95W-LSA$7QM0hrqqVy^euKNNujhMi>Xc;Irw!Dx}6#lhI4~XsA zN)XAk&ikBR)eEiblf42WXpGlR&`8&%)RM>w%p>7&zCPAS90)n5zKU32QoafS+^ln| zJR1pUnx@gLaSr)1q4{$^uW^9o^9p>E5|@TuDm9;`0%c}=1FPBwaG~f~CIl0}@qc|M{yQ*)-zNXnE$n`e zj)o_3xA-k07ha%ZUH7O9mR!408QPsF$;Un#?Hr7pqL8ms{P6;7XwtX$;wgrZkkTLiU+cDuk^5> zawSGej;cUC{Z|dB$?(=y-)*jQPwx1_t!E+L;KH~Zk(6Toi#6Th4?IwS>I({j_d)8}ds+w3F_OEp3o$os4WcYSyaR;f$m}od^ zZ>bAw8_=dM1h*8%yF9|)^5DRKk1WtdEjS??SY)IdP3|S?jjixh*tm$4!x6i`(y7ZO zw0BQio&fdHG^L2ihffX}bhPaE`?tjtw|FX(jT>Wg@7CQqJ4b!@{HMGwO|kOt_{To+ z8}}ndL%h9mHqgHPYX$c24KM0tES|&co2-xv_6a2#+>5?u60FOqzh8Cdm~kZC&^%;z z-4EM+UL?OOO@9KICy;+K35yzE`&Hvhsou<~as&`zgyMEreHcq>e-F;bpDRQO%W4p! z|DtmgTRjxOlJP(^XMI33a(Xw@G_(9d&XA;nb9?69(U+g*c|V1sX0TGK-kX7|J4&`j zF5<6}dKTgpQ4UQ)Q?sqg57SBGK6`27x-l1H=aQJ$@qmrZ*~BCG>jy-o27@oNQQ5Qu?GImH$;vze5? zep-^_lIm@+sDFKop< zEn+7(?fm+taLyyO=2ph9!6_tYps-oNhFvK3Ars4LIlo+6#s)_E!?^`eV$ zg3#ycVXl>hN*e38MDPs*i#iF18Vx~s!AnI)Zq)E_YA>qqSic`=8{UrJ#%gKq-ht9< zm9%=g6j2F!^t*WiI*wry;zBip7}w4b@|~@r`oeE&FO>)yCMZvTmUp_NkB) z9~%5DJq+2jgcKi0gL<+;0``IXBgNdX+L2Syfr46ffyWyg)1q+=;iWKX#nw?@HDQ|} zC1_?;*`M0QWhyoskdBb7ub)42ZbpqsoIx^lw*KzO?Z$VnV@Vnbd|{CcC%q2tnqjDo zs6$CH*(+5kR#o11evAl|ZnnSDX9nZ$ld^`>M4CMIoaiyQy~&_^_5d71DIU`*YYPtJ z7o$e?e?RnXapBkGk0^7nYZ+xCTbYCJa5&JXO`Pt(!NmVgEOb%FL|;)=?qaN&i;zSu z26Np{S(ON%=jC#^wrCvl!Q+AVK5&|wPafwMjk^N^rDSenBh~Vpi<>KiGXzRxOCgtS zZD@{r<+SGuY&_j}PJ9jb3+IPdq!?rro;;bqAB7#=K9%%3A26a9J1H;k@eQHyp2vTc*BO|He3#VO6I)G^A-%r&1 z96U2@Nf;?!CD+&L5@4ZF6euPjDHJGoeV?%~tnWpinakdHaPdm50l9btoD~yMh)nqC zNxm4wPO>0O{{+a6h>NZn$PIV`teTGi<>~02(b4`Nzy_WoDX4kW<}4t9tw8v`v*HQB z%3iA9u@gTTp%Ri4Y0S`ucQL$M!>NvTZuaF(i3#>bJ`@!bU$2!!p z%mTIKD1yP8DS>s!atg0qZdS*R{Xa7%w2{pt6!{yGD+adtPH)XkS!eooHqnQByzTjD z2$o4=-4i;rI$%zaYxB!nmCXF%Ju7&FN*7L1Gc42IQt+~Uhxz=#Y8IFLmZaMLNXUfW zhsbWw({{V%RP!nn&*{{(h_UnVn%fkwt1(()||bt^dD&NgiId>uo6}u{D9^Q7T$X%#h*<7?MG?Rt~-7 z)h~Ks?2ucePu&`A(F6`vPRB>u%-q08lsYR6PH(wQl|-GHDzpg~-0Vu#<^t6tey`%| z*fL$`@d5aKlAz+O_x)=waBs(M5 zih5Qj(`ovs{Zv_G`tfuJHRte(RnE1rPxKalop1Bde4F_9`L9t7HV&#kq+%}E{waLN zpc(pmru8Pg_GaR~^uF6-m97mML#^1*lNTnrmB^_{{l#2f8!VzZ#SZ(N5+}=SD4SJC zd9*{&xZ~#UK9fr+&!{?BFR0bs0fr4Xx*K@(<7~K$L93s&)vEKVzZEcALK(EH@CC-G ziF93Hj!|XLlsJk8rVPz%ymTe#-GAvFEYad(1HP5_+?9LBoMBzovq-{SOpwR+1b`iB zYCVc@V1MOVr2lnCNR$5dchfh^^g=Jb8Z9{{DjOCbwNfUgMkCbF$1!(4R=6xKf;x+Y7dH0m?54PB*r)B8(H=+n zZ+Zvlzt>Y2HZ_@uQ>)kAiWya)ud5prV7QkPA8QUfhu39Fn$|tj1z!E^(1Bh_z4Iam zUmjv^H{TNN+_cP$*}7n}1zUc{mW(vwk6N$ZM3hzND3({!elt^a>D4V>bB~)qjCvFb zgH@CbH-D$7kEal<_2d_k+>((#_k9tzOM$n8S3Y4hW0{A$Vm*rRAlkZDX(LExT|&>G zAJv*euqWKxZ(0ekX#pQ;-`)!ot8`E!9I<{9g$vh*c>SM7nSSr;k zo1SLP7&APyaIL5sk4D@&mBx4dz9Ch2c?J?sXhg%YVFqt8i|pCB+j;OULkuRzzqPX zSoj%~B;T#ZXSgqai-hS?l6G^O)O9WcTEu)v z?*xJ*wnNR5c$4F-Bx8H0m^%7?pJMWwC07nZ?}&)vXRwU3GQX8|whg0v^Ab`@Vv;_I z{&*S6^O#-!McX)$Oto9*2_SdKR;R5*CGlaIYq-dZbsw)61?}U=m&@e+cc~>aR3H>5 zX>Xzp9@bBIrVZBx+yC_89D?mgxqR*kpZMxGy*L`|;Z+?r?f1PC@!(WYehIH&b*+-r zr)w4bHd?Bvexv)T-7hOo0A-xFtPk1hmM`3cphtu^9#*bLy5$Vl(R%0NL))SLSqq7l zw+jS?`F1~3R3dU4^8G2FXNa8n3WXlizWqb{fK|3&VHaekX@{di2Py({)Jkse>4V1OCi4CpwS|8`necDRFe<97 zJ-ds?Fu2#U#2MiTS^1V@YL}qr;QnIVZwH+VkkOw{P`Ecrw#*~BBV=@se zSiFSVXR8bJ%Zdxyp1h;gUFKP-`_I5ZOO20H?+=elY7p8ThSI$m_6$)L z?zD}6xlhZ<;H^;}zJ~Ja=+h$XbW54JCX z3tD25S{Fn=k5Lz8MKIY3j0$;pu*pzb(>Tj{1ZPuoahyIrPa1vvRsU&M1i4$79u-zF zKwE5feTgyZ?E_QkmG7=KCw-vp*2qc9`0+_MC-k`a-5STAj%Dc=czxVzw&TuK(m$qZ zd;~!H=!_Cy*#$0FL1kN|6*5E2oc}1>ln7IJ$=>gk``RsRtv2apQoi?C%poZAOAc{uZ1RsF2D~0b+=St$M%$lNu{jMK;{Cej70i zap~5GDR1q>$ycO|$Io?&jN zO~z*6`3(T96R(cC&NYE_mMPmdv%r2TBeOfdMqU}vQlvQQ{-l0=1S(&I{3szoND?Q= zW7-my1ZxF4>^Bt3cj-D02(yG&rSQBopMg^M+_63TUTlA_!F9C^`wzRbJ{5@v-6kHd+qo6224Ukc^;)HBXES9ugP-{&lrA4iA-WWd zt0iNil(?(mX|_yWB~O5YzQz2v?Bi*1Y(_HgFUn4r?wFG30s2ue$ofFF1Ep@MAq|e3Mx248^~FhkZ+{Q zFEkq7*a?i0eOBKJJ|#^iMkkLT61zqT=4`U zDC5jpn}YEN^W$YmdP<$kTBEAg<-p1d7?KFIK<`f~PLT)M!Yib)`&o ziqw2ANt1E#dH@%SMi4Edd13WldO`bUV5W(i=;g^2I5abj$#Gaz`Y73+YaCIW^eU}nE&i(h9hJ)zd4o&x;>Il@@P%kx_;15endQgX&tdc_V1VmUE*n>Z>n0BNis1lC1 zL-kPHjDz_)2@Ejf0%eqy!t^3$7Wxe6*P}V#1i;){QS>?U)aO#VX`lluG(2z5eaE)c zT&p0zIj&-4ME%}Jn=L;9tiAyqE>SYmM+_46*aG}DVz2a2JR%|@dCN0# zECA>`|Dys%#B3S5OMWHoNWMCD@}l71ZT9`*d1wWnit9uH+X>G=_+-+rvz50m57zm6 zZr;9H_j z%=Kk>J=e*g-rZj5)Rs?uMaGhSPHDDBWJZ$Kz^fL`0otGotaG5U0d3PX+f|sg8xLY+ zunjIg0Hk4ELBIVkwHc<2jpslT(?`vD`e>|gVi%so7f1SdRZ$q>4eLP7PQ-wV5=5fc z3BF$&3)5;n51QQ4waQOccu!O?YoH>Ha{1Zmp!crRW}Q4;&?R+alGc-u+D^ka6ZCr3 z4Y9~d{UiMW)%gifY}q%M5zks3iP84zuPJxv3mN9IXdV_LndHVsL6w;=X+Ni|l9HJr zOn4JDs?U<;6}3-|@<>Q=^3TorRIB)I+dL)3UV6(X&Lw2B;z|(Qw7h&JiI;@!XBPKT zQ^yo80ozUZD|O$he*QDlkwqt3%rdk@(<>kSZ|j^u#wWl5MoyP>L?O=RpPu=n6b8IH z{hS7hvBwY2!AS`e)hqPk*T^S;6!Pth+ZFXCHFac~J!HRV6_OQGUS>K-i?XSut})6R zwmc1J!$$kvnL+n#UsUQxTivCKiu{$Cf{h{~SLh^$-ggMu>#(}LB=O?Pepe5Yx*vqL zPwhKr@C0DS{qbKpGr+n3xZ@7Iuf#=Th_#^bStJlOa7r#(R^)Yhr-y&;p8BoU+~zCj^_x<{5U7V^2vcnliLoP;@?T^ZHKMiOgJ7SX73J!%0=|2s4a zrGExb+Dpm9EIPmKDrNFvJW=vai+@z*EHP~WeaLKod1U;vx6ECa>?E-A-q(EY1;MoTWUA3X@{%=LsIDtbm`RsyjDhn*R zHRDp6++W_NY_0`_EQ)q)XA;IYMCcnF@KBCcUL=hZTNG-HYN~^X2v6Jn){I|-JzIna z586+<*7jp%=L`t~ONxBEL0PK*MfKd+Wgxxg zfx@kl|C!a>_3w$>r(^BD%5A#Y5OkU11m%ujP94O!68`swA}N=E3$U_iH?-Y3HVNXT zB9AP30uU_v*>N{f$GZp!csI_rRDSL}?@q0eV!I4Wx^eXqRlJ!&qCVf8@+OMyk>jxqL{_v!hW2obePRTR0#EPQ_&I+hxLCY_DN}plKFH4#5*E-ts2??>l%S@ko~YJ ze{wZ+rsn)_9=J~fN-jwm2b$IvQtWt;~C9K0pEiN-A7 zhY+*d>du~X7 zjkB>Xh*_WeW$77KTl&ZzK)Q*)@8er)D1iC>(u+k5C-dUltrV7eEr#?F-@}H>c!f zMHznA&%XuYFlxlq2&@3|nl(l;kEyD3lx_fLBMk*gH16cZDiDAs@$S@qDF zSH=+$5#fS&Ou5tzM4^pPtzL+^v*}kafjxok8` z?QK)LI1-<+37wT{%I8R8kxV_yDCaEdd29EgXo`cfX}N|^fL9#H57KhiuD6xici;1h zY{I@h0dis=PcNSUnl!3+l0Lvr)+%nBh~fx;j4}XVoA{OdEQM_@rzm@p()^aK%6CRt zS}JXrL-Tvz_r*U{IzA6?BW5jk%1_(#W_%=d67v7dS4m$iCRAJD@Tf!TJEvsc_N&=% z49lXd#5ALsZ$1Zp`50U9vIbpZXeflyX*IQ&+A4!?gr~;*+0ubq1XaNwXy= z)|8g2l#7vG{qbtyKotgw$mGE{XSe&#w$K5*@JFkK#3mrz{le9MKpSk`H>OVP-$ilsRoL*6 zV^!5-MO2iK*UL@Q5RM25ltS0VvD`!J4XKAOiEB*=0-H0itbFL-E_2BA)Yj=|{QvqR z!m@8GU+j9-6_@WVUBZi;fuhm~C>pPO_oC_tn&m1wJgjc6n^^3dikr!SVxxw851x{P^oA-J?KRPmjj*wZs@;yV{AY~!E99B?Lzw4~o-3%doi zy}j{p0bu-dyHi~YFs@^xdY5OabZ(eQhnH7XYKBm%S>VqccqPGt3b4(4g=`3OsLjAW z3T?$MaM(9^F<*br6%pI3|H0_}Zt8 z>7D&W;J$!0wBoDJTxUR1#_SGy7Cyjg_44d?RWp`z&DhkzJu;cNQi(i8PsV+Jg{QIs z{~%V?73yfB+H<={8TABk|Ls)`NL`@znQ}Q66)JXftI?WekK^r&0Ojw!GvQErRi>bi zi@OFnp`bPfmpT<^j1U(cy4aXXOim#kKK>NiPLjO`-@=9=x@;&pCN@bXjo0mm#R@ni^jJQxb}w z%!f@1UJJRUOb&sc00^BRz1OGW1?L*wpbasHt=H(*jD`Czj|~ejL2lXB(^N<-gH@8C z>-c1=Q@u&^)BW?Md#m$c<{R5r+)c%U8q6DJeNkoAP(V0AbkSB#$GgD~RksE%W#?uy z`MF~wfBfW7X`&`=HM<%VyOAiA*hWu)Z?$@F!E}Sy+W4Qu35GBkRa(ef*hiQhJMeOf ztaDeq68oan;y;R#48Q+*KsLxr8RtSm<7r|8GfEAr_RaguXlz$Q+DpaduW6!I zj;v^MgzQ)jo`}R^yGC04s)4#gaV_WzZu4c4(vPPcG1tj!$7fFf!xs_uP7)z>O>Th> zjovCGpA+dD{eIo}f>eeQCwAC!YyNmC?9#EV(*7^`f_}<)es}lz-#OfKy(N8nhwk@y zUX^Wp9sm94po@9(%P+u8Z@|4Kym0@zDW^H++QnPY12M6*bz|_pu+L{=$7MWdDa;N>?K5?|^#BL1IVt~00! zZCmH)0X!m2sZtdJ(m{$+BZz(U5XbX zLy6CSDc+JC=wghabskrz)>NQZ|824BaNy=WVQxG&KlBoj`M_tWC+S9`lV?Z7)i5&; zd^M~W;ARP*4Suk>8yq2WHhdE7zIJpTbX!NbV5#O?ndA1MgR`1P4=gW=wZ%g#cQ>=qG0<$d6%;1R!(E! z$6CDtwfpX?BeA6d*79Y2v||Apbw@GCqVL1*2K^uCkb~~F>eG*YwEZRnic(y9s4UiF z6j=nMLWiZFwPdPHygfD#9@!F-71hXg46+PEWU+4LLX|@)syF}s{o&R;b=&^?HB*UYT-a_rXEg?vV(xFW+vPCLIKGii|2RUTK^#$0X5$?8 z0GOTWYne7Ttq{!1{3}Ve0a_1BAp>r%9F9N4enTk%4;ff=MkD{1(jbC-KX1J0y{dFN zb??|Z%AWhf>{a3gv#MmWuG+@lYq2N6?Eig2y*Y44mpslgV zu6wby?!}nuh~hp&&U#oGH>)ff4|DMgRNae=%Kj%pBNv!(;wPkQVCNLIU|nZ0tiFqAuXis$Vd!Sswh;JW5V?j*Z4l^H0^*zw@I|;T zrFsOPnz^(MgB;J@UsK|+01KU@1<$+!sJeySmy%{;iC#$qP(d2s6X*rOTRA-%m#1`> zAOlV#XwDFD&l2zPmDm1KRsN>Db;h!l+t@am(u4@@{pyFO>N5@;KiB{}5e(s-8TtO& z>le>)4jX-O+Wnx{dbM@gaaSd=+{~0&GWmr`rptkNO(O7fTVKE=IDOvZslXSNhnvyg zM8V^44u@;}8Z2jS;c}~67bfu!lDF$)T@}*Pt!;97Z3+*&rf9_O1HVFbn``Yi&CziqS`_)YmjP{x zO$-+pTbuEH|MkXsvIwiwL46J4ph{mBEz#%Bz|{OtW}~~~Y~P3lz|AP13LvUu%MIy{ z^^zDcrChj)mmu>Z(fW}f*<@LiKo!;$bKcaK5HwGOt@p}F z`)oj4Yo?vQWyTzdN>Mhc@#*x@c8x=v?sCY%{`iy?f&Xqpw%U_{?0*%mA5Rf)ITN}M zQYh4`A6CyQ8Aj_z1~6^fte}eXy31RgSbYL5OhC*lCn3r(sBwRClKg}A-Kx}!$dmB7 zK%ckk(skYOPTeDTsaxyy+h?bBn_RhH+%?2~_nyKdEnAVYQ_r+X79a>D`GoTnrOWz_ zaZhU;c;{yLs^(z1`!tVF#IS{iTT#gT&!&l$GG7A(oAs=J84?@cz72bXl2w&Qt(U|d ztB&O^G4XfGm#J*(J7*?s3csp6itb}Kj_8mFR_RwXE*e>03SM#U-3i57E22agY06>u zeah+0_Dr5MOjRb{T-cTt+qo1lRHJkUEo^F63o)O>UCr}WEVY?a?q}z0?tQTH0$iL= zON+JWo1lI)^5@%agYqm?a?yztu-Na{lH`e#Z^K=;wgw=u!e8|W<>X4Wa;?Nw1#k~5@zQ>K4$Vu|=}nvgRfVn)4F{@;80X& zsp^RZQ{t1?5}4$UE3wnww$ck>f3)to0Vd;jjPU&0BTK(tjC%MN7!0*hQ!fUX4Gbm1 zzYe|kfr2oI{&t29U$<^3Y>?@X^I<3>hFJmKZf?GExSj74AOSykDNCJ2u4wEP~Wqq z{FSi45*J%$mIW|Rds&ue?{dk0gBHCH|qG^>U6D#sdLYLXzg?ho-JjeT}meH;z z(LuK=+_hQOq-usSf~7khRLo54LOE_7zGkWHCC{Yb_Rxisy;F1p=NV5xh&Rs3S4`Vz z{H0BK$^1aQ&SuPXIZ2|CEss0$o`p}gM$@rn&jjd$Dk;l*B7Zos8+y%A50&vN3xi%4 z^K(2(@K|x{^)aX65A)HtGupJ^8g=$`9rw%yvR)!gJt!wKUB{1oIgzz2t`h z?P;AEC1`ppRiT&rF3ge0jp%lKamN~uCIc!r2c8HX7x~l(pL^^#bs-MO06Mp{wUCDR z!rj5!v;yct%_GBg!t#$0`?|q8Nxs`KjP#a5|6MYGjhdImcKq;sqr`p_(sG_&m!h%Q zcx>k_DwXnb!_&NJx*#v^2x)#^Svt1?Hg1|J#i6gdP5Z>|) z`Xcl=gr2E+L+A(BbWRcXb$f1N(uJfSg^uQq98bU0(H+ZnQY;yuy)aAgp<6cM|535| zj8dD)i12xq&r^4*_N+82Nyb@3Q_f>0=bK%V(gmVmlRJtY$UOyodd8S|FiIW6xDn{_ z^1;qS>yNgaajl|Dd~zo1iPw_uAGPC!H7Yk;cRJy%^(YOGnoV&cOX#Y?^FUbT0j*>qS4$=qL=M6esSh@CUStu6*?X-QC zzA@*kk&GM!>IY=B*Ser9V`$|S5m8nGJ6Y@V-JkCD>)6VC+$?T%`morBp>>ire_x;# z{Z8Am;O9eT8j6>A_L))q+WGeqd-_Jdr7|rNB=`Cr{a3X%A8KY|sd1!mhic9($fT%> z`}JDGd6&-I|8wP}duJyut;1}6TP+f#Xu z;0C(#DTAd?6ceeii}350p2dJDGEsb<$g8^uzjkV^LhHb@|EI7Zx?FKt`QD59mYRX5 zF(3qyKmyagQ5M;))@rSUb_IGi2-qrv?Rq)qJq5Vf=0HJ>1b9qOntW{D;?Iz(Zisv$3j6WwnHFIe zzba?pC>eJAgmjAbOlu5?e|wc%wPOmSUy9RtKW(XSbv5CjQySi(vv|3Mws#!G14VmQ zN>(^0nZR4%V$3+ykti@XZ(4DALKCyIjv~o`MP$fDktfw`DZ%}7Bq2A!^W;K2 z@t)*dhVsQ5(7|U#s6e94&HQr1?peYZoc;8poWOEEV}iRu>+hV8lJHN|eB&WNNCFA$ zncr_csQw#uy#J^V*_9bYG}E9%e2)?bdUPlzwz?4oBMA&@rMWSX%T#zWDr*Y1aU*_w zh#qo>rXnfn0nJu=|Ib7{P?RD_jnV4bCFj`1G6qVS1CmyB@p+O3hASHTp@5Qeh@_Qv z89Owy#Oo;1+dTU(+NCbn3d)bC)xQaGDtMk`HC&%Oa48nX%f0GdlFZLT-5;Jqsgyv{ zs^Zx*&WYh<=?AQa!FeF&tkmN?;$jZMgFM+M9$%H|fPwF>z?n}&fKP@Y}!DGqf1aj13z)qOUgtsB&|Hh^CV4! j@D0`eFzkPWzP$uR|H;Tk%VdP1So?RL=KrS+6?yC*c-X|S literal 0 HcwPel00001 diff --git a/www-apps/phpSANE/dev/images/spinner.gif b/www-apps/phpSANE/dev/images/spinner.gif new file mode 100644 index 0000000000000000000000000000000000000000..4d809c3e3806699ba312b72d3cd6fd7e36159972 GIT binary patch literal 3802 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 scanner co-ords +$PREVIEW_SCALE = 2; + +// set the preview image on-screen size +$PREVIEW_WIDTH_PX = $PREVIEW_WIDTH_MM * $PREVIEW_SCALE; +$PREVIEW_HEIGHT_PX = $PREVIEW_HEIGHT_MM * $PREVIEW_SCALE; + +// set the list of page sizes to select from +// ref: page sizes in mm (http://en.wikipedia.org/wiki/Paper_size) +// NB. only pages within your scanner size will be included +$PAGE_SIZE_LIST = array(); +add_page_size('A0', 841, 1189); +add_page_size('A1', 594, 841); +add_page_size('A2', 420, 594); +add_page_size('A3', 297, 420); +add_page_size('A4', 210, 297); +add_page_size('A5', 148, 210); +add_page_size('A6', 105, 148); +//add_page_size('A7', 74, 105); +//add_page_size('A8', 52, 74); +//add_page_size('A9', 37, 52); +//add_page_size('A10', 26, 37); +//add_page_size('US Letter', 216, 279); +//add_page_size('US Legal', 216, 356); +//add_page_size('US Ledger', 432, 279); +//add_page_size('US Tabloid', 279, 432); +$DEFAULT_PAGE_SIZE = 'A4'; + +// enable features +$do_test_mode = false; //fake scanner +$do_btn_clean = false; //for debugging +$do_btn_reset = false; //for debugging +$do_btn_help = true; +$do_brightness = true; +$do_contrast = true; +$do_usr_opt = false; +$do_file_name = false; +$do_append_pdf = true; +$do_append_txt = true; +$do_lang_toggle = true; +$do_file_selectbox= true; //multi file selection box +$do_file_delete = true; //delete selected files +$do_file_download = true; //download selected files +$do_file_timezone = false; +$do_file_highlight_new = true; + + +$do_format_pnm = true; +$do_format_jpg = true; +$do_format_tif = true; +$do_format_bmp = true; +$do_format_png = true; +$do_format_txt = true; +$do_format_pdf = true; + + +// END CONFIG ---------------------------------------------------------- + +// system config +// ============= +$SCANIMAGE = "/usr/bin/scanimage"; //scanimage binary (sane) +$GOCR = "/opt/bin/gocr"; //optional ocr binary +$PDFUNITE = "/usr/local/bin/pdfunite"; //optional PDF merge binary +$PNMTOJPEG = "/usr/bin/pnmtojpeg"; //netpbm pnm to jpeg conversion binary +$PNMTOTIFF = "/usr/bin/pnmtotiff"; //netpbm pnm to tiff conversion binary +$PNMTOBMP = "/usr/bin/ppmtobmp"; //netpbm ppm to bmp conversion binary +$PNMTOPNG = "/usr/bin/pnmtopng"; //netpbm pnm to png conversion binary +$CONVERT = "/usr/bin/convert"; //ImageMagick convert binary +$IDENTIFY = "/usr/bin/identify"; //ImageMagick binary used to test for PDF support +if(php_uname('s') == 'FreeBSD') { + //FreeBSD + $SCANIMAGE = "/usr/local/bin/scanimage"; + $GOCR = "/usr/local/bin/gocr"; + $PDFUNITE = "/usr/local/bin/pdfunite"; + $PNMTOJPEG = "/usr/bin/pnmtojpeg"; + $PNMTOTIFF = "/usr/local/bin/pnmtotiff"; + $PNMTOBMP = "/usr/local/bin/ppmtobmp"; + $PNMTOPNG = "/usr/local/bin/pnmtopng"; + $CONVERT = "/usr/local/bin/convert"; + $IDENTIFY = "/usr/local/bin/identify"; +} +else if(stripos(exec('uname -a'), 'synology') !== FALSE) { + //Synology Disk Station + $SCANIMAGE = "/opt/bin/scanimage"; + $GOCR = "/opt/bin/gocr"; + $PDFUNITE = "/usr/local/bin/pdfunite"; + $PNMTOJPEG = "/usr/local/netpbm/bin/pnmtojpeg"; + $PNMTOTIFF = "/usr/local/netpbm/bin/pnmtotiff"; + $PNMTOBMP = "/usr/local/netpbm/bin/ppmtobmp"; + $PNMTOPNG = "/usr/local/netpbm/bin/pnmtopng"; + $CONVERT = "/opt/bin/convert"; + $IDENTIFY = "/opt/bin/identify"; +} +if(!`ls $GOCR`) $do_format_txt = false; //disable OCR when not available +if(!(`ls $CONVERT` && `ls $IDENTIFY` && `$IDENTIFY -list Format | grep -i pdf`)) $do_format_pdf = false; //disable PDF when not available +if(!`ls $PDFUNITE`) $do_append_pdf = false; //disable PDF books when merge tool is not available + + + +$action_clear=0; +$action_clean_tmp=0; +$action_clean_output=0; +$action_deletefiles=0; +$action_preview=0; +$action_save=0; +$first=1; + + +// first visit and clean/clear options +if (isset($_POST['first'])) $first=$_POST['first']; +if ($first) { + $action_clear = 1; + $action_clean_tmp = 1; + $first = 0; + if(isset($_COOKIE['language_id'])) { + $lang_id = $_COOKIE['language_id']; + } +} + +if(isset($_POST['lang_id'])) $lang_id=$_POST['lang_id']; +if(isset($_POST['append_file'])) $append_file=$_POST['append_file']; + + +// check what button is clicked +if(isset($_POST['action_deletefiles'])) $action_deletefiles=1; +if(isset($_POST['action_preview'])) $action_preview=1; +if(isset($_POST['action_save'])) $action_save=1; +if(isset($_POST['action_reset'])) $action_clear=1; +if(isset($_POST['action_clean'])) { $action_clean_tmp=1; $action_clean_output=1; $action_clear=1; }; + + +// default options (-1 for default) +$sid = time(); +$preview_images = "./images/scan.jpg"; +$page_size = 'A4'; +$format = "jpg"; +$mode = "Color"; // Lineart|Gray|Color +$resolution = 300; +$brightness = -1; +$contrast = -1; +$usr_opt = " --jpeg-quality 0"; +$pos_x = 0; +$pos_y = 0; +$geometry_x = 0; +$geometry_y = 0; +$file_name_prefix = -1; +foreach ($PAGE_SIZE_LIST as $index => $page_values) { + if ($page_values[0] == $DEFAULT_PAGE_SIZE) + { + $default_page_width_mm = $page_values[1]; + $default_page_height_mm = $page_values[2]; + + $pos_x = $PREVIEW_WIDTH_MM - $default_page_width_mm; + $pos_y = 0; + $geometry_x = $PREVIEW_WIDTH_MM; + $geometry_y = $default_page_height_mm; + } +} + + +// user options +if (!$action_clear) { + if(isset($_POST['sid'])) $sid=$_POST['sid']; + if(isset($_POST['preview_images'])) $preview_images=$_POST['preview_images']; + if(isset($_POST['pos_x'])) $pos_x=$_POST['pos_x']; + if(isset($_POST['pos_y'])) $pos_y=$_POST['pos_y']; + if(isset($_POST['geometry_x'])) $geometry_x=$_POST['geometry_x']; + if(isset($_POST['geometry_y'])) $geometry_y=$_POST['geometry_y']; + if(isset($_POST['format'])) $format=$_POST['format']; + if(isset($_POST['mode'])) $mode=$_POST['mode']; + if(isset($_POST['resolution'])) $resolution=$_POST['resolution']; + if(isset($_POST['brightness'])) $brightness=$_POST['brightness']; + if(isset($_POST['usr_opt'])) $usr_opt=$_POST['usr_opt']; +} + + +// verify usr_opt - keep only valid chars, otherwise replace with an 'X' +$my_usr_opt = ''; +for ($i = 0; $i < strlen($usr_opt); $i++) { + if (preg_match('([0-9]|[a-z]|[A-Z]|[\ \%\+\-_=])', $usr_opt[$i])) { + $my_usr_opt .= $usr_opt[$i]; + } else { + $my_usr_opt .= 'X'; + } +} +$usr_opt = $my_usr_opt; + + +// INTERNAL CONFIG ----------------------------------------------------- + +// scanner device detect +$scanner_ok = false; +if ($do_test_mode) { + $sane_result = "device `plustek:libusb:004:002' is a Plustek OpticPro U24 flatbed scanner"; +} else { + $sane_cmd = $SCAN_NET_SETUP . $SCANIMAGE . " --list-devices | grep 'device' | grep -e '\(scanner\|hpaio\|multi-function\)'"; + $sane_result = exec($sane_cmd); + $sane_result; + unset($sane_cmd); +} + +// get scanner name +$start = strpos($sane_result, "`") + 1; +$length = strpos($sane_result, "'") - $start; +$scanner = "\"".substr($sane_result, $start, $length)."\""; +unset($start); +unset($length); +if ((strlen($scanner) > 2) || $do_test_mode) { + $scanner_ok = true; +} +$start = strpos($sane_result, "is a ") + 5; +$length = strlen($sane_result) - $start; +$scanner_name = str_replace("_", " ", substr($sane_result, $start, $length)); +$scan_output = $scanner_name; +unset($start); +unset($length); +unset($sane_result); + + +if($scanner_ok) { + $scanner_known = scanner_known($scanner_name); + + // allowed resolutions + if($scanner_known) { + // read scanner configuration from file + $mode_list = get_scanner_mode_options($scanner_name); + $mode_default = get_scanner_mode_default($scanner_name); + $resolution_list = get_scanner_resolution_options($scanner_name); + $resolution_max = (int)end($resolution_list); + $resolution_min = (int)reset($resolution_list); + $resolution_default = get_scanner_resolution_default($scanner_name); + $brightness_supported = strtolower(get_scanner_brightness_supported($scanner_name)) === 'true'; + $brightness_default = (int)get_scanner_brightness_default($scanner_name); + $brightness_minimum = (int)get_scanner_brightness_minimum($scanner_name); + $brightness_maximum = (int)get_scanner_brightness_maximum($scanner_name); + $contrast_supported = strtolower(get_scanner_contrast_supported($scanner_name)) === 'true'; + $contrast_default = (int)get_scanner_contrast_default($scanner_name); + $contrast_minimum = (int)get_scanner_contrast_minimum($scanner_name); + $contrast_maximum = (int)get_scanner_contrast_maximum($scanner_name); + } + else { + // build configuration from scanimage output + + // scanimage call and gather output + $sane_cmd = $SCANIMAGE . " -h -d$scanner"; + $sane_result = `$sane_cmd`; + if ($do_test_mode) { + $sane_result = " --resolution 50..2450dpi [75]\n --mode Lineart|Color|Gray [Color]\n --contrast 0..100 [50]\n --brightness -100..100 [0]\n"; + } + $sane_result_arr = explode("\n", $sane_result); + unset($sane_result); + unset($sane_cmd); + //////// + + + // brightness + $brightness_supported = false; + $brightness_minimum = 0; + $brightness_maximum = 0; + $brightness_default = 0; + $sane_result_brightness = preg_grep('/--brightness /', $sane_result_arr); + if(count($sane_result_brightness) > 0) { + $brightness_line = end($sane_result_brightness); + if(strpos($brightness_line, 'inactive') === false) { + $brightness_supported = true; + $brightness_minmax = explode('..', preg_replace('/^.*--brightness ([-|0-9..]*)[ \t].*$/iU','$1', $brightness_line)); + $brightness_minimum = $brightness_minmax[0]; + $brightness_maximum = $brightness_minmax[1]; + unset($brightness_minmax); + + preg_match("/\[(.*?)\]/", $brightness_line, $brightness_default_array); + $brightness_default = $brightness_default_array[1]; + unset($brightness_default_array); + } + unset($brightness_line); + } + unset($sane_result_brightness); + //////// + + + // contrast + $contrast_supported = false; + $contrast_minimum = 0; + $contrast_maximum = 0; + $contrast_default = 0; + $sane_result_contrast = preg_grep('/--contrast /', $sane_result_arr); + if(count($sane_result_contrast) > 0) { + $contrast_line = end($sane_result_contrast); + if(strpos($contrast_line, 'inactive') === false) { + $contrast_supported = true; + $contrast_minmax = explode('..', preg_replace('/^.*--contrast ([-|0-9..]*)[ \t].*$/iU','$1', $contrast_line)); + $contrast_minimum = $contrast_minmax[0]; + $contrast_maximum = $contrast_minmax[1]; + unset($contrast_minmax); + + preg_match("/\[(.*?)\]/", $contrast_line, $contrast_default_array); + $contrast_default = $contrast_default_array[1]; + unset($contrast_default_array); + } + unset($contrast_line); + } + unset($sane_result_contrast); + //////// + + + // modes + $sane_result_mode = preg_grep('/--mode /', $sane_result_arr); + $sane_result_mode = end($sane_result_mode); + $modes = preg_replace('/^.*--mode ([a-z|]*)[ \t].*$/iU','$1', $sane_result_mode); + $mode_list = explode('|', $modes); + + preg_match("/\[(.*?)\]/", $sane_result_mode, $mode_default_array); + $mode_default = $mode_default_array[1]; + unset($sane_result_mode); + unset($mode_default_array); + //////// + + + // resolutions + $sane_result_reso = preg_grep('/--resolution /', $sane_result_arr); + $sane_result_reso = end($sane_result_reso); + + // get default resolution + preg_match("/\[(.*?)\]/", $sane_result_reso, $resolution_default_array); + $resolution_default = $resolution_default_array[1]; + + $start = strpos($sane_result_reso, "n") + 2; + $length = strpos($sane_result_reso, "dpi") - $start; + $list = "" . substr($sane_result_reso, $start,$length) . ""; + unset($start); + unset($length); + unset($sane_result_reso); + unset($sane_result_arr); + + // change "|" separated string $list into array of values or generate a range of values. + $length = strpos($list, ".."); + if ($length === false) { + $resolution_list = explode("|" , $list); + $resolution_max = (int)end($resolution_list); + $resolution_min = (int)reset($resolution_list); + } else { + $resolution_list = array(); + $resolution_min = (int)substr($list, 0, $length); + $resolution_max = (int)substr($list, $length + 2); + + // lower resolutions + $list = array( + 10, 20, 30, 40, 50, 60, 72, 75, 80, 90, + 100, 120, 133, 144, 150, 160, 175, 180, + 200, 216, 240, 266, + 300, 320, 350, 360, + 400, 480, + 600, + 720, + 800, + 900, + ); + + foreach ($list as $res) { + if (($res >= $resolution_min) && ($res <= $resolution_max)) { + $resolution_list[] = $res; + } + } + + // higher resolutions + $res = 1000; + while (($res >= $resolution_min) && ($res < $resolution_max)) { + $resolution_list[] = $res; + $res += 200; + } + + $resolution_list[] = $resolution_max; + } + unset($length); + //////// + + + // save scanner configuration + save_scanner_config($scanner_name, + $mode_list, $mode_default, + $resolution_list, $resolution_default, + $brightness_supported, $brightness_default, $brightness_minimum, $brightness_maximum, + $contrast_supported, $contrast_default, $contrast_minimum, $contrast_maximum); + } + + if($resolution == -1 || array_search($resolution_default, $resolution_list) === false) { + $resolution = $resolution_default; + } + + if($mode == -1 || (array_search(strtolower($mode),array_map('strtolower', $mode_list)) === false)) { + $mode = $mode_default; + } + + $do_brightness = $do_brightness && $brightness_supported; //disable brightness option when not available + if($brightness == -1 || (($brightness < $brightness_minimum) || ($brightness > $brightness_maximum))) { + $brightness = $brightness_default; //set to scanimage default when not set or out of range + } + unset($brightness_supported); + + $do_contrast = $do_contrast && $contrast_supported; //disable contrast option when not available + if($contrast == -1 || (($contrast < $contrast_minimum) || ($contrast > $contrast_maximum))) { + $contrast = $contrast_default; //set to scanimage default when not set or out of range + } + unset($contrast_supported); +} +?> diff --git a/www-apps/phpSANE/dev/incl/files.php b/www-apps/phpSANE/dev/incl/files.php new file mode 100644 index 0000000..f0f4f84 --- /dev/null +++ b/www-apps/phpSANE/dev/incl/files.php @@ -0,0 +1,157 @@ + + + + + + + + + + + + + +
+
    + + + + + + +
    +
      +
    • {$lang[$lang_id][27]}
    • +
    • {$lang[$lang_id][28]}
    • +
    • {$lang[$lang_id][29]}
    • +
    • {$lang[$lang_id][30]}
    • +
    • {$lang[$lang_id][31]}
    • +
    + "; + } + if($do_file_delete) echo "
  • "; + if($do_file_download) echo "
  • {$lang[$lang_id][11]}
  • "; + ?> +
+
+ + + + "; + } + echo " + + + + "; + ?> + + + + getMTime()] = $fileinfo->getFilename(); + } + } + krsort($files); + $dirArray = array_values($files); + + //loop through the array of files + for($index=0; $index < count($dirArray); $index++) { + $file_name = $dirArray[$index]; + $file_path = str_replace(" ", "%20", $save_dir.$dirArray[$index]); + $file_size = size_readable(filesize($save_dir . $dirArray[$index])); + $file_modtime = strftime('%c', filemtime($save_dir . $dirArray[$index])); + $file_new = $index === 0 && $action_save && $scanner_ok && (time() - filemtime($save_dir . $dirArray[$index]) <= 60); + if(!$do_file_timezone) { + $file_modtime = str_replace(array(' CET', ' CEST'), '', $file_modtime); + } + + //file type and category + $file_extention = findexts($dirArray[$index]); + $file_category = ''; + switch ($file_extention){ + case "bmp": $file_extention = $lang[$lang_id][47]; $file_category = "image"; break; + case "jpg": case "jpeg": $file_extention = $lang[$lang_id][44]; $file_category = "image"; break; + case "pdf": $file_extention = $lang[$lang_id][43]; $file_category = "document"; break; + case "png": $file_extention = $lang[$lang_id][48]; $file_category = "image"; break; + case "pnm": $file_extention = $lang[$lang_id][45]; $file_category = "image"; break; + case "tif": case "tiff": $file_extention = $lang[$lang_id][46]; $file_category = "image"; break; + case "txt": $file_extention = $lang[$lang_id][49]; $file_category = "document"; break; + case "": $file_extention = ucwords($lang[$lang_id][8]); break; + default: $file_extention = strtoupper($file_extention)." ".$lang[$lang_id][55]; $file_category = "other"; break; + } + + //print file info + echo ""; + if($do_file_download || $do_file_delete) { + echo " + "; + } + echo " + + + + + + \n"; + } + ?> + +
{$lang[$lang_id][51]}{$lang[$lang_id][52]}{$lang[$lang_id][53]}{$lang[$lang_id][54]}
$file_category$file_name$file_extention$file_size$file_modtime
+
+ + 1) ? end($splitFileName) : ''; + } + + /* Return human readable sizes + * + * @author Aidan Lister + * @version 1.3.0 + * @link http://aidanlister.com/2004/04/human-readable-file-sizes/ + * @param int $size size in bytes + * @param string $max maximum unit + * @param string $system 'si' for SI, 'bi' for binary prefixes + * @param string $retstring return string format + */ + function size_readable($size, $max = null, $system = 'si', $retstring = '%01.2f %s') + { + // Pick units + $systems['si']['prefix'] = array('B', 'KB', 'MB', 'GB', 'TB', 'PB'); + $systems['si']['size'] = 1000; + $systems['bi']['prefix'] = array('B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB'); + $systems['bi']['size'] = 1024; + $sys = isset($systems[$system]) ? $systems[$system] : $systems['si']; + + // Max unit to display + $depth = count($sys['prefix']) - 1; + if ($max && false !== $d = array_search($max, $sys['prefix'])) { + $depth = $d; + } + + // Loop + $i = 0; + while ($size >= $sys['size'] && $i < $depth) { + $size /= $sys['size']; + $i++; + } + + return sprintf($retstring, $size, $sys['prefix'][$i]); + } +?> \ No newline at end of file diff --git a/www-apps/phpSANE/dev/incl/functions.php b/www-apps/phpSANE/dev/incl/functions.php new file mode 100644 index 0000000..510fda1 --- /dev/null +++ b/www-apps/phpSANE/dev/incl/functions.php @@ -0,0 +1,180 @@ + $page_name, $page_x, $page_y); + } +} +// --------------------------------------------------------------------- + + +// --------------------------------------------------------------------- +// Scanner configuration file functions +// --------------------------------------------------------------------- + +function sanitize_path($url) { + // everything to lower and no spaces begin or end + $url = strtolower(trim($url)); + + // adding - for spaces and union characters + $find = array(' ', '&', '\r\n', '\n', '+',','); + $url = str_replace ($find, '-', $url); + + //delete and replace rest of special chars + $find = array('/[^a-z0-9\-<>]/', '/[\-]+/', '/<[^>]*>/'); + $repl = array('', '-', ''); + return preg_replace ($find, $repl, $url); +} + +function get_config_path($scanner_name) { + global $scanner_dir; + return $scanner_dir.(sanitize_path($scanner_name)).".ini"; +} + +function scanner_known($scanner_name) { + return file_exists(get_config_path($scanner_name)); +} + +function get_config_option_array($scanner_name, $config_key, $index = 0) { + $config_options = explode('|', get_config_option($scanner_name, $config_key)); + $config_option_string = $config_options[$index]; + return explode(';', $config_option_string); +} + +function get_config_option($scanner_name, $config_key) { + $config_option = ''; + if(scanner_known($scanner_name)) { + $scanner_config = file(get_config_path($scanner_name)); + + $config_option_line = preg_grep("/".$config_key.":/", $scanner_config); + $config_option_line = trim(end($config_option_line)); + + $start = strpos($config_option_line, ":") + 1; + $length = strlen($config_option_line) - $start; + $config_option = "" . substr($config_option_line, $start, $length) . ""; + } + return $config_option; +} + +function get_scanner_resolution_options($scanner_name) { + return get_config_option_array($scanner_name, "resolution"); +} +function get_scanner_resolution_default($scanner_name) { + $mode_info = explode('|', get_config_option($scanner_name, "resolution")); + return $mode_info[1]; +} + +function get_scanner_mode_options($scanner_name) { + return get_config_option_array($scanner_name, "mode"); +} +function get_scanner_mode_default($scanner_name) { + $mode_info = explode('|', get_config_option($scanner_name, "mode")); + return $mode_info[1]; +} + +function get_scanner_brightness_supported($scanner_name) { + $brightness_info = explode('|', get_config_option($scanner_name, "brightness")); + return $brightness_info[0]; +} +function get_scanner_brightness_default($scanner_name) { + $brightness_info = explode('|', get_config_option($scanner_name, "brightness")); + return $brightness_info[1]; +} +function get_scanner_brightness_minimum($scanner_name) { + $brightness_info = explode('|', get_config_option($scanner_name, "brightness")); + return $brightness_info[2]; +} +function get_scanner_brightness_maximum($scanner_name) { + $brightness_info = explode('|', get_config_option($scanner_name, "brightness")); + return $brightness_info[3]; +} + +function get_scanner_contrast_supported($scanner_name) { + $contrast_info = explode('|', get_config_option($scanner_name, "contrast")); + return $contrast_info[0]; +} +function get_scanner_contrast_default($scanner_name) { + $contrast_info = explode('|', get_config_option($scanner_name, "contrast")); + return $contrast_info[1]; +} +function get_scanner_contrast_minimum($scanner_name) { + $contrast_info = explode('|', get_config_option($scanner_name, "contrast")); + return $contrast_info[2]; +} +function get_scanner_contrast_maximum($scanner_name) { + $contrast_info = explode('|', get_config_option($scanner_name, "contrast")); + return $contrast_info[3]; +} + +function save_scanner_config($scanner_name, + $mode_list, $mode_default, + $resolution_list, $resolution_default, + $brightness_supported, $brightness_default, $brightness_minimum, $brightness_maximum, + $contrast_supported, $contrast_default, $contrast_minimum, $contrast_maximum) { + $file_path = get_config_path($scanner_name); + file_put_contents($file_path, "mode:".implode(';', $mode_list)."|{$mode_default}\r\n"); + file_put_contents($file_path, "resolution:".implode(';', $resolution_list)."|{$resolution_default}|\r\n", FILE_APPEND); + file_put_contents($file_path, "brightness:".($brightness_supported ? 'true' : 'false')."|{$brightness_default}|{$brightness_minimum}|{$brightness_maximum}\r\n", FILE_APPEND); + file_put_contents($file_path, "contrast:".($contrast_supported ? 'true' : 'false')."|{$contrast_default}|{$contrast_minimum}|{$contrast_maximum}\r\n", FILE_APPEND); +} + +// --------------------------------------------------------------------- +// --------------------------------------------------------------------- + + +/** + * generates html select dropdown list with options + * if values is two dimensional then adds optgroup too + * + * @param string $name selectbox name and id + * @param array $values options + * @param mixed $selected selected option + * @param array $attributes additonal attributes + * + * @return string html source with selectbox + */ + +function html_selectbox($name, $values, $selected=NULL, $attributes=array()) { + $attr_html = ''; + if(is_array($attributes) && !empty($attributes)) + { + foreach ($attributes as $k=>$v) + { + $attr_html .= ' '.$k.'="'.$v.'"'; + } + } + + $output = '\n"; + + return $output; +} +// --------------------------------------------------------------------- + +?> diff --git a/www-apps/phpSANE/dev/incl/language.php b/www-apps/phpSANE/dev/incl/language.php new file mode 100644 index 0000000..f148f8a --- /dev/null +++ b/www-apps/phpSANE/dev/incl/language.php @@ -0,0 +1,576 @@ +Nochmals probieren?

Kein Scanner gefunden.
Ist der Scanner frei?
Überprüfen Sie, ob der Scanner angeschlossen ist, und vom Programm scanimage -L gefunden wird.", // 33 + "weiteren Versuch starten", // 34 + "Zum Speichern rechtsklicken und \"Speichern unter\" auswählen", // 35 + "Schließen", // 36 + "Hilfe", // 37 + "Zusätzliche Kommandozeilenoptionen", // 38 + "kein Scan-Befehl übermittelt", // 39 + "Seitengröße", // 40 + "Dateiname", // 41 + "scannen", // 42 + "PDF document", // 43 + "JPEG image", // 44 + "PNM image", // 45 + "TIFF image", // 46 + "BMP image", // 47 + "PNG image", // 48 + "TXT document", // 49 + "Scan another page?", // 50 + "Filename", // 51 + "Type", // 52 + "Size", // 53 + "Date modified", // 54 + "file", // 55 + "Select file", // 56 + "Custom size", // 57 + "Download", // 58 + "Delete", // 59 + "scan_", // 60 +); + + +//////////////////////////////////////////////////////////////////////// +// 1 = English + +$lang[1] = array( + "Scan area", // 0 + "Left", // 1 + "Top", // 2 + "Width", // 3 + "Height", // 4 + "mm", // 5 + "dpi", // 6 + "%", // 7 + "Unknown", // 8 + "Scan options", // 9 + "File format", // 10 + "preparing download.. please wait", // 11 + "Are you sure you want to delete the selected files? This action cannot be undone!", // 12 + "Error occurred while downloading files.", // 13 + "Mode", // 14 + "24 bit color", // 15 + "Grayscale", // 16 + "Monochrome", // 17 + "Resolution", // 18 + array("en", "en_US", "en_US.UTF-8", "English_UnitedStates", "English"), // 19 + "English", // 20 + "Scanner device", // 21 + "Brightness", // 22 + "Contrast", // 23 + "preview", // 24 + "Reset", // 25 + "Clean", // 26 + "All", // 27 + "None", // 28 + "Documents", // 29 + "Images", // 30 + "Other", // 31 + "ERROR", // 32 + "No scanners were identified.
If you were expecting something different, check that the scanner is plugged in, turned on and detected by the sane-find-scanner tool (if appropriate).
Please read the documentation which came with this software (README, FAQ, manpages).", // 33 + "try again", // 34 + "Right-click to save", // 35 + "CLOSE", // 36 + "Help", // 37 + "Extra", // 38 + "no scan command", // 39 + "Page size", // 40 + "File name", // 41 + "accept", // 42 + "PDF document", // 43 + "JPEG image", // 44 + "PNM image", // 45 + "TIFF image", // 46 + "BMP image", // 47 + "PNG image", // 48 + "TXT document", // 49 + "Scan another page?", // 50 + "Filename", // 51 + "Type", // 52 + "Size", // 53 + "Date modified", // 54 + "file", // 55 + "Select file", // 56 + "Custom size", // 57 + "Download", // 58 + "Delete", // 59 + "scan_", // 60 +); + + +//////////////////////////////////////////////////////////////////////// +// 2 = Polish + +//Ą = Ą +//ą = ą +//Ć = Ć +//ć = ć +//Ę = Ę +//ę = ę +//Ł = Ł +//ł = ł +//Ń = Ń +//ń = ń +//Ó = Ó +//ó = ó +//Ś = Ś +//ś = ś +//Ź = Ź +//ź = ź +//Ż = Ż +//ż = ż + +$lang[2] = array( + "Obszar skanowania", // 0 + "Lewy", // 1 + "Góra", // 2 + "Szerokość", // 3 + "Wysokość", // 4 + "mm", // 5 + "dpi", // 6 + "%", // 7 + "Unknown", // 8 + "Opcje skanowania", // 9 + "Format pliku", // 10 + "preparing download.. please wait", // 11 + "Are you sure you want to delete the selected files? This action cannot be undone!", // 12 + "Error occurred while downloading files.", // 13 + "Mode", // 14 + "Pełny kolor (24bit)", // 15 + "Skala szarości", // 16 + "Czarno - białe", // 17 + "Rezdzielczość DPI", // 18 + array("pl", "pl_PL", "pl.UTF-8", "Polish_Poland", "Polish"), // 19 + "Polski", // 20 + "Sterownik skanera", // 21 + "Jasność", // 22 + "Kontrast", // 23 + "podgląd", // 24 + "Reset", // 25 + "Wyczyść", // 26 + "All", // 27 + "None", // 28 + "Documents", // 29 + "Images", // 30 + "Other", // 31 + "oops... inwazja kosmitow", // 32 + "Nie znaleziono skanera.
If you were expecting something different, check that the scanner is plugged in, turned on and detected by the sane-find-scanner tool (if appropriate).
Please read the documentation which came with this software (README, FAQ, manpages).", // 33 + "spróbuj ponownie", // 34 + "Kliknij prawym klawiszem aby zapisać", // 35 + "Zamknij", // 36 + "Pomoc", // 37 + "Dodatkowe opcje", // 38 + "no scan command", // 39 + "Rozmiar strony", // 40 + "Nazwa pliku", // 41 + "skanuj", // 42 + "PDF document", // 43 + "JPEG image", // 44 + "PNM image", // 45 + "TIFF image", // 46 + "BMP image", // 47 + "PNG image", // 48 + "TXT document", // 49 + "Scan another page?", // 50 + "Filename", // 51 + "Type", // 52 + "Size", // 53 + "Date modified", // 54 + "file", // 55 + "Select file", // 56 + "Custom size", // 57 + "Download", // 58 + "Delete", // 59 + "scan_", // 60 +); + + +//////////////////////////////////////////////////////////////////////// +// 3 = Finnish + +//ä = ä +//ö = ö + +$lang[3] = array( + "Skannattava alue", // 0 + "Vasen", // 1 + "Ylä", // 2 + "Leveys", // 3 + "Korkeus", // 4 + "mm", // 5 + "dpi", // 6 + "%", // 7 + "Unknown", // 8 + "Skannaus asetukset", // 9 + "Tiedoston formaatti", // 10 + "preparing download.. please wait", // 11 + "Are you sure you want to delete the selected files? This action cannot be undone!", // 12 + "Error occurred while downloading files.", // 13 + "Tila", // 14 + "24 bittinen väritila", // 15 + "Harmaasävy", // 16 + "Yksiväri", // 17 + "Resoluutio DPI", // 18 + array("fi", "fi_FI", "fi_FI.UTF-8", "Finnish_Finland", "Finnish"), // 19 + "Suomi", // 20 + "Skannaus laite", // 21 + "Kirkkaus", // 22 + "Kontrasti", // 23 + "esikatselu", // 24 + "Palauta asetukset", // 25 + "Siivoa", // 26 + "All", // 27 + "None", // 28 + "Documents", // 29 + "Images", // 30 + "Other", // 31 + "VIRHE", // 32 + "Yhtään skanneria ei tunnistettu.
Jos odotit jotain muuta, niin tarkista että skanneri on kytketty tietokoneeseen, laitettu päälle ja että sane-find-scanner työkalu läytää sen.
Ole hyvä ja lue tämän ohjelmiston kanssa tullut dokumentaatio(README, FAQ, manpages).", // 33 + "Yritä uudelleen", // 34 + "Paina oikeaa hiiren nappia tallentaaksesi", // 35 + "SULJE", // 36 + "Ohje", // 37 + "Extrat", // 38 + "ei skanner komentoa", // 39 + "Sivun koko", // 40 + "Tiedoston nimi", // 41 + "skannaa", // 42 + "PDF document", // 43 + "JPEG image", // 44 + "PNM image", // 45 + "TIFF image", // 46 + "BMP image", // 47 + "PNG image", // 48 + "TXT document", // 49 + "Scan another page?", // 50 + "Filename", // 51 + "Type", // 52 + "Size", // 53 + "Date modified", // 54 + "file", // 55 + "Select file", // 56 + "Custom size", // 57 + "Download", // 58 + "Delete", // 59 + "scan_", // 60 +); + + +//////////////////////////////////////////////////////////////////////// +// 4 = Russian + +$lang[4] = array( + "Область сканирования", // 0 + "Слева", // 1 + "От верха", // 2 + "Ширина", // 3 + "Высота", // 4 + "mm", // 5 + "dpi", // 6 + "%", // 7 + "Unknown", // 8 + "Настройки сканирования", // 9 + "Формат файла", // 10 + "preparing download.. please wait", // 11 + "Are you sure you want to delete the selected files? This action cannot be undone!", // 12 + "Error occurred while downloading files.", // 13 + "Режим", // 14 + "Цветной 24 bit", // 15 + "Оттенки серого", // 16 + "Черно-белый", // 17 + "Разрешение DPI", // 18 + array("ru", "ru_RU", "ru_RU.UTF-8", "Russian_Russia", "Russian"), // 19 + "Русский", // 20 + "Устройство сканирования", // 21 + "Яркость", // 22 + "Контраст", // 23 + "Просмотр", // 24 + "Сброс", // 25 + "Очистить", // 26 + "All", // 27 + "None", // 28 + "Documents", // 29 + "Images", // 30 + "Other", // 31 + "ОШИБКА", // 32 + "Сканеры не обнаружены.
Проверьте подключение через программу sane-find-scanner (если установлена).
Или почитайте дополнительные инструкции (README, FAQ, manpages).", // 33 + "Повторить", // 34 + "Правая кнопка - сохранить", // 35 + "Закрыть", // 36 + "Помощь", // 37 + "Дополнительные параметры", // 38 + "Нет комманды сканирования", // 39 + "Формат страницы", // 40 + "Название файла", // 41 + "Сканировать", // 42 + "PDF document", // 43 + "JPEG image", // 44 + "PNM image", // 45 + "TIFF image", // 46 + "BMP image", // 47 + "PNG image", // 48 + "TXT document", // 49 + "Scan another page?", // 50 + "Filename", // 51 + "Type", // 52 + "Size", // 53 + "Date modified", // 54 + "file", // 55 + "Select file", // 56 + "Custom size", // 57 + "Download", // 58 + "Delete", // 59 + "scan_", // 60 +); + + +//////////////////////////////////////////////////////////////////////// +// 5 = Ukrainian + +$lang[5] = array( + "Область сканування", // 0 + "Зліва", // 1 + "З верху", // 2 + "Ширина", // 3 + "Висота", // 4 + "mm", // 5 + "dpi", // 6 + "%", // 7 + "Unknown", // 8 + "Параметри сканування", // 9 + "Формат файлу", // 10 + "preparing download.. please wait", // 11 + "Are you sure you want to delete the selected files? This action cannot be undone!", // 12 + "Error occurred while downloading files.", // 13 + "Режим", // 14 + "Кольорове 24 біт", // 15 + "Відтінки сірого", // 16 + "Черно-білий", // 17 + "Роздільна здатність, DPI", // 18 + array("uk", "uk_UA", "uk_UA.UTF-8", "Ukrainian_Ukraine", "Ukrainian"), // 19 + "Українська", // 20 + "Пристрій сканування", // 21 + "Яскравість", // 22 + "Контраст", // 23 + "Перегляд", // 24 + "Скинути", // 25 + "Очистити", // 26 + "All", // 27 + "None", // 28 + "Documents", // 29 + "Images", // 30 + "Other", // 31 + "Помилка", // 32 + "Сканери не знайдені.
Перевірте підключення через програму sane-find-scanner (якщо встановлена).
Або почитайте додаткові інструкції (README, FAQ, manpages).", // 33 + "Повторити", // 34 + "Правая кнопка - зберегти", // 35 + "Закрити", // 36 + "Допомога", // 37 + "Додаткові параметри", // 38 + "Немає комманди сканування", // 39 + "Формат сторінки", // 40 + "Назва файлу", // 41 + "Сканувати", // 42 + "PDF document", // 43 + "JPEG image", // 44 + "PNM image", // 45 + "TIFF image", // 46 + "BMP image", // 47 + "PNG image", // 48 + "TXT document", // 49 + "Scan another page?", // 50 + "Filename", // 51 + "Type", // 52 + "Size", // 53 + "Date modified", // 54 + "file", // 55 + "Select file", // 56 + "Custom size", // 57 + "Download", // 58 + "Delete", // 59 + "scan_", // 60 +); + + +//////////////////////////////////////////////////////////////////////// +// 6 = French + +//é = é +//à = à + +$lang[6] = array( + "Aire de numérisation", // 0 + "Gauche", // 1 + "Haut", // 2 + "Largeur", // 3 + "Hauteur", // 4 + "mm", // 5 + "dpi", // 6 + "%", // 7 + "Unknown", // 8 + "Options de numérisation", // 9 + "Format du fichier", // 10 + "preparing download.. please wait", // 11 + "Are you sure you want to delete the selected files? This action cannot be undone!", // 12 + "Error occurred while downloading files.", // 13 + "Mode", // 14 + "24 bit Couleur", // 15 + "Nuanges de gris", // 16 + "Monochrome", // 17 + "Résolution DPI", // 18 + array("fr", "fr_FR", "fr_FR.UTF-8", "French_France", "French"), // 19 + "Français", // 20 + "Scanner", // 21 + "Luminosité", // 22 + "Contraste", // 23 + "Prévisualiser", // 24 + "Recharger", // 25 + "Réinitialiser", // 26 + "All", // 27 + "None", // 28 + "Documents", // 29 + "Images", // 30 + "Other", // 31 + "ERREUR", // 32 + "Aucun scanner n'a été identifié.
Si vous vous attendiez à autre chose, vérifiez que le scanner est branché, allumé et détecté par sane-find-scanner.
Reportez-vous à la documentation de ce logiciel (README, FAQ, manpages).", // 33 + "réessayer", // 34 + "Cliquer-droit pour sauvegarderRight", // 35 + "FERMER", // 36 + "Aide", // 37 + "Extra", // 38 + "aucune commande de numérisation", // 39 + "Taille de la page", // 40 + "Nom du fichier", // 41 + "Numériser", // 42 + "PDF document", // 43 + "JPEG image", // 44 + "PNM image", // 45 + "TIFF image", // 46 + "BMP image", // 47 + "PNG image", // 48 + "TXT document", // 49 + "Scan another page?", // 50 + "Filename", // 51 + "Type", // 52 + "Size", // 53 + "Date modified", // 54 + "file", // 55 + "Select file", // 56 + "Custom size", // 57 + "Download", // 58 + "Delete", // 59 + "scan_", // 60 +); + + +//////////////////////////////////////////////////////////////////////// +// 7 = Dutch + +$lang[7] = array( + "Scan gebied", // 0 + "Links", // 1 + "Boven", // 2 + "Breedte", // 3 + "Hoogte", // 4 + "mm", // 5 + "dpi", // 6 + "%", // 7 + "Onbekend", // 8 + "Opties", // 9 + "Bestandsformaat", // 10 + "download voorbereiden..", // 11 + "Weet u zeker dat u de geselecteerde bestanden wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt!", // 12 + "Fout opgetreden tijdens downloaden.", // 13 + "Mode", // 14 + "Kleur", // 15 + "Grijswaarden", // 16 + "Monochroom", // 17 + "Resolutie", // 18 + array("nl", "nl_NL", "nl_NL.UTF-8", "Dutch_Netherlands", "Dutch"), // 19 + "Nederlands", // 20 + "Scanner", // 21 + "Helderheid", // 22 + "Contrast", // 23 + "voorbeeld", // 24 + "Reset", // 25 + "Clean", // 26 + "All", // 27 + "None", // 28 + "Documents", // 29 + "Images", // 30 + "Other", // 31 + "FOUT", // 32 + "Kan geen verbinding maken met de scanner. Staat de scanner aan?", // 33 + "opnieuw proberen", // 34 + "Rechter muisknop om op te slaan", // 35 + "SLUITEN", // 36 + "Help", // 37 + "Extra", // 38 + "geen scan commando", // 39 + "Paginaformaat", // 40 + "Bestandsnaam", // 41 + "accepteren", // 42 + "PDF document", // 43 + "JPEG afbeelding", // 44 + "PNM afbeelding", // 45 + "TIFF afbeelding", // 46 + "BMP afbeelding", // 47 + "PNG afbeelding", // 48 + "TXT document", // 49 + "Nog een pagina scannen?", // 50 + "Bestandsnaam", // 51 + "Type", // 52 + "Grootte", // 53 + "Gewijzigd op", // 54 + "bestand", // 55 + "Selecteer bestand", // 56 + "Aangepast", // 57 + "downloaden", // 58 + "verwijderen", // 59 + "scannen_", // 60 +); + +?> diff --git a/www-apps/phpSANE/dev/incl/menu.php b/www-apps/phpSANE/dev/incl/menu.php new file mode 100644 index 0000000..ab0a5b3 --- /dev/null +++ b/www-apps/phpSANE/dev/incl/menu.php @@ -0,0 +1,157 @@ + + + ".$lang[$lang_id][21]." + + + ".$scan_output." + + + ".$lang[$lang_id][0]." + + + ".$lang[$lang_id][40]." + + + + + + + ".$lang[$lang_id][1]." + + {$lang[$lang_id][5]} + + + ".$lang[$lang_id][2]." + + {$lang[$lang_id][5]} + + + ".$lang[$lang_id][3]." + + {$lang[$lang_id][5]} + + + ".$lang[$lang_id][4]." + + {$lang[$lang_id][5]} + + + ".$lang[$lang_id][9]." + + + ".$lang[$lang_id][10]." + + + + + + + ".$lang[$lang_id][14]." + + + + + + + ".$lang[$lang_id][18]." + \n".html_selectbox('resolution', $resolution_list, $resolution)." + {$lang[$lang_id][6]} + "; + +if ($do_brightness) { + echo " + + ".$lang[$lang_id][22]." + +

+ + + {$lang[$lang_id][7]} + "; +} + +if ($do_contrast) { + echo " + + ".$lang[$lang_id][23]." + +
+ + + {$lang[$lang_id][7]} + "; +} + +if ($do_usr_opt) { +echo " + + ".$lang[$lang_id][38]." + + + "; +} + +if($do_file_name) { + $filename = ($file_name_prefix !== -1 ? $file_name_prefix : $lang[$lang_id][60]) . date("Y-m-d H.i.s", time()); + echo " + + ".$lang[$lang_id][41]." + + + + "; +} + +if($do_btn_reset || $do_btn_clean) { +echo " + + "; + if ($do_btn_reset) echo ""; + if ($do_btn_clean) echo ""; + echo " + + + "; +} + +echo " + + + + + + + \n"; + \ No newline at end of file diff --git a/www-apps/phpSANE/dev/incl/scan.php b/www-apps/phpSANE/dev/incl/scan.php new file mode 100644 index 0000000..74ad9e4 --- /dev/null +++ b/www-apps/phpSANE/dev/incl/scan.php @@ -0,0 +1,214 @@ += 0) { + if($pos_x <= $MAX_SCAN_WIDTH_MM) { + $cmd_geometry_l=" -l ".$pos_x."mm"; + } + else { + $cmd_geometry_l=" -l ".$MAX_SCAN_WIDTH_MM."mm"; + } + } + else { + $lang[$lang_id][1]="".$lang[$lang_id][1].""; + scan_error($scan_output, $error_input, $lang_error); + } + + $cmd_geometry_t=""; + if ($pos_y >= 0) { + if ($pos_y <= $MAX_SCAN_HEIGHT_MM) { + $cmd_geometry_t=" -t ".$pos_y."mm"; + } + else { + $cmd_geometry_t=" -t ".$MAX_SCAN_HEIGHT_MM."mm"; + } + } + else { + $lang[$lang_id][2]="".$lang[$lang_id][2].""; + scan_error($scan_output, $error_input, $lang_error); + } + + $cmd_geometry_x=""; + $width = $geometry_x; + if (($width >= 0) && $width <= $PREVIEW_WIDTH_MM) { + if($width <= $MAX_SCAN_WIDTH_MM) { + $cmd_geometry_x=" -x ".$width."mm"; + } + else { + $cmd_geometry_x=" -x ".$MAX_SCAN_WIDTH_MM."mm"; + } + } + else { + $lang[$lang_id][3]="".$lang[$lang_id][3].""; + scan_error($scan_output, $error_input, $lang_error); + } + + $cmd_geometry_y=""; + $height = $geometry_y; + if (($height >= 0) && $height <=$PREVIEW_HEIGHT_MM) { + if($height <= $MAX_SCAN_HEIGHT_MM) { + $cmd_geometry_y=" -y ".$height."mm"; + } + else { + $cmd_geometry_y=" -y ".$MAX_SCAN_HEIGHT_MM."mm"; + } + } + else { + $lang[$lang_id][4]="".$lang[$lang_id][4].""; + scan_error($scan_output, $error_input, $lang_error); + } + + $cmd_mode=" --mode \"".$mode."\""; + + $cmd_resolution=""; + if (($resolution >= $resolution_min) && ($resolution <= $resolution_max)) { + $cmd_resolution=" --resolution ".$resolution."dpi"; + } else { + $lang[$lang_id][18]="".$lang[$lang_id][18].""; + scan_error($scan_output, $error_input, $lang_error); + } + + $cmd_brightness=""; + if ($do_brightness && (strtolower($mode) != 'lineart')) { + if (($brightness >= $contrast_minimum) && ($brightness <= $contrast_maximum)) { + $cmd_brightness=" --brightness ".$brightness; + } else { + $lang[$lang_id][22]="".$lang[$lang_id][22].""; + scan_error($scan_output, $error_input, $lang_error); + } + } + + $cmd_contrast=""; + if ($do_contrast) { + if (($contrast >= $contrast_minimum) && ($contrast <= $contrast_maximum)) { + $cmd_contrast=" --contrast ".$contrast; + } else { + $lang[$lang_id][23]="".$lang[$lang_id][23].""; + scan_error($scan_output, $error_input, $lang_error); + } + } + + $cmd_usr_opt=" " . $usr_opt; + + //////////////////////////////////////////////////////////////////////// + // build the device command + + $scan_yes=''; + $cmd_device = ''; + $file_save = ''; + $file_save_image = 0; + $cmd_scan=$SCANIMAGE." -d ".$scanner.$cmd_geometry_l.$cmd_geometry_t.$cmd_geometry_x.$cmd_geometry_y.$cmd_mode.$cmd_resolution.$cmd_brightness.$cmd_contrast.$cmd_usr_opt; + + if ($error_input == 0) + { + if ($action_preview) { + $preview_images = $temp_dir."preview_".$sid.".jpg"; + $cmd_device = $SCANIMAGE." -d ".$scanner." --resolution ".$PREVIEW_DPI."dpi -l 0mm -t 0mm -x ".$MAX_SCAN_WIDTH_MM."mm -y ".$MAX_SCAN_HEIGHT_MM."mm".$cmd_mode.$cmd_brightness.$cmd_contrast.$cmd_usr_opt." | ".$PNMTOJPEG." --quality=50 > ".$preview_images; + } + else if ($action_save) { + $file_save = $save_dir.$_POST['file_name'].".".$format; + if (file_exists($file_save)) { + $file_save=$save_dir.$_POST['file_name']." ".date("Y-m-d H.i.s",time()).".".$format; + } + $file_save_image = 1; + + if ($format == "jpg") { + $cmd_device = $cmd_scan." | {$PNMTOJPEG} --quality=100 > \"".$file_save."\""; + } + if ($format == "pnm") { + $cmd_device = $cmd_scan." > \"".$file_save."\""; + } + if ($format == "tif") { + $cmd_device = $cmd_scan." | {$PNMTOTIFF} > \"".$file_save."\""; + } + if ($format == "bmp") { + $cmd_device = $cmd_scan." | {$PNMTOBMP} > \"".$file_save."\""; + } + if ($format == "png") { + $cmd_device = $cmd_scan." | {$PNMTOPNG} > \"".$file_save."\""; + } + if ($format == "pdf") { + //$cmd_device = $cmd_scan." | {$CONVERT} pnm:- -compress jpeg -quality 100 -density {$resolution} pdf:- > \"".$file_save."\""; + /* + Bugfix: + convert: unable to read image data `-' @ error/pnm.c/ReadPNMImage/766. + convert: no images defined `pdf:-' @ error/convert.c/ConvertImageCommand/3044. + */ + $cmd_device = $cmd_scan." | {$CONVERT} - -compress jpeg -quality 100 -density {$resolution} pdf:- > \"".$file_save."\""; + } + if ($format == "txt") { + $cmd_device = $cmd_scan." | ".$GOCR." - > \"".$file_save."\""; + } + } + } + + if ($action_deletefiles && $do_file_delete) { + if(isset($_POST['selected_files'])) { + foreach($_POST['selected_files'] as $selected_file) { + $file_path = $save_dir . $selected_file; + if(is_readable($file_path)) { + unlink($file_path); + } + } + } + } + + //////////////////////////////////////////////////////////////////////// + // perform actions required + if ($cmd_device !== '') { + $scan_yes=`$cmd_device`; + } else { + $cmd_device = $lang[$lang_id][39]; + } + + //merge files + if ($action_save && $append_file !== '') { + $escaped_file_save = str_replace(" ", "\\ ", $file_save); + $escaped_append_file = str_replace(" ", "\\ ", $append_file); + + if ($format == "pdf" && $do_append_pdf) { + //merge pdf files + exec("$PDFUNITE $escaped_append_file $escaped_file_save {$escaped_append_file}_new"); + exec("rm -f $escaped_append_file $escaped_file_save"); + exec("mv {$escaped_append_file}_new $escaped_append_file"); + } + else if ($format == "txt" && $do_append_txt) { + //merge txt files + exec("cat $escaped_file_save >> $escaped_append_file"); + exec("rm -f $escaped_file_save"); + } + $file_save = $append_file; + } + + if (($file_save !== '')&&($save_type=='popup')) { + echo "\n"; + } + + //remove files from temp directory older then one day + if ($action_clean_tmp) { + $files = glob($temp_dir."*"); + foreach($files as $file) { + if(is_file($file) && time() - filemtime($file) >= 24*60*60) { + unlink($file); + } + } + } + + if ($action_clean_output) { + $cmd_clean='rm -f '.$save_dir.'*'; + exec($cmd_clean); + } +?> diff --git a/www-apps/phpSANE/dev/incl/security.php b/www-apps/phpSANE/dev/incl/security.php new file mode 100644 index 0000000..24e2d81 --- /dev/null +++ b/www-apps/phpSANE/dev/incl/security.php @@ -0,0 +1,90 @@ + +# +# 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. +# +*/ + +function validate($value, $constraint, $regex='') { + switch ($constraint) { + case 'empty_or_numeric': + return empty($value) or validate($value, 'numeric'); + case 'filepath': + return (validate($value, 'regex', '/^[a-z0-9 ._\/-]+$/i') + and validate($value, 'inverse_regex', '/\.\./')); + case 'numeric': + return is_numeric($value); + case 'regex': + return preg_match($regex, $value); + case 'inverse_regex': + return ! preg_match($regex, $value); + default: + return FALSE; + } +} + +function valid_or_dead($key, $constraint, $regex='') { + foreach(array($_GET, $_POST, $_SERVER) as $_arr) { + if (!array_key_exists($key, $_arr)) { + continue; + } + $value = $_arr[$key]; + if (!validate($value, $constraint, $regex)) { + die('Input validation of '.$key.' failed!
' + .'Constraint: "'.$constraint.'"
' + .'Value: "'.strip_tags(htmlspecialchars($value)).'"'); + } + } +} + +// action +valid_or_dead('action', 'regex', '/[a-z0-9]*/i'); +// brightness +valid_or_dead('brightness', 'empty_or_numeric'); +// contrast +valid_or_dead('contrast', 'empty_or_numeric'); +// depth +valid_or_dead('depth', 'numeric'); +// first +valid_or_dead('first', 'regex', '/^[01]$/i'); +// format +valid_or_dead('format', 'regex', '/^[a-z]+$/i'); +// pos_x +valid_or_dead('pos_x', 'numeric'); +// pos_y +valid_or_dead('pos_y', 'numeric'); +// geometry_x +valid_or_dead('geometry_x', 'numeric'); +// geometry_y +valid_or_dead('geometry_y', 'numeric'); +// lang_id +valid_or_dead('lang_id', 'numeric'); +// mode +valid_or_dead('mode', 'regex', '/^[a-z]+$/i'); +// file_name +valid_or_dead('file_name', 'filepath'); +// preview_images +valid_or_dead('preview_images', 'filepath'); +// resolution +valid_or_dead('resolution', 'regex', '/^(|auto|[0-9]+)$/i'); +// sid +valid_or_dead('sid', 'filepath'); +// usr_opt +valid_or_dead('usr_opt', 'inverse_regex', '(;|&&|\|\||<|>|<<|>>)'); +// file_save +valid_or_dead('file_save', 'filepath'); +// file_save_image +valid_or_dead('first', 'regex', '/^[01]$/i'); + +// REMOTE_ADDR +valid_or_dead('REMOTE_ADDR', 'regex', '/^[0-9.:]+$/i'); diff --git a/www-apps/phpSANE/dev/index.html b/www-apps/phpSANE/dev/index.html new file mode 100644 index 0000000..ee5175b --- /dev/null +++ b/www-apps/phpSANE/dev/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www-apps/phpSANE/dev/javascript/.htaccess b/www-apps/phpSANE/dev/javascript/.htaccess new file mode 100644 index 0000000..0881ec4 --- /dev/null +++ b/www-apps/phpSANE/dev/javascript/.htaccess @@ -0,0 +1,6 @@ + + #one year + + Header set Cache-Control "max-age=29030400" + + \ No newline at end of file diff --git a/www-apps/phpSANE/dev/javascript/jquery.jcrop.min.js b/www-apps/phpSANE/dev/javascript/jquery.jcrop.min.js new file mode 100644 index 0000000..4c9c7ad --- /dev/null +++ b/www-apps/phpSANE/dev/javascript/jquery.jcrop.min.js @@ -0,0 +1,22 @@ +/** + * jquery.Jcrop.min.js v0.9.12 (build:20130202) + * jQuery Image Cropping Plugin - released under MIT License + * Copyright (c) 2008-2013 Tapmodo Interactive LLC + * https://github.com/tapmodo/Jcrop + */ +(function(a){a.Jcrop=function(b,c){function i(a){return Math.round(a)+"px"}function j(a){return d.baseClass+"-"+a}function k(){return a.fx.step.hasOwnProperty("backgroundColor")}function l(b){var c=a(b).offset();return[c.left,c.top]}function m(a){return[a.pageX-e[0],a.pageY-e[1]]}function n(b){typeof b!="object"&&(b={}),d=a.extend(d,b),a.each(["onChange","onSelect","onRelease","onDblClick"],function(a,b){typeof d[b]!="function"&&(d[b]=function(){})})}function o(a,b,c){e=l(D),bc.setCursor(a==="move"?a:a+"-resize");if(a==="move")return bc.activateHandlers(q(b),v,c);var d=_.getFixed(),f=r(a),g=_.getCorner(r(f));_.setPressed(_.getCorner(f)),_.setCurrent(g),bc.activateHandlers(p(a,d),v,c)}function p(a,b){return function(c){if(!d.aspectRatio)switch(a){case"e":c[1]=b.y2;break;case"w":c[1]=b.y2;break;case"n":c[0]=b.x2;break;case"s":c[0]=b.x2}else switch(a){case"e":c[1]=b.y+1;break;case"w":c[1]=b.y+1;break;case"n":c[0]=b.x+1;break;case"s":c[0]=b.x+1}_.setCurrent(c),bb.update()}}function q(a){var b=a;return bd.watchKeys +(),function(a){_.moveOffset([a[0]-b[0],a[1]-b[1]]),b=a,bb.update()}}function r(a){switch(a){case"n":return"sw";case"s":return"nw";case"e":return"nw";case"w":return"ne";case"ne":return"sw";case"nw":return"se";case"se":return"nw";case"sw":return"ne"}}function s(a){return function(b){return d.disabled?!1:a==="move"&&!d.allowMove?!1:(e=l(D),W=!0,o(a,m(b)),b.stopPropagation(),b.preventDefault(),!1)}}function t(a,b,c){var d=a.width(),e=a.height();d>b&&b>0&&(d=b,e=b/a.width()*a.height()),e>c&&c>0&&(e=c,d=c/a.height()*a.width()),T=a.width()/d,U=a.height()/e,a.width(d).height(e)}function u(a){return{x:a.x*T,y:a.y*U,x2:a.x2*T,y2:a.y2*U,w:a.w*T,h:a.h*U}}function v(a){var b=_.getFixed();b.w>d.minSelect[0]&&b.h>d.minSelect[1]?(bb.enableHandles(),bb.done()):bb.release(),bc.setCursor(d.allowSelect?"crosshair":"default")}function w(a){if(d.disabled)return!1;if(!d.allowSelect)return!1;W=!0,e=l(D),bb.disableHandles(),bc.setCursor("crosshair");var b=m(a);return _.setPressed(b),bb.update(),bc.activateHandlers(x,v,a.type.substring +(0,5)==="touch"),bd.watchKeys(),a.stopPropagation(),a.preventDefault(),!1}function x(a){_.setCurrent(a),bb.update()}function y(){var b=a("
").addClass(j("tracker"));return g&&b.css({opacity:0,backgroundColor:"white"}),b}function be(a){G.removeClass().addClass(j("holder")).addClass(a)}function bf(a,b){function t(){window.setTimeout(u,l)}var c=a[0]/T,e=a[1]/U,f=a[2]/T,g=a[3]/U;if(X)return;var h=_.flipCoords(c,e,f,g),i=_.getFixed(),j=[i.x,i.y,i.x2,i.y2],k=j,l=d.animationDelay,m=h[0]-j[0],n=h[1]-j[1],o=h[2]-j[2],p=h[3]-j[3],q=0,r=d.swingSpeed;c=k[0],e=k[1],f=k[2],g=k[3],bb.animMode(!0);var s,u=function(){return function(){q+=(100-q)/r,k[0]=Math.round(c+q/100*m),k[1]=Math.round(e+q/100*n),k[2]=Math.round(f+q/100*o),k[3]=Math.round(g+q/100*p),q>=99.8&&(q=100),q<100?(bh(k),t()):(bb.done(),bb.animMode(!1),typeof b=="function"&&b.call(bs))}}();t()}function bg(a){bh([a[0]/T,a[1]/U,a[2]/T,a[3]/U]),d.onSelect.call(bs,u(_.getFixed())),bb.enableHandles()}function bh(a){_.setPressed([a[0],a[1]]),_.setCurrent([a[2], +a[3]]),bb.update()}function bi(){return u(_.getFixed())}function bj(){return _.getFixed()}function bk(a){n(a),br()}function bl(){d.disabled=!0,bb.disableHandles(),bb.setCursor("default"),bc.setCursor("default")}function bm(){d.disabled=!1,br()}function bn(){bb.done(),bc.activateHandlers(null,null)}function bo(){G.remove(),A.show(),A.css("visibility","visible"),a(b).removeData("Jcrop")}function bp(a,b){bb.release(),bl();var c=new Image;c.onload=function(){var e=c.width,f=c.height,g=d.boxWidth,h=d.boxHeight;D.width(e).height(f),D.attr("src",a),H.attr("src",a),t(D,g,h),E=D.width(),F=D.height(),H.width(E).height(F),M.width(E+L*2).height(F+L*2),G.width(E).height(F),ba.resize(E,F),bm(),typeof b=="function"&&b.call(bs)},c.src=a}function bq(a,b,c){var e=b||d.bgColor;d.bgFade&&k()&&d.fadeTime&&!c?a.animate({backgroundColor:e},{queue:!1,duration:d.fadeTime}):a.css("backgroundColor",e)}function br(a){d.allowResize?a?bb.enableOnly():bb.enableHandles():bb.disableHandles(),bc.setCursor(d.allowSelect?"crosshair":"default"),bb +.setCursor(d.allowMove?"move":"default"),d.hasOwnProperty("trueSize")&&(T=d.trueSize[0]/E,U=d.trueSize[1]/F),d.hasOwnProperty("setSelect")&&(bg(d.setSelect),bb.done(),delete d.setSelect),ba.refresh(),d.bgColor!=N&&(bq(d.shade?ba.getShades():G,d.shade?d.shadeColor||d.bgColor:d.bgColor),N=d.bgColor),O!=d.bgOpacity&&(O=d.bgOpacity,d.shade?ba.refresh():bb.setBgOpacity(O)),P=d.maxSize[0]||0,Q=d.maxSize[1]||0,R=d.minSize[0]||0,S=d.minSize[1]||0,d.hasOwnProperty("outerImage")&&(D.attr("src",d.outerImage),delete d.outerImage),bb.refresh()}var d=a.extend({},a.Jcrop.defaults),e,f=navigator.userAgent.toLowerCase(),g=/msie/.test(f),h=/msie [1-6]\./.test(f);typeof b!="object"&&(b=a(b)[0]),typeof c!="object"&&(c={}),n(c);var z={border:"none",visibility:"visible",margin:0,padding:0,position:"absolute",top:0,left:0},A=a(b),B=!0;if(b.tagName=="IMG"){if(A[0].width!=0&&A[0].height!=0)A.width(A[0].width),A.height(A[0].height);else{var C=new Image;C.src=A[0].src,A.width(C.width),A.height(C.height)}var D=A.clone().removeAttr("id"). +css(z).show();D.width(A.width()),D.height(A.height()),A.after(D).hide()}else D=A.css(z).show(),B=!1,d.shade===null&&(d.shade=!0);t(D,d.boxWidth,d.boxHeight);var E=D.width(),F=D.height(),G=a("
").width(E).height(F).addClass(j("holder")).css({position:"relative",backgroundColor:d.bgColor}).insertAfter(A).append(D);d.addClass&&G.addClass(d.addClass);var H=a("
"),I=a("
").width("100%").height("100%").css({zIndex:310,position:"absolute",overflow:"hidden"}),J=a("
").width("100%").height("100%").css("zIndex",320),K=a("
").css({position:"absolute",zIndex:600}).dblclick(function(){var a=_.getFixed();d.onDblClick.call(bs,a)}).insertBefore(D).append(I,J);B&&(H=a("").attr("src",D.attr("src")).css(z).width(E).height(F),I.append(H)),h&&K.css({overflowY:"hidden"});var L=d.boundary,M=y().width(E+L*2).height(F+L*2).css({position:"absolute",top:i(-L),left:i(-L),zIndex:290}).mousedown(w),N=d.bgColor,O=d.bgOpacity,P,Q,R,S,T,U,V=!0,W,X,Y;e=l(D);var Z=function(){function a(){var a={},b=["touchstart" +,"touchmove","touchend"],c=document.createElement("div"),d;try{for(d=0;da+f&&(f-=f+a),0>b+g&&(g-=g+b),FE&&(r=E,u=Math.abs((r-a)/f),s=k<0?b-u:u+b)):(r=c,u=l/f,s=k<0?b-u:b+u,s<0?(s=0,t=Math.abs((s-b)*f),r=j<0?a-t:t+a):s>F&&(s=F,t=Math.abs(s-b)*f,r=j<0?a-t:t+a)),r>a?(r-ah&&(r=a+h),s>b?s=b+(r-a)/f:s=b-(r-a)/f):rh&&(r=a-h),s>b?s=b+(a-r)/f:s=b-(a-r)/f),r<0?(a-=r,r=0):r>E&&(a-=r-E,r=E),s<0?(b-=s,s=0):s>F&&(b-=s-F,s=F),q(o(a,b,r,s))}function n(a){return a[0]<0&&(a[0]=0),a[1]<0&&(a[1]=0),a[0]>E&&(a[0]=E),a[1]>F&&(a[1]=F),[Math.round(a[0]),Math.round(a[1])]}function o(a,b,c,d){var e=a,f=c,g=b,h=d;return cP&&(c=d>0?a+P:a-P),Q&&Math.abs +(f)>Q&&(e=f>0?b+Q:b-Q),S/U&&Math.abs(f)0?b+S/U:b-S/U),R/T&&Math.abs(d)0?a+R/T:a-R/T),a<0&&(c-=a,a-=a),b<0&&(e-=b,b-=b),c<0&&(a-=c,c-=c),e<0&&(b-=e,e-=e),c>E&&(g=c-E,a-=g,c-=g),e>F&&(g=e-F,b-=g,e-=g),a>E&&(g=a-F,e-=g,b-=g),b>F&&(g=b-F,e-=g,b-=g),q(o(a,b,c,e))}function q(a){return{x:a[0],y:a[1],x2:a[2],y2:a[3],w:a[2]-a[0],h:a[3]-a[1]}}var a=0,b=0,c=0,e=0,f,g;return{flipCoords:o,setPressed:h,setCurrent:i,getOffset:j,moveOffset:k,getCorner:l,getFixed:m}}(),ba=function(){function f(a,b){e.left.css({height:i(b)}),e.right.css({height:i(b)})}function g(){return h(_.getFixed())}function h(a){e.top.css({left:i(a.x),width:i(a.w),height:i(a.y)}),e.bottom.css({top:i(a.y2),left:i(a.x),width:i(a.w),height:i(F-a.y2)}),e.right.css({left:i(a.x2),width:i(E-a.x2)}),e.left.css({width:i(a.x)})}function j(){return a("
").css({position:"absolute",backgroundColor:d.shadeColor||d.bgColor}).appendTo(c)}function k(){b||(b=!0,c.insertBefore(D),g(),bb.setBgOpacity(1,0,1),H.hide(),l(d.shadeColor||d.bgColor,1),bb. +isAwake()?n(d.bgOpacity,1):n(1,1))}function l(a,b){bq(p(),a,b)}function m(){b&&(c.remove(),H.show(),b=!1,bb.isAwake()?bb.setBgOpacity(d.bgOpacity,1,1):(bb.setBgOpacity(1,1,1),bb.disableHandles()),bq(G,0,1))}function n(a,e){b&&(d.bgFade&&!e?c.animate({opacity:1-a},{queue:!1,duration:d.fadeTime}):c.css({opacity:1-a}))}function o(){d.shade?k():m(),bb.isAwake()&&n(d.bgOpacity)}function p(){return c.children()}var b=!1,c=a("
").css({position:"absolute",zIndex:240,opacity:0}),e={top:j(),left:j().height(F),right:j().height(F),bottom:j()};return{update:g,updateRaw:h,getShades:p,setBgColor:l,enable:k,disable:m,resize:f,refresh:o,opacity:n}}(),bb=function(){function k(b){var c=a("
").css({position:"absolute",opacity:d.borderOpacity}).addClass(j(b));return I.append(c),c}function l(b,c){var d=a("
").mousedown(s(b)).css({cursor:b+"-resize",position:"absolute",zIndex:c}).addClass("ord-"+b);return Z.support&&d.bind("touchstart.jcrop",Z.createDragger(b)),J.append(d),d}function m(a){var b=d.handleSize,e=l(a,c++ +).css({opacity:d.handleOpacity}).addClass(j("handle"));return b&&e.width(b).height(b),e}function n(a){return l(a,c++).addClass("jcrop-dragbar")}function o(a){var b;for(b=0;b').css({position:"fixed",left:"-120px",width:"12px"}).addClass("jcrop-keymgr"),c=a("
").css({position:"absolute",overflow:"hidden"}).append(b);return d.keySupport&&(b.keydown(i).blur(f),h||!d.fixedSupport?(b.css({position:"absolute",left:"-20px"}),c.append(b).insertBefore(D)):b.insertBefore(D)),{watchKeys:e}}();Z.support&&M.bind("touchstart.jcrop",Z.newSelection),J.hide(),br(!0);var bs={setImage:bp,animateTo:bf,setSelect:bg,setOptions:bk,tellSelect:bi,tellScaled:bj,setClass:be,disable:bl,enable:bm,cancel:bn,release:bb.release,destroy:bo,focus:bd.watchKeys,getBounds:function(){return[E*T,F*U]},getWidgetSize:function(){return[E,F]},getScaleFactor:function(){return[T,U]},getOptions:function(){return d},ui:{holder:G,selection:K}};return g&&G.bind("selectstart",function(){return!1}),A.data("Jcrop",bs),bs},a.fn.Jcrop=function(b,c){var d;return this.each(function(){if(a(this).data("Jcrop")){if( +b==="api")return a(this).data("Jcrop");a(this).data("Jcrop").setOptions(b)}else this.tagName=="IMG"?a.Jcrop.Loader(this,function(){a(this).css({display:"block",visibility:"hidden"}),d=a.Jcrop(this,b),a.isFunction(c)&&c.call(d)}):(a(this).css({display:"block",visibility:"hidden"}),d=a.Jcrop(this,b),a.isFunction(c)&&c.call(d))}),this},a.Jcrop.Loader=function(b,c,d){function g(){f.complete?(e.unbind(".jcloader"),a.isFunction(c)&&c.call(f)):window.setTimeout(g,50)}var e=a(b),f=e[0];e.bind("load.jcloader",g).bind("error.jcloader",function(b){e.unbind(".jcloader"),a.isFunction(d)&&d.call(f)}),f.complete&&a.isFunction(c)&&(e.unbind(".jcloader"),c.call(f))},a.Jcrop.defaults={allowSelect:!0,allowMove:!0,allowResize:!0,trackDocument:!0,baseClass:"jcrop",addClass:null,bgColor:"black",bgOpacity:.6,bgFade:!1,borderOpacity:.4,handleOpacity:.5,handleSize:null,aspectRatio:0,keySupport:!0,createHandles:["n","s","e","w","nw","ne","se","sw"],createDragbars:["n","s","e","w"],createBorders:["n","s","e","w"],drawBorders:!0,dragEdges +:!0,fixedSupport:!0,touchSupport:null,shade:null,boxWidth:0,boxHeight:0,boundary:2,fadeTime:400,animationDelay:20,swingSpeed:3,minSelect:[0,0],maxSize:[0,0],minSize:[0,0],onChange:function(){},onSelect:function(){},onDblClick:function(){},onRelease:function(){}}})(jQuery); \ No newline at end of file diff --git a/www-apps/phpSANE/dev/javascript/jquery.min.js b/www-apps/phpSANE/dev/javascript/jquery.min.js new file mode 100644 index 0000000..da41706 --- /dev/null +++ b/www-apps/phpSANE/dev/javascript/jquery.min.js @@ -0,0 +1,6 @@ +/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license +//@ sourceMappingURL=jquery-1.10.2.min.map +*/ +(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="
",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
a",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="
t
",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t +}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X
","
"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle); +u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("