From 5cd1df507af368220dd8c19617078c8554940388 Mon Sep 17 00:00:00 2001 From: Jacek Pyziak Date: Fri, 6 Dec 2024 15:15:36 +0100 Subject: [PATCH] =?UTF-8?q?Dodanie=20nowej=20wersji=20mened=C5=BCera=20pli?= =?UTF-8?q?k=C3=B3w=20z=20aktualizacj=C4=85=20plik=C3=B3w=20i=20konfigurac?= =?UTF-8?q?ji?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/templates/articles/article-edit.php | 2 +- admin/templates/banners/banner-edit.php | 2 +- admin/templates/filemanager/filemanager.php | 2 +- admin/templates/shop-producer/edit.php | 2 +- autoload/admin/controls/class.Filemanager.php | 4 +- autoload/admin/view/class.FileManager.php | 5 - libraries/ckeditor/config.js | 170 +- .../filemanager-9.14.2/UploadHandler.php | 1615 +++++++ libraries/filemanager-9.14.2/ajax_calls.php | 680 +++ libraries/filemanager-9.14.2/config/.htaccess | 1 + .../filemanager-9.14.2/config/config.php | 618 +++ .../css/jquery.fileupload-noscript.css | 22 + .../css/jquery.fileupload-ui-noscript.css | 17 + .../css/jquery.fileupload-ui.css | 53 + .../css/jquery.fileupload.css | 37 + .../filemanager-9.14.2/css/rtl-style.css | Bin 0 -> 6224 bytes libraries/filemanager-9.14.2/css/style.css | 35 + libraries/filemanager-9.14.2/dialog.php | 1936 +++++++++ libraries/filemanager-9.14.2/execute.php | 519 +++ .../filemanager-9.14.2/force_download.php | 127 + .../img/clipboard_apply.png | Bin 0 -> 189 bytes .../img/clipboard_clear.png | Bin 0 -> 195 bytes libraries/filemanager-9.14.2/img/copy.png | Bin 0 -> 238 bytes libraries/filemanager-9.14.2/img/cut.png | Bin 0 -> 173 bytes libraries/filemanager-9.14.2/img/date.png | Bin 0 -> 611 bytes .../filemanager-9.14.2/img/dimension.png | Bin 0 -> 489 bytes libraries/filemanager-9.14.2/img/down.png | Bin 0 -> 163 bytes libraries/filemanager-9.14.2/img/download.png | Bin 0 -> 674 bytes .../filemanager-9.14.2/img/duplicate.png | Bin 0 -> 245 bytes libraries/filemanager-9.14.2/img/edit_img.png | Bin 0 -> 673 bytes .../filemanager-9.14.2/img/file_edit.png | Bin 0 -> 764 bytes .../img/glyphicons-halflings-white.png | Bin 0 -> 8583 bytes .../img/glyphicons-halflings.png | Bin 0 -> 15602 bytes libraries/filemanager-9.14.2/img/ico/ac3.jpg | Bin 0 -> 1692 bytes .../filemanager-9.14.2/img/ico/accdb.jpg | Bin 0 -> 2613 bytes libraries/filemanager-9.14.2/img/ico/ade.jpg | Bin 0 -> 2290 bytes libraries/filemanager-9.14.2/img/ico/adp.jpg | Bin 0 -> 2290 bytes libraries/filemanager-9.14.2/img/ico/ai.jpg | Bin 0 -> 1776 bytes libraries/filemanager-9.14.2/img/ico/aiff.jpg | Bin 0 -> 1717 bytes libraries/filemanager-9.14.2/img/ico/avi.jpg | Bin 0 -> 1548 bytes libraries/filemanager-9.14.2/img/ico/bmp.jpg | Bin 0 -> 1979 bytes libraries/filemanager-9.14.2/img/ico/c4d.jpg | Bin 0 -> 6241 bytes libraries/filemanager-9.14.2/img/ico/css.jpg | Bin 0 -> 1722 bytes libraries/filemanager-9.14.2/img/ico/csv.jpg | Bin 0 -> 2558 bytes .../filemanager-9.14.2/img/ico/default.jpg | Bin 0 -> 1723 bytes libraries/filemanager-9.14.2/img/ico/dmg.jpg | Bin 0 -> 1579 bytes libraries/filemanager-9.14.2/img/ico/doc.jpg | Bin 0 -> 2511 bytes libraries/filemanager-9.14.2/img/ico/docx.jpg | Bin 0 -> 2511 bytes libraries/filemanager-9.14.2/img/ico/dwg.jpg | Bin 0 -> 5457 bytes libraries/filemanager-9.14.2/img/ico/dxf.jpg | Bin 0 -> 5419 bytes .../filemanager-9.14.2/img/ico/favicon.ico | Bin 0 -> 1150 bytes libraries/filemanager-9.14.2/img/ico/fla.jpg | Bin 0 -> 1859 bytes libraries/filemanager-9.14.2/img/ico/flv.jpg | Bin 0 -> 1806 bytes .../filemanager-9.14.2/img/ico/folder.png | Bin 0 -> 737 bytes .../img/ico/folder_back.png | Bin 0 -> 1128 bytes libraries/filemanager-9.14.2/img/ico/gif.jpg | Bin 0 -> 1979 bytes libraries/filemanager-9.14.2/img/ico/gz.jpg | Bin 0 -> 1718 bytes libraries/filemanager-9.14.2/img/ico/html.jpg | Bin 0 -> 2152 bytes libraries/filemanager-9.14.2/img/ico/iso.jpg | Bin 0 -> 1496 bytes libraries/filemanager-9.14.2/img/ico/jpeg.jpg | Bin 0 -> 1960 bytes libraries/filemanager-9.14.2/img/ico/jpg.jpg | Bin 0 -> 1979 bytes libraries/filemanager-9.14.2/img/ico/log.jpg | Bin 0 -> 1765 bytes libraries/filemanager-9.14.2/img/ico/m4a.jpg | Bin 0 -> 1529 bytes libraries/filemanager-9.14.2/img/ico/mdb.jpg | Bin 0 -> 2613 bytes libraries/filemanager-9.14.2/img/ico/mid.jpg | Bin 0 -> 1630 bytes libraries/filemanager-9.14.2/img/ico/mov.jpg | Bin 0 -> 1574 bytes libraries/filemanager-9.14.2/img/ico/mp3.jpg | Bin 0 -> 1555 bytes libraries/filemanager-9.14.2/img/ico/mp4.jpg | Bin 0 -> 1529 bytes libraries/filemanager-9.14.2/img/ico/mpeg.jpg | Bin 0 -> 1589 bytes libraries/filemanager-9.14.2/img/ico/mpg.jpg | Bin 0 -> 1532 bytes libraries/filemanager-9.14.2/img/ico/odb.jpg | Bin 0 -> 1748 bytes libraries/filemanager-9.14.2/img/ico/odf.jpg | Bin 0 -> 1760 bytes libraries/filemanager-9.14.2/img/ico/odg.jpg | Bin 0 -> 1748 bytes libraries/filemanager-9.14.2/img/ico/odp.jpg | Bin 0 -> 1760 bytes libraries/filemanager-9.14.2/img/ico/ods.jpg | Bin 0 -> 1748 bytes libraries/filemanager-9.14.2/img/ico/odt.jpg | Bin 0 -> 1748 bytes libraries/filemanager-9.14.2/img/ico/ogg.jpg | Bin 0 -> 1557 bytes libraries/filemanager-9.14.2/img/ico/otg.jpg | Bin 0 -> 1759 bytes libraries/filemanager-9.14.2/img/ico/otp.jpg | Bin 0 -> 1870 bytes libraries/filemanager-9.14.2/img/ico/ots.jpg | Bin 0 -> 1748 bytes libraries/filemanager-9.14.2/img/ico/ott.jpg | Bin 0 -> 1748 bytes libraries/filemanager-9.14.2/img/ico/pdf.jpg | Bin 0 -> 2050 bytes libraries/filemanager-9.14.2/img/ico/png.jpg | Bin 0 -> 1979 bytes libraries/filemanager-9.14.2/img/ico/ppt.jpg | Bin 0 -> 2386 bytes libraries/filemanager-9.14.2/img/ico/pptx.jpg | Bin 0 -> 2479 bytes libraries/filemanager-9.14.2/img/ico/psd.jpg | Bin 0 -> 2110 bytes libraries/filemanager-9.14.2/img/ico/rar.jpg | Bin 0 -> 1718 bytes libraries/filemanager-9.14.2/img/ico/rtf.jpg | Bin 0 -> 2511 bytes libraries/filemanager-9.14.2/img/ico/skp.jpg | Bin 0 -> 6347 bytes libraries/filemanager-9.14.2/img/ico/sql.jpg | Bin 0 -> 1695 bytes libraries/filemanager-9.14.2/img/ico/stp.jpg | Bin 0 -> 5539 bytes libraries/filemanager-9.14.2/img/ico/svg.jpg | Bin 0 -> 1979 bytes libraries/filemanager-9.14.2/img/ico/tar.jpg | Bin 0 -> 1747 bytes libraries/filemanager-9.14.2/img/ico/tiff.jpg | Bin 0 -> 1953 bytes libraries/filemanager-9.14.2/img/ico/txt.jpg | Bin 0 -> 1765 bytes libraries/filemanager-9.14.2/img/ico/vwx.jpg | Bin 0 -> 5463 bytes libraries/filemanager-9.14.2/img/ico/wav.jpg | Bin 0 -> 1557 bytes libraries/filemanager-9.14.2/img/ico/webm.jpg | Bin 0 -> 1548 bytes libraries/filemanager-9.14.2/img/ico/wma.jpg | Bin 0 -> 1548 bytes .../filemanager-9.14.2/img/ico/xhtml.jpg | Bin 0 -> 1920 bytes libraries/filemanager-9.14.2/img/ico/xls.jpg | Bin 0 -> 2691 bytes libraries/filemanager-9.14.2/img/ico/xlsx.jpg | Bin 0 -> 2539 bytes libraries/filemanager-9.14.2/img/ico/xml.jpg | Bin 0 -> 1714 bytes libraries/filemanager-9.14.2/img/ico/zip.jpg | Bin 0 -> 1718 bytes .../filemanager-9.14.2/img/ico_dark/ac3.jpg | Bin 0 -> 3462 bytes .../filemanager-9.14.2/img/ico_dark/accdb.jpg | Bin 0 -> 4130 bytes .../filemanager-9.14.2/img/ico_dark/ade.jpg | Bin 0 -> 4126 bytes .../filemanager-9.14.2/img/ico_dark/adp.jpg | Bin 0 -> 4126 bytes .../filemanager-9.14.2/img/ico_dark/ai.jpg | Bin 0 -> 3416 bytes .../filemanager-9.14.2/img/ico_dark/aiff.jpg | Bin 0 -> 3454 bytes .../filemanager-9.14.2/img/ico_dark/avi.jpg | Bin 0 -> 3461 bytes .../filemanager-9.14.2/img/ico_dark/bmp.jpg | Bin 0 -> 3754 bytes .../filemanager-9.14.2/img/ico_dark/css.jpg | Bin 0 -> 3444 bytes .../filemanager-9.14.2/img/ico_dark/csv.jpg | Bin 0 -> 4189 bytes .../img/ico_dark/default.jpg | Bin 0 -> 3783 bytes .../filemanager-9.14.2/img/ico_dark/dmg.jpg | Bin 0 -> 3619 bytes .../filemanager-9.14.2/img/ico_dark/doc.jpg | Bin 0 -> 4081 bytes .../filemanager-9.14.2/img/ico_dark/docx.jpg | Bin 0 -> 4075 bytes .../img/ico_dark/favicon.ico | Bin 0 -> 1150 bytes .../filemanager-9.14.2/img/ico_dark/fla.jpg | Bin 0 -> 3608 bytes .../filemanager-9.14.2/img/ico_dark/flv.jpg | Bin 0 -> 3572 bytes .../img/ico_dark/folder.png | Bin 0 -> 535 bytes .../img/ico_dark/folder_back.png | Bin 0 -> 1128 bytes .../filemanager-9.14.2/img/ico_dark/gif.jpg | Bin 0 -> 3754 bytes .../filemanager-9.14.2/img/ico_dark/gz.jpg | Bin 0 -> 3372 bytes .../filemanager-9.14.2/img/ico_dark/html.jpg | Bin 0 -> 3719 bytes .../filemanager-9.14.2/img/ico_dark/iso.jpg | Bin 0 -> 3576 bytes .../filemanager-9.14.2/img/ico_dark/jpeg.jpg | Bin 0 -> 3700 bytes .../filemanager-9.14.2/img/ico_dark/jpg.jpg | Bin 0 -> 3754 bytes .../filemanager-9.14.2/img/ico_dark/log.jpg | Bin 0 -> 3804 bytes .../filemanager-9.14.2/img/ico_dark/m4a.jpg | Bin 0 -> 3379 bytes .../filemanager-9.14.2/img/ico_dark/mdb.jpg | Bin 0 -> 4130 bytes .../filemanager-9.14.2/img/ico_dark/mid.jpg | Bin 0 -> 3383 bytes .../filemanager-9.14.2/img/ico_dark/mov.jpg | Bin 0 -> 3439 bytes .../filemanager-9.14.2/img/ico_dark/mp3.jpg | Bin 0 -> 3335 bytes .../filemanager-9.14.2/img/ico_dark/mp4.jpg | Bin 0 -> 3415 bytes .../filemanager-9.14.2/img/ico_dark/mpeg.jpg | Bin 0 -> 3470 bytes .../filemanager-9.14.2/img/ico_dark/mpg.jpg | Bin 0 -> 3459 bytes .../filemanager-9.14.2/img/ico_dark/odb.jpg | Bin 0 -> 3581 bytes .../filemanager-9.14.2/img/ico_dark/odf.jpg | Bin 0 -> 3590 bytes .../filemanager-9.14.2/img/ico_dark/odg.jpg | Bin 0 -> 3581 bytes .../filemanager-9.14.2/img/ico_dark/odp.jpg | Bin 0 -> 3590 bytes .../filemanager-9.14.2/img/ico_dark/ods.jpg | Bin 0 -> 3581 bytes .../filemanager-9.14.2/img/ico_dark/odt.jpg | Bin 0 -> 3581 bytes .../filemanager-9.14.2/img/ico_dark/ogg.jpg | Bin 0 -> 3440 bytes .../filemanager-9.14.2/img/ico_dark/otg.jpg | Bin 0 -> 3561 bytes .../filemanager-9.14.2/img/ico_dark/otp.jpg | Bin 0 -> 3559 bytes .../filemanager-9.14.2/img/ico_dark/ots.jpg | Bin 0 -> 3581 bytes .../filemanager-9.14.2/img/ico_dark/ott.jpg | Bin 0 -> 3581 bytes .../filemanager-9.14.2/img/ico_dark/pdf.jpg | Bin 0 -> 3705 bytes .../filemanager-9.14.2/img/ico_dark/png.jpg | Bin 0 -> 3754 bytes .../filemanager-9.14.2/img/ico_dark/ppt.jpg | Bin 0 -> 4035 bytes .../filemanager-9.14.2/img/ico_dark/pptx.jpg | Bin 0 -> 4089 bytes .../filemanager-9.14.2/img/ico_dark/psd.jpg | Bin 0 -> 3859 bytes .../filemanager-9.14.2/img/ico_dark/rar.jpg | Bin 0 -> 3387 bytes .../filemanager-9.14.2/img/ico_dark/rtf.jpg | Bin 0 -> 4081 bytes .../filemanager-9.14.2/img/ico_dark/sql.jpg | Bin 0 -> 3766 bytes .../filemanager-9.14.2/img/ico_dark/svg.jpg | Bin 0 -> 3754 bytes .../filemanager-9.14.2/img/ico_dark/tar.jpg | Bin 0 -> 3346 bytes .../filemanager-9.14.2/img/ico_dark/tiff.jpg | Bin 0 -> 3798 bytes .../filemanager-9.14.2/img/ico_dark/txt.jpg | Bin 0 -> 3804 bytes .../filemanager-9.14.2/img/ico_dark/wav.jpg | Bin 0 -> 3440 bytes .../filemanager-9.14.2/img/ico_dark/webm.jpg | Bin 0 -> 3476 bytes .../filemanager-9.14.2/img/ico_dark/wma.jpg | Bin 0 -> 3461 bytes .../filemanager-9.14.2/img/ico_dark/xhtml.jpg | Bin 0 -> 3653 bytes .../filemanager-9.14.2/img/ico_dark/xls.jpg | Bin 0 -> 4183 bytes .../filemanager-9.14.2/img/ico_dark/xlsx.jpg | Bin 0 -> 4250 bytes .../filemanager-9.14.2/img/ico_dark/xml.jpg | Bin 0 -> 3774 bytes .../filemanager-9.14.2/img/ico_dark/zip.jpg | Bin 0 -> 3372 bytes libraries/filemanager-9.14.2/img/info.png | Bin 0 -> 345 bytes libraries/filemanager-9.14.2/img/key.png | Bin 0 -> 185 bytes libraries/filemanager-9.14.2/img/label.png | Bin 0 -> 479 bytes libraries/filemanager-9.14.2/img/loading.gif | Bin 0 -> 1688 bytes libraries/filemanager-9.14.2/img/logo.png | Bin 0 -> 24774 bytes libraries/filemanager-9.14.2/img/preview.png | Bin 0 -> 376 bytes .../filemanager-9.14.2/img/processing.gif | Bin 0 -> 3209 bytes libraries/filemanager-9.14.2/img/rename.png | Bin 0 -> 262 bytes libraries/filemanager-9.14.2/img/size.png | Bin 0 -> 660 bytes libraries/filemanager-9.14.2/img/sort.png | Bin 0 -> 584 bytes .../img/storing_animation.gif | Bin 0 -> 3887 bytes libraries/filemanager-9.14.2/img/trans.jpg | Bin 0 -> 4024 bytes libraries/filemanager-9.14.2/img/up.png | Bin 0 -> 163 bytes libraries/filemanager-9.14.2/img/upload.png | Bin 0 -> 324 bytes libraries/filemanager-9.14.2/img/url.png | Bin 0 -> 593 bytes libraries/filemanager-9.14.2/img/zip.png | Bin 0 -> 819 bytes .../filemanager-9.14.2/include/FtpClient.php | 884 ++++ .../include/FtpException.php | 20 + .../filemanager-9.14.2/include/FtpWrapper.php | 115 + .../filemanager-9.14.2/include/Response.php | 365 ++ .../filemanager-9.14.2/include/ftp_class.php | 82 + .../include/get_png_imageinfo.php | 75 + .../include/mime_type_lib.php | 270 ++ .../include/php_image_magician.php | 3804 +++++++++++++++++ .../filemanager-9.14.2/include/utils.php | 1315 ++++++ libraries/filemanager-9.14.2/index.php | 10 + libraries/filemanager-9.14.2/js/include.js | 1 + .../js/jquery.fileupload-angular.js | 438 ++ .../js/jquery.fileupload-audio.js | 113 + .../js/jquery.fileupload-image.js | 326 ++ .../js/jquery.fileupload-jquery-ui.js | 161 + .../js/jquery.fileupload-process.js | 178 + .../js/jquery.fileupload-ui.js | 714 ++++ .../js/jquery.fileupload-validate.js | 125 + .../js/jquery.fileupload-video.js | 113 + .../js/jquery.fileupload.js | 1502 +++++++ .../js/jquery.iframe-transport.js | 224 + .../filemanager-9.14.2/js/modernizr.custom.js | 4 + libraries/filemanager-9.14.2/js/plugins.js | 3 + .../js/vendor/jquery.ui.widget.js | 572 +++ libraries/filemanager-9.14.2/lang/az_AZ.php | 147 + libraries/filemanager-9.14.2/lang/bg_BG.php | 147 + libraries/filemanager-9.14.2/lang/ca.php | 126 + libraries/filemanager-9.14.2/lang/cs.php | 147 + libraries/filemanager-9.14.2/lang/da.php | 147 + libraries/filemanager-9.14.2/lang/de.php | 147 + libraries/filemanager-9.14.2/lang/el_GR.php | 147 + libraries/filemanager-9.14.2/lang/en_EN.php | 146 + libraries/filemanager-9.14.2/lang/es.php | 147 + libraries/filemanager-9.14.2/lang/fa.php | 147 + libraries/filemanager-9.14.2/lang/fi_FI.php | 146 + libraries/filemanager-9.14.2/lang/fr_FR.php | 147 + libraries/filemanager-9.14.2/lang/he_IL.php | 147 + libraries/filemanager-9.14.2/lang/hr.php | 147 + libraries/filemanager-9.14.2/lang/hu_HU.php | 147 + libraries/filemanager-9.14.2/lang/id.php | 147 + libraries/filemanager-9.14.2/lang/it.php | 147 + libraries/filemanager-9.14.2/lang/ja.php | 147 + libraries/filemanager-9.14.2/lang/ka.php | 146 + .../filemanager-9.14.2/lang/languages.php | 44 + libraries/filemanager-9.14.2/lang/lt.php | 147 + libraries/filemanager-9.14.2/lang/mn_MN.php | 147 + libraries/filemanager-9.14.2/lang/nb_NO.php | 147 + libraries/filemanager-9.14.2/lang/nl.php | 147 + libraries/filemanager-9.14.2/lang/nn_NO.php | 147 + libraries/filemanager-9.14.2/lang/pl.php | 147 + libraries/filemanager-9.14.2/lang/pt_BR.php | 147 + libraries/filemanager-9.14.2/lang/pt_PT.php | 147 + libraries/filemanager-9.14.2/lang/ro.php | 147 + libraries/filemanager-9.14.2/lang/ru.php | 146 + libraries/filemanager-9.14.2/lang/sk.php | 147 + libraries/filemanager-9.14.2/lang/sl.php | 147 + libraries/filemanager-9.14.2/lang/sv_SE.php | 147 + libraries/filemanager-9.14.2/lang/th_TH.php | 154 + libraries/filemanager-9.14.2/lang/tr_TR.php | 147 + libraries/filemanager-9.14.2/lang/uk_UA.php | 147 + libraries/filemanager-9.14.2/lang/vi.php | 146 + libraries/filemanager-9.14.2/lang/zh_CN.php | 147 + libraries/filemanager-9.14.2/svg/icon-a.svg | 235 + libraries/filemanager-9.14.2/svg/icon-b.svg | 224 + libraries/filemanager-9.14.2/svg/icon-c.svg | 224 + libraries/filemanager-9.14.2/svg/icon-d.svg | 224 + libraries/filemanager-9.14.2/svg/svg.svg | 1 + libraries/filemanager-9.14.2/upload.php | 212 + 253 files changed, 23749 insertions(+), 96 deletions(-) create mode 100644 libraries/filemanager-9.14.2/UploadHandler.php create mode 100644 libraries/filemanager-9.14.2/ajax_calls.php create mode 100644 libraries/filemanager-9.14.2/config/.htaccess create mode 100644 libraries/filemanager-9.14.2/config/config.php create mode 100644 libraries/filemanager-9.14.2/css/jquery.fileupload-noscript.css create mode 100644 libraries/filemanager-9.14.2/css/jquery.fileupload-ui-noscript.css create mode 100644 libraries/filemanager-9.14.2/css/jquery.fileupload-ui.css create mode 100644 libraries/filemanager-9.14.2/css/jquery.fileupload.css create mode 100644 libraries/filemanager-9.14.2/css/rtl-style.css create mode 100644 libraries/filemanager-9.14.2/css/style.css create mode 100644 libraries/filemanager-9.14.2/dialog.php create mode 100644 libraries/filemanager-9.14.2/execute.php create mode 100644 libraries/filemanager-9.14.2/force_download.php create mode 100644 libraries/filemanager-9.14.2/img/clipboard_apply.png create mode 100644 libraries/filemanager-9.14.2/img/clipboard_clear.png create mode 100644 libraries/filemanager-9.14.2/img/copy.png create mode 100644 libraries/filemanager-9.14.2/img/cut.png create mode 100644 libraries/filemanager-9.14.2/img/date.png create mode 100644 libraries/filemanager-9.14.2/img/dimension.png create mode 100644 libraries/filemanager-9.14.2/img/down.png create mode 100644 libraries/filemanager-9.14.2/img/download.png create mode 100644 libraries/filemanager-9.14.2/img/duplicate.png create mode 100644 libraries/filemanager-9.14.2/img/edit_img.png create mode 100644 libraries/filemanager-9.14.2/img/file_edit.png create mode 100644 libraries/filemanager-9.14.2/img/glyphicons-halflings-white.png create mode 100644 libraries/filemanager-9.14.2/img/glyphicons-halflings.png create mode 100644 libraries/filemanager-9.14.2/img/ico/ac3.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/accdb.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/ade.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/adp.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/ai.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/aiff.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/avi.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/bmp.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/c4d.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/css.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/csv.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/default.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/dmg.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/doc.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/docx.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/dwg.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/dxf.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/favicon.ico create mode 100644 libraries/filemanager-9.14.2/img/ico/fla.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/flv.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/folder.png create mode 100644 libraries/filemanager-9.14.2/img/ico/folder_back.png create mode 100644 libraries/filemanager-9.14.2/img/ico/gif.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/gz.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/html.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/iso.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/jpeg.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/jpg.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/log.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/m4a.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/mdb.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/mid.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/mov.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/mp3.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/mp4.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/mpeg.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/mpg.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/odb.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/odf.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/odg.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/odp.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/ods.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/odt.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/ogg.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/otg.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/otp.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/ots.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/ott.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/pdf.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/png.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/ppt.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/pptx.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/psd.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/rar.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/rtf.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/skp.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/sql.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/stp.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/svg.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/tar.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/tiff.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/txt.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/vwx.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/wav.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/webm.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/wma.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/xhtml.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/xls.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/xlsx.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/xml.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico/zip.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/ac3.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/accdb.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/ade.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/adp.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/ai.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/aiff.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/avi.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/bmp.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/css.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/csv.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/default.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/dmg.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/doc.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/docx.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/favicon.ico create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/fla.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/flv.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/folder.png create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/folder_back.png create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/gif.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/gz.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/html.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/iso.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/jpeg.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/jpg.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/log.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/m4a.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/mdb.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/mid.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/mov.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/mp3.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/mp4.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/mpeg.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/mpg.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/odb.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/odf.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/odg.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/odp.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/ods.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/odt.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/ogg.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/otg.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/otp.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/ots.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/ott.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/pdf.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/png.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/ppt.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/pptx.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/psd.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/rar.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/rtf.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/sql.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/svg.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/tar.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/tiff.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/txt.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/wav.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/webm.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/wma.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/xhtml.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/xls.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/xlsx.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/xml.jpg create mode 100644 libraries/filemanager-9.14.2/img/ico_dark/zip.jpg create mode 100644 libraries/filemanager-9.14.2/img/info.png create mode 100644 libraries/filemanager-9.14.2/img/key.png create mode 100644 libraries/filemanager-9.14.2/img/label.png create mode 100644 libraries/filemanager-9.14.2/img/loading.gif create mode 100644 libraries/filemanager-9.14.2/img/logo.png create mode 100644 libraries/filemanager-9.14.2/img/preview.png create mode 100644 libraries/filemanager-9.14.2/img/processing.gif create mode 100644 libraries/filemanager-9.14.2/img/rename.png create mode 100644 libraries/filemanager-9.14.2/img/size.png create mode 100644 libraries/filemanager-9.14.2/img/sort.png create mode 100644 libraries/filemanager-9.14.2/img/storing_animation.gif create mode 100644 libraries/filemanager-9.14.2/img/trans.jpg create mode 100644 libraries/filemanager-9.14.2/img/up.png create mode 100644 libraries/filemanager-9.14.2/img/upload.png create mode 100644 libraries/filemanager-9.14.2/img/url.png create mode 100644 libraries/filemanager-9.14.2/img/zip.png create mode 100644 libraries/filemanager-9.14.2/include/FtpClient.php create mode 100644 libraries/filemanager-9.14.2/include/FtpException.php create mode 100644 libraries/filemanager-9.14.2/include/FtpWrapper.php create mode 100644 libraries/filemanager-9.14.2/include/Response.php create mode 100644 libraries/filemanager-9.14.2/include/ftp_class.php create mode 100644 libraries/filemanager-9.14.2/include/get_png_imageinfo.php create mode 100644 libraries/filemanager-9.14.2/include/mime_type_lib.php create mode 100644 libraries/filemanager-9.14.2/include/php_image_magician.php create mode 100644 libraries/filemanager-9.14.2/include/utils.php create mode 100644 libraries/filemanager-9.14.2/index.php create mode 100644 libraries/filemanager-9.14.2/js/include.js create mode 100644 libraries/filemanager-9.14.2/js/jquery.fileupload-angular.js create mode 100644 libraries/filemanager-9.14.2/js/jquery.fileupload-audio.js create mode 100644 libraries/filemanager-9.14.2/js/jquery.fileupload-image.js create mode 100644 libraries/filemanager-9.14.2/js/jquery.fileupload-jquery-ui.js create mode 100644 libraries/filemanager-9.14.2/js/jquery.fileupload-process.js create mode 100644 libraries/filemanager-9.14.2/js/jquery.fileupload-ui.js create mode 100644 libraries/filemanager-9.14.2/js/jquery.fileupload-validate.js create mode 100644 libraries/filemanager-9.14.2/js/jquery.fileupload-video.js create mode 100644 libraries/filemanager-9.14.2/js/jquery.fileupload.js create mode 100644 libraries/filemanager-9.14.2/js/jquery.iframe-transport.js create mode 100644 libraries/filemanager-9.14.2/js/modernizr.custom.js create mode 100644 libraries/filemanager-9.14.2/js/plugins.js create mode 100644 libraries/filemanager-9.14.2/js/vendor/jquery.ui.widget.js create mode 100644 libraries/filemanager-9.14.2/lang/az_AZ.php create mode 100644 libraries/filemanager-9.14.2/lang/bg_BG.php create mode 100644 libraries/filemanager-9.14.2/lang/ca.php create mode 100644 libraries/filemanager-9.14.2/lang/cs.php create mode 100644 libraries/filemanager-9.14.2/lang/da.php create mode 100644 libraries/filemanager-9.14.2/lang/de.php create mode 100644 libraries/filemanager-9.14.2/lang/el_GR.php create mode 100644 libraries/filemanager-9.14.2/lang/en_EN.php create mode 100644 libraries/filemanager-9.14.2/lang/es.php create mode 100644 libraries/filemanager-9.14.2/lang/fa.php create mode 100644 libraries/filemanager-9.14.2/lang/fi_FI.php create mode 100644 libraries/filemanager-9.14.2/lang/fr_FR.php create mode 100644 libraries/filemanager-9.14.2/lang/he_IL.php create mode 100644 libraries/filemanager-9.14.2/lang/hr.php create mode 100644 libraries/filemanager-9.14.2/lang/hu_HU.php create mode 100644 libraries/filemanager-9.14.2/lang/id.php create mode 100644 libraries/filemanager-9.14.2/lang/it.php create mode 100644 libraries/filemanager-9.14.2/lang/ja.php create mode 100644 libraries/filemanager-9.14.2/lang/ka.php create mode 100644 libraries/filemanager-9.14.2/lang/languages.php create mode 100644 libraries/filemanager-9.14.2/lang/lt.php create mode 100644 libraries/filemanager-9.14.2/lang/mn_MN.php create mode 100644 libraries/filemanager-9.14.2/lang/nb_NO.php create mode 100644 libraries/filemanager-9.14.2/lang/nl.php create mode 100644 libraries/filemanager-9.14.2/lang/nn_NO.php create mode 100644 libraries/filemanager-9.14.2/lang/pl.php create mode 100644 libraries/filemanager-9.14.2/lang/pt_BR.php create mode 100644 libraries/filemanager-9.14.2/lang/pt_PT.php create mode 100644 libraries/filemanager-9.14.2/lang/ro.php create mode 100644 libraries/filemanager-9.14.2/lang/ru.php create mode 100644 libraries/filemanager-9.14.2/lang/sk.php create mode 100644 libraries/filemanager-9.14.2/lang/sl.php create mode 100644 libraries/filemanager-9.14.2/lang/sv_SE.php create mode 100644 libraries/filemanager-9.14.2/lang/th_TH.php create mode 100644 libraries/filemanager-9.14.2/lang/tr_TR.php create mode 100644 libraries/filemanager-9.14.2/lang/uk_UA.php create mode 100644 libraries/filemanager-9.14.2/lang/vi.php create mode 100644 libraries/filemanager-9.14.2/lang/zh_CN.php create mode 100644 libraries/filemanager-9.14.2/svg/icon-a.svg create mode 100644 libraries/filemanager-9.14.2/svg/icon-b.svg create mode 100644 libraries/filemanager-9.14.2/svg/icon-c.svg create mode 100644 libraries/filemanager-9.14.2/svg/icon-d.svg create mode 100644 libraries/filemanager-9.14.2/svg/svg.svg create mode 100644 libraries/filemanager-9.14.2/upload.php diff --git a/admin/templates/articles/article-edit.php b/admin/templates/articles/article-edit.php index 44c0764..24e8d84 100644 --- a/admin/templates/articles/article-edit.php +++ b/admin/templates/articles/article-edit.php @@ -63,7 +63,7 @@ ob_start(); 'value' => htmlspecialchars( $this -> article['languages'][ $lg['id'] ]['main_image'] ), 'icon_content' => 'przeglądaj', 'inline' => true, - 'icon_js' => "window.open ( '/libraries/filemanager-9.14.1/dialog.php?type=1&popup=1&field_id=main_image_" . $lg['id'] . "&akey=c3cb2537d25c0efc9e573d059d79c3b8', 'mywindow', 'location=1,status=1,scrollbars=1, width=1100,height=700');" + 'icon_js' => "window.open ( '/libraries/filemanager-9.14.2/dialog.php?type=1&popup=1&field_id=main_image_" . $lg['id'] . "&akey=c3cb2537d25c0efc9e573d059d79c3b8', 'mywindow', 'location=1,status=1,scrollbars=1, width=1100,height=700');" ] ); ?> 'src_' . $lg['id'], 'value' => $this -> banner['languages'][ $lg['id'] ]['src'], 'icon_content' => 'przeglądaj', - 'icon_js' => "window.open ( 'http://" . $_SERVER['SERVER_NAME'] . "/libraries/filemanager-9.14.1/dialog.php?type=1&popup=1&field_id=src_" . $lg['id'] . "&akey=c3cb2537d25c0efc9e573d059d79c3b8', 'mywindow', 'location=1,status=1,scrollbars=1, width=1100,height=700');" + 'icon_js' => "window.open ( 'http://" . $_SERVER['SERVER_NAME'] . "/libraries/filemanager-9.14.2/dialog.php?type=1&popup=1&field_id=src_" . $lg['id'] . "&akey=c3cb2537d25c0efc9e573d059d79c3b8', 'mywindow', 'location=1,status=1,scrollbars=1, width=1100,height=700');" ) ); ?> diff --git a/admin/templates/filemanager/filemanager.php b/admin/templates/filemanager/filemanager.php index ba4e016..3e132fd 100644 --- a/admin/templates/filemanager/filemanager.php +++ b/admin/templates/filemanager/filemanager.php @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/admin/templates/shop-producer/edit.php b/admin/templates/shop-producer/edit.php index add3cb6..c9139ba 100644 --- a/admin/templates/shop-producer/edit.php +++ b/admin/templates/shop-producer/edit.php @@ -30,7 +30,7 @@ ob_start(); 'id' => 'img', 'value' => $this -> producer['img'], 'icon_content' => 'przeglądaj', - 'icon_js' => "window.open ( 'http://" . $_SERVER['SERVER_NAME'] . "/libraries/filemanager-9.14.1/dialog.php?type=1&popup=1&field_id=img&akey=c3cb2537d25c0efc9e573d059d79c3b8', 'mywindow', 'location=1,status=1,scrollbars=1, width=1100,height=700');" + 'icon_js' => "window.open ( 'http://" . $_SERVER['SERVER_NAME'] . "/libraries/filemanager-9.14.2/dialog.php?type=1&popup=1&field_id=img&akey=c3cb2537d25c0efc9e573d059d79c3b8', 'mywindow', 'location=1,status=1,scrollbars=1, width=1100,height=700');" ] ); ?> diff --git a/autoload/admin/controls/class.Filemanager.php b/autoload/admin/controls/class.Filemanager.php index 6e03a42..cfa6e21 100644 --- a/autoload/admin/controls/class.Filemanager.php +++ b/autoload/admin/controls/class.Filemanager.php @@ -3,9 +3,9 @@ namespace admin\controls; class Filemanager { - public function draw() + static public function draw() { - return \admin\view\FileManager::filemanager(); + return \Tpl::view( 'filemanager/filemanager' ); } } ?> diff --git a/autoload/admin/view/class.FileManager.php b/autoload/admin/view/class.FileManager.php index 15a45de..f6c4b1e 100644 --- a/autoload/admin/view/class.FileManager.php +++ b/autoload/admin/view/class.FileManager.php @@ -3,10 +3,5 @@ namespace admin\view; class FileManager { - public function filemanager() - { - $tpl = new \Tpl; - return $tpl -> render( 'filemanager/filemanager' ); - } } ?> diff --git a/libraries/ckeditor/config.js b/libraries/ckeditor/config.js index d9056c8..6d1ef22 100644 --- a/libraries/ckeditor/config.js +++ b/libraries/ckeditor/config.js @@ -4,92 +4,92 @@ */ CKEDITOR.editorConfig = function (config) { - config.toolbar = 'MyTool'; - config.toolbar_MyTool = - [ - ['Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord'], - ['Undo', 'Redo', '-', 'Find', 'Replace', '-', 'SelectAll', 'RemoveFormat'], - ['Bold', 'Italic', 'Underline', 'Strike', '-', 'Subscript', 'Superscript'], - ['NumberedList', 'BulletedList', 'Indent', 'Outdent', 'CreateDiv'], - ['TextColor', 'BGColor'], - ['JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock'], - ['Link', 'Unlink', 'cmslinkarticle', 'cmslinkpage'], - ['ckawesome', 'Image', 'Flash', 'Table', 'HorizontalRule', 'SpecialChar', 'Youtube', 'GoogleMaps'], - ['Styles', 'Format', 'Font', 'FontSize', 'Source', 'Maximize'], - [ - 'jsplus_bootstrap_show_blocks', 'jsplus_bootstrap_templates', 'jsplus_bootstrap_block_conf', 'jsplus_bootstrap_col_move_left', 'jsplus_bootstrap_col_move_right', 'jsplus_bootstrap_delete_col', - 'jsplus_bootstrap_delete_row', 'jsplus_bootstrap_row_move_down', 'jsplus_bootstrap_row_move_up' - ], - [ - 'jsplus_bootstrap_alert', 'jsplus_bootstrap_icons', 'jsplus_bootstrap_button', 'jsplus_bootstrap_badge', 'jsplus_bootstrap_label' - ] - ]; + config.toolbar = 'MyTool'; + config.toolbar_MyTool = + [ + ['Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord'], + ['Undo', 'Redo', '-', 'Find', 'Replace', '-', 'SelectAll', 'RemoveFormat'], + ['Bold', 'Italic', 'Underline', 'Strike', '-', 'Subscript', 'Superscript'], + ['NumberedList', 'BulletedList', 'Indent', 'Outdent', 'CreateDiv'], + ['TextColor', 'BGColor'], + ['JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock'], + ['Link', 'Unlink', 'cmslinkarticle', 'cmslinkpage'], + ['ckawesome', 'Image', 'Flash', 'Table', 'HorizontalRule', 'SpecialChar', 'Youtube', 'GoogleMaps'], + ['Styles', 'Format', 'Font', 'FontSize', 'Source', 'Maximize'], + [ + 'jsplus_bootstrap_show_blocks', 'jsplus_bootstrap_templates', 'jsplus_bootstrap_block_conf', 'jsplus_bootstrap_col_move_left', 'jsplus_bootstrap_col_move_right', 'jsplus_bootstrap_delete_col', + 'jsplus_bootstrap_delete_row', 'jsplus_bootstrap_row_move_down', 'jsplus_bootstrap_row_move_up' + ], + [ + 'jsplus_bootstrap_alert', 'jsplus_bootstrap_icons', 'jsplus_bootstrap_button', 'jsplus_bootstrap_badge', 'jsplus_bootstrap_label' + ] + ]; - config.toolbar = 'MyToolbar'; - config.toolbar_MyToolbar = - [ - ['Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord'], - ['Undo', 'Redo', '-', 'Find', 'Replace', '-', 'SelectAll', 'RemoveFormat'], - ['Bold', 'Italic', 'Underline', 'Strike', '-', 'Subscript', 'Superscript','CopyFormatting'], - ['NumberedList', 'BulletedList', 'Indent', 'Outdent', 'CreateDiv'], - ['TextColor', 'BGColor'], - ['JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock'], - ['Link', 'Unlink', 'cmslinkarticle', 'cmslinkpage'], - ['ckawesome', 'Image', 'Flash', 'Table', 'HorizontalRule', 'SpecialChar', 'Youtube'], - ['Styles', 'Format', 'Font', 'FontSize', 'ShowBlocks', 'Source', 'Maximize'], - [ - 'jsplus_bootstrap_show_blocks', 'jsplus_bootstrap_templates', 'jsplus_bootstrap_block_conf', 'jsplus_bootstrap_col_move_left', 'jsplus_bootstrap_col_move_right', 'jsplus_bootstrap_delete_col', - 'jsplus_bootstrap_delete_row', 'jsplus_bootstrap_row_move_down', 'jsplus_bootstrap_row_move_up' - ], - ['BootstrapCollapse', 'BootstrapTab'], - [ - 'jsplus_bootstrap_alert', 'jsplus_bootstrap_icons', 'jsplus_bootstrap_button', 'jsplus_bootstrap_badge', 'jsplus_bootstrap_label' - ], - [ - 'jsplus_bootstrap_table_new', 'jsplus_bootstrap_table_conf', 'jsplus_bootstrap_table_row_conf', 'jsplus_bootstrap_table_col_conf', 'jsplus_bootstrap_table_cell_conf', 'jsplus_bootstrap_table_row_move_up', - 'jsplus_bootstrap_table_row_move_down', 'jsplus_bootstrap_table_col_move_left', 'jsplus_bootstrap_table_col_move_right', 'jsplus_bootstrap_table_add_row_up', 'jsplus_bootstrap_table_add_row_down', - 'jsplus_bootstrap_table_add_col_left', 'jsplus_bootstrap_table_add_col_right', 'jsplus_bootstrap_table_add_cell_left', 'jsplus_bootstrap_table_add_cell_right', 'jsplus_bootstrap_table_delete_col', - 'jsplus_bootstrap_table_delete_row', 'jsplus_bootstrap_table_delete_cell', 'jsplus_bootstrap_table_merge_cells', 'jsplus_bootstrap_table_merge_cell_right', 'jsplus_bootstrap_table_merge_cell_down', - 'jsplus_bootstrap_table_split_cell_hor', 'jsplus_bootstrap_table_split_cell_vert' - ], - ['jsplus_bootstrap_advanced_blocks'] - ]; - config.toolbar = 'Basic'; - config.toolbar_Basic = - [ - ['Bold', 'Italic', 'Underline', 'Strike', '-', 'NumberedList', 'BulletedList'], - ['Link', 'Unlink', 'ckawesome', 'Image'], - ['JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock', '-', 'TextColor', 'BGColor'], - ['Source', 'Maximize'] - ]; - config.defaultLanguage = 'pl'; - config.extraPlugins = 'showblocks,indent,justify,font,tableresize,find,texttransform,colorbutton,youtube,cmslinkarticle,cmslinkpage,colordialog,googlemaps,ckawesome,' - + 'jsplus_bootstrap_include,' - + 'jsplus_bootstrap_block_conf,jsplus_bootstrap_col_move_left,jsplus_bootstrap_col_move_right,jsplus_bootstrap_delete_col,jsplus_bootstrap_delete_row,' - + 'jsplus_bootstrap_row_move_down,jsplus_bootstrap_row_move_up,jsplus_bootstrap_show_blocks,' - + 'jsplus_bootstrap_templates,jsplus_bootstrap_table_new,jsplus_bootstrap_button,jsplus_bootstrap_icons,jsplus_bootstrap_badge,jsplus_bootstrap_label,' - + 'jsplus_bootstrap_breadcrumbs,jsplus_bootstrap_alert,' - + 'jsplus_bootstrap_table_conf,jsplus_bootstrap_table_row_conf,jsplus_bootstrap_table_col_conf,jsplus_bootstrap_table_cell_conf,jsplus_bootstrap_table_row_move_up,' - + 'jsplus_bootstrap_table_row_move_down,jsplus_bootstrap_table_col_move_left,jsplus_bootstrap_table_col_move_right,jsplus_bootstrap_table_add_row_up,jsplus_bootstrap_table_add_row_down,' - + 'jsplus_bootstrap_table_add_col_left,jsplus_bootstrap_table_add_col_right,jsplus_bootstrap_table_add_cell_left,jsplus_bootstrap_table_add_cell_right,jsplus_bootstrap_table_delete_col,' - + 'jsplus_bootstrap_table_delete_row,jsplus_bootstrap_table_delete_cell,jsplus_bootstrap_table_merge_cells,jsplus_bootstrap_table_merge_cell_right,jsplus_bootstrap_table_merge_cell_down,' - + 'jsplus_bootstrap_table_split_cell_hor,jsplus_bootstrap_table_split_cell_vert,bootstrapCollapse,bootstrapTab,ckawesome,copyformatting'; + config.toolbar = 'MyToolbar'; + config.toolbar_MyToolbar = + [ + ['Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord'], + ['Undo', 'Redo', '-', 'Find', 'Replace', '-', 'SelectAll', 'RemoveFormat'], + ['Bold', 'Italic', 'Underline', 'Strike', '-', 'Subscript', 'Superscript','CopyFormatting'], + ['NumberedList', 'BulletedList', 'Indent', 'Outdent', 'CreateDiv'], + ['TextColor', 'BGColor'], + ['JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock'], + ['Link', 'Unlink', 'cmslinkarticle', 'cmslinkpage'], + ['ckawesome', 'Image', 'Flash', 'Table', 'HorizontalRule', 'SpecialChar', 'Youtube'], + ['Styles', 'Format', 'Font', 'FontSize', 'ShowBlocks', 'Source', 'Maximize'], + [ + 'jsplus_bootstrap_show_blocks', 'jsplus_bootstrap_templates', 'jsplus_bootstrap_block_conf', 'jsplus_bootstrap_col_move_left', 'jsplus_bootstrap_col_move_right', 'jsplus_bootstrap_delete_col', + 'jsplus_bootstrap_delete_row', 'jsplus_bootstrap_row_move_down', 'jsplus_bootstrap_row_move_up' + ], + ['BootstrapCollapse', 'BootstrapTab'], + [ + 'jsplus_bootstrap_alert', 'jsplus_bootstrap_icons', 'jsplus_bootstrap_button', 'jsplus_bootstrap_badge', 'jsplus_bootstrap_label' + ], + [ + 'jsplus_bootstrap_table_new', 'jsplus_bootstrap_table_conf', 'jsplus_bootstrap_table_row_conf', 'jsplus_bootstrap_table_col_conf', 'jsplus_bootstrap_table_cell_conf', 'jsplus_bootstrap_table_row_move_up', + 'jsplus_bootstrap_table_row_move_down', 'jsplus_bootstrap_table_col_move_left', 'jsplus_bootstrap_table_col_move_right', 'jsplus_bootstrap_table_add_row_up', 'jsplus_bootstrap_table_add_row_down', + 'jsplus_bootstrap_table_add_col_left', 'jsplus_bootstrap_table_add_col_right', 'jsplus_bootstrap_table_add_cell_left', 'jsplus_bootstrap_table_add_cell_right', 'jsplus_bootstrap_table_delete_col', + 'jsplus_bootstrap_table_delete_row', 'jsplus_bootstrap_table_delete_cell', 'jsplus_bootstrap_table_merge_cells', 'jsplus_bootstrap_table_merge_cell_right', 'jsplus_bootstrap_table_merge_cell_down', + 'jsplus_bootstrap_table_split_cell_hor', 'jsplus_bootstrap_table_split_cell_vert' + ], + ['jsplus_bootstrap_advanced_blocks'] + ]; + config.toolbar = 'Basic'; + config.toolbar_Basic = + [ + ['Bold', 'Italic', 'Underline', 'Strike', '-', 'NumberedList', 'BulletedList'], + ['Link', 'Unlink', 'ckawesome', 'Image'], + ['JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock', '-', 'TextColor', 'BGColor'], + ['Source', 'Maximize'] + ]; + config.defaultLanguage = 'pl'; + config.extraPlugins = 'showblocks,indent,justify,font,tableresize,find,texttransform,colorbutton,youtube,cmslinkarticle,cmslinkpage,colordialog,googlemaps,ckawesome,' + + 'jsplus_bootstrap_include,' + + 'jsplus_bootstrap_block_conf,jsplus_bootstrap_col_move_left,jsplus_bootstrap_col_move_right,jsplus_bootstrap_delete_col,jsplus_bootstrap_delete_row,' + + 'jsplus_bootstrap_row_move_down,jsplus_bootstrap_row_move_up,jsplus_bootstrap_show_blocks,' + + 'jsplus_bootstrap_templates,jsplus_bootstrap_table_new,jsplus_bootstrap_button,jsplus_bootstrap_icons,jsplus_bootstrap_badge,jsplus_bootstrap_label,' + + 'jsplus_bootstrap_breadcrumbs,jsplus_bootstrap_alert,' + + 'jsplus_bootstrap_table_conf,jsplus_bootstrap_table_row_conf,jsplus_bootstrap_table_col_conf,jsplus_bootstrap_table_cell_conf,jsplus_bootstrap_table_row_move_up,' + + 'jsplus_bootstrap_table_row_move_down,jsplus_bootstrap_table_col_move_left,jsplus_bootstrap_table_col_move_right,jsplus_bootstrap_table_add_row_up,jsplus_bootstrap_table_add_row_down,' + + 'jsplus_bootstrap_table_add_col_left,jsplus_bootstrap_table_add_col_right,jsplus_bootstrap_table_add_cell_left,jsplus_bootstrap_table_add_cell_right,jsplus_bootstrap_table_delete_col,' + + 'jsplus_bootstrap_table_delete_row,jsplus_bootstrap_table_delete_cell,jsplus_bootstrap_table_merge_cells,jsplus_bootstrap_table_merge_cell_right,jsplus_bootstrap_table_merge_cell_down,' + + 'jsplus_bootstrap_table_split_cell_hor,jsplus_bootstrap_table_split_cell_vert,bootstrapCollapse,bootstrapTab,ckawesome,copyformatting'; - config.fullPage = false; - config.disableNativeSpellChecker = false; - config.bootstrapCollapse_managePopupContent = true; - config.bootstrapTab_managePopupContent = true; - config.mj_variables_allow_html = true; - config.copyFormatting_allowedContexts = true; - - config.jsplus_bootstrap_version = 4; + config.fullPage = false; + config.disableNativeSpellChecker = false; + config.bootstrapCollapse_managePopupContent = true; + config.bootstrapTab_managePopupContent = true; + config.mj_variables_allow_html = true; + config.copyFormatting_allowedContexts = true; - config.filebrowserBrowseUrl = '/libraries/filemanager-9.14.1/dialog.php?type=2&editor=ckeditor&akey=c3cb2537d25c0efc9e573d059d79c3b8'; - config.filebrowserImageBrowseUrl = '/libraries/filemanager-9.14.1/dialog.php?type=1&editor=ckeditor&akey=c3cb2537d25c0efc9e573d059d79c3b8'; - config.filebrowserUploadUrl = '/libraries/filemanager-9.14.1/dialog.php?type=2&editor=ckeditor&akey=c3cb2537d25c0efc9e573d059d79c3b8'; - config.contentsCss = '/libraries/framework/fonts/font-awesome/font-awesome.css'; - config.fontawesomePath = '/libraries/font-awesome-4.7.0/css/font-awesome.min.css'; - - config.allowedContent = true; - config.extraAllowedContent = 'img(*)[*]{*}'; + config.jsplus_bootstrap_version = 4; + + config.filebrowserBrowseUrl = '/libraries/filemanager-9.14.2/dialog.php?type=2&editor=ckeditor&akey=c3cb2537d25c0efc9e573d059d79c3b8'; + config.filebrowserImageBrowseUrl = '/libraries/filemanager-9.14.2dialog.php?type=1&editor=ckeditor&akey=c3cb2537d25c0efc9e573d059d79c3b8'; + config.filebrowserUploadUrl = '/libraries/filemanager-9.14.2/dialog.php?type=2&editor=ckeditor&akey=c3cb2537d25c0efc9e573d059d79c3b8'; + config.contentsCss = '/libraries/framework/fonts/font-awesome/font-awesome.css'; + config.fontawesomePath = '/libraries/font-awesome-4.7.0/css/font-awesome.min.css'; + + config.allowedContent = true; + config.extraAllowedContent = 'img(*)[*]{*}'; }; diff --git a/libraries/filemanager-9.14.2/UploadHandler.php b/libraries/filemanager-9.14.2/UploadHandler.php new file mode 100644 index 0000000..025a048 --- /dev/null +++ b/libraries/filemanager-9.14.2/UploadHandler.php @@ -0,0 +1,1615 @@ + 'The uploaded file exceeds the upload_max_filesize directive in php.ini', + 2 => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form', + 3 => 'The uploaded file was only partially uploaded', + 4 => 'No file was uploaded', + 6 => 'Missing a temporary folder', + 7 => 'Failed to write file to disk', + 8 => 'A PHP extension stopped the file upload', + 'post_max_size' => 'The uploaded file exceeds the post_max_size directive in php.ini', + 'max_file_size' => 'File is too big', + 'min_file_size' => 'File is too small', + 'accept_file_types' => 'Filetype not allowed', + 'max_number_of_files' => 'Maximum number of files exceeded', + 'max_width' => 'Image exceeds maximum width', + 'min_width' => 'Image requires a minimum width', + 'max_height' => 'Image exceeds maximum height', + 'min_height' => 'Image requires a minimum height', + 'abort' => 'File upload aborted', + 'image_resize' => 'Failed to resize image' + ]; + + const IMAGETYPE_GIF = 1; + const IMAGETYPE_JPEG = 2; + const IMAGETYPE_PNG = 3; + const IMAGETYPE_WEBP = 4; + + protected $image_objects = []; + + public function __construct($options = null, $initialize = true, $error_messages = null) { + $this->response = []; + $this->options = [ + 'script_url' => $this->get_full_url().'/'.$this->basename($this->get_server_var('SCRIPT_NAME')), + 'upload_dir' => dirname($this->get_server_var('SCRIPT_FILENAME')).'/files/', + 'upload_url' => $this->get_full_url().'/files/', + 'input_stream' => 'php://input', + 'user_dirs' => false, + 'mkdir_mode' => 0755, + 'param_name' => 'files', + // Set the following option to 'POST', if your server does not support + // DELETE requests. This is a parameter sent to the client: + 'delete_type' => 'DELETE', + 'access_control_allow_origin' => '*', + 'access_control_allow_credentials' => false, + 'access_control_allow_methods' => [ + 'OPTIONS', + 'HEAD', + 'GET', + 'POST', + 'PUT', + 'PATCH', + 'DELETE' + ], + 'access_control_allow_headers' => [ + 'Content-Type', + 'Content-Range', + 'Content-Disposition' + ], + // By default, allow redirects to the referer protocol+host: + 'redirect_allow_target' => '/^'.preg_quote( + parse_url($this->get_server_var('HTTP_REFERER'), PHP_URL_SCHEME) + .'://' + .parse_url($this->get_server_var('HTTP_REFERER'), PHP_URL_HOST) + .'/', // Trailing slash to not match subdomains by mistake + '/' // preg_quote delimiter param + ).'/', + // Enable to provide file downloads via GET requests to the PHP script: + // 1. Set to 1 to download files via readfile method through PHP + // 2. Set to 2 to send a X-Sendfile header for lighttpd/Apache + // 3. Set to 3 to send a X-Accel-Redirect header for nginx + // If set to 2 or 3, adjust the upload_url option to the base path of + // the redirect parameter, e.g. '/files/'. + 'download_via_php' => false, + // Read files in chunks to avoid memory limits when download_via_php + // is enabled, set to 0 to disable chunked reading of files: + 'readfile_chunk_size' => 10 * 1024 * 1024, // 10 MiB + // Defines which files can be displayed inline when downloaded: + 'inline_file_types' => '/\.(gif|jpe?g|png)$/i', + // Defines which files (based on their names) are accepted for upload. + // By default, only allows file uploads with image file extensions. + // Only change this setting after making sure that any allowed file + // types cannot be executed by the webserver in the files directory, + // e.g. PHP scripts, nor executed by the browser when downloaded, + // e.g. HTML files with embedded JavaScript code. + // Please also read the SECURITY.md document in this repository. + 'accept_file_types' => '/\.(gif|jpe?g|png)$/i', + // Replaces dots in filenames with the given string. + // Can be disabled by setting it to false or an empty string. + // Note that this is a security feature for servers that support + // multiple file extensions, e.g. the Apache AddHandler Directive: + // https://httpd.apache.org/docs/current/mod/mod_mime.html#addhandler + // Before disabling it, make sure that files uploaded with multiple + // extensions cannot be executed by the webserver, e.g. + // "example.php.png" with embedded PHP code, nor executed by the + // browser when downloaded, e.g. "example.html.gif" with embedded + // JavaScript code. + 'replace_dots_in_filenames' => '-', + // The php.ini settings upload_max_filesize and post_max_size + // take precedence over the following max_file_size setting: + 'max_file_size' => null, + 'min_file_size' => 1, + // The maximum number of files for the upload directory: + 'max_number_of_files' => null, + // Reads first file bytes to identify and correct file extensions: + 'correct_image_extensions' => false, + // Image resolution restrictions: + 'max_width' => null, + 'max_height' => null, + 'min_width' => 1, + 'min_height' => 1, + // Set the following option to false to enable resumable uploads: + 'discard_aborted_uploads' => true, + // Set to 0 to use the GD library to scale and orient images, + // set to 1 to use imagick (if installed, falls back to GD), + // set to 2 to use the ImageMagick convert binary directly: + 'image_library' => 1, + // Uncomment the following to define an array of resource limits + // for imagick: + /* + 'imagick_resource_limits' => array( + imagick::RESOURCETYPE_MAP => 32, + imagick::RESOURCETYPE_MEMORY => 32 + ), + */ + // Command or path for to the ImageMagick convert binary: + 'convert_bin' => 'convert', + // Uncomment the following to add parameters in front of each + // ImageMagick convert call (the limit constraints seem only + // to have an effect if put in front): + /* + 'convert_params' => '-limit memory 32MiB -limit map 32MiB', + */ + // Command or path for to the ImageMagick identify binary: + 'identify_bin' => 'identify', + 'image_versions' => [ + // The empty image version key defines options for the original image. + // Keep in mind: these image manipulations are inherited by all other image versions from this point onwards. + // Also note that the property 'no_cache' is not inherited, since it's not a manipulation. + '' => [ + // Automatically rotate images based on EXIF meta data: + 'auto_orient' => true + ], + // You can add arrays to generate different versions. + // The name of the key is the name of the version (example: 'medium'). + // the array contains the options to apply. + /* + 'medium' => array( + 'max_width' => 800, + 'max_height' => 600 + ), + */ + //'thumbnail' => array( + // Uncomment the following to use a defined directory for the thumbnails + // instead of a subdirectory based on the version identifier. + // Make sure that this directory doesn't allow execution of files if you + // don't pose any restrictions on the type of uploaded files, e.g. by + // copying the .htaccess file from the files directory for Apache: + //'upload_dir' => dirname($this->get_server_var('SCRIPT_FILENAME')).'/thumb/', + //'upload_url' => $this->get_full_url().'/thumb/', + // Uncomment the following to force the max + // dimensions and e.g. create square thumbnails: + // 'auto_orient' => true, + // 'crop' => true, + // 'jpeg_quality' => 70, + // 'no_cache' => true, (there's a caching option, but this remembers thumbnail sizes from a previous action!) + // 'strip' => true, (this strips EXIF tags, such as geolocation) + // 'max_width' => 80, // either specify width, or set to 0. Then width is automatically adjusted - keeping aspect ratio to a specified max_height. + // 'max_height' => 80 // either specify height, or set to 0. Then height is automatically adjusted - keeping aspect ratio to a specified max_width. + // ) + ], + 'print_response' => true + ]; + if ($options) { + $this->options = $options + $this->options; + } + if ($error_messages) { + $this->error_messages = $error_messages + $this->error_messages; + } + if ($initialize) { + $this->initialize(); + } + } + + protected function initialize() { + switch ($this->get_server_var('REQUEST_METHOD')) { + case 'OPTIONS': + case 'HEAD': + $this->head(); + break; + case 'GET': + $this->get($this->options['print_response']); + break; + case 'PATCH': + case 'PUT': + case 'POST': + $this->post($this->options['print_response']); + break; + case 'DELETE': + $this->delete($this->options['print_response']); + break; + default: + $this->header('HTTP/1.1 405 Method Not Allowed'); + } + } + + protected function get_full_url() { + $https = !empty($_SERVER['HTTPS']) && strcasecmp($_SERVER['HTTPS'], 'on') === 0 || + !empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && + strcasecmp($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') === 0; + return + ($https ? 'https://' : 'http://'). + (!empty($_SERVER['REMOTE_USER']) ? $_SERVER['REMOTE_USER'].'@' : ''). + ($_SERVER['HTTP_HOST'] ?? ($_SERVER['SERVER_NAME'] . + ($https && $_SERVER['SERVER_PORT'] === 443 || + $_SERVER['SERVER_PORT'] === 80 ? '' : ':' . $_SERVER['SERVER_PORT']))). + substr($_SERVER['SCRIPT_NAME'],0, strrpos($_SERVER['SCRIPT_NAME'], '/')); + } + + protected function get_user_id() { + @session_start(); + return session_id(); + } + + protected function get_user_path() { + if ($this->options['user_dirs']) { + return $this->get_user_id().'/'; + } + return ''; + } + + protected function get_upload_path($file_name = null, $version = null) { + $file_name = $file_name ?: ''; + if (empty($version)) { + $version_path = ''; + } else { + $version_dir = @$this->options['image_versions'][$version]['upload_dir']; + if ($version_dir) { + return $version_dir.$this->get_user_path().$file_name; + } + $version_path = $version.'/'; + } + return $this->options['upload_dir'].$this->get_user_path() + .$version_path.$file_name; + } + + protected function get_query_separator($url) { + return strpos($url, '?') === false ? '?' : '&'; + } + + protected function get_download_url($file_name, $version = null, $direct = false) { + if (!$direct && $this->options['download_via_php']) { + $url = $this->options['script_url'] + .$this->get_query_separator($this->options['script_url']) + .$this->get_singular_param_name() + .'='.rawurlencode($file_name); + if ($version) { + $url .= '&version='.rawurlencode($version); + } + return $url.'&download=1'; + } + if (empty($version)) { + $version_path = ''; + } else { + $version_url = @$this->options['image_versions'][$version]['upload_url']; + if ($version_url) { + return $version_url.$this->get_user_path().rawurlencode($file_name); + } + $version_path = rawurlencode($version).'/'; + } + return $this->options['upload_url'].$this->get_user_path() + .$version_path.rawurlencode($file_name); + } + + protected function set_additional_file_properties($file) { + $file->deleteUrl = $this->options['script_url'] + .$this->get_query_separator($this->options['script_url']) + .$this->get_singular_param_name() + .'='.rawurlencode($file->name); + $file->deleteType = $this->options['delete_type']; + if ($file->deleteType !== 'DELETE') { + $file->deleteUrl .= '&_method=DELETE'; + } + if ($this->options['access_control_allow_credentials']) { + $file->deleteWithCredentials = true; + } + } + + // Fix for overflowing signed 32 bit integers, + // works for sizes up to 2^32-1 bytes (4 GiB - 1): + protected function fix_integer_overflow($size) { + if ($size < 0) { + $size += 2.0 * (PHP_INT_MAX + 1); + } + return $size; + } + + protected function get_file_size($file_path, $clear_stat_cache = false) { + if ($clear_stat_cache) { + if (version_compare(PHP_VERSION, '5.3.0') >= 0) { + clearstatcache(true, $file_path); + } else { + clearstatcache(); + } + } + return $this->fix_integer_overflow(filesize($file_path)); + } + + protected function is_valid_file_object($file_name) { + $file_path = $this->get_upload_path($file_name); + if (is_file($file_path) && $file_name[0] !== '.') { + return true; + } + return false; + } + + protected function get_file_object($file_name) { + if ($this->is_valid_file_object($file_name)) { + $file = new \stdClass(); + $file->name = $file_name; + $file->size = $this->get_file_size( + $this->get_upload_path($file_name) + ); + $file->url = $this->get_download_url($file->name); + foreach ($this->options['image_versions'] as $version => $options) { + if (!empty($version)) { + if (is_file($this->get_upload_path($file_name, $version))) { + $file->{$version.'Url'} = $this->get_download_url( + $file->name, + $version + ); + } + } + } + $this->set_additional_file_properties($file); + return $file; + } + return null; + } + + protected function get_file_objects($iteration_method = 'get_file_object') { + $upload_dir = $this->get_upload_path(); + if (!is_dir($upload_dir)) { + return []; + } + return array_values(array_filter(array_map( + [$this, $iteration_method], + scandir($upload_dir) + ))); + } + + protected function count_file_objects() { + return count($this->get_file_objects('is_valid_file_object')); + } + + protected function get_error_message($error) { + return $this->error_messages[$error] ?? $error; + } + + public function get_config_bytes($val) { + $val = trim($val); + $last = strtolower($val[strlen($val)-1]); + $val = (int)$val; + switch ($last) { + case 'g': + $val *= 1024; + case 'm': + $val *= 1024; + case 'k': + $val *= 1024; + } + return $this->fix_integer_overflow($val); + } + + protected function validate($uploaded_file, $file, $error, $index) { + if ($error) { + $file->error = $this->get_error_message($error); + return false; + } + $content_length = $this->fix_integer_overflow( + (int)$this->get_server_var('CONTENT_LENGTH') + ); + $post_max_size = $this->get_config_bytes(ini_get('post_max_size')); + if ($post_max_size && ($content_length > $post_max_size)) { + $file->error = $this->get_error_message('post_max_size'); + return false; + } + if (!preg_match($this->options['accept_file_types'], $file->name)) { + $file->error = $this->get_error_message('accept_file_types'); + return false; + } + if ($uploaded_file && is_uploaded_file($uploaded_file)) { + $file_size = $this->get_file_size($uploaded_file); + } else { + $file_size = $content_length; + } + if ($this->options['max_file_size'] && ( + $file_size > $this->options['max_file_size'] || + $file->size > $this->options['max_file_size']) + ) { + $file->error = $this->get_error_message('max_file_size'); + return false; + } + if ($this->options['min_file_size'] && + $file_size < $this->options['min_file_size']) { + $file->error = $this->get_error_message('min_file_size'); + return false; + } + if (is_int($this->options['max_number_of_files']) && + ($this->count_file_objects() >= $this->options['max_number_of_files']) && + // Ignore additional chunks of existing files: + !is_file($this->get_upload_path($file->name))) { + $file->error = $this->get_error_message('max_number_of_files'); + return false; + } + $max_width = @$this->options['max_width']; + $max_height = @$this->options['max_height']; + $min_width = @$this->options['min_width']; + $min_height = @$this->options['min_height']; + if (($max_width || $max_height || $min_width || $min_height) + && $this->is_valid_image_file($uploaded_file)) { + list($img_width, $img_height) = $this->get_image_size($uploaded_file); + // If we are auto rotating the image by default, do the checks on + // the correct orientation + if ( + @$this->options['image_versions']['']['auto_orient'] && + function_exists('exif_read_data') && + ($exif = @exif_read_data($uploaded_file)) && + (((int) @$exif['Orientation']) >= 5) + ) { + $tmp = $img_width; + $img_width = $img_height; + $img_height = $tmp; + unset($tmp); + } + } + if (!empty($img_width)) { + if ($max_width && $img_width > $max_width) { + $file->error = $this->get_error_message('max_width'); + return false; + } + if ($max_height && $img_height > $max_height) { + $file->error = $this->get_error_message('max_height'); + return false; + } + if ($min_width && $img_width < $min_width) { + $file->error = $this->get_error_message('min_width'); + return false; + } + if ($min_height && $img_height < $min_height) { + $file->error = $this->get_error_message('min_height'); + return false; + } + } + return true; + } + + protected function upcount_name_callback($matches) { + $index = isset($matches[1]) ? ((int)$matches[1]) + 1 : 1; + $ext = $matches[2] ?? ''; + return ' ('.$index.')'.$ext; + } + + protected function upcount_name($name) { + return preg_replace_callback( + '/(?:(?: \(([\d]+)\))?(\.[^.]+))?$/', + [$this, 'upcount_name_callback'], + $name, + 1 + ); + } + + protected function get_unique_filename($file_path, $name, $size, $type, $error, + $index, $content_range) { + while(is_dir($this->get_upload_path($name))) { + $name = $this->upcount_name($name); + } + // Keep an existing filename if this is part of a chunked upload: + $uploaded_bytes =!empty($content_range[1]) ? $this->fix_integer_overflow((int)$content_range[1]) : 0; + while (is_file($this->get_upload_path($name))) { + if(isset($uploaded_bytes)){ + if ($uploaded_bytes === $this->get_file_size( + $this->get_upload_path($name))) { + break; + } + } + $name = $this->upcount_name($name); + } + + return $name; + } + + protected function fix_file_extension($file_path, $name, $size, $type, $error, + $index, $content_range) { + // Add missing file extension for known image types: + if (strpos($name, '.') === false && + preg_match('/^image\/(gif|jpe?g|png|webp)/', $type, $matches)) { + $name .= '.'.$matches[1]; + } + if ($this->options['correct_image_extensions']) { + switch ($this->imagetype($file_path)) { + case self::IMAGETYPE_JPEG: + $extensions = ['jpg', 'jpeg']; + break; + case self::IMAGETYPE_PNG: + $extensions = ['png']; + break; + case self::IMAGETYPE_GIF: + $extensions = ['gif']; + break; + case self::IMAGETYPE_WEBP: + $extensions = ['webp']; + break; + } + // Adjust incorrect image file extensions: + if (!empty($extensions)) { + $parts = explode('.', $name); + $extIndex = count($parts) - 1; + $ext = strtolower(@$parts[$extIndex]); + if (!in_array($ext, $extensions)) { + $parts[$extIndex] = $extensions[0]; + $name = implode('.', $parts); + } + } + } + return $name; + } + + protected function trim_file_name($file_path, $name, $size, $type, $error, + $index, $content_range) { + // Remove path information and dots around the filename, to prevent uploading + // into different directories or replacing hidden system files. + // Also remove control characters and spaces (\x00..\x20) around the filename: + $name = trim($this->basename(stripslashes($name)), ".\x00..\x20"); + // Replace dots in filenames to avoid security issues with servers + // that interpret multiple file extensions, e.g. "example.php.png": + $replacement = $this->options['replace_dots_in_filenames']; + if (!empty($replacement)) { + $parts = explode('.', $name); + if (count($parts) > 2) { + $ext = array_pop($parts); + $name = implode($replacement, $parts).'.'.$ext; + } + } + // Use a timestamp for empty filenames: + if (!$name) { + $name = str_replace('.', '-', microtime(true)); + } + return $name; + } + + protected function get_file_name($file_path, $name, $size, $type, $error, + $index, $content_range) { + $name = $this->trim_file_name($file_path, $name, $size, $type, $error, + $index, $content_range); + return $this->get_unique_filename( + $file_path, + $this->fix_file_extension($file_path, $name, $size, $type, $error, + $index, $content_range), + $size, + $type, + $error, + $index, + $content_range + ); + } + + protected function get_scaled_image_file_paths($file_name, $version) { + $file_path = $this->get_upload_path($file_name); + if (!empty($version)) { + $version_dir = $this->get_upload_path(null, $version); + if (!is_dir($version_dir)) { + mkdir($version_dir, $this->options['mkdir_mode'], true); + } + $new_file_path = $version_dir.'/'.$file_name; + } else { + $new_file_path = $file_path; + } + return [$file_path, $new_file_path]; + } + + protected function gd_get_image_object($file_path, $func, $no_cache = false) { + if (empty($this->image_objects[$file_path]) || $no_cache) { + $this->gd_destroy_image_object($file_path); + $this->image_objects[$file_path] = $func($file_path); + } + return $this->image_objects[$file_path]; + } + + protected function gd_set_image_object($file_path, $image) { + $this->gd_destroy_image_object($file_path); + $this->image_objects[$file_path] = $image; + } + + protected function gd_destroy_image_object($file_path) { + $image = (isset($this->image_objects[$file_path])) ? $this->image_objects[$file_path] : null ; + return $image && imagedestroy($image); + } + + protected function gd_imageflip($image, $mode) { + if (function_exists('imageflip')) { + return imageflip($image, $mode); + } + $new_width = $src_width = imagesx($image); + $new_height = $src_height = imagesy($image); + $new_img = imagecreatetruecolor($new_width, $new_height); + $src_x = 0; + $src_y = 0; + switch ($mode) { + case '1': // flip on the horizontal axis + $src_y = $new_height - 1; + $src_height = -$new_height; + break; + case '2': // flip on the vertical axis + $src_x = $new_width - 1; + $src_width = -$new_width; + break; + case '3': // flip on both axes + $src_y = $new_height - 1; + $src_height = -$new_height; + $src_x = $new_width - 1; + $src_width = -$new_width; + break; + default: + return $image; + } + imagecopyresampled( + $new_img, + $image, + 0, + 0, + $src_x, + $src_y, + $new_width, + $new_height, + $src_width, + $src_height + ); + return $new_img; + } + + protected function gd_orient_image($file_path, $src_img) { + if (!function_exists('exif_read_data')) { + return false; + } + $exif = @exif_read_data($file_path); + if ($exif === false) { + return false; + } + $orientation = (int)@$exif['Orientation']; + if ($orientation < 2 || $orientation > 8) { + return false; + } + switch ($orientation) { + case 2: + $new_img = $this->gd_imageflip( + $src_img, + defined('IMG_FLIP_VERTICAL') ? IMG_FLIP_VERTICAL : 2 + ); + break; + case 3: + $new_img = imagerotate($src_img, 180, 0); + break; + case 4: + $new_img = $this->gd_imageflip( + $src_img, + defined('IMG_FLIP_HORIZONTAL') ? IMG_FLIP_HORIZONTAL : 1 + ); + break; + case 5: + $tmp_img = $this->gd_imageflip( + $src_img, + defined('IMG_FLIP_HORIZONTAL') ? IMG_FLIP_HORIZONTAL : 1 + ); + $new_img = imagerotate($tmp_img, 270, 0); + imagedestroy($tmp_img); + break; + case 6: + $new_img = imagerotate($src_img, 270, 0); + break; + case 7: + $tmp_img = $this->gd_imageflip( + $src_img, + defined('IMG_FLIP_VERTICAL') ? IMG_FLIP_VERTICAL : 2 + ); + $new_img = imagerotate($tmp_img, 270, 0); + imagedestroy($tmp_img); + break; + case 8: + $new_img = imagerotate($src_img, 90, 0); + break; + default: + return false; + } + $this->gd_set_image_object($file_path, $new_img); + return true; + } + + protected function gd_create_scaled_image($file_name, $version, $options) { + if (!function_exists('imagecreatetruecolor')) { + error_log('Function not found: imagecreatetruecolor'); + return false; + } + list($file_path, $new_file_path) = + $this->get_scaled_image_file_paths($file_name, $version); + $type = strtolower(substr(strrchr($file_name, '.'), 1)); + switch ($type) { + case 'jpg': + case 'jpeg': + $src_func = 'imagecreatefromjpeg'; + $write_func = 'imagejpeg'; + $image_quality = $options['jpeg_quality'] ?? 75; + break; + case 'gif': + $src_func = 'imagecreatefromgif'; + $write_func = 'imagegif'; + $image_quality = null; + break; + case 'png': + $src_func = 'imagecreatefrompng'; + $write_func = 'imagepng'; + $image_quality = $options['png_quality'] ?? 9; + break; + case 'webp': + $src_func = 'imagecreatefromwebp'; + $write_func = 'imagewebp'; + $image_quality = $options['webp_quality'] ?? 75; + break; + default: + return false; + } + $src_img = $this->gd_get_image_object( + $file_path, + $src_func, + !empty($options['no_cache']) + ); + $image_oriented = false; + if (!empty($options['auto_orient']) && $this->gd_orient_image( + $file_path, + $src_img + )) { + $image_oriented = true; + $src_img = $this->gd_get_image_object( + $file_path, + $src_func + ); + } + $max_width = $img_width = imagesx($src_img); + $max_height = $img_height = imagesy($src_img); + if (!empty($options['max_width'])) { + $max_width = $options['max_width']; + } + if (!empty($options['max_height'])) { + $max_height = $options['max_height']; + } + $scale = min( + $max_width / $img_width, + $max_height / $img_height + ); + if ($scale >= 1) { + if ($image_oriented) { + return $write_func($src_img, $new_file_path, $image_quality); + } + if ($file_path !== $new_file_path) { + return copy($file_path, $new_file_path); + } + return true; + } + if (empty($options['crop'])) { + $new_width = $img_width * $scale; + $new_height = $img_height * $scale; + $dst_x = 0; + $dst_y = 0; + $new_img = imagecreatetruecolor($new_width, $new_height); + } else { + if (($img_width / $img_height) >= ($max_width / $max_height)) { + $new_width = $img_width / ($img_height / $max_height); + $new_height = $max_height; + } else { + $new_width = $max_width; + $new_height = $img_height / ($img_width / $max_width); + } + $dst_x = 0 - ($new_width - $max_width) / 2; + $dst_y = 0 - ($new_height - $max_height) / 2; + $new_img = imagecreatetruecolor($max_width, $max_height); + } + // Handle transparency in GIF and PNG images: + switch ($type) { + case 'gif': + case 'png': + imagecolortransparent($new_img, imagecolorallocate($new_img, 0, 0, 0)); + case 'png': + imagealphablending($new_img, false); + imagesavealpha($new_img, true); + break; + } + $success = imagecopyresampled( + $new_img, + $src_img, + $dst_x, + $dst_y, + 0, + 0, + $new_width, + $new_height, + $img_width, + $img_height + ) && $write_func($new_img, $new_file_path, $image_quality); + $this->gd_set_image_object($file_path, $new_img); + return $success; + } + + protected function imagick_get_image_object($file_path, $no_cache = false) { + if (empty($this->image_objects[$file_path]) || $no_cache) { + $this->imagick_destroy_image_object($file_path); + $image = new \Imagick(); + if (!empty($this->options['imagick_resource_limits'])) { + foreach ($this->options['imagick_resource_limits'] as $type => $limit) { + $image::setResourceLimit($type, $limit); + } + } + $image->readImage($file_path); + $this->image_objects[$file_path] = $image; + } + return $this->image_objects[$file_path]; + } + + protected function imagick_set_image_object($file_path, $image) { + $this->imagick_destroy_image_object($file_path); + $this->image_objects[$file_path] = $image; + } + + protected function imagick_destroy_image_object($file_path) { + $image = (isset($this->image_objects[$file_path])) ? $this->image_objects[$file_path] : null ; + return $image && $image->destroy(); + } + + protected function imagick_orient_image($image) { + $orientation = $image->getImageOrientation(); + $background = new \ImagickPixel('none'); + switch ($orientation) { + case \imagick::ORIENTATION_TOPRIGHT: // 2 + $image->flopImage(); // horizontal flop around y-axis + break; + case \imagick::ORIENTATION_BOTTOMRIGHT: // 3 + $image->rotateImage($background, 180); + break; + case \imagick::ORIENTATION_BOTTOMLEFT: // 4 + $image->flipImage(); // vertical flip around x-axis + break; + case \imagick::ORIENTATION_LEFTTOP: // 5 + $image->flopImage(); // horizontal flop around y-axis + $image->rotateImage($background, 270); + break; + case \imagick::ORIENTATION_RIGHTTOP: // 6 + $image->rotateImage($background, 90); + break; + case \imagick::ORIENTATION_RIGHTBOTTOM: // 7 + $image->flipImage(); // vertical flip around x-axis + $image->rotateImage($background, 270); + break; + case \imagick::ORIENTATION_LEFTBOTTOM: // 8 + $image->rotateImage($background, 270); + break; + default: + return false; + } + $image->setImageOrientation(\imagick::ORIENTATION_TOPLEFT); // 1 + return true; + } + + protected function imagick_create_scaled_image($file_name, $version, $options) { + list($file_path, $new_file_path) = + $this->get_scaled_image_file_paths($file_name, $version); + $image = $this->imagick_get_image_object( + $file_path, + !empty($options['crop']) || !empty($options['no_cache']) + ); + if ($image->getImageFormat() === 'GIF') { + // Handle animated GIFs: + $images = $image->coalesceImages(); + foreach ($images as $frame) { + $image = $frame; + $this->imagick_set_image_object($file_name, $image); + break; + } + } + $image_oriented = false; + if (!empty($options['auto_orient'])) { + $image_oriented = $this->imagick_orient_image($image); + } + + $image_resize = false; + $new_width = $max_width = $img_width = $image->getImageWidth(); + $new_height = $max_height = $img_height = $image->getImageHeight(); + + // use isset(). User might be setting max_width = 0 (auto in regular resizing). Value 0 would be considered empty when you use empty() + if (isset($options['max_width'])) { + $image_resize = true; + $new_width = $max_width = $options['max_width']; + } + if (isset($options['max_height'])) { + $image_resize = true; + $new_height = $max_height = $options['max_height']; + } + + $image_strip = ($options['strip'] ?? false); + + if ( !$image_oriented && ($max_width >= $img_width) && ($max_height >= $img_height) && !$image_strip && empty($options["jpeg_quality"]) ) { + if ($file_path !== $new_file_path) { + return copy($file_path, $new_file_path); + } + return true; + } + $crop = ($options['crop'] ?? false); + + if ($crop) { + $x = 0; + $y = 0; + if (($img_width / $img_height) >= ($max_width / $max_height)) { + $new_width = 0; // Enables proportional scaling based on max_height + $x = ($img_width / ($img_height / $max_height) - $max_width) / 2; + } else { + $new_height = 0; // Enables proportional scaling based on max_width + $y = ($img_height / ($img_width / $max_width) - $max_height) / 2; + } + } + $success = $image->resizeImage( + $new_width, + $new_height, + $options['filter'] ?? \imagick::FILTER_LANCZOS, + $options['blur'] ?? 1, + $new_width && $new_height // fit image into constraints if not to be cropped + ); + if ($success && $crop) { + $success = $image->cropImage( + $max_width, + $max_height, + $x, + $y + ); + if ($success) { + $success = $image->setImagePage($max_width, $max_height, 0, 0); + } + } + $type = strtolower(substr(strrchr($file_name, '.'), 1)); + switch ($type) { + case 'jpg': + case 'jpeg': + if (!empty($options['jpeg_quality'])) { + $image->setImageCompression(\imagick::COMPRESSION_JPEG); + $image->setImageCompressionQuality($options['jpeg_quality']); + } + break; + } + if ( $image_strip ) { + $image->stripImage(); + } + return $success && $image->writeImage($new_file_path); + } + + protected function imagemagick_create_scaled_image($file_name, $version, $options) { + list($file_path, $new_file_path) = + $this->get_scaled_image_file_paths($file_name, $version); + $resize = @$options['max_width'] + .(empty($options['max_height']) ? '' : 'X'.$options['max_height']); + if (!$resize && empty($options['auto_orient'])) { + if ($file_path !== $new_file_path) { + return copy($file_path, $new_file_path); + } + return true; + } + $cmd = $this->options['convert_bin']; + if (!empty($this->options['convert_params'])) { + $cmd .= ' '.$this->options['convert_params']; + } + $cmd .= ' '.escapeshellarg($file_path); + if (!empty($options['auto_orient'])) { + $cmd .= ' -auto-orient'; + } + if ($resize) { + // Handle animated GIFs: + $cmd .= ' -coalesce'; + if (empty($options['crop'])) { + $cmd .= ' -resize '.escapeshellarg($resize.'>'); + } else { + $cmd .= ' -resize '.escapeshellarg($resize.'^'); + $cmd .= ' -gravity center'; + $cmd .= ' -crop '.escapeshellarg($resize.'+0+0'); + } + // Make sure the page dimensions are correct (fixes offsets of animated GIFs): + $cmd .= ' +repage'; + } + if (!empty($options['convert_params'])) { + $cmd .= ' '.$options['convert_params']; + } + $cmd .= ' '.escapeshellarg($new_file_path); + exec($cmd, $output, $error); + if ($error) { + error_log(implode('\n', $output)); + return false; + } + return true; + } + + protected function get_image_size($file_path) { + if ($this->options['image_library']) { + if (extension_loaded('imagick')) { + $image = new \Imagick(); + try { + if (@$image->pingImage($file_path)) { + $dimensions = [$image->getImageWidth(), $image->getImageHeight()]; + $image->destroy(); + return $dimensions; + } + return false; + } catch (\Exception $e) { + error_log($e->getMessage()); + } + } + if ($this->options['image_library'] === 2) { + $cmd = $this->options['identify_bin']; + $cmd .= ' -ping '.escapeshellarg($file_path); + exec($cmd, $output, $error); + if (!$error && !empty($output)) { + // image.jpg JPEG 1920x1080 1920x1080+0+0 8-bit sRGB 465KB 0.000u 0:00.000 + $infos = preg_split('/\s+/', substr($output[0], strlen($file_path))); + $dimensions = preg_split('/x/', $infos[2]); + return $dimensions; + } + return false; + } + } + if (!function_exists('getimagesize')) { + error_log('Function not found: getimagesize'); + return false; + } + return @getimagesize($file_path); + } + + protected function create_scaled_image($file_name, $version, $options) { + try { + if ($this->options['image_library'] === 2) { + return $this->imagemagick_create_scaled_image($file_name, $version, $options); + } + if ($this->options['image_library'] && extension_loaded('imagick')) { + return $this->imagick_create_scaled_image($file_name, $version, $options); + } + return $this->gd_create_scaled_image($file_name, $version, $options); + } catch (\Exception $e) { + error_log($e->getMessage()); + return false; + } + } + + protected function destroy_image_object($file_path) { + if ($this->options['image_library'] && extension_loaded('imagick')) { + return $this->imagick_destroy_image_object($file_path); + } + } + + protected function imagetype($file_path) { + $fp = fopen($file_path, 'r'); + $data = fread($fp, 4); + fclose($fp); + // GIF: 47 49 46 38 + if ($data === 'GIF8') { + return self::IMAGETYPE_GIF; + } + // JPG: FF D8 FF + if (bin2hex(substr($data, 0, 3)) === 'ffd8ff') { + return self::IMAGETYPE_JPEG; + } + // PNG: 89 50 4E 47 + if (bin2hex(@$data[0]).substr($data, 1, 4) === '89PNG') { + return self::IMAGETYPE_PNG; + } + if ($data === 'RIFF') { + return self::IMAGETYPE_WEBP; + } + return false; + } + + protected function is_valid_image_file($file_path) { + if (!preg_match('/\.(gif|jpe?g|png)$/i', $file_path)) { + return false; + } + return !!$this->imagetype($file_path); + } + + protected function handle_image_file($file_path, $file) { + $failed_versions = []; + foreach ($this->options['image_versions'] as $version => $options) { + if ($this->create_scaled_image($file->name, $version, $options)) { + if (!empty($version)) { + $file->{$version.'Url'} = $this->get_download_url( + $file->name, + $version + ); + } else { + $file->size = $this->get_file_size($file_path, true); + } + } else { + $failed_versions[] = $version ?: 'original'; + } + } + if (count($failed_versions)) { + $file->error = $this->get_error_message('image_resize') + .' ('.implode(', ', $failed_versions).')'; + } + // Free memory: + $this->destroy_image_object($file_path); + } + + protected function handle_file_upload($uploaded_file, $name, $size, $type, $error, + $index = null, $content_range = null) { + $file = new \stdClass(); + $file->name = $this->get_file_name($uploaded_file, $name, $size, $type, $error, + $index, $content_range); + $file->size = $this->fix_integer_overflow((int)$size); + $file->type = $type; + if ($this->validate($uploaded_file, $file, $error, $index)) { + $this->handle_form_data($file, $index); + $upload_dir = $this->get_upload_path(); + if (!is_dir($upload_dir)) { + mkdir($upload_dir, $this->options['mkdir_mode'], true); + } + $file_path = $this->get_upload_path($file->name); + $append_file = $content_range && is_file($file_path) && + $file->size > $this->get_file_size($file_path); + if ($uploaded_file && is_uploaded_file($uploaded_file)) { + // multipart/formdata uploads (POST method uploads) + if ($append_file) { + file_put_contents( + $file_path, + fopen($uploaded_file, 'r'), + FILE_APPEND + ); + } else { + move_uploaded_file($uploaded_file, $file_path); + } + } else { + // Non-multipart uploads (PUT method support) + file_put_contents( + $file_path, + fopen($this->options['input_stream'], 'r'), + $append_file ? FILE_APPEND : 0 + ); + } + $file_size = $this->get_file_size($file_path, $append_file); + if ($file_size === $file->size) { + $file->url = $this->get_download_url($file->name); + if ($this->is_valid_image_file($file_path)) { + $this->handle_image_file($file_path, $file); + } + } else { + $file->size = $file_size; + if (!$content_range && $this->options['discard_aborted_uploads']) { + unlink($file_path); + $file->error = $this->get_error_message('abort'); + } + } + $this->set_additional_file_properties($file); + } + return $file; + } + + protected function readfile($file_path) { + $file_size = $this->get_file_size($file_path); + $chunk_size = $this->options['readfile_chunk_size']; + if ($chunk_size && $file_size > $chunk_size) { + $handle = fopen($file_path, 'rb'); + while (!feof($handle)) { + echo fread($handle, $chunk_size); + @ob_flush(); + @flush(); + } + fclose($handle); + return $file_size; + } + return readfile($file_path); + } + + protected function body($str) { + echo $str; + } + + protected function header($str) { + header($str); + } + + protected function get_upload_data($id) { + return @$_FILES[$id]; + } + + protected function get_post_param($id) { + return @$_POST[$id]; + } + + protected function get_query_param($id) { + if (isset($_GET[$id])) { + return @$_GET[$id]; + } + + return false; + } + + protected function get_server_var($id) { + if (isset($_SERVER[$id])) { + return @$_SERVER[$id]; + } + + return false; + } + + protected function handle_form_data($file, $index) { + // Handle form data, e.g. $_POST['description'][$index] + } + + protected function get_version_param() { + return $this->basename(stripslashes($this->get_query_param('version'))); + } + + protected function get_singular_param_name() { + return substr($this->options['param_name'], 0, -1); + } + + protected function get_file_name_param() { + $name = $this->get_singular_param_name(); + return $this->basename(stripslashes($this->get_query_param($name))); + } + + protected function get_file_names_params() { + $params = $this->get_query_param($this->options['param_name']); + if (!$params) { + return null; + } + foreach ($params as $key => $value) { + $params[$key] = $this->basename(stripslashes($value)); + } + return $params; + } + + protected function get_file_type($file_path) { + switch (strtolower(pathinfo($file_path, PATHINFO_EXTENSION))) { + case 'jpeg': + case 'jpg': + return 'image/jpeg'; + case 'png': + return 'image/png'; + case 'gif': + return 'image/gif'; + default: + return ''; + } + } + + protected function download() { + switch ($this->options['download_via_php']) { + case 1: + $redirect_header = null; + break; + case 2: + $redirect_header = 'X-Sendfile'; + break; + case 3: + $redirect_header = 'X-Accel-Redirect'; + break; + default: + return $this->header('HTTP/1.1 403 Forbidden'); + } + $file_name = $this->get_file_name_param(); + if (!$this->is_valid_file_object($file_name)) { + return $this->header('HTTP/1.1 404 Not Found'); + } + if ($redirect_header) { + return $this->header( + $redirect_header.': '.$this->get_download_url( + $file_name, + $this->get_version_param(), + true + ) + ); + } + $file_path = $this->get_upload_path($file_name, $this->get_version_param()); + // Prevent browsers from MIME-sniffing the content-type: + $this->header('X-Content-Type-Options: nosniff'); + if (!preg_match($this->options['inline_file_types'], $file_name)) { + $this->header('Content-Type: application/octet-stream'); + $this->header('Content-Disposition: attachment; filename="'.$file_name.'"'); + } else { + $this->header('Content-Type: '.$this->get_file_type($file_path)); + $this->header('Content-Disposition: inline; filename="'.$file_name.'"'); + } + $this->header('Content-Length: '.$this->get_file_size($file_path)); + $this->header('Last-Modified: '.gmdate('D, d M Y H:i:s T', filemtime($file_path))); + $this->readfile($file_path); + } + + protected function send_content_type_header() { + $this->header('Vary: Accept'); + if (strpos($this->get_server_var('HTTP_ACCEPT'), 'application/json') !== false) { + $this->header('Content-type: application/json'); + } else { + $this->header('Content-type: text/plain'); + } + } + + protected function send_access_control_headers() { + $this->header('Access-Control-Allow-Origin: '.$this->options['access_control_allow_origin']); + $this->header('Access-Control-Allow-Credentials: ' + .($this->options['access_control_allow_credentials'] ? 'true' : 'false')); + $this->header('Access-Control-Allow-Methods: ' + .implode(', ', $this->options['access_control_allow_methods'])); + $this->header('Access-Control-Allow-Headers: ' + .implode(', ', $this->options['access_control_allow_headers'])); + } + + public function generate_response($content, $print_response = true) { + $this->response = $content; + if ($print_response) { + $json = json_encode($content); + $redirect = stripslashes($this->get_post_param('redirect')); + if ($redirect && preg_match($this->options['redirect_allow_target'], $redirect)) { + $this->header('Location: '.sprintf($redirect, rawurlencode($json))); + return; + } + $this->head(); + if ($this->get_server_var('HTTP_CONTENT_RANGE')) { + $files = $content[$this->options['param_name']] ?? null; + if ($files && is_array($files) && is_object($files[0]) && $files[0]->size) { + $this->header('Range: 0-'.( + $this->fix_integer_overflow((int)$files[0]->size) - 1 + )); + } + } + $this->body($json); + } + return $content; + } + + public function get_response () { + return $this->response; + } + + public function head() { + $this->header('Pragma: no-cache'); + $this->header('Cache-Control: no-store, no-cache, must-revalidate'); + $this->header('Content-Disposition: inline; filename="files.json"'); + // Prevent Internet Explorer from MIME-sniffing the content-type: + $this->header('X-Content-Type-Options: nosniff'); + if ($this->options['access_control_allow_origin']) { + $this->send_access_control_headers(); + } + $this->send_content_type_header(); + } + + public function get($print_response = true) { + if ($print_response && $this->get_query_param('download')) { + return $this->download(); + } + $file_name = $this->get_file_name_param(); + if ($file_name) { + $response = [ + $this->get_singular_param_name() => $this->get_file_object($file_name) + ]; + } else { + $response = [ + $this->options['param_name'] => $this->get_file_objects() + ]; + } + return $this->generate_response($response, $print_response); + } + + public function post($print_response = true) { + if ($this->get_query_param('_method') === 'DELETE') { + return $this->delete($print_response); + } + $upload = $this->get_upload_data($this->options['param_name']); + // Parse the Content-Disposition header, if available: + $content_disposition_header = $this->get_server_var('HTTP_CONTENT_DISPOSITION'); + $file_name = $content_disposition_header ? + rawurldecode(preg_replace( + '/(^[^"]+")|("$)/', + '', + $content_disposition_header + )) : null; + // Parse the Content-Range header, which has the following form: + // Content-Range: bytes 0-524287/2000000 + $content_range_header = $this->get_server_var('HTTP_CONTENT_RANGE'); + $content_range = $content_range_header ? + preg_split('/[^0-9]+/', $content_range_header) : null; + $size = $content_range ? $content_range[3] : null; + $files = []; + if ($upload) { + if (is_array($upload['tmp_name'])) { + // param_name is an array identifier like "files[]", + // $upload is a multi-dimensional array: + foreach ($upload['tmp_name'] as $index => $value) { + $files[] = $this->handle_file_upload( + $upload['tmp_name'][$index], + $file_name ?: $upload['name'][$index], + $size ?: $upload['size'][$index], + $upload['type'][$index], + isset($upload['error']) ? $upload['error'][$index] : null, + $index, + $content_range + ); + } + } else { + // param_name is a single object identifier like "file", + // $upload is a one-dimensional array: + $files[] = $this->handle_file_upload( + $upload['tmp_name'] ?? null, + $file_name ?: ($upload['name'] ?? null), + $size ?: ($upload['size'] ?? $this->get_server_var('CONTENT_LENGTH')), + $upload['type'] ?? $this->get_server_var('CONTENT_TYPE'), + $upload['error'] ?? null, + null, + $content_range + ); + } + } + $response = [$this->options['param_name'] => $files]; + $name = $file_name ?: $upload['name'][0]; + $res = $this->generate_response($response, $print_response); + if(is_file($this->get_upload_path($name))){ + $uploaded_bytes =!empty($content_range[1]) ? $this->fix_integer_overflow((int)$content_range[1]) : 0; + $totalSize = $this->get_file_size($this->get_upload_path($name)); + if ($totalSize - $uploaded_bytes - $this->options['readfile_chunk_size'] < 0) { + $this->onUploadEnd($res); + }else{ + $this->head(); + $this->body(json_encode($res)); + } + }else{ + $this->head(); + $this->body(json_encode($res)); + } + return $res; + } + + public function onUploadEnd ($res){ + $targetPath = $this->options['storeFolder']; + $targetPathThumb = $this->options['storeFolderThumb']; + + if(!$this->options['ftp']){ + $targetFile = $targetPath. $res['files'][0]->name; + $targetFileThumb = $targetPathThumb. $res['files'][0]->name; + if (!is_dir($targetPathThumb)) { + mkdir($targetPathThumb, $this->options['mkdir_mode'], true); + } + if(is_function_callable('chmod')){ + if(is_file($targetFile)) { + chmod($targetFile, $this->options['config']['filePermission']); + }elseif(is_dir($targetFile)){ + chmod($targetFile, $this->options['config']['folderPermission']); + } + } + }else{ + $targetFile = $this->options['config']['ftp_temp_folder'].$res['files'][0]->name; + $targetFileThumb = $this->options['config']['ftp_temp_folder']."thumbs/". $res['files'][0]->name; + } + + //check if image (and supported) + $is_img = FALSE; + if ($this->is_valid_image_file($targetFile)){ + $is_img = TRUE; + } + + if ($is_img) + { + if(isset($this->options['config']['image_watermark']) && $this->options['config']['image_watermark']){ + require_once('include/php_image_magician.php'); + + $magicianObj = new imageLib($targetFile); + $magicianObj -> addWatermark($this->options['config']['image_watermark'], $this->options['config']['image_watermark_position'], $this->options['config']['image_watermark_padding']); + + $magicianObj -> saveImage($targetFile); + } + + + + $thumbResult = create_img($targetFile, $targetFileThumb, 122, 91); + + if ( $thumbResult!==true) + { + if($thumbResult === false){ + $res['files'][0]->error = trans("Not enough Memory"); + }else{ + $res['files'][0]->error = $thumbResult; + } + } + else + { + if( !$this->options['ftp'] && ! new_thumbnails_creation($targetPath,$targetFile,$_FILES['files']['name'][0],$this->options['config']['current_path'],$this->options['config'])) + { + $res['files'][0]->error = trans("Not enough Memory"); + } + else + { + $imginfo = getimagesize($targetFile); + $srcWidth = $imginfo[0]; + $srcHeight = $imginfo[1]; + + // resize images if set + if ($this->options['config']['image_resizing']) + { + if ($this->options['config']['image_resizing_width'] == 0) // if width not set + { + if ($this->options['config']['image_resizing_height'] == 0) + { + $this->options['config']['image_resizing_width'] = $srcWidth; + $this->options['config']['image_resizing_height'] = $srcHeight; + } + else + { + $this->options['config']['image_resizing_width'] = $this->options['config']['image_resizing_height']*$srcWidth/$srcHeight; + } + } + elseif ($this->options['config']['image_resizing_height'] == 0) // if height not set + { + $this->options['config']['image_resizing_height'] = $this->options['config']['image_resizing_width']*$srcHeight/$srcWidth; + } + + // new dims and create + $srcWidth = $this->options['config']['image_resizing_width']; + $srcHeight = $this->options['config']['image_resizing_height']; + create_img($targetFile, $targetFile, $this->options['config']['image_resizing_width'], $this->options['config']['image_resizing_height'], $this->options['config']['image_resizing_mode']); + } + + //max resizing limit control + $resize = FALSE; + if ($this->options['config']['image_max_width'] != 0 && $srcWidth > $this->options['config']['image_max_width'] && $this->options['config']['image_resizing_override'] === FALSE) + { + $resize = TRUE; + $srcWidth = $this->options['config']['image_max_width']; + + if ($this->options['config']['image_max_height'] == 0) $srcHeight = $this->options['config']['image_max_width']*$srcHeight/$srcWidth; + } + + if ($this->options['config']['image_max_height'] != 0 && $srcHeight > $this->options['config']['image_max_height'] && $this->options['config']['image_resizing_override'] === FALSE){ + $resize = TRUE; + $srcHeight = $this->options['config']['image_max_height']; + + if ($this->options['config']['image_max_width'] == 0) $srcWidth = $this->options['config']['image_max_height']*$srcWidth/$srcHeight; + } + + if ($resize){ create_img($targetFile, $targetFile, $srcWidth, $srcHeight, $this->options['config']['image_max_mode']); } + } + } + } + + if($this->options['ftp']){ + + $this->options['ftp']->put($targetPath. $res['files'][0]->name, $targetFile, FTP_BINARY); + unlink($targetFile); + if ($is_img) + { + $this->options['ftp']->put($targetPathThumb. $res['files'][0]->name, $targetFileThumb, FTP_BINARY); + unlink($targetFileThumb); + } + } + $this->head(); + $this->body(json_encode($res)); + } + + public function delete($print_response = true) { + $file_names = $this->get_file_names_params(); + if (empty($file_names)) { + $file_names = [$this->get_file_name_param()]; + } + $response = []; + foreach ($file_names as $file_name) { + $file_path = $this->get_upload_path($file_name); + $success = is_file($file_path) && $file_name[0] !== '.' && unlink($file_path); + if ($success) { + foreach ($this->options['image_versions'] as $version => $options) { + if (!empty($version)) { + $file = $this->get_upload_path($file_name, $version); + if (is_file($file)) { + unlink($file); + } + } + } + } + $response[$file_name] = $success; + } + return $this->generate_response($response, $print_response); + } + + protected function basename($filepath, $suffix = '') { + $splited = preg_split('/\//', rtrim ($filepath, '/ ')); + return substr(basename('X'.$splited[count($splited)-1], $suffix), 1); + } +} diff --git a/libraries/filemanager-9.14.2/ajax_calls.php b/libraries/filemanager-9.14.2/ajax_calls.php new file mode 100644 index 0000000..c7aa17b --- /dev/null +++ b/libraries/filemanager-9.14.2/ajax_calls.php @@ -0,0 +1,680 @@ +send(); + exit; +} +$languages = include 'lang/languages.php'; + +if (isset($_SESSION['RF']['language']) && file_exists('lang/' . basename($_SESSION['RF']['language']) . '.php')) { + if (array_key_exists($_SESSION['RF']['language'], $languages)) { + include 'lang/' . basename($_SESSION['RF']['language']) . '.php'; + } else { + response(trans('Lang_Not_Found').AddErrorLocation())->send(); + exit; + } +} else { + response(trans('Lang_Not_Found').AddErrorLocation())->send(); + exit; +} + + +//check $_GET['file'] +if (isset($_GET['file']) && !checkRelativePath($_GET['file'])) { + response(trans('wrong path').AddErrorLocation())->send(); + exit; +} + +//check $_POST['file'] +if(isset($_POST['path']) && !checkRelativePath($_POST['path'])) { + response(trans('wrong path').AddErrorLocation())->send(); + exit; +} + + +$ftp = ftp_con($config); + +if (isset($_GET['action'])) { + switch ($_GET['action']) { + case 'new_file_form': + echo trans('Filename') . ':

'; + break; + + case 'view': + if (isset($_GET['type'])) { + $_SESSION['RF']["view_type"] = $_GET['type']; + } else { + response(trans('view type number missing').AddErrorLocation())->send(); + exit; + } + break; + + case 'filter': + if (isset($_GET['type'])) { + if (isset($config['remember_text_filter']) && $config['remember_text_filter']) { + $_SESSION['RF']["filter"] = $_GET['type']; + } + } else { + response(trans('view type number missing').AddErrorLocation())->send(); + exit; + } + break; + + case 'sort': + if (isset($_GET['sort_by'])) { + $_SESSION['RF']["sort_by"] = $_GET['sort_by']; + } + + if (isset($_GET['descending'])) + { + $_SESSION['RF']["descending"] = $_GET['descending']; + } + break; + case 'save_img': + $info = pathinfo($_POST['name']); + $image_data = $_POST['url']; + $ext = strtolower($info['extension']); + + if (preg_match('/^data:image\/(\w+);base64,/', $image_data, $type)) { + $image_data = substr($image_data, strpos($image_data, ',') + 1); + $type = strtolower($type[1]); // jpg, png, gif + + // Images get some additional checks + if (!in_array($type, array('gif', 'jpg', 'jpeg', 'jpe', 'png', 'webp'), TRUE)) + { + response('File type not allowed')->send(); + exit; + } + + if (!in_array($ext, array('gif', 'jpg', 'jpeg', 'jpe', 'png', 'webp'), TRUE)) + { + response('Extension not allowed')->send(); + exit; + } + + $image_data = base64_decode($image_data); + + if ($image_data === false) { + response(trans('TUI_Decode_Failed').AddErrorLocation())->send(); + exit; + } + } else { + response(trans('').AddErrorLocation())->send(); + exit; + } + + if ($image_data === false) { + response(trans('').AddErrorLocation())->send(); + exit; + } + + if (!checkresultingsize(strlen($image_data))) { + response(sprintf(trans('max_size_reached'), $config['MaxSizeTotal']).AddErrorLocation())->send(); + exit; + } + if ($ftp) { + $temp = tempnam('/tmp', 'RF'); + unlink($temp); + $temp .=".".substr(strrchr($_POST['url'], '.'), 1); + file_put_contents($temp, $image_data); + + // remove file if not image + if (@getimagesize($temp) === FALSE) { + unlink($temp); + exit; + } + + $ftp->put($config['ftp_base_folder'].$config['upload_dir'] . $_POST['path'] . $_POST['name'], $temp, FTP_BINARY); + + create_img($temp, $temp, 122, 91); + $ftp->put($config['ftp_base_folder'].$config['ftp_thumbs_dir']. $_POST['path'] . $_POST['name'], $temp, FTP_BINARY); + + unlink($temp); + } else { + $pathFileName = $config['current_path'] . $_POST['path'] . $_POST['name']; + file_put_contents($pathFileName, $image_data); + + // remove file if not image + if (@getimagesize($pathFileName) === FALSE) { + unlink($pathFileName); + exit; + } + create_img($pathFileName, $config['thumbs_base_path'].$_POST['path'].$_POST['name'], 122, 91); + // TODO something with this function cause its blowing my mind + new_thumbnails_creation( + $config['current_path'].$_POST['path'], + $config['current_path'].$_POST['path'].$_POST['name'], + $_POST['name'], + $config['current_path'], + $config + ); + } + break; + + case 'extract': + if (!$config['extract_files']) { + response(trans('wrong action').AddErrorLocation())->send(); + } + if ($ftp) { + $path = $config['ftp_base_url'].$config['upload_dir'] . $_POST['path']; + $base_folder = $config['ftp_base_url'].$config['upload_dir'] . fix_dirname($_POST['path']) . "/"; + } else { + $path = $config['current_path'] . $_POST['path']; + $base_folder = $config['current_path'] . fix_dirname($_POST['path']) . "/"; + } + + $info = pathinfo($path); + + if ($ftp) { + $tempDir = tempdir(); + $temp = tempnam($tempDir, 'RF'); + unlink($temp); + $temp .= "." . $info['extension']; + $handle = fopen($temp, "w"); + fwrite($handle, file_get_contents($path)); + fclose($handle); + $path = $temp; + $base_folder = $tempDir . "/"; + } + + $info = pathinfo($path); + + switch ($info['extension']) { + case "zip": + $zip = new ZipArchive; + if ($zip->open($path) === true) { + //get total size + $sizeTotalFinal = 0; + for ($i = 0; $i < $zip->numFiles; $i++) { + $aStat = $zip->statIndex($i); + $sizeTotalFinal += $aStat['size']; + } + if (!checkresultingsize($sizeTotalFinal)) { + response(sprintf(trans('max_size_reached'), $config['MaxSizeTotal']).AddErrorLocation())->send(); + exit; + } + + //make all the folders and unzip into the folders + for ($i = 0; $i < $zip->numFiles; $i++) { + $FullFileName = $zip->statIndex($i); + + if (checkRelativePath($FullFileName['name'])) { + if (substr($FullFileName['name'], -1, 1) == "/") { + create_folder($base_folder . $FullFileName['name']); + } + + if (! (substr($FullFileName['name'], -1, 1) == "/")) { + $fileinfo = pathinfo($FullFileName['name']); + if (in_array(strtolower($fileinfo['extension']), $config['ext'])) { + copy('zip://' . $path . '#' . $FullFileName['name'], $base_folder . $FullFileName['name']); + } + } + } + } + $zip->close(); + } else { + response(trans('Zip_No_Extract').AddErrorLocation())->send(); + exit; + } + + break; + + case "gz": + // No resulting size pre-control available + $p = new PharData($path); + $p->decompress(); // creates files.tar + break; + + case "tar": + // No resulting size pre-control available + // unarchive from the tar + $phar = new PharData($path); + $phar->decompressFiles(); + $files = []; + check_files_extensions_on_phar($phar, $files, '', $config); + $phar->extractTo($base_folder, $files, true); + break; + + default: + response(trans('Zip_Invalid').AddErrorLocation())->send(); + exit; + } + + if ($ftp) { + unlink($path); + $ftp->putAll($base_folder, "/".$config['ftp_base_folder'] . $config['upload_dir'] . fix_dirname($_POST['path']), FTP_BINARY); + deleteDir($base_folder); + } + + + break; + case 'media_preview': + if(isset($_GET['file'])){ + $_GET['file'] = sanitize($_GET['file']); + } + if(isset($_GET['title'])){ + $_GET['title'] = sanitize($_GET['title']); + } + if($ftp){ + $preview_file = $config['ftp_base_url'].$config['upload_dir'] . $_GET['file']; + }else{ + $preview_file = $config['current_path'] . $_GET["file"]; + } + $info = pathinfo($preview_file); + ob_start(); + ?> +
+ +
+ + + + + + + + + send(); + exit; + + break; + case 'copy_cut': + if ($_POST['sub_action'] != 'copy' && $_POST['sub_action'] != 'cut') { + response(trans('wrong sub-action').AddErrorLocation())->send(); + exit; + } + + if (trim($_POST['path']) == '') { + response(trans('no path').AddErrorLocation())->send(); + exit; + } + + $msg_sub_action = ($_POST['sub_action'] == 'copy' ? trans('Copy') : trans('Cut')); + $path = $config['current_path'] . $_POST['path']; + + if (is_dir($path)) { + // can't copy/cut dirs + if ($config['copy_cut_dirs'] === false) { + response(sprintf(trans('Copy_Cut_Not_Allowed'), $msg_sub_action, trans('Folders')).AddErrorLocation())->send(); + exit; + } + + list($sizeFolderToCopy, $fileNum, $foldersCount) = folder_info($path, false); + // size over limit + if ($config['copy_cut_max_size'] !== false && is_int($config['copy_cut_max_size'])) { + if (($config['copy_cut_max_size'] * 1024 * 1024) < $sizeFolderToCopy) { + response(sprintf(trans('Copy_Cut_Size_Limit'), $msg_sub_action, $config['copy_cut_max_size']).AddErrorLocation())->send(); + exit; + } + } + + // file count over limit + if ($config['copy_cut_max_count'] !== false && is_int($config['copy_cut_max_count'])) { + if ($config['copy_cut_max_count'] < $fileNum) { + response(sprintf(trans('Copy_Cut_Count_Limit'), $msg_sub_action, $config['copy_cut_max_count']).AddErrorLocation())->send(); + exit; + } + } + + if (!checkresultingsize($sizeFolderToCopy)) { + response(sprintf(trans('max_size_reached'), $config['MaxSizeTotal']).AddErrorLocation())->send(); + exit; + } + } else { + // can't copy/cut files + if ($config['copy_cut_files'] === false) { + response(sprintf(trans('Copy_Cut_Not_Allowed'), $msg_sub_action, trans('Files')).AddErrorLocation())->send(); + exit; + } + } + + $_SESSION['RF']['clipboard']['path'] = $_POST['path']; + $_SESSION['RF']['clipboard_action'] = $_POST['sub_action']; + break; + case 'clear_clipboard': + $_SESSION['RF']['clipboard'] = null; + $_SESSION['RF']['clipboard_action'] = null; + break; + case 'chmod': + if ($ftp) { + $path = $config['ftp_base_url'] . $config['upload_dir'] . $_POST['path']; + if ( + ($_POST['folder']==1 && $config['chmod_dirs'] === false) + || ($_POST['folder']==0 && $config['chmod_files'] === false) + || (is_function_callable("chmod") === false)) { + response(sprintf(trans('File_Permission_Not_Allowed'), (is_dir($path) ? trans('Folders') : trans('Files')), 403).AddErrorLocation())->send(); + exit; + } + $info = $_POST['permissions']; + } else { + $path = $config['current_path'] . $_POST['path']; + if ( + (is_dir($path) && $config['chmod_dirs'] === false) + || (is_file($path) && $config['chmod_files'] === false) + || (is_function_callable("chmod") === false)) { + response(sprintf(trans('File_Permission_Not_Allowed'), (is_dir($path) ? trans('Folders') : trans('Files')), 403).AddErrorLocation())->send(); + exit; + } + + $perms = fileperms($path) & 0777; + + $info = '-'; + + // Owner + $info .= (($perms & 0x0100) ? 'r' : '-'); + $info .= (($perms & 0x0080) ? 'w' : '-'); + $info .= (($perms & 0x0040) ? + (($perms & 0x0800) ? 's' : 'x') : + (($perms & 0x0800) ? 'S' : '-')); + + // Group + $info .= (($perms & 0x0020) ? 'r' : '-'); + $info .= (($perms & 0x0010) ? 'w' : '-'); + $info .= (($perms & 0x0008) ? + (($perms & 0x0400) ? 's' : 'x') : + (($perms & 0x0400) ? 'S' : '-')); + + // World + $info .= (($perms & 0x0004) ? 'r' : '-'); + $info .= (($perms & 0x0002) ? 'w' : '-'); + $info .= (($perms & 0x0001) ? + (($perms & 0x0200) ? 't' : 'x') : + (($perms & 0x0200) ? 'T' : '-')); + } + + + $ret = '
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
r  w  x  
'.trans('User').'
'.trans('Group').'
'.trans('All').'
'; + + if ((!$ftp && is_dir($path))) { + $ret .= '
'.trans('File_Permission_Recursive').'

+
    +
  • +
  • +
  • +
  • +
+
'; + } + + $ret .= '
'; + + response($ret)->send(); + exit; + + break; + case 'get_lang': + if (! file_exists('lang/languages.php')) { + response(trans('Lang_Not_Found').AddErrorLocation())->send(); + exit; + } + + $languages = include 'lang/languages.php'; + if (! isset($languages) || ! is_array($languages)) { + response(trans('Lang_Not_Found').AddErrorLocation())->send(); + exit; + } + + $curr = $_SESSION['RF']['language']; + + $ret = ''; + + response($ret)->send(); + exit; + + break; + case 'change_lang': + $choosen_lang = (!empty($_POST['choosen_lang']))? $_POST['choosen_lang']:"en_EN"; + + if (array_key_exists($choosen_lang, $languages)) { + if (! file_exists('lang/' . $choosen_lang . '.php')) { + response(trans('Lang_Not_Found').AddErrorLocation())->send(); + exit; + } else { + $_SESSION['RF']['language'] = $choosen_lang; + } + } + + break; + case 'cad_preview': + if ($ftp) { + $selected_file = $config['ftp_base_url'].$config['upload_dir'] . $_GET['file']; + } else { + $selected_file = $config['current_path'] . $_GET['file']; + + if (! file_exists($selected_file)) { + response(trans('File_Not_Found').AddErrorLocation())->send(); + exit; + } + } + if ($ftp) { + $url_file = $selected_file; + } else { + $url_file = $config['base_url'] . $config['upload_dir'] . str_replace($config['current_path'], '', $_GET["file"]); + } + + $cad_url = urlencode($url_file); + $cad_html = ""; + $ret = $cad_html; + response($ret)->send(); + break; + case 'get_file': // preview or edit + $sub_action = $_GET['sub_action']; + $preview_mode = $_GET["preview_mode"]; + + if ($sub_action != 'preview' && $sub_action != 'edit') { + response(trans('wrong action').AddErrorLocation())->send(); + exit; + } + + if ($ftp) { + $selected_file = ($sub_action == 'preview' ? $config['ftp_base_url'].$config['upload_dir'] . $_GET['file'] : $config['ftp_base_url'].$config['upload_dir'] . $_POST['path']); + } else { + $selected_file = ($sub_action == 'preview' ? $config['current_path'] . $_GET['file'] : $config['current_path'] . $_POST['path']); + + if (! file_exists($selected_file)) { + response(trans('File_Not_Found').AddErrorLocation())->send(); + exit; + } + } + + $info = pathinfo($selected_file); + + if ($preview_mode == 'text') { + $is_allowed = ($sub_action == 'preview' ? $config['preview_text_files'] : $config['edit_text_files']); + $allowed_file_exts = ($sub_action == 'preview' ? $config['previewable_text_file_exts'] : $config['editable_text_file_exts']); + } elseif ($preview_mode == 'google') { + $is_allowed = $config['googledoc_enabled']; + $allowed_file_exts = $config['googledoc_file_exts']; + } + + if (! isset($allowed_file_exts) || ! is_array($allowed_file_exts)) { + $allowed_file_exts = []; + } + + if (!isset($info['extension'])) { + $info['extension']=''; + } + if (! in_array($info['extension'], $allowed_file_exts) + || ! isset($is_allowed) + || $is_allowed === false + || (!$ftp && ! is_readable($selected_file)) + ) { + response(sprintf(trans('File_Open_Edit_Not_Allowed'), ($sub_action == 'preview' ? strtolower(trans('Open')) : strtolower(trans('Edit')))).AddErrorLocation())->send(); + exit; + } + if ($sub_action == 'preview') { + if ($preview_mode == 'text') { + // get and sanities + $data = file_get_contents($selected_file); + $data = htmlspecialchars(htmlspecialchars_decode($data)); + $ret = ''; + + $ret .= ''; + $ret .= '
'.$data.'
'; + } elseif ($preview_mode == 'google') { + if ($ftp) { + $url_file = $selected_file; + } else { + $url_file = $config['base_url'] . $config['upload_dir'] . str_replace($config['current_path'], '', $_GET["file"]); + } + + $googledoc_url = urlencode($url_file); + $ret = ""; + } + }else{ + $data = stripslashes(htmlspecialchars(file_get_contents($selected_file))); + if(in_array($info['extension'], ['html','html'])){ + $ret = ''; + }else{ + $ret = ''; + } + + } + + response($ret)->send(); + exit; + + break; + default: + response(trans('no action passed').AddErrorLocation())->send(); + exit; + } +} else { + response(trans('no action passed').AddErrorLocation())->send(); + exit; +} diff --git a/libraries/filemanager-9.14.2/config/.htaccess b/libraries/filemanager-9.14.2/config/.htaccess new file mode 100644 index 0000000..14249c5 --- /dev/null +++ b/libraries/filemanager-9.14.2/config/.htaccess @@ -0,0 +1 @@ +Deny from all \ No newline at end of file diff --git a/libraries/filemanager-9.14.2/config/config.php b/libraries/filemanager-9.14.2/config/config.php new file mode 100644 index 0000000..96d638a --- /dev/null +++ b/libraries/filemanager-9.14.2/config/config.php @@ -0,0 +1,618 @@ + +| in tinymce a new parameter added: filemanager_access_key:"myPrivateKey" +| example tinymce config: +| +| tiny init ... +| external_filemanager_path:"../filemanager/", +| filemanager_title:"Filemanager" , +| filemanager_access_key:"myPrivateKey" , +| ... +| +*/ + +define('USE_ACCESS_KEYS', false); // TRUE or FALSE + +/* +|-------------------------------------------------------------------------- +| DON'T COPY THIS VARIABLES IN FOLDERS config.php FILES +|-------------------------------------------------------------------------- +*/ + +define('DEBUG_ERROR_MESSAGE', false); // TRUE or FALSE + +/* +|-------------------------------------------------------------------------- +| Path configuration +|-------------------------------------------------------------------------- +| In this configuration the folder tree is +| root +| |- source <- upload folder +| |- thumbs <- thumbnail folder [must have write permission (755)] +| |- filemanager +| |- js +| | |- tinymce +| | | |- plugins +| | | | |- responsivefilemanager +| | | | | |- plugin.min.js +*/ + +$config = [ + + /* + |-------------------------------------------------------------------------- + | DON'T TOUCH (base url (only domain) of site). + |-------------------------------------------------------------------------- + | + | without final / (DON'T TOUCH) + | + */ + 'base_url' => ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == "on") ? "https" : "http"). "://". @$_SERVER['HTTP_HOST'], + /* + |-------------------------------------------------------------------------- + | path from base_url to base of upload folder + |-------------------------------------------------------------------------- + | + | with start and final / + | + */ + 'upload_dir' => '/upload/filemanager/', + /* + |-------------------------------------------------------------------------- + | relative path from filemanager folder to upload folder + |-------------------------------------------------------------------------- + | + | with final / + | + */ + 'current_path' => '../../upload/filemanager/', + + /* + |-------------------------------------------------------------------------- + | relative path from filemanager folder to thumbs folder + |-------------------------------------------------------------------------- + | + | with final / + | DO NOT put inside upload folder + | + */ + 'thumbs_base_path' => '../../temp/', + + /* + |-------------------------------------------------------------------------- + | path from base_url to base of thumbs folder + |-------------------------------------------------------------------------- + | + | with final / + | DO NOT put inside upload folder + | + */ + 'thumbs_upload_dir' => '/thumbs/', + + + /* + |-------------------------------------------------------------------------- + | mime file control to define files extensions + |-------------------------------------------------------------------------- + | + | If you want to be forced to assign the extension starting from the mime type + | + */ + 'mime_extension_rename' => true, + + + /* + |-------------------------------------------------------------------------- + | FTP configuration BETA VERSION + |-------------------------------------------------------------------------- + | + | If you want enable ftp use write these parametres otherwise leave empty + | Remember to set base_url properly to point in the ftp server domain and + | upload dir will be ftp_base_folder + upload_dir so without final / + | + */ + 'ftp_host' => false, //put the FTP host + 'ftp_user' => "user", + 'ftp_pass' => "pass", + 'ftp_base_folder' => "base_folder", + 'ftp_base_url' => "http://site to ftp root", + // Directory where place files before to send to FTP with final / + 'ftp_temp_folder' => "../temp/", + /* + |--------------------------------------------------------------------------- + | path from ftp_base_folder to base of thumbs folder with start and final / + |--------------------------------------------------------------------------- + */ + 'ftp_thumbs_dir' => '/thumbs/', + 'ftp_ssl' => false, + 'ftp_port' => 21, + + /* EXAMPLE + 'ftp_host' => "host.com", + 'ftp_user' => "test@host.com", + 'ftp_pass' => "pass.1", + 'ftp_base_folder' => "", + 'ftp_base_url' => "http://host.com/testFTP", + */ + + /* + |-------------------------------------------------------------------------- + | Multiple files selection + |-------------------------------------------------------------------------- + | The user can delete multiple files, select all files , deselect all files + */ + 'multiple_selection' => true, + + /* + | + | The user can have a select button that pass a json to external input or pass the first file selected to editor + | If you use responsivefilemanager tinymce extension can copy into editor multiple object like images, videos, audios, links in the same time + | + */ + 'multiple_selection_action_button' => true, + + /* + |-------------------------------------------------------------------------- + | Access keys + |-------------------------------------------------------------------------- + | + | add access keys eg: array('myPrivateKey', 'someoneElseKey'); + | keys should only containt (a-z A-Z 0-9 \ . _ -) characters + | if you are integrating lets say to a cms for admins, i recommend making keys randomized something like this: + | $username = 'Admin'; + | $salt = 'dsflFWR9u2xQa' (a hard coded string) + | $akey = md5($username.$salt); + | DO NOT use 'key' as access key! + | Keys are CASE SENSITIVE! + | + */ + + 'access_keys' => [], + + //-------------------------------------------------------------------------------------------------------- + // YOU CAN COPY AND CHANGE THESE VARIABLES INTO FOLDERS config.php FILES TO CUSTOMIZE EACH FOLDER OPTIONS + //-------------------------------------------------------------------------------------------------------- + + /* + |-------------------------------------------------------------------------- + | Maximum size of all files in source folder + |-------------------------------------------------------------------------- + | + | in Megabytes + | + */ + 'MaxSizeTotal' => false, + + /* + |-------------------------------------------------------------------------- + | Maximum upload size + |-------------------------------------------------------------------------- + | + | in Megabytes + | + */ + 'MaxSizeUpload' => 10, + + /* + |-------------------------------------------------------------------------- + | File and Folder permission + |-------------------------------------------------------------------------- + | + */ + 'filePermission' => 0755, + 'folderPermission' => 0777, + + + /* + |-------------------------------------------------------------------------- + | default language file name + |-------------------------------------------------------------------------- + */ + 'default_language' => "en_EN", + + /* + |-------------------------------------------------------------------------- + | Icon theme + |-------------------------------------------------------------------------- + | + | Default available: ico and ico_dark + | Can be set to custom icon inside filemanager/img + | + */ + 'icon_theme' => "ico", + + + //Show or not total size in filemanager (is possible to greatly increase the calculations) + 'show_total_size' => false, + //Show or not show folder size in list view feature in filemanager (is possible, if there is a large folder, to greatly increase the calculations) + 'show_folder_size' => false, + //Show or not show sorting feature in filemanager + 'show_sorting_bar' => true, + //Show or not show filters button in filemanager + 'show_filter_buttons' => true, + //Show or not language selection feature in filemanager + 'show_language_selection' => true, + //active or deactive the transliteration (mean convert all strange characters in A..Za..z0..9 characters) + 'transliteration' => false, + //convert all spaces on files name and folders name with $replace_with variable + 'convert_spaces' => false, + //convert all spaces on files name and folders name this value + 'replace_with' => "_", + //convert to lowercase the files and folders name + 'lower_case' => false, + + //Add ?484899493349 (time value) to returned images to prevent cache + 'add_time_to_img' => false, + + + //******************************************* + //Images limit and resizing configuration + //******************************************* + + // set maximum pixel width and/or maximum pixel height for all images + // If you set a maximum width or height, oversized images are converted to those limits. Images smaller than the limit(s) are unaffected + // if you don't need a limit set both to 0 + 'image_max_width' => 0, + 'image_max_height' => 0, + 'image_max_mode' => 'auto', + /* + # $option: 0 / exact = defined size; + # 1 / portrait = keep aspect set height; + # 2 / landscape = keep aspect set width; + # 3 / auto = auto; + # 4 / crop= resize and crop; + */ + + //Automatic resizing // + // If you set $image_resizing to TRUE the script converts all uploaded images exactly to image_resizing_width x image_resizing_height dimension + // If you set width or height to 0 the script automatically calculates the other dimension + // Is possible that if you upload very big images the script not work to overcome this increase the php configuration of memory and time limit + 'image_resizing' => false, + 'image_resizing_width' => 0, + 'image_resizing_height' => 0, + 'image_resizing_mode' => 'auto', // same as $image_max_mode + 'image_resizing_override' => false, + // If set to TRUE then you can specify bigger images than $image_max_width & height otherwise if image_resizing is + // bigger than $image_max_width or height then it will be converted to those values + + + //****************** + // + // WATERMARK IMAGE + // + //Watermark path or false + 'image_watermark' => false,//"../watermark.png", + # Could be a pre-determined position such as: + # tl = top left, + # t = top (middle), + # tr = top right, + # l = left, + # m = middle, + # r = right, + # bl = bottom left, + # b = bottom (middle), + # br = bottom right + # Or, it could be a co-ordinate position such as: 50x100 + 'image_watermark_position' => 'br', + # padding: If using a pre-determined position you can + # adjust the padding from the edges by passing an amount + # in pixels. If using co-ordinates, this value is ignored. + 'image_watermark_padding' => 10, + + //****************** + // Default layout setting + // + // 0 => boxes + // 1 => detailed list (1 column) + // 2 => columns list (multiple columns depending on the width of the page) + // YOU CAN ALSO PASS THIS PARAMETERS USING SESSION VAR => $_SESSION['RF']["VIEW"]= + // + //****************** + 'default_view' => 0, + + //set if the filename is truncated when overflow first row + 'ellipsis_title_after_first_row' => true, + + //************************* + //Permissions configuration + //****************** + 'delete_files' => true, + 'create_folders' => true, + 'delete_folders' => true, + 'upload_files' => true, + 'rename_files' => true, + 'rename_folders' => true, + 'duplicate_files' => true, + 'extract_files' => true, + 'copy_cut_files' => true, // for copy/cut files + 'copy_cut_dirs' => true, // for copy/cut directories + 'chmod_files' => true, // change file permissions + 'chmod_dirs' => true, // change folder permissions + 'preview_text_files' => true, // eg.: txt, log etc. + 'edit_text_files' => true, // eg.: txt, log etc. + 'create_text_files' => true, // only create files with exts. defined in $config['editable_text_file_exts'] + 'download_files' => true, // allow download files or just preview + + // you can preview these type of files if $preview_text_files is true + 'previewable_text_file_exts' => ["bsh", "c","css", "cc", "cpp", "cs", "csh", "cyc", "cv", "htm", "html", "java", "js", "m", "mxml", "perl", "pl", "pm", "py", "rb", "sh", "xhtml", "xml","xsl",'txt', 'log',''], + + // you can edit these type of files if $edit_text_files is true (only text based files) + // you can create these type of files if $config['create_text_files'] is true (only text based files) + // if you want you can add html,css etc. + // but for security reasons it's NOT RECOMMENDED! + 'editable_text_file_exts' => ['txt', 'log', 'xml', 'html', 'css', 'htm', 'js',''], + + 'jplayer_exts' => ["mp4","flv","webmv","webma","webm","m4a","m4v","ogv","oga","mp3","midi","mid","ogg","wav"], + + 'cad_exts' => ['dwg', 'dxf', 'hpgl', 'plt', 'spl', 'step', 'stp', 'iges', 'igs', 'sat', 'cgm', 'svg'], + + // Preview with Google Documents + 'googledoc_enabled' => true, + 'googledoc_file_exts' => ['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx' , 'pdf', 'odt', 'odp', 'ods'], + + // defines size limit for paste in MB / operation + // set 'FALSE' for no limit + 'copy_cut_max_size' => 100, + // defines file count limit for paste / operation + // set 'FALSE' for no limit + 'copy_cut_max_count' => 200, + //IF any of these limits reached, operation won't start and generate warning + + //********************** + //Allowed extensions (lowercase insert) + //********************** + 'ext_img' => ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'svg', 'ico', 'webp'], //Images + 'ext_file' => ['doc', 'docx', 'rtf', 'pdf', 'xls', 'xlsx', 'txt', 'csv', 'html', 'xhtml', 'psd', 'sql', 'log', 'fla', 'xml', 'ade', 'adp', 'mdb', 'accdb', 'ppt', 'pptx', 'odt', 'ots', 'ott', 'odb', 'odg', 'otp', 'otg', 'odf', 'ods', 'odp', 'css', 'ai', 'kmz','dwg', 'dxf', 'hpgl', 'plt', 'spl', 'step', 'stp', 'iges', 'igs', 'sat', 'cgm', 'tiff',''], //Files + 'ext_video' => ['mov', 'mpeg', 'm4v', 'mp4', 'avi', 'mpg', 'wma', "flv", "webm"], //Video + 'ext_music' => ['mp3', 'mpga', 'm4a', 'ac3', 'aiff', 'mid', 'ogg', 'wav'], //Audio + 'ext_misc' => ['zip', 'rar', 'gz', 'tar', 'iso', 'dmg'], //Archives + + + //********************* + // If you insert an extensions blacklist array the filemanager don't check any extensions but simply block the extensions in the list + // otherwise check Allowed extensions configuration + //********************* + 'ext_blacklist' => false,//['exe','bat','jpg'], + + + //Empty filename permits like .htaccess, .env, ... + 'empty_filename' => false, + + /* + |-------------------------------------------------------------------------- + | accept files without extension + |-------------------------------------------------------------------------- + | + | If you want to accept files without extension, remember to add '' extension on allowed extension + | + */ + 'files_without_extension' => false, + + /****************** + * TUI Image Editor config + *******************/ + // Add or modify the options below as needed - they will be json encoded when added to the configuration so arrays can be utilized as needed + 'tui_active' => true, + 'tui_position' => 'bottom', + // 'common.bi.image' => "../assets/images/logo.png", + // 'common.bisize.width' => '70px', + // 'common.bisize.height' => '25px', + 'common.backgroundImage' => 'none', + 'common.backgroundColor' => '#ececec', + 'common.border' => '1px solid #E6E7E8', + + // header + 'header.backgroundImage' => 'none', + 'header.backgroundColor' => '#ececec', + 'header.border' => '0px', + + // main icons + 'menu.normalIcon.path' => 'svg/icon-d.svg', + 'menu.normalIcon.name' => 'icon-d', + 'menu.activeIcon.path' => 'svg/icon-b.svg', + 'menu.activeIcon.name' => 'icon-b', + 'menu.disabledIcon.path' => 'svg/icon-a.svg', + 'menu.disabledIcon.name' => 'icon-a', + 'menu.hoverIcon.path' => 'svg/icon-c.svg', + 'menu.hoverIcon.name' => 'icon-c', + 'menu.iconSize.width' => '24px', + 'menu.iconSize.height' => '24px', + + // submenu primary color + 'submenu.backgroundColor' => '#ececec', + 'submenu.partition.color' => '#000000', + + // submenu icons + 'submenu.normalIcon.path' => 'svg/icon-d.svg', + 'submenu.normalIcon.name' => 'icon-d', + 'submenu.activeIcon.path' => 'svg/icon-b.svg', + 'submenu.activeIcon.name' => 'icon-b', + 'submenu.iconSize.width' => '32px', + 'submenu.iconSize.height' => '32px', + + // submenu labels + 'submenu.normalLabel.color' => '#000', + 'submenu.normalLabel.fontWeight' => 'normal', + 'submenu.activeLabel.color' => '#000', + 'submenu.activeLabel.fontWeight' => 'normal', + + // checkbox style + 'checkbox.border' => '1px solid #E6E7E8', + 'checkbox.backgroundColor' => '#000', + + // rango style + 'range.pointer.color' => '#333', + 'range.bar.color' => '#ccc', + 'range.subbar.color' => '#606060', + + 'range.disabledPointer.color' => '#d3d3d3', + 'range.disabledBar.color' => 'rgba(85,85,85,0.06)', + 'range.disabledSubbar.color' => 'rgba(51,51,51,0.2)', + + 'range.value.color' => '#000', + 'range.value.fontWeight' => 'normal', + 'range.value.fontSize' => '11px', + 'range.value.border' => '0', + 'range.value.backgroundColor' => '#f5f5f5', + 'range.title.color' => '#000', + 'range.title.fontWeight' => 'lighter', + + // colorpicker style + 'colorpicker.button.border' => '0px', + 'colorpicker.title.color' => '#000', + + + //The filter and sorter are managed through both javascript and php scripts because if you have a lot of + //file in a folder the javascript script can't sort all or filter all, so the filemanager switch to php script. + //The plugin automatic swich javascript to php when the current folder exceeds the below limit of files number + 'file_number_limit_js' => 500, + + //********************** + // Hidden files and folders + //********************** + // set the names of any folders you want hidden (eg "hidden_folder1", "hidden_folder2" ) Remember all folders with these names will be hidden (you can set any exceptions in config.php files on folders) + 'hidden_folders' => [], + // set the names of any files you want hidden. Remember these names will be hidden in all folders (eg "this_document.pdf", "that_image.jpg" ) + 'hidden_files' => ['config.php'], + + /******************* + * URL upload + *******************/ + 'url_upload' => true, + + + //************************************ + //Thumbnail for external use creation + //************************************ + + + // New image resized creation with fixed path from filemanager folder after uploading (thumbnails in fixed mode) + // If you want create images resized out of upload folder for use with external script you can choose this method, + // You can create also more than one image at a time just simply add a value in the array + // Remember than the image creation respect the folder hierarchy so if you are inside source/test/test1/ the new image will create at + // path_from_filemanager/test/test1/ + // PS if there isn't write permission in your destination folder you must set it + // + 'fixed_image_creation' => false, //activate or not the creation of one or more image resized with fixed path from filemanager folder + 'fixed_path_from_filemanager' => ['../test/', '../test1/'], //fixed path of the image folder from the current position on upload folder + 'fixed_image_creation_name_to_prepend' => ['', 'test_'], //name to prepend on filename + 'fixed_image_creation_to_append' => ['_test', ''], //name to appendon filename + 'fixed_image_creation_width' => [300, 400], //width of image + 'fixed_image_creation_height' => [200, 300], //height of image + /* + # $option: 0 / exact = defined size; + # 1 / portrait = keep aspect set height; + # 2 / landscape = keep aspect set width; + # 3 / auto = auto; + # 4 / crop= resize and crop; + */ + 'fixed_image_creation_option' => ['crop', 'auto'], //set the type of the crop + + + // New image resized creation with relative path inside to upload folder after uploading (thumbnails in relative mode) + // With Responsive filemanager you can create automatically resized image inside the upload folder, also more than one at a time + // just simply add a value in the array + // The image creation path is always relative so if i'm inside source/test/test1 and I upload an image, the path start from here + // + 'relative_image_creation' => false, //activate or not the creation of one or more image resized with relative path from upload folder + 'relative_path_from_current_pos' => ['./', './'], //relative path of the image folder from the current position on upload folder + 'relative_image_creation_name_to_prepend' => ['', ''], //name to prepend on filename + 'relative_image_creation_name_to_append' => ['_thumb', '_thumb1'], //name to append on filename + 'relative_image_creation_width' => [300, 400], //width of image + 'relative_image_creation_height' => [200, 300], //height of image + /* + * $option: 0 / exact = defined size; + * 1 / portrait = keep aspect set height; + * 2 / landscape = keep aspect set width; + * 3 / auto = auto; + * 4 / crop= resize and crop; + */ + 'relative_image_creation_option' => ['crop', 'crop'], //set the type of the crop + + + // Remember text filter after close filemanager for future session + 'remember_text_filter' => false, + +]; + +return array_merge( + $config, + [ + 'ext' => array_merge( + $config['ext_img'], + $config['ext_file'], + $config['ext_misc'], + $config['ext_video'], + $config['ext_music'] + ), + 'tui_defaults_config' => [ + //'common.bi.image' => $config['common.bi.image'], + //'common.bisize.width' => $config['common.bisize.width'], + //'common.bisize.height' => $config['common.bisize.height'], + 'common.backgroundImage' => $config['common.backgroundImage'], + 'common.backgroundColor' => $config['common.backgroundColor'], + 'common.border' => $config['common.border'], + 'header.backgroundImage' => $config['header.backgroundImage'], + 'header.backgroundColor' => $config['header.backgroundColor'], + 'header.border' => $config['header.border'], + 'menu.normalIcon.path' => $config['menu.normalIcon.path'], + 'menu.normalIcon.name' => $config['menu.normalIcon.name'], + 'menu.activeIcon.path' => $config['menu.activeIcon.path'], + 'menu.activeIcon.name' => $config['menu.activeIcon.name'], + 'menu.disabledIcon.path' => $config['menu.disabledIcon.path'], + 'menu.disabledIcon.name' => $config['menu.disabledIcon.name'], + 'menu.hoverIcon.path' => $config['menu.hoverIcon.path'], + 'menu.hoverIcon.name' => $config['menu.hoverIcon.name'], + 'menu.iconSize.width' => $config['menu.iconSize.width'], + 'menu.iconSize.height' => $config['menu.iconSize.height'], + 'submenu.backgroundColor' => $config['submenu.backgroundColor'], + 'submenu.partition.color' => $config['submenu.partition.color'], + 'submenu.normalIcon.path' => $config['submenu.normalIcon.path'], + 'submenu.normalIcon.name' => $config['submenu.normalIcon.name'], + 'submenu.activeIcon.path' => $config['submenu.activeIcon.path'], + 'submenu.activeIcon.name' => $config['submenu.activeIcon.name'], + 'submenu.iconSize.width' => $config['submenu.iconSize.width'], + 'submenu.iconSize.height' => $config['submenu.iconSize.height'], + 'submenu.normalLabel.color' => $config['submenu.normalLabel.color'], + 'submenu.normalLabel.fontWeight' => $config['submenu.normalLabel.fontWeight'], + 'submenu.activeLabel.color' => $config['submenu.activeLabel.color'], + //'submenu.activeLabel.fontWeight' => $config['submenu.activeLabel.fontWeightcommon.bi.image'], + 'checkbox.border' => $config['checkbox.border'], + 'checkbox.backgroundColor' => $config['checkbox.backgroundColor'], + 'range.pointer.color' => $config['range.pointer.color'], + 'range.bar.color' => $config['range.bar.color'], + 'range.subbar.color' => $config['range.subbar.color'], + 'range.disabledPointer.color' => $config['range.disabledPointer.color'], + 'range.disabledBar.color' => $config['range.disabledBar.color'], + 'range.disabledSubbar.color' => $config['range.disabledSubbar.color'], + 'range.value.color' => $config['range.value.color'], + 'range.value.fontWeight' => $config['range.value.fontWeight'], + 'range.value.fontSize' => $config['range.value.fontSize'], + 'range.value.border' => $config['range.value.border'], + 'range.value.backgroundColor' => $config['range.value.backgroundColor'], + 'range.title.color' => $config['range.title.color'], + 'range.title.fontWeight' => $config['range.title.fontWeight'], + 'colorpicker.button.border' => $config['colorpicker.button.border'], + 'colorpicker.title.color' => $config['colorpicker.title.color'] + ], + ] +); \ No newline at end of file diff --git a/libraries/filemanager-9.14.2/css/jquery.fileupload-noscript.css b/libraries/filemanager-9.14.2/css/jquery.fileupload-noscript.css new file mode 100644 index 0000000..2409bfb --- /dev/null +++ b/libraries/filemanager-9.14.2/css/jquery.fileupload-noscript.css @@ -0,0 +1,22 @@ +@charset "UTF-8"; +/* + * jQuery File Upload Plugin NoScript CSS + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + */ + +.fileinput-button input { + position: static; + opacity: 1; + filter: none; + font-size: inherit !important; + direction: inherit; +} +.fileinput-button span { + display: none; +} diff --git a/libraries/filemanager-9.14.2/css/jquery.fileupload-ui-noscript.css b/libraries/filemanager-9.14.2/css/jquery.fileupload-ui-noscript.css new file mode 100644 index 0000000..30651ac --- /dev/null +++ b/libraries/filemanager-9.14.2/css/jquery.fileupload-ui-noscript.css @@ -0,0 +1,17 @@ +@charset "UTF-8"; +/* + * jQuery File Upload UI Plugin NoScript CSS + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2012, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + */ + +.fileinput-button i, +.fileupload-buttonbar .delete, +.fileupload-buttonbar .toggle { + display: none; +} diff --git a/libraries/filemanager-9.14.2/css/jquery.fileupload-ui.css b/libraries/filemanager-9.14.2/css/jquery.fileupload-ui.css new file mode 100644 index 0000000..5bb9e42 --- /dev/null +++ b/libraries/filemanager-9.14.2/css/jquery.fileupload-ui.css @@ -0,0 +1,53 @@ +@charset "UTF-8"; +/* + * jQuery File Upload UI Plugin CSS + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2010, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + */ + +.fileupload-buttonbar .btn, +.fileupload-buttonbar .toggle { + margin-bottom: 5px; +} + +.fileupload-process { + float: right; + display: none; +} +.fileupload-processing .fileupload-process, +.files .processing .preview { + display: block; + width: 32px; + height: 32px; + background: url("../img/loading.gif") center no-repeat; + background-size: contain; +} +.files audio, +.files video { + max-width: 300px; +} + +@media (max-width: 767px) { + .fileupload-buttonbar .toggle, + .files .toggle, + .files .btn span { + display: none; + } + .files .name { + width: 80px; + word-wrap: break-word; + } + .files audio, + .files video { + max-width: 80px; + } + .files img, + .files canvas { + max-width: 100%; + } +} diff --git a/libraries/filemanager-9.14.2/css/jquery.fileupload.css b/libraries/filemanager-9.14.2/css/jquery.fileupload.css new file mode 100644 index 0000000..8ae3b09 --- /dev/null +++ b/libraries/filemanager-9.14.2/css/jquery.fileupload.css @@ -0,0 +1,37 @@ +@charset "UTF-8"; +/* + * jQuery File Upload Plugin CSS + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + */ + +.fileinput-button { + position: relative; + overflow: hidden; + display: inline-block; +} +.fileinput-button input { + position: absolute; + top: 0; + right: 0; + margin: 0; + opacity: 0; + -ms-filter: 'alpha(opacity=0)'; + font-size: 200px !important; + direction: ltr; + cursor: pointer; +} + +/* Fixes for IE < 8 */ +@media screen\9 { + .fileinput-button input { + filter: alpha(opacity=0); + font-size: 100%; + height: 100%; + } +} diff --git a/libraries/filemanager-9.14.2/css/rtl-style.css b/libraries/filemanager-9.14.2/css/rtl-style.css new file mode 100644 index 0000000000000000000000000000000000000000..eb67f80674165af297fad515355294cf31e30b56 GIT binary patch literal 6224 zcmd5=U2oGc6ur+#{D(5$wk2Kn0b>YW5J*S}B-jf=JhW@pR!h^WNnvc_uLI{e^|OH!&?jlntPc}OTJ)F3~ni&U3r1uDc%zKs_0UaT2C41Un@Ozv125I z1(z7#FY(=!^bGt1V2+@_E3Bn<3&eqvu?x5ict-MzF5B>}M zo9q7+lHaEX^;G;aGvyhjh!AF*6u!dPVodX0#~(dEg0J0Y9=n7u#|qI5I9teD8FD7G zA>Zu$s&NOvY~~Hd?*LKG4E6})G4@X&TZVPa$7VhWF*nEV7#1`4*_@b3nK?6+{d{@J zq@(9uyf&4Bn~f)3U}cUDU?VrLQzyBWBFy&{st9&uMh&5*T+;P+=XsZvCWW4IZ`p)S z0u;=ro1vH}`!WaX8k25FiBjCu#6kZUC{1!?>cX|(YJc0tl3Ir@*YA+256ujf@14j2 zv~|7kVO^WF$FVkdRqRik6@|BP&50ZuRCE=u=R4Z-s_{Pc;+c%yxg1iIYI5IS_nXb#3rCRI9jrhqC&OX~?_vNE% z^d0c^#bsTuIdEzdt6GZK59Aw05zf6GX}PPD4Jq4=t@%QE>f)H? z?KyVV*Acl&QooEYLf*>yc!-d7(B|x-bXS`a9WALVt8iB9b127+*oAaf$<7n=RMpvz zkpZ=ZiW{KzcG}U-IC^ca0|ifvY(^>NcTXrlms?7&o=er@E<)$47M>sYMz zkmgQxWe<4_>*swp_M)i8F*NGCx!tN+U$3i(z@n>GjuT&GyEV+!LsiD+xy6)6XD@e8 zfzGU4+Rxaj;%$I;=oE6ZyT%)J7d<+9my4*nr^x%Kk216GMCoq^iXmucs91Y>e5$7maYkbktR~nzf z2JGhYoRQyS=kgNVM))oFbe8idbMRpf!HssV=E_y<+^`>;VCli,ul.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dd,dt{line-height:20px}dt{font-weight:700}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:after,.dl-horizontal:before{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:"\2014 \00A0"}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:""}blockquote.pull-right small:after{content:"\00A0 \2014"}blockquote:after,blockquote:before,q:after,q:before{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,Courier New,monospace;font-size:12px;color:#333;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{margin:0}fieldset,legend{padding:0;border:0}legend{display:block;width:100%;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}button,input,label,select,textarea{font-size:14px;font-weight:400;line-height:20px}button,input,select,textarea{font-family:Helvetica Neue,Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}.uneditable-input,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;border-radius:4px}.uneditable-input,input,textarea{width:206px}textarea{height:auto}.uneditable-input,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],textarea{background-color:#fff;border:1px solid #ccc;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);transition:border .2s linear,box-shadow .2s linear}.uneditable-input:focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,textarea:focus{border-color:rgba(82,168,236,.8);outline:0;outline:thin dotted\9;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6)}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;*margin-top:0;line-height:normal}input[type=button],input[type=checkbox],input[type=file],input[type=image],input[type=radio],input[type=reset],input[type=submit]{width:auto}input[type=file],select{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus,select:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;box-shadow:inset 0 1px 2px rgba(0,0,0,.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.checkbox,.radio{min-height:20px;padding-left:20px}.checkbox input[type=checkbox],.radio input[type=radio]{float:left;margin-left:-20px}.controls>.checkbox:first-child,.controls>.radio:first-child{padding-top:5px}.checkbox.inline,.radio.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.checkbox.inline+.checkbox.inline,.radio.inline+.radio.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}.row-fluid .uneditable-input[class*=span],.row-fluid input[class*=span],.row-fluid select[class*=span],.row-fluid textarea[class*=span],.uneditable-input[class*=span],input[class*=span],select[class*=span],textarea[class*=span]{float:none;margin-left:0}.input-append .uneditable-input[class*=span],.input-append input[class*=span],.input-prepend .uneditable-input[class*=span],.input-prepend input[class*=span],.row-fluid .input-append [class*=span],.row-fluid .input-prepend [class*=span],.row-fluid .uneditable-input[class*=span],.row-fluid input[class*=span],.row-fluid select[class*=span],.row-fluid textarea[class*=span]{display:inline-block}.uneditable-input,input,textarea{margin-left:0}.controls-row [class*=span]+[class*=span]{margin-left:20px}.uneditable-input.span12,input.span12,textarea.span12{width:926px}.uneditable-input.span11,input.span11,textarea.span11{width:846px}.uneditable-input.span10,input.span10,textarea.span10{width:766px}.uneditable-input.span9,input.span9,textarea.span9{width:686px}.uneditable-input.span8,input.span8,textarea.span8{width:606px}.uneditable-input.span7,input.span7,textarea.span7{width:526px}.uneditable-input.span6,input.span6,textarea.span6{width:446px}.uneditable-input.span5,input.span5,textarea.span5{width:366px}.uneditable-input.span4,input.span4,textarea.span4{width:286px}.uneditable-input.span3,input.span3,textarea.span3{width:206px}.uneditable-input.span2,input.span2,textarea.span2{width:126px}.uneditable-input.span1,input.span1,textarea.span1{width:46px}.controls-row{*zoom:1}.controls-row:after,.controls-row:before{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*=span],.row-fluid .controls-row [class*=span]{float:left}.controls-row .checkbox[class*=span],.controls-row .radio[class*=span]{padding-top:5px}input[disabled],input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type=checkbox][disabled],input[type=checkbox][readonly],input[type=radio][disabled],input[type=radio][readonly]{background-color:transparent}.control-group.warning .checkbox,.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e}.control-group.warning .input-append .add-on,.control-group.warning .input-prepend .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .checkbox,.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392}.control-group.error .input-append .add-on,.control-group.error .input-prepend .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .checkbox,.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b}.control-group.success .input-append .add-on,.control-group.success .input-prepend .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .checkbox,.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7ab5d3}.control-group.info .input-append .add-on,.control-group.info .input-prepend .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e9322d;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:after,.form-actions:before{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append .dropdown-menu,.input-append .popover,.input-append .uneditable-input,.input-append input,.input-append select,.input-prepend .dropdown-menu,.input-prepend .popover,.input-prepend .uneditable-input,.input-prepend input,.input-prepend select{font-size:14px}.input-append .uneditable-input,.input-append input,.input-append select,.input-prepend .uneditable-input,.input-prepend input,.input-prepend select{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;border-radius:0 4px 4px 0}.input-append .uneditable-input:focus,.input-append input:focus,.input-append select:focus,.input-prepend .uneditable-input:focus,.input-prepend input:focus,.input-prepend select:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:400;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-append .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .add-on,.input-prepend .btn,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-append .uneditable-input,.input-append input,.input-append select,.input-prepend .add-on:first-child,.input-prepend .btn:first-child{border-radius:4px 0 0 4px}.input-append .uneditable-input+.btn-group .btn:last-child,.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child{border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn-group:last-child>.dropdown-toggle,.input-append .btn:last-child{border-radius:0 4px 4px 0}.input-prepend.input-append .uneditable-input,.input-prepend.input-append input,.input-prepend.input-append select{border-radius:0}.input-prepend.input-append .uneditable-input+.btn-group .btn,.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn{border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px\9;padding-left:14px;padding-left:4px\9;margin-bottom:0;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{border-radius:0}.form-search .input-append .search-query{border-radius:14px 0 0 14px}.form-search .input-append .btn,.form-search .input-prepend .search-query{border-radius:0 14px 14px 0}.form-search .input-prepend .btn{border-radius:14px 0 0 14px}.form-horizontal .help-inline,.form-horizontal .input-append,.form-horizontal .input-prepend,.form-horizontal .uneditable-input,.form-horizontal input,.form-horizontal select,.form-horizontal textarea,.form-inline .help-inline,.form-inline .input-append,.form-inline .input-prepend,.form-inline .uneditable-input,.form-inline input,.form-inline select,.form-inline textarea,.form-search .help-inline,.form-search .input-append,.form-search .input-prepend,.form-search .uneditable-input,.form-search input,.form-search select,.form-search textarea{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-horizontal .hide,.form-inline .hide,.form-search .hide{display:none}.form-inline .btn-group,.form-inline label,.form-search .btn-group,.form-search label{display:inline-block}.form-inline .input-append,.form-inline .input-prepend,.form-search .input-append,.form-search .input-prepend{margin-bottom:0}.form-inline .checkbox,.form-inline .radio,.form-search .checkbox,.form-search .radio{padding-left:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio],.form-search .checkbox input[type=checkbox],.form-search .radio input[type=radio]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:after,.form-horizontal .control-group:before{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal .input-append+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table td,.table th{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:700}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child td,.table caption+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table thead:first-child tr:first-child td,.table thead:first-child tr:first-child th{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed td,.table-condensed th{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;border-radius:4px}.table-bordered td,.table-bordered th{border-left:1px solid #ddd}.table-bordered caption+tbody tr:first-child td,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+thead tr:first-child th,.table-bordered tbody:first-child tr:first-child td,.table-bordered tbody:first-child tr:first-child th,.table-bordered thead:first-child tr:first-child th{border-top:0}.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child,.table-bordered thead:first-child tr:first-child>th:first-child{border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child,.table-bordered thead:first-child tr:first-child>th:last-child{border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child,.table-bordered thead:last-child tr:last-child>th:first-child{border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child,.table-bordered thead:last-child tr:last-child>th:last-child{border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered caption+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child{border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered caption+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child{border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}.row-fluid table td[class*=span],.row-fluid table th[class*=span],table td[class*=span],table th[class*=span]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class*=" icon-"],[class^=icon-]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url(../img/glyphicons-halflings.png);background-position:14px 14px;background-repeat:no-repeat}.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-menu>.active>a>[class^=icon-],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>li>a:focus>[class^=icon-],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^=icon-],.dropdown-submenu:focus>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class^=icon-],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^=icon-],.icon-white,.nav-list>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^=icon-],.nav-pills>.active>a>[class*=" icon-"],.nav-pills>.active>a>[class^=icon-],.navbar-inverse .nav>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^=icon-]{background-image:url(../img/glyphicons-halflings-white.png)}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropdown,.dropup{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);*border-right-width:2px;*border-bottom-width:2px;border-radius:6px;box-shadow:0 5px 10px rgba(0,0,0,.2);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover,.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover,.dropdown-submenu:focus>a,.dropdown-submenu:hover>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:linear-gradient(180deg,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff0088cc",endColorstr="#ff0077b3",GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#999}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-large{padding:24px;border-radius:6px}.well-small{padding:9px;border-radius:3px}.fade{opacity:0;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:700;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px hsla(0,0%,100%,.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:linear-gradient(180deg,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);border-bottom-color:#b3b3b3;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffffffff",endColorstr="#ffe6e6e6",GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;box-shadow:inset 0 1px 0 hsla(0,0%,100%,.2),0 1px 2px rgba(0,0,0,.05)}.btn.active,.btn.disabled,.btn:active,.btn:focus,.btn:hover,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn.active,.btn:active{background-color:#ccc\9}.btn:first-child{*margin-left:0}.btn:focus,.btn:hover{color:#333;text-decoration:none;background-position:0 -15px;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;border-radius:6px}.btn-large [class*=" icon-"],.btn-large [class^=icon-]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;border-radius:3px}.btn-small [class*=" icon-"],.btn-small [class^=icon-]{margin-top:0}.btn-mini [class*=" icon-"],.btn-mini [class^=icon-]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.btn-danger.active,.btn-info.active,.btn-inverse.active,.btn-primary.active,.btn-success.active,.btn-warning.active{color:hsla(0,0%,100%,.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#006dcc;*background-color:#04c;background-image:linear-gradient(180deg,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff0088cc",endColorstr="#ff0044cc",GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary.active,.btn-primary.disabled,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary.active,.btn-primary:active{background-color:#039\9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#faa732;*background-color:#f89406;background-image:linear-gradient(180deg,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#fffbb450",endColorstr="#fff89406",GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning.active,.btn-warning.disabled,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning.active,.btn-warning:active{background-color:#c67605\9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#da4f49;*background-color:#bd362f;background-image:linear-gradient(180deg,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffee5f5b",endColorstr="#ffbd362f",GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger.active,.btn-danger.disabled,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger.active,.btn-danger:active{background-color:#942a25\9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#5bb75b;*background-color:#51a351;background-image:linear-gradient(180deg,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff62c462",endColorstr="#ff51a351",GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success.active,.btn-success.disabled,.btn-success:active,.btn-success:focus,.btn-success:hover,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success.active,.btn-success:active{background-color:#408140\9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#49afcd;*background-color:#2f96b4;background-image:linear-gradient(180deg,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff5bc0de",endColorstr="#ff2f96b4",GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info.active,.btn-info.disabled,.btn-info:active,.btn-info:focus,.btn-info:hover,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info.active,.btn-info:active{background-color:#24748c\9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#363636;*background-color:#222;background-image:linear-gradient(180deg,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff444444",endColorstr="#ff222222",GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse.active,.btn-inverse.disabled,.btn-inverse:active,.btn-inverse:focus,.btn-inverse:hover,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse.active,.btn-inverse:active{background-color:#080808\9}button.btn,input[type=submit].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type=submit].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type=submit].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type=submit].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type=submit].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;border-radius:0}.btn-link:focus,.btn-link:hover{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn{margin-left:5px}.btn-group>.btn{position:relative;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{border-top-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;border-bottom-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{border-top-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding:5px 8px;box-shadow:inset 1px 0 0 hsla(0,0%,100%,.125),inset 0 1px 0 hsla(0,0%,100%,.2),0 1px 2px rgba(0,0,0,.05)}.btn-group>.btn-mini+.dropdown-toggle{padding:2px 5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{padding:7px 12px}.btn-group.open .dropdown-toggle{background-image:none;box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px;border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-danger .caret,.btn-info .caret,.btn-inverse .caret,.btn-primary .caret,.btn-success .caret,.btn-warning .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{border-radius:0 0 6px 6px}.alert{margin-bottom:20px;text-shadow:0 1px 0 hsla(0,0%,100%,.5);background-color:#fcf8e3;border:1px solid #fbeed5;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{background-color:#d9edf7;border-color:#bce8f1}.alert-info,.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:700;line-height:20px;color:#999;text-shadow:0 1px 0 hsla(0,0%,100%,.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list .nav-header,.nav-list>li>a{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 hsla(0,0%,100%,.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:focus,.nav-list>.active>a:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.2);background-color:#08c}.nav-list [class*=" icon-"],.nav-list [class^=icon-]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-pills,.nav-tabs{*zoom:1}.nav-pills:after,.nav-pills:before,.nav-tabs:after,.nav-tabs:before{display:table;line-height:0;content:""}.nav-pills:after,.nav-tabs:after{clear:both}.nav-pills>li,.nav-tabs>li{float:left}.nav-pills>li>a,.nav-tabs>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:focus,.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:focus,.nav-tabs>.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:focus,.nav-pills>.active>a:hover{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{border-top-right-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{border-bottom-right-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:focus,.nav-tabs.nav-stacked>li>a:hover{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:focus .caret,.nav .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:focus,.nav>.dropdown.active>a:hover{cursor:pointer}.nav-pills .open .dropdown-toggle,.nav-tabs .open .dropdown-toggle,.nav>li.dropdown.open.active>a:focus,.nav>li.dropdown.open.active>a:hover{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open.active .caret,.nav li.dropdown.open .caret,.nav li.dropdown.open a:focus .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:focus,.tabs-stacked .open>a:hover{border-color:#999}.tabbable{*zoom:1}.tabbable:after,.tabbable:before{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-left>.nav-tabs,.tabs-right>.nav-tabs{border-bottom:0}.pill-content>.pill-pane,.tab-content>.tab-pane{display:none}.pill-content>.active,.tab-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:focus,.tabs-below>.nav-tabs>li>a:hover{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:focus,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:focus,.tabs-left>.nav-tabs>li>a:hover{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:focus,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:focus,.tabs-right>.nav-tabs>li>a:hover{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:focus,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:focus,.nav>.disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:linear-gradient(180deg,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffffffff",endColorstr="#fff2f2f2",GradientType=0);*zoom:1;box-shadow:0 1px 4px rgba(0,0,0,.065)}.navbar-inner:after,.navbar-inner:before{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:focus,.navbar .brand:hover{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:focus,.navbar-link:hover{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-append .btn,.navbar .input-append .btn-group,.navbar .input-prepend .btn,.navbar .input-prepend .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:after,.navbar-form:before{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form .checkbox,.navbar-form .radio,.navbar-form input,.navbar-form select{margin-top:5px}.navbar-form .btn,.navbar-form input,.navbar-form select{display:inline-block;margin-bottom:0}.navbar-form input[type=checkbox],.navbar-form input[type=image],.navbar-form input[type=radio]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:13px;font-weight:400;line-height:1;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{border-radius:0}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-bottom .navbar-inner,.navbar-fixed-top .navbar-inner{padding-right:0;padding-left:0;border-radius:0}.navbar-fixed-bottom .container,.navbar-fixed-top .container,.navbar-static-top .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{box-shadow:0 1px 10px rgba(0,0,0,.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{box-shadow:0 -1px 10px rgba(0,0,0,.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:focus,.navbar .nav>.active>a:hover{color:#555;text-decoration:none;background-color:#e5e5e5;box-shadow:inset 0 3px 8px rgba(0,0,0,.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#ededed;*background-color:#e5e5e5;background-image:linear-gradient(180deg,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#fff2f2f2",endColorstr="#ffe5e5e5",GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);box-shadow:inset 0 1px 0 hsla(0,0%,100%,.1),0 1px 0 hsla(0,0%,100%,.075)}.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar:active,.navbar .btn-navbar:focus,.navbar .btn-navbar:hover,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar.active,.navbar .btn-navbar:active{background-color:#ccc\9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;border-radius:1px;box-shadow:0 1px 0 rgba(0,0,0,.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,.2);content:""}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:""}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:focus .caret,.navbar .nav li.dropdown>a:hover .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle,.navbar .nav li.dropdown.open>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .nav>li>.dropdown-menu.pull-right,.navbar .pull-right>li>.dropdown-menu{right:0;left:auto}.navbar .nav>li>.dropdown-menu.pull-right:before,.navbar .pull-right>li>.dropdown-menu:before{right:12px;left:auto}.navbar .nav>li>.dropdown-menu.pull-right:after,.navbar .pull-right>li>.dropdown-menu:after{right:13px;left:auto}.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu,.navbar .pull-right>li>.dropdown-menu .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:linear-gradient(180deg,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff222222",endColorstr="#ff111111",GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-inverse .brand:focus,.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff}.navbar-inverse .brand,.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:focus,.navbar-inverse .nav .active>a:hover{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:focus,.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:focus .caret,.navbar-inverse .nav li.dropdown>a:hover .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 hsla(0,0%,100%,.15);transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query.focused,.navbar-inverse .navbar-search .search-query:focus{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;box-shadow:0 0 3px rgba(0,0,0,.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#0e0e0e;*background-color:#040404;background-image:linear-gradient(180deg,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff151515",endColorstr="#ff040404",GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar:active{background-color:#000\9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;border-radius:4px;*zoom:1;box-shadow:0 1px 2px rgba(0,0,0,.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>.active>a,.pagination ul>.active>span,.pagination ul>li>a:focus,.pagination ul>li>a:hover{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>a,.pagination ul>.disabled>a:focus,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>span{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;border-bottom-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>a,.pagination-small ul>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>a,.pagination-small ul>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:after,.pager:before{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.3);*border:1px solid #999;border-radius:6px;outline:none;box-shadow:0 3px 7px rgba(0,0,0,.3);background-clip:padding-box}.modal.fade{top:-25%;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-footer,.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;border-radius:0 0 6px 6px;*zoom:1;box-shadow:inset 0 1px 0 #fff}.modal-footer:after,.modal-footer:before{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 5px 10px rgba(0,0,0,.2);background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:after,.thumbnails:before{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;border-radius:4px;box-shadow:0 1px 3px rgba(0,0,0,.055);transition:all .2s ease-in-out}a.thumbnail:focus,a.thumbnail:hover{border-color:#08c;box-shadow:0 1px 4px rgba(0,105,214,.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.badge,.label{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:700;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{border-radius:3px}.badge{padding-right:9px;padding-left:9px;border-radius:9px}.badge:empty,.label:empty{display:none}a.badge:focus,a.badge:hover,a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.badge-important,.label-important{background-color:#b94a48}.badge-important[href],.label-important[href]{background-color:#953b39}.badge-warning,.label-warning{background-color:#f89406}.badge-warning[href],.label-warning[href]{background-color:#c67605}.badge-success,.label-success{background-color:#468847}.badge-success[href],.label-success[href]{background-color:#356635}.badge-info,.label-info{background-color:#3a87ad}.badge-info[href],.label-info[href]{background-color:#2d6987}.badge-inverse,.label-inverse{background-color:#333}.badge-inverse[href],.label-inverse[href]{background-color:#1a1a1a}.btn .badge,.btn .label{position:relative;top:-1px}.btn-mini .badge,.btn-mini .label{top:0}@keyframes progress-bar-stripes{0%{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:linear-gradient(180deg,#f5f5f5,#f9f9f9);border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#fff5f5f5",endColorstr="#fff9f9f9",GradientType=0);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress,.progress .bar{background-repeat:repeat-x}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#0e90d2;background-image:linear-gradient(180deg,#149bdf,#0480be);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff149bdf",endColorstr="#ff0480be",GradientType=0);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-sizing:border-box;transition:width .6s ease}.progress .bar+.bar{box-shadow:inset 1px 0 0 rgba(0,0,0,.15),inset 0 -1px 0 rgba(0,0,0,.15)}.progress-striped .bar{background-color:#149bdf;background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:40px 40px}.progress.active .bar{animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:linear-gradient(180deg,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffee5f5b",endColorstr="#ffc43c35",GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:linear-gradient(180deg,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff62c462",endColorstr="#ff57a957",GradientType=0)}.progress-striped .bar-success,.progress-success.progress-striped .bar{background-color:#62c462;background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:linear-gradient(180deg,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff5bc0de",endColorstr="#ff339bb9",GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:linear-gradient(180deg,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#fffbb450",endColorstr="#fff89406",GradientType=0)}.progress-striped .bar-warning,.progress-warning.progress-striped .bar{background-color:#fbb450;background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;transition:left .6s ease-in-out}.carousel-inner>.item>a>img,.carousel-inner>.item>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:hsla(0,0%,100%,.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} + +/*! + * Bootstrap Responsive v2.3.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.hidden-desktop,.visible-phone,.visible-tablet{display:none!important}.visible-desktop{display:inherit!important}@media (min-width:768px) and (max-width:839px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media (max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:inherit!important}.hidden-print{display:none!important}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:after,.row:before{display:table;line-height:0;content:""}.row:after{clear:both}[class*=span]{float:left;min-height:1px;margin-left:30px}.container,.navbar-fixed-bottom .container,.navbar-fixed-top .container,.navbar-static-top .container,.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:after,.row-fluid:before{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*=span]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;box-sizing:border-box}.row-fluid [class*=span]:first-child{margin-left:0}.row-fluid .controls-row [class*=span]+[class*=span]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}.uneditable-input,input,textarea{margin-left:0}.controls-row [class*=span]+[class*=span]{margin-left:30px}.uneditable-input.span12,input.span12,textarea.span12{width:1156px}.uneditable-input.span11,input.span11,textarea.span11{width:1056px}.uneditable-input.span10,input.span10,textarea.span10{width:956px}.uneditable-input.span9,input.span9,textarea.span9{width:856px}.uneditable-input.span8,input.span8,textarea.span8{width:756px}.uneditable-input.span7,input.span7,textarea.span7{width:656px}.uneditable-input.span6,input.span6,textarea.span6{width:556px}.uneditable-input.span5,input.span5,textarea.span5{width:456px}.uneditable-input.span4,input.span4,textarea.span4{width:356px}.uneditable-input.span3,input.span3,textarea.span3{width:256px}.uneditable-input.span2,input.span2,textarea.span2{width:156px}.uneditable-input.span1,input.span1,textarea.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media (min-width:768px) and (max-width:839px){.row{margin-left:-20px;*zoom:1}.row:after,.row:before{display:table;line-height:0;content:""}.row:after{clear:both}[class*=span]{float:left;min-height:1px;margin-left:20px}.container,.navbar-fixed-bottom .container,.navbar-fixed-top .container,.navbar-static-top .container,.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:after,.row-fluid:before{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*=span]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;box-sizing:border-box}.row-fluid [class*=span]:first-child{margin-left:0}.row-fluid .controls-row [class*=span]+[class*=span]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}.uneditable-input,input,textarea{margin-left:0}.controls-row [class*=span]+[class*=span]{margin-left:20px}.uneditable-input.span12,input.span12,textarea.span12{width:710px}.uneditable-input.span11,input.span11,textarea.span11{width:648px}.uneditable-input.span10,input.span10,textarea.span10{width:586px}.uneditable-input.span9,input.span9,textarea.span9{width:524px}.uneditable-input.span8,input.span8,textarea.span8{width:462px}.uneditable-input.span7,input.span7,textarea.span7{width:400px}.uneditable-input.span6,input.span6,textarea.span6{width:338px}.uneditable-input.span5,input.span5,textarea.span5{width:276px}.uneditable-input.span4,input.span4,textarea.span4{width:214px}.uneditable-input.span3,input.span3,textarea.span3{width:152px}.uneditable-input.span2,input.span2,textarea.span2{width:90px}.uneditable-input.span1,input.span1,textarea.span1{width:28px}}@media (max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}.row-fluid [class*=span],.uneditable-input[class*=span],[class*=span]{display:block;float:none;width:100%;margin-left:0;box-sizing:border-box}.row-fluid .span12,.span12{width:100%;box-sizing:border-box}.row-fluid [class*=offset]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,.uneditable-input,input[class*=span],select[class*=span],textarea[class*=span]{display:block;width:100%;min-height:30px;box-sizing:border-box}.input-append input,.input-append input[class*=span],.input-prepend input,.input-prepend input[class*=span]{display:inline-block;width:auto}.controls-row [class*=span]+[class*=span]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media (max-width:480px){.nav-collapse{-webkit-transform:translateZ(0)}.page-header h1 small{display:block;line-height:20px}input[type=checkbox],input[type=radio]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media (max-width:839px){body{padding-top:0}.navbar-fixed-bottom,.navbar-fixed-top{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-bottom .navbar-inner,.navbar-fixed-top .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .dropdown-menu a,.nav-collapse .nav>li>a{padding:9px 15px;font-weight:700;color:#777;border-radius:3px}.nav-collapse .btn{padding:4px 10px;font-weight:400;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .dropdown-menu a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .nav>li>a:hover{background-color:#f2f2f2}.navbar-inverse .nav-collapse .dropdown-menu a,.navbar-inverse .nav-collapse .nav>li>a{color:#999}.navbar-inverse .nav-collapse .dropdown-menu a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .nav>li>a:hover{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:none;border-radius:0;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu .divider,.nav-collapse .dropdown-menu:after,.nav-collapse .dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after,.nav-collapse .nav>li>.dropdown-menu:before{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;box-shadow:inset 0 1px 0 hsla(0,0%,100%,.1),0 1px 0 hsla(0,0%,100%,.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media (min-width:840px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}}html.with-featherlight{overflow:hidden}.featherlight{display:none;position:fixed;top:0;right:0;bottom:0;left:0;z-index:2147483647;text-align:center;white-space:nowrap;cursor:pointer;background:#333;background:transparent}.featherlight:last-of-type{background:rgba(0,0,0,.8)}.featherlight:before{content:"";display:inline-block;height:100%;vertical-align:middle}.featherlight .featherlight-content{position:relative;text-align:left;vertical-align:middle;display:inline-block;overflow:auto;padding:25px 25px 0;border-bottom:25px solid transparent;margin-left:5%;margin-right:5%;max-height:95%;background:#fff;cursor:auto;white-space:normal}.featherlight .featherlight-inner{display:block}.featherlight link.featherlight-inner,.featherlight script.featherlight-inner,.featherlight style.featherlight-inner{display:none}.featherlight .featherlight-close-icon{position:absolute;z-index:9999;top:0;right:0;line-height:25px;width:25px;cursor:pointer;text-align:center;font-family:Arial,sans-serif;background:#fff;background:hsla(0,0%,100%,.3);color:#000;border:none;padding:0}.featherlight .featherlight-close-icon::-moz-focus-inner{border:0;padding:0}.featherlight .featherlight-image{width:100%}.featherlight-iframe .featherlight-content{border-bottom:0;padding:0;-webkit-overflow-scrolling:touch}.featherlight iframe{border:none}.featherlight *{box-sizing:border-box}@media only screen and (max-width:1024px){.featherlight .featherlight-content{margin-left:0;margin-right:0;max-height:98%;padding:10px 10px 0;border-bottom:10px solid transparent}}@media print{html.with-featherlight>*>:not(.featherlight){display:none}} + +/*! + * jQuery contextMenu - Plugin for simple contextMenu handling + * + * Version: v1.10.3 + * + * Authors: Björn Brala (SWIS.nl), Rodney Rehm, Addy Osmani (patches for FF) + * Web: http://swisnl.github.io/jQuery-contextMenu/ + * + * Copyright (c) 2011-2015 SWIS BV and contributors + * + * Licensed under + * MIT License http://www.opensource.org/licenses/mit-license + + * Date: 2015-12-03T20:12:18.263Z + */.context-menu-list{position:absolute;display:inline-block;min-width:120px;max-width:250px;padding:0;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:11px;list-style-type:none;background:#eee;border:1px solid #ddd;box-shadow:0 2px 5px rgba(0,0,0,.5)}.context-menu-item{padding:2px 2px 2px 24px;-moz-user-select:none;background-color:#eee}.context-menu-item>label>input,.context-menu-item>label>textarea{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.context-menu-item.hover{cursor:pointer;background-color:#39f}.context-menu-item.disabled{color:#666}.context-menu-submenu:after{position:absolute;top:0;right:3px;z-index:1;color:#666;content:">"}.context-menu-item.icon{min-height:18px;list-style-type:none;background-repeat:no-repeat;background-position:4px 2px}.context-menu-item.icon-edit{background-image:url(images/page_white_edit.png)}.context-menu-item.icon-cut{background-image:url(images/cut.png)}.context-menu-item.icon-copy{background-image:url(images/page_white_copy.png)}.context-menu-item.icon-paste{background-image:url(images/page_white_paste.png)}.context-menu-item.icon-delete{background-image:url(images/page_white_delete.png)}.context-menu-item.icon-add{background-image:url(images/page_white_add.png)}.context-menu-item.icon-quit{background-image:url(images/door.png)}.context-menu-input>label>*{vertical-align:top}.context-menu-input>label>input[type=checkbox],.context-menu-input>label>input[type=radio]{margin-left:-17px}.context-menu-input>label>span{margin-left:5px}.context-menu-input>label,.context-menu-input>label>input[type=text],.context-menu-input>label>select,.context-menu-input>label>textarea{display:block;width:100%;box-sizing:border-box}.context-menu-input>label>textarea{height:100px}.context-menu-item>.context-menu-list{top:5px;right:-5px;display:none}.context-menu-item.visible>.context-menu-list{display:block}.context-menu-accesskey{text-decoration:underline}*,:after,:before{box-sizing:border-box}body,html{font-family:Open Sans,sans-serif;font-size:100%;padding:0;margin:0;height:100%}body{padding-top:32px;font-weight:200;background:#ececec;overflow:-moz-scrollbars-vertical}.btn{background-image:none!important;text-shadow:none!important;border-color:none!important;box-shadow:none!important}.btn:focus{outline:none}.btn-inverse{background-image:none!important;background:#333}pre.no-prettify,pre.prettyprint{height:300px;margin:0!important;width:100%!important;overflow:scroll;border-radius:0!important}.input-append .add-on:last-child,.input-append .btn-group:last-child>.dropdown-toggle,.input-append .btn:last-child{border-radius:0!important}[class*=" rficon-"],[class^=rficon-]{display:inline-block;width:16px;height:16px;margin-top:1px;*margin-right:.3em;line-height:16px;vertical-align:text-top;background-position:0 0;background-repeat:no-repeat}.rficon-clipboard-apply{background-image:url(../img/clipboard_apply.png)}.rficon-clipboard-clear{background-image:url(../img/clipboard_clear.png)}.rficon-upload{background-image:url(../img/upload.png)}.btn{border-radius:0}.container-fluid{padding-right:0!important;margin-top:10px!important}.img-precontainer{width:100%;background:#fff}.img-container,.img-precontainer{margin:auto;text-align:center;border:none}.img-container{height:91px;width:122px;padding:0;overflow:hidden;display:table-cell;vertical-align:middle;background-image:url(../img/trans.jpg);background-size:13px}.img-container img{max-width:122px;max-height:91px}ul.breadcrumb{margin-bottom:5px;border-radius:0;padding-bottom:4px;padding-top:6px;background:#f0f0f0;box-shadow:0 1px 4px rgba(0,0,0,.065);border-bottom:1px solid #bbb}ul.breadcrumb .pull-left i{margin-top:2px}ul.breadcrumb li.multiple{margin-top:-4px;padding-right:20px}.alert{padding:8px 35px 8px 14px;margin-bottom:2px;border:1px solid #aaa;color:#666;font-weight:200;font-size:13px;border-radius:0;background:#fff}.img-container *,.img-container-mini *{vertical-align:middle}#help{display:none}.text-center{text-align:center}iframe{overflow:auto;-webkit-overflow-scrolling:touch}.uploader{position:fixed;top:6px;left:6px;right:6px;bottom:6px;z-index:9999;background:#eee;border:1px solid #ccc;display:none;box-shadow:0 0 10px 0 rgba(1,1,1,.5)}.uploader .flex{padding:10px;position:relative}.uploader .container1,.uploader .container2,.uploader .flex{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%}.uploader .upload-help{font-size:11px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff;text-align:center}.uploader .upload-tabbable{padding:2px;height:100%;overflow:hidden}.uploader .upload-tabbable .nav{margin:0}.uploader .upload-tabbable .nav li a{font-size:13px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.uploader .upload-tabbable #urlUpload{padding:5px 10px}.uploader .upload-tabbable .tab-content{padding:5px;border-bottom:1px solid #ddd;border-left:1px solid #ddd;border-right:1px solid #ddd;background:#fff;-ms-flex-positive:2;flex-grow:2;position:relative}.uploader .upload-tabbable .tab-content .tab-pane{position:absolute;top:0;bottom:0;left:0;right:0;padding:5px}.uploader .upload-tabbable .tab-content form{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%}.uploader .upload-tabbable .tab-content form #filesTable{-ms-flex-positive:2;flex-grow:2;overflow-y:scroll;background:#fff;font-size:.95em}.uploader .upload-tabbable .tab-content form #filesTable .progress{margin-bottom:4px}input#filter-input{margin:0 0 2px;width:84px;height:26px;vertical-align:bottom;border-radius:0;font-size:12px;font-weight:200;position:relative;left:1px}.qq-uploader .span9{margin-left:14px!important;width:690px!important}.space10{clear:both;height:10px}h4{font-size:12px;text-align:center;padding:0;margin:6px 0 0;line-height:18px}h3,h4{font-weight:200}h3{font-size:14px}.boxes{border:1px solid #ccc;word-wrap:break-word;background:#fff;box-shadow:1px 1px 2px 0 rgba(0,0,0,.2);min-height:115px;text-align:center}.container-fluid{padding:0 10px!important}body .avpw .avpw_primary_button,body .avpw .avpw_primary_button:active,body .avpw .avpw_primary_button:link,body .avpw .avpw_primary_button:visited{color:#fff;background:#999;border:none}body .avpw .avpw_primary_button:hover{border:none;background:#666}.download-form{margin-bottom:25px}.grid li i{margin-left:2px;margin-right:2px;z-index:0}.box,.boxx{word-wrap:break-word;vertical-align:top;text-align:left;position:relative;z-index:100;padding:4px}.box,.box .btn,.boxx{border:none;box-shadow:none}.box .btn{width:100%;background:none;z-index:200}.navbar{margin-bottom:0;border-bottom:1px solid #bbb}.navbar .navbar-inner{border:none;min-height:35px;border-radius:0;padding-bottom:2px;margin:0;padding-right:8px;padding-left:8px}.navbar .navbar-inner .container-fluid{margin:0;margin-top:0!important;padding:0}.navbar .navbar-inner .container-fluid .brand{display:none}.navbar .navbar-inner .container-fluid .filters span{margin-top:0;font-size:13px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}ul.sorting{position:absolute;left:-25px;top:20px;min-width:0;background:#eee}ul.sorting li a:hover{background:#aaa}.btn-group .dropdown-toggle.sorting-btn{position:relative;top:-5px;font-size:13px}.btn-group .dropdown-toggle.sorting-btn,.btn-group .dropdown-toggle.sorting-btn:hover{background:none;border:none;box-shadow:none;-webkit-box-shadow:none}ul.sorting.dropdown-menu>li>a{font-size:12px;text-shadow:none}ul.sorting.dropdown-menu>li>a.descending{background-image:url(../img/down.png);background-repeat:no-repeat;background-position:6px 8px}ul.sorting.dropdown-menu>li>a.ascending{background-image:url(../img/up.png);background-repeat:no-repeat;background-position:6px 8px}.sorter-container{margin-top:5px;margin-bottom:0;border-radius:0;padding-bottom:4px;padding-top:6px;box-shadow:0 1px 4px rgba(0,0,0,.065);background-color:#f5f5f5;position:relative;border-bottom:1px solid #bbb;height:24px}.sorter-container a.sorter{color:#000}.sorter-container a.descending{padding-left:9px;background-image:url(../img/down.png);background-repeat:no-repeat;background-position:0 3px}.sorter-container a.ascending{padding-left:9px;background-image:url(../img/up.png);background-repeat:no-repeat;background-position:0 4px}.sorter-container .file-date,.sorter-container .file-extension,.sorter-container .file-name,.sorter-container .file-operations,.sorter-container .file-size,.sorter-container .img-dimension{display:block;position:absolute;top:0;z-index:100;box-shadow:none;text-align:left;font-size:13px;margin-top:1px;color:#999}.sorter-container .file-operations{width:110px;right:0}.sorter-container .img-dimension{width:65px;right:123px}.sorter-container .file-date{width:70px;right:188px}.sorter-container .file-size{width:55px;right:258px}.sorter-container .file-extension{width:40px;right:313px}.sorter-container .file-name{width:50px;left:52px}.file-date,.file-extension,.file-name,.file-operations,.file-size,.img-dimension{font-size:12px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff;display:none}.view-controller{text-align:left}.view-controller .btn-group>.btn:first-child,.view-controller .btn-group>.btn:last-child{border-radius:0}.navbar .filters .btn{margin-bottom:2px;padding:2px 5px;margin-top:5px}.filters .types{text-align:right}.fileupload-buttonbar{margin-bottom:10px}.fileupload-buttonbar .progress{margin:0}@media (max-width:780px){#view2{display:none}}@media (min-width:840px){.mobile-inline-visible{display:none!important}}@media (max-width:839px){body{padding-top:0!important}.mobile-inline-visible{display:inline!important}.filters .types{text-align:left}.navbar .navbar-inner .container-fluid .brand{display:block}.navbar .navbar-inner{padding-bottom:4px}.filters div.span2.half,.filters div.span3.half,.filters div.span4.half{float:left;width:auto;margin-right:10px}.filters div.entire{float:none;width:100%;clear:both}.container-fluid{margin:0!important;padding:0}#qLbar{height:50px!important}}@media (min-width:400px) and (max-width:839px){.filters .row-fluid .half{width:48.61878453038674%;*width:48.56559304102504%;float:left}}.tooltip.in{opacity:1;filter:alpha(opacity=1)}.tooltip,.tooltip.in{z-index:10000;font-weight:700}.grid{padding:0;margin:0 auto;list-style:none;-webkit-overflow-scrolling:touch}.ui-draggable-helper{z-index:10}.grid li{display:inline-block;width:124px;border:none;margin:4px;margin-bottom:8px;padding:0;vertical-align:top}.grid figure{margin:0;position:relative;display:block;width:122px;margin:auto}.grid figure:hover{background:#e0e0e0!important}.list-view1.grid li,.list-view1.grid li figure{width:100%}.grid figcaption{text-align:center;padding:2px;padding-top:8px;color:#fff;height:30px;width:122px;margin-left:0;margin-right:0;position:absolute;top:auto;bottom:0;box-shadow:inset 0 0 8px 0 rgba(41,41,41,.5)}.grid figcaption a{margin:0;padding:3px}.grid figcaption h3{margin:0;padding:0;color:#fff}.grid h4{text-align:center;color:#000;padding:0;margin-bottom:4px;margin-top:4px}.grid figure .box{box-sizing:content-box;cursor:pointer}.list-view0.grid figure .box,.list-view1.grid figure .box,.list-view2.grid figure .box{max-width:100%;display:block;position:relative;overflow:hidden;z-index:1}.list-view0.grid figure .box h4.ellipsis,.list-view1.grid figure .box h4.ellipsis,.list-view2.grid figure .box h4.ellipsis{height:18px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.list-view0.grid figure .box h4,.list-view0.grid figure .box h4 a,.list-view1.grid figure .box h4,.list-view1.grid figure .box h4 a,.list-view2.grid figure .box h4,.list-view2.grid figure .box h4 a{z-index:1}.no-touch .list-view0 figure .box{z-index:1;transition:transform .3s}.list-view0.grid .ui-state-highlight .img-precontainer{background:grey!important}.list-view0.grid .ui-state-highlight .img-precontainer .img-container{background:repeating-linear-gradient(45deg,transparent,transparent 5px,hsla(0,0%,100%,.4) 0,hsla(0,0%,100%,.3) 10px);border:none;overflow:hidden}.list-view0.grid .ui-state-hover .img-precontainer .img-container{background:#666}.list-view1.grid .ui-state-highlight:nth-child(odd) figure,.list-view2.grid .ui-state-highlight:nth-child(odd) figure{background:#ddd!important;border-bottom-color:#444!important}.list-view1.grid .ui-state-highlight:nth-child(2n) figure,.list-view2.grid .ui-state-highlight:nth-child(2n) figure{background:#ccc!important;border-bottom-color:#aaa!important}.list-view1.grid .ui-state-highlight.ui-state-hover figure,.list-view2.grid .ui-state-highlight.ui-state-hover figure{background-color:#aaa!important}.no-touch .list-view0 figure.cs-hover .box,.no-touch .list-view0 figure:hover .box{box-shadow:0 0 4px 0 rgba(1,1,1,.5);transform:translateY(-26px)}.list-view0 figure.cs-hover .box.no-effect,.list-view0 figure:hover .box.no-effect,.no-effect{box-shadow:none;transform:none}.list-view0 .img-precontainer-mini{display:none;background:none}a,a:hover{color:#000;text-decoration:none}.back-directory .box,.back-directory .img-precontainer,.back-directory .img-precontainer-mini{background:none}form{margin:0;padding:0}.google-iframe,.viewer-iframe{width:100%;height:500px;border:none}.modal{width:60%;margin-left:-30%}.modal-body{padding:6px}.modal-body form,.modal-body input,.modal-body textarea{margin:0;border-radius:0}.modal-body .text-center{padding-bottom:6px}.modal-footer{padding:7px}.modal-header{padding:7px 8px!important}.modal-header h3{font-weight:300;font-size:20px}.list-view1.sorter-container{display:block}.list-view0.sorter-container,.list-view2.sorter-container{display:none}.selector{z-index:1}.selector .cont{display:block;position:relative;padding-left:35px;margin-bottom:12px;cursor:pointer;font-size:22px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.selector .cont input{position:absolute;opacity:0;cursor:pointer}.selector .cont input:checked~.checkmark{background-color:#2196f3}.selector .cont .checkmark{position:absolute;top:0;left:0;height:18px;width:18px;background-color:#fff;border:1px solid #ddd;transition:background-color .5s ease;-webkit-transition:background-color .5s ease-out;-moz-transition:background-color .5s ease-out;-o-transition:background-color .5s ease-out}.selector .cont .checkmark:after{content:"";position:absolute;display:none;left:5px;top:1px;width:6px;height:12px;border:solid #fff;border-width:0 3px 3px 0;transform:rotate(45deg)}.selector .cont:hover input~.checkmark{background-color:#ddd}.selector .cont input:checked~.checkmark:after{display:block}.list-view0.grid .selector{position:absolute;top:2px;left:2px;width:18px;height:22px}.list-view0.grid .img-precontainer .img-container img{max-width:122px!important;max-height:91px!important}.list-view0.grid .img-precontainer .img-container img.icon{width:122px;margin-top:0}.list-view0.grid .img-precontainer .filetype{position:absolute;top:0;width:122px;text-align:center;color:#fff;font-size:13px;line-height:22px}.list-view0.grid .cover{background:hsla(0,0%,100%,.25);width:122px;position:absolute;top:22px;right:0;height:69px}.list-view0.grid .box{background:#fff}.list-view0.grid .directory{background:#ddd}.list-view0.grid figure.back-directory .directory{background:#bbb}.list-view0.grid figcaption{background:#fff}.list-view0.grid .selected figure{border:none;height:126px}.list-view0.grid .selected figure .box,.list-view0.grid .selected figure>a,.list-view0.grid .selected figure figcaption{display:none}.list-view1.grid li,.list-view2.grid li{margin:0}.list-view1.grid li.back figure.back-directory,.list-view2.grid li.back figure.back-directory{height:34px}.list-view1.grid li.no-selector .img-container-mini,.list-view2.grid li.no-selector .img-container-mini{padding-left:0}.list-view1.grid li.no-selector figure .box,.list-view2.grid li.no-selector figure .box{margin-left:48px}.list-view1.grid li:nth-child(odd) figure,.list-view2.grid li:nth-child(odd) figure{background:#f9f9f9}.list-view1.grid li:nth-child(odd) figure.directory,.list-view2.grid li:nth-child(odd) figure.directory{background:#eaeaea}.list-view1.grid li figure,.list-view2.grid li figure{border-bottom:1px solid #aaa;background:#fff}.list-view1.grid li figure.back-directory,.list-view2.grid li figure.back-directory{background:#bbb}.list-view1.grid li figure.back-directory .box,.list-view2.grid li figure.back-directory .box{background:none}.list-view1.grid li figure.directory,.list-view2.grid li figure.directory{background:#efefef}.list-view1.grid li figure.directory box,.list-view2.grid li figure.directory box{padding:0;min-height:10px}.list-view1.grid li figure .box,.list-view2.grid li figure .box{margin-left:70px;transition:none}.list-view1.grid li figure .box h4,.list-view2.grid li figure .box h4{padding-top:1px;font-size:13px;text-align:left}.list-view1.grid .img-precontainer-mini,.list-view2.grid .img-precontainer-mini{display:block;position:absolute;width:45px;left:22px;height:34px;overflow:hidden;text-align:center}.list-view1.grid .img-precontainer-mini img,.list-view2.grid .img-precontainer-mini img{max-width:45px;width:45px}.list-view1.grid .img-precontainer-mini .filetype,.list-view2.grid .img-precontainer-mini .filetype{position:absolute;top:1px;left:0;text-align:center;padding:1px 2px;font-size:13px;line-height:32px;width:45px;height:32px;color:#fff;background:#333}.list-view1.grid .cover,.list-view2.grid .cover{display:none}.list-view1.grid .selector,.list-view2.grid .selector{top:8px;left:2px;position:relative}.list-view1.grid .selector .cont,.list-view2.grid .selector .cont{margin:0}.list-view1.grid .img-container-mini,.list-view2.grid .img-container-mini{width:45px;height:34px;border:none;overflow:hidden;text-align:center;vertical-align:middle;margin:auto;left:24px}.list-view1.grid .img-precontainer-mini.original-thumb,.list-view2.grid .img-precontainer-mini.original-thumb{padding:0}.list-view1.grid .img-precontainer-mini.original-thumb img,.list-view2.grid .img-precontainer-mini.original-thumb img{width:auto;max-height:32px}.list-view1.grid .img-precontainer-mini.original-thumb img.original,.list-view2.grid .img-precontainer-mini.original-thumb img.original{width:auto;height:auto}.list-view1.grid .img-precontainer,.list-view2.grid .img-precontainer{display:none}.list-view1.grid figcaption,.list-view2.grid figcaption{background:none;width:120px;position:absolute;right:0;top:0;z-index:1;bottom:0;box-shadow:none;text-align:right}.list-view1.grid .selected figure,.list-view2.grid .selected figure{background:#ccc!important}.list-view1.grid .file-date,.list-view1.grid .file-extension,.list-view1.grid .file-size,.list-view1.grid .img-dimension{overflow:hidden;display:block;position:absolute;top:0;z-index:1;box-shadow:none;text-align:left;margin-top:7px}.list-view1.grid .img-dimension{width:65px;right:120px}.list-view1.grid .file-date{width:70px;right:185px}.list-view1.grid .file-size{width:55px;right:255px}.list-view1.grid .file-extension{width:40px;right:310px}.list-view1.grid figure .box{padding-right:352px}.list-view2.grid figure .box{padding-right:115px}@media (max-width:610px){.list-view1.grid figure .box{padding-right:312px}.list-view1.grid figure .file-extension,.sorter-container .file-extension{display:none}}@media (max-width:565px){.list-view1.grid figure .box{padding-right:257px}.list-view1.grid figure .file-size,.sorter-container .file-size{display:none}}@media (max-width:495px){.list-view1.grid figure .box{padding-right:187px}.list-view1.grid figure .file-date,.sorter-container .file-date{display:none}}@media (max-width:430px){.list-view1.grid figure .box{padding-right:115px}.list-view1.grid figure .img-dimension,.sorter-container .img-dimension{display:none}.breadcrumb{margin-left:0;margin-right:0}}.list-view1.grid .img-precontainer-mini .filetype.pdf,.list-view2.grid .img-precontainer-mini .filetype.pdf{background:#cb0011}.list-view1.grid .img-precontainer-mini .filetype.css,.list-view2.grid .img-precontainer-mini .filetype.css{background:#d10698}.list-view1.grid .img-precontainer-mini .filetype.ai,.list-view2.grid .img-precontainer-mini .filetype.ai{background:#d6772f}.list-view1.grid .img-precontainer-mini .filetype.psd,.list-view2.grid .img-precontainer-mini .filetype.psd{background:#0960a4}.list-view1.grid .img-precontainer-mini .filetype.html,.list-view1.grid .img-precontainer-mini .filetype.xhtml,.list-view2.grid .img-precontainer-mini .filetype.html,.list-view2.grid .img-precontainer-mini .filetype.xhtml{background:#035bc4}.list-view1.grid .img-precontainer-mini .filetype.fla,.list-view1.grid .img-precontainer-mini .filetype.flv,.list-view2.grid .img-precontainer-mini .filetype.fla,.list-view2.grid .img-precontainer-mini .filetype.flv{background:#cf302e}.list-view1.grid .img-precontainer-mini .filetype.ppt,.list-view1.grid .img-precontainer-mini .filetype.pptx,.list-view2.grid .img-precontainer-mini .filetype.ppt,.list-view2.grid .img-precontainer-mini .filetype.pptx{background:#da5b00}.list-view1.grid .img-precontainer-mini .filetype.css,.list-view1.grid .img-precontainer-mini .filetype.xls,.list-view1.grid .img-precontainer-mini .filetype.xlsx,.list-view2.grid .img-precontainer-mini .filetype.css,.list-view2.grid .img-precontainer-mini .filetype.xls,.list-view2.grid .img-precontainer-mini .filetype.xlsx{background:#1a712c}.list-view1.grid .img-precontainer-mini .filetype.doc,.list-view1.grid .img-precontainer-mini .filetype.docx,.list-view1.grid .img-precontainer-mini .filetype.rts,.list-view2.grid .img-precontainer-mini .filetype.doc,.list-view2.grid .img-precontainer-mini .filetype.docx,.list-view2.grid .img-precontainer-mini .filetype.rts{background:#002093}.list-view1.grid .img-precontainer-mini .filetype.gzip,.list-view1.grid .img-precontainer-mini .filetype.rar,.list-view1.grid .img-precontainer-mini .filetype.zip,.list-view2.grid .img-precontainer-mini .filetype.gzip,.list-view2.grid .img-precontainer-mini .filetype.rar,.list-view2.grid .img-precontainer-mini .filetype.zip{background:#fe9221}.list-view1.grid .img-precontainer-mini .filetype.avi,.list-view1.grid .img-precontainer-mini .filetype.mov,.list-view1.grid .img-precontainer-mini .filetype.mp4,.list-view1.grid .img-precontainer-mini .filetype.mpeg,.list-view1.grid .img-precontainer-mini .filetype.mpg,.list-view1.grid .img-precontainer-mini .filetype.webm,.list-view1.grid .img-precontainer-mini .filetype.wma,.list-view2.grid .img-precontainer-mini .filetype.avi,.list-view2.grid .img-precontainer-mini .filetype.mov,.list-view2.grid .img-precontainer-mini .filetype.mp4,.list-view2.grid .img-precontainer-mini .filetype.mpeg,.list-view2.grid .img-precontainer-mini .filetype.mpg,.list-view2.grid .img-precontainer-mini .filetype.webm,.list-view2.grid .img-precontainer-mini .filetype.wma{background:#31231e}.list-view1.grid .img-precontainer-mini .filetype.ac3,.list-view1.grid .img-precontainer-mini .filetype.aiff,.list-view1.grid .img-precontainer-mini .filetype.m4a,.list-view1.grid .img-precontainer-mini .filetype.mid,.list-view1.grid .img-precontainer-mini .filetype.mp3,.list-view1.grid .img-precontainer-mini .filetype.ogg,.list-view1.grid .img-precontainer-mini .filetype.wav,.list-view2.grid .img-precontainer-mini .filetype.ac3,.list-view2.grid .img-precontainer-mini .filetype.aiff,.list-view2.grid .img-precontainer-mini .filetype.m4a,.list-view2.grid .img-precontainer-mini .filetype.mid,.list-view2.grid .img-precontainer-mini .filetype.mp3,.list-view2.grid .img-precontainer-mini .filetype.ogg,.list-view2.grid .img-precontainer-mini .filetype.wav{background:#9f008b}.list-view1.grid .img-precontainer-mini .filetype.odb,.list-view1.grid .img-precontainer-mini .filetype.odf,.list-view1.grid .img-precontainer-mini .filetype.odg,.list-view1.grid .img-precontainer-mini .filetype.odp,.list-view1.grid .img-precontainer-mini .filetype.ods,.list-view1.grid .img-precontainer-mini .filetype.odt,.list-view1.grid .img-precontainer-mini .filetype.otg,.list-view1.grid .img-precontainer-mini .filetype.otp,.list-view1.grid .img-precontainer-mini .filetype.ots,.list-view1.grid .img-precontainer-mini .filetype.ott,.list-view2.grid .img-precontainer-mini .filetype.odb,.list-view2.grid .img-precontainer-mini .filetype.odf,.list-view2.grid .img-precontainer-mini .filetype.odg,.list-view2.grid .img-precontainer-mini .filetype.odp,.list-view2.grid .img-precontainer-mini .filetype.ods,.list-view2.grid .img-precontainer-mini .filetype.odt,.list-view2.grid .img-precontainer-mini .filetype.otg,.list-view2.grid .img-precontainer-mini .filetype.otp,.list-view2.grid .img-precontainer-mini .filetype.ots,.list-view2.grid .img-precontainer-mini .filetype.ott{background:#367bbe}.list-view1.grid .img-precontainer-mini .filetype.bmp,.list-view1.grid .img-precontainer-mini .filetype.gif,.list-view1.grid .img-precontainer-mini .filetype.jpeg,.list-view1.grid .img-precontainer-mini .filetype.jpg,.list-view1.grid .img-precontainer-mini .filetype.png,.list-view1.grid .img-precontainer-mini .filetype.svg,.list-view1.grid .img-precontainer-mini .filetype.tiff,.list-view2.grid .img-precontainer-mini .filetype.bmp,.list-view2.grid .img-precontainer-mini .filetype.gif,.list-view2.grid .img-precontainer-mini .filetype.jpeg,.list-view2.grid .img-precontainer-mini .filetype.jpg,.list-view2.grid .img-precontainer-mini .filetype.png,.list-view2.grid .img-precontainer-mini .filetype.svg,.list-view2.grid .img-precontainer-mini .filetype.tiff{background:#cfa554}.list-view1.grid .img-precontainer-mini .filetype.dmg,.list-view1.grid .img-precontainer-mini .filetype.iso,.list-view1.grid .img-precontainer-mini .filetype.log,.list-view1.grid .img-precontainer-mini .filetype.sql,.list-view1.grid .img-precontainer-mini .filetype.txt,.list-view1.grid .img-precontainer-mini .filetype.xml,.list-view2.grid .img-precontainer-mini .filetype.dmg,.list-view2.grid .img-precontainer-mini .filetype.iso,.list-view2.grid .img-precontainer-mini .filetype.log,.list-view2.grid .img-precontainer-mini .filetype.sql,.list-view2.grid .img-precontainer-mini .filetype.txt,.list-view2.grid .img-precontainer-mini .filetype.xml{background:#cacaca}.list-view1.grid .img-precontainer-mini .filetype.accdb,.list-view1.grid .img-precontainer-mini .filetype.ade,.list-view1.grid .img-precontainer-mini .filetype.adp,.list-view1.grid .img-precontainer-mini .filetype.mdb,.list-view2.grid .img-precontainer-mini .filetype.accdb,.list-view2.grid .img-precontainer-mini .filetype.ade,.list-view2.grid .img-precontainer-mini .filetype.adp,.list-view2.grid .img-precontainer-mini .filetype.mdb{background:#b61c19}.lightbox-content{overflow:hidden;padding:0;background:none;box-shadow:none;border-radius:0;border:0}.context-menu-list{font-family:Open Sans,sans-serif;width:200px;background:#fff;font-size:12px;margin:0;padding:5px}.context-menu-item{background-color:#fff;position:relative;height:auto;word-wrap:break-word;-webkit-user-select:none;-moz-user-select:0;-ms-user-select:none;user-select:none;padding:5px 5px 5px 30px}.context-menu-item:last-child{border:none}.context-menu-separator{padding-bottom:0;border-bottom:1px solid #ddd}.context-menu-item.hover{background-color:#ddd}.context-menu-input.hover,.context-menu-item.disabled.hover{cursor:default;background-color:#eee}.context-menu-item.icon{vertical-align:middle;background-position:4px 5px;width:auto;display:list-item}.context-menu-item.icon-edit{background-image:url(../img/file_edit.png)}.context-menu-item.icon-cut{background-image:url(../img/cut.png)}.context-menu-item.icon-copy{background-image:url(../img/copy.png)}.context-menu-item.icon-rename{background-image:url(../img/rename.png)}.context-menu-item.icon-preview{background-image:url(../img/preview.png)}.context-menu-item.icon-dimension{background-image:url(../img/dimension.png)}.context-menu-item.icon-date{background-image:url(../img/date.png)}.context-menu-item.icon-label{background-image:url(../img/label.png)}.context-menu-item.icon-size{background-image:url(../img/size.png)}.context-menu-item.icon-download{background-image:url(../img/download.png)}.context-menu-item.icon-paste{background-image:url(../img/page_white_paste.png)}.context-menu-item.icon-clipboard-apply{background-image:url(../img/clipboard_apply.png)}.context-menu-item.icon-delete{background-image:url(../img/page_white_delete.png)}.context-menu-item.icon-add{background-image:url(../img/page_white_add.png)}.context-menu-item.icon-quit{background-image:url(../img/door.png)}.context-menu-item.icon-info{background-image:url(../img/info.png)}.context-menu-item.icon-extract{background-image:url(../img/zip.png)}.context-menu-item.icon-url{background-image:url(../img/url.png)}.context-menu-item.icon-edit_img{background-image:url(../img/edit_img.png)}.context-menu-item.icon-duplicate{background-image:url(../img/duplicate.png)}.context-menu-item.icon-key{background-image:url(../img/key.png)}.dropzone{border:1px solid rgba(0,0,0,.03);min-height:360px;border-radius:3px;background:rgba(0,0,0,.03);padding:23px}.dropzone .dz-success *{cursor:pointer!important}.dropzone .dz-default.dz-message{opacity:1;-ms-filter:none;filter:none;transition:opacity .3s ease-in-out;background-repeat:no-repeat;background-position:0 0;position:absolute;width:428px;height:123px;margin-left:-214px;margin-top:-61.5px;top:50%;left:50%}.btn-primary,.btn-primary.disabled,.btn-primary[disabled]{background-color:#333}.btn-primary.active,.btn-primary:active,.btn-primary:focus,.btn-primary:hover{background-color:#222}.tui-image-editor-container{position:fixed;top:0;left:0;z-index:99999} \ No newline at end of file diff --git a/libraries/filemanager-9.14.2/dialog.php b/libraries/filemanager-9.14.2/dialog.php new file mode 100644 index 0000000..9a3d71f --- /dev/null +++ b/libraries/filemanager-9.14.2/dialog.php @@ -0,0 +1,1936 @@ + $newname, + 'uploaded' => 1, + 'url' => $config['base_url'].$config['upload_dir'].$newname, + ]); + exit(); + } +} + +if (isset($_POST['submit'])) { + include 'upload.php'; +} else { + $available_languages = include 'lang/languages.php'; + + list($preferred_language) = array_values( + array_filter( + [ + $_GET['lang'] ?? null, + $_SESSION['RF']['language'] ?? null, + $config['default_language'] + ] + ) + ); + + if (array_key_exists($preferred_language, $available_languages)) { + $_SESSION['RF']['language'] = $preferred_language; + } else { + $_SESSION['RF']['language'] = $config['default_language']; + } +} + +include 'include/utils.php'; + +$subdir_path = ''; + +if (isset($_GET['fldr']) && !empty($_GET['fldr'])) { + $subdir_path = rawurldecode(trim(strip_tags($_GET['fldr']), "/")); +} elseif (isset($_SESSION['RF']['fldr']) && !empty($_SESSION['RF']['fldr'])) { + $subdir_path = rawurldecode(trim(strip_tags($_SESSION['RF']['fldr']), "/")); +} + +if (checkRelativePath($subdir_path)) { + $subdir = strip_tags($subdir_path) . "/"; + $_SESSION['RF']['fldr'] = $subdir_path; + $_SESSION['RF']["filter"] = ''; +} else { + $subdir = ''; +} + +if ($subdir == "") { + if (!empty($_COOKIE['last_position']) && strpos($_COOKIE['last_position'], '.') === false) { + $subdir = trim($_COOKIE['last_position']); + } +} +//remember last position +setcookie('last_position', $subdir, time() + (86400 * 7)); + +if ($subdir == "/") { + $subdir = ""; +} + +// If hidden folders are specified +if (count($config['hidden_folders'])) { + // If hidden folder appears in the path specified in URL parameter "fldr" + $dirs = explode('/', $subdir); + foreach ($dirs as $dir) { + if ($dir !== '' && in_array($dir, $config['hidden_folders'])) { + // Ignore the path + $subdir = ""; + break; + } + } +} + +if ($config['show_total_size']) { + list($sizeCurrentFolder, $fileCurrentNum, $foldersCurrentCount) = folder_info($config['current_path'], false); +} + +/*** + * SUB-DIR CODE + ***/ +if (!isset($_SESSION['RF']["subfolder"])) { + $_SESSION['RF']["subfolder"] = ''; +} +$rfm_subfolder = ''; + +if (!empty($_SESSION['RF']["subfolder"]) + && strpos($_SESSION['RF']["subfolder"], "/") !== 0 + && strpos($_SESSION['RF']["subfolder"], '.') === false +) { + $rfm_subfolder = $_SESSION['RF']['subfolder']; +} + +if ($rfm_subfolder != "" && $rfm_subfolder[strlen($rfm_subfolder) - 1] != "/") { + $rfm_subfolder .= "/"; +} + +$ftp = ftp_con($config); + +if (($ftp && !$ftp->isDir( + $config['ftp_base_folder'] . $config['upload_dir'] . $rfm_subfolder . $subdir + )) || (!$ftp && !file_exists($config['current_path'] . $rfm_subfolder . $subdir))) { + $subdir = ''; + $rfm_subfolder = ""; +} + + +$cur_dir = $config['upload_dir'] . $rfm_subfolder . $subdir; +$cur_dir_thumb = $config['thumbs_upload_dir'] . $rfm_subfolder . $subdir; +$thumbs_path = $config['thumbs_base_path'] . $rfm_subfolder . $subdir; +$parent = $rfm_subfolder . $subdir; + +if ($ftp) { + $cur_dir = $config['ftp_base_folder'] . $cur_dir; + $cur_dir_thumb = $config['ftp_base_folder'] . $cur_dir_thumb; + $thumbs_path = str_replace(['/..', '..'], '', $cur_dir_thumb); + $parent = $config['ftp_base_folder'] . $parent; +} + +if (!$ftp) { + $cycle = true; + $max_cycles = 50; + $i = 0; + while ($cycle && $i < $max_cycles) { + $i++; + + if ($parent == "./") { + $parent = ""; + } + + if (file_exists($config['current_path'] . $parent . "config.php")) { + $configMain = $config; + $configTemp = include $config['current_path'] . $parent . 'config.php'; + if (is_array($configTemp) && count($configTemp) > 0) { + $config = array_merge($configMain, $configTemp); + $config['ext'] = array_merge( + $config['ext_img'], + $config['ext_file'], + $config['ext_misc'], + $config['ext_video'], + $config['ext_music'] + ); + } else { + $config = $configMain; + } + $cycle = false; + } + + if ($parent == "") { + $cycle = false; + } else { + $parent = fix_dirname($parent) . "/"; + } + } + + if (!is_dir($thumbs_path)) { + create_folder(false, $thumbs_path, $ftp, $config); + } +} + +$multiple = null; + +if (isset($_GET['multiple'])) { + if ($_GET['multiple'] == 1) { + $multiple = 1; + $config['multiple_selection'] = true; + $config['multiple_selection_action_button'] = true; + } elseif ($_GET['multiple'] == 0) { + $multiple = 0; + $config['multiple_selection'] = false; + $config['multiple_selection_action_button'] = false; + } +} + +if (isset($_GET['callback'])) { + $callback = strip_tags($_GET['callback']); + $_SESSION['RF']["callback"] = $callback; +} else { + $callback = 0; + + if (isset($_SESSION['RF']["callback"])) { + $callback = $_SESSION['RF']["callback"]; + } +} + +$popup = isset($_GET['popup']) ? strip_tags($_GET['popup']) : 0; +//Sanitize popup +$popup = !!$popup; + +$crossdomain = isset($_GET['crossdomain']) ? strip_tags($_GET['crossdomain']) : 0; +//Sanitize crossdomain +$crossdomain = !!$crossdomain; + +//view type +if (!isset($_SESSION['RF']["view_type"])) { + $view = $config['default_view']; + $_SESSION['RF']["view_type"] = $view; +} + +if (isset($_GET['view'])) { + $view = fix_get_params($_GET['view']); + $_SESSION['RF']["view_type"] = $view; +} + +$view = $_SESSION['RF']["view_type"]; + +//filter +$filter = ""; +if (isset($_SESSION['RF']["filter"])) { + $filter = $_SESSION['RF']["filter"]; +} + +if (isset($_GET["filter"])) { + $filter = fix_get_params($_GET["filter"]); +} + +if (!isset($_SESSION['RF']['sort_by'])) { + $_SESSION['RF']['sort_by'] = 'name'; +} + +if (isset($_GET["sort_by"])) { + $sort_by = $_SESSION['RF']['sort_by'] = fix_get_params($_GET["sort_by"]); +} else { + $sort_by = $_SESSION['RF']['sort_by']; +} + +if (!isset($_SESSION['RF']['descending'])) { + $_SESSION['RF']['descending'] = true; +} + +if (isset($_GET["descending"])) { + $descending = $_SESSION['RF']['descending'] = fix_get_params($_GET["descending"]) == 1; +} else { + $descending = $_SESSION['RF']['descending']; +} + +$boolarray = [false => 'false', true => 'true']; + +$return_relative_url = isset($_GET['relative_url']) && $_GET['relative_url'] == "1"; + +if (!isset($_GET['type'])) { + $_GET['type'] = 0; +} + +$extensions = null; +if (isset($_GET['extensions'])) { + $extensions = json_decode(urldecode($_GET['extensions'])); + $ext_tmp = []; + foreach ($extensions as $extension) { + $extension = fix_strtolower($extension); + if (check_file_extension($extension, $config)) { + $ext_tmp[] = $extension; + } + } + if ($extensions) { + $ext = $ext_tmp; + $config['ext'] = $ext_tmp; + $config['show_filter_buttons'] = false; + } +} + +if (isset($_GET['editor'])) { + $editor = strip_tags($_GET['editor']); +} else { + $editor = $_GET['type'] == 0 ? null : 'tinymce'; +} + +$field_id = isset($_GET['field_id']) ? fix_get_params($_GET['field_id']) : null; +$type_param = fix_get_params($_GET['type']); +$apply = null; + +if ($multiple) { + $apply = 'apply_multiple'; +} + +if ($type_param == 1) { + $apply_type = 'apply_img'; +} elseif ($type_param == 2) { + $apply_type = 'apply_link'; +} elseif ($type_param == 0 && !$field_id) { + $apply_type = 'apply_none'; +} elseif ($type_param == 3) { + $apply_type = 'apply_video'; +} else { + $apply_type = 'apply'; +} + +if (!$apply) { + $apply = $apply_type; +} + +$get_params = [ + 'editor' => $editor, + 'type' => $type_param, + 'lang' => $lang, + 'popup' => $popup, + 'crossdomain' => $crossdomain, + 'extensions' => ($extensions) ? urlencode(json_encode($extensions)) : null, + 'field_id' => $field_id, + 'multiple' => $multiple, + 'relative_url' => $return_relative_url, + 'akey' => (isset($_GET['akey']) && $_GET['akey'] != '' ? $_GET['akey'] : 'key') +]; +if (isset($_GET['CKEditorFuncNum'])) { + $get_params['CKEditorFuncNum'] = $_GET['CKEditorFuncNum']; + $get_params['CKEditor'] = ($_GET['CKEditor'] ?? ''); +} +$get_params['fldr'] = ''; + +$get_params = http_build_query($get_params); +?> + + + + + + + + Responsive FileManager + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +"/> +"/> +"/> +"/> + + + + +
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+ +
+ +
+
+
+ +
+
+
+ + + + + + + + + +
+
+ +
+ + + +
+
+
+
+ + + + + +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+ + + +
+ + scanDir($config['ftp_base_folder'] . $config['upload_dir'] . $rfm_subfolder . $subdir); + if (!$ftp->isDir($config['ftp_base_folder'] . $config['ftp_thumbs_dir'] . $rfm_subfolder . $subdir)) { + create_folder( + false, + $config['ftp_base_folder'] . $config['ftp_thumbs_dir'] . $rfm_subfolder . $subdir, + $ftp, + $config + ); + } + } catch (FtpClient\FtpException $e) { + echo "Error: "; + echo $e->getMessage(); + echo "
Please check configurations"; + die(); + } + } else { + $files = scandir($config['current_path'] . $rfm_subfolder . $subdir); + } + + $n_files = count($files); + + //php sorting + $sorted = []; + //$current_folder=array(); + //$prev_folder=array(); + $current_files_number = 0; + $current_folders_number = 0; + + foreach ($files as $k => $file) { + if ($ftp) { + $date = strtotime($file['day'] . " " . $file['month'] . " " . date('Y') . " " . $file['time']); + $size = $file['size']; + if ($file['type'] == 'file') { + $current_files_number++; + $file_ext = substr(strrchr($file['name'], '.'), 1); + $is_dir = false; + } else { + $current_folders_number++; + $file_ext = trans('Type_dir'); + $is_dir = true; + } + $sorted[$k] = [ + 'is_dir' => $is_dir, + 'file' => $file['name'], + 'file_lcase' => strtolower($file['name']), + 'date' => $date, + 'size' => $size, + 'permissions' => $file['permissions'], + 'extension' => fix_strtolower($file_ext) + ]; + } else { + if ($file != "." && $file != "..") { + if (is_dir($config['current_path'] . $rfm_subfolder . $subdir . $file)) { + $date = filemtime($config['current_path'] . $rfm_subfolder . $subdir . $file); + if (!($file == '.' || substr($file, 0, 1) == '.' || + (isset($file_array['extension']) && $file_array['extension'] == fix_strtolower( + trans('Type_dir') + )) || + (isset($file_array['extension']) && $file_array['extension'] != fix_strtolower( + trans('Type_dir') + )) || + ($file == '..' && $subdir == '') || + in_array($file, $config['hidden_folders']) || + ($filter != '' && $n_files > $config['file_number_limit_js'] && $file != ".." && stripos( + $file, + $filter + ) === false))) { + $current_folders_number++; + } + if ($config['show_folder_size']) { + list($size, $nfiles, $nfolders) = folder_info( + $config['current_path'] . $rfm_subfolder . $subdir . $file, + false + ); + } else { + $size = 0; + } + $file_ext = trans('Type_dir'); + $sorted[$k] = [ + 'is_dir' => true, + 'file' => $file, + 'file_lcase' => strtolower($file), + 'date' => $date, + 'size' => $size, + 'permissions' => '', + 'extension' => fix_strtolower($file_ext) + ]; + + if ($config['show_folder_size']) { + $sorted[$k]['nfiles'] = $nfiles; + $sorted[$k]['nfolders'] = $nfolders; + } + } else { + $current_files_number++; + $file_path = $config['current_path'] . $rfm_subfolder . $subdir . $file; + $date = filemtime($file_path); + $size = filesize($file_path); + $file_ext = substr(strrchr($file, '.'), 1); + $sorted[$k] = [ + 'is_dir' => false, + 'file' => $file, + 'file_lcase' => strtolower($file), + 'date' => $date, + 'size' => $size, + 'permissions' => '', + 'extension' => strtolower($file_ext) + ]; + } + } + } + } + + switch ($sort_by) { + case 'date': + //usort($sorted, 'dateSort'); + usort($sorted, function($x, $y) use ($descending) { + if ($x['is_dir'] !== $y['is_dir']) { + return $y['is_dir'] ? 1 : -1; + } else { + return ($descending) + ? $x['date'] <=> $y['date'] + : $y['date'] <=> $x['date']; + } + }); + break; + case 'size': + //usort($sorted, 'sizeSort'); + usort($sorted, function($x, $y) use ($descending) { + if ($x['is_dir'] !== $y['is_dir']) { + return $y['is_dir'] ? 1 : -1; + } else { + return ($descending) + ? $x['size'] <=> $y['size'] + : $y['size'] <=> $x['size']; + } + }); + break; + case 'extension': + //usort($sorted, 'extensionSort'); + usort($sorted, function($x, $y) use ($descending) { + if ($x['is_dir'] !== $y['is_dir']) { + return $y['is_dir'] ? 1 : -1; + } else { + return ($descending) + ? $x['extension'] <=> $y['extension'] + : $y['extension'] <=> $x['extension']; + } + }); + break; + default: + // usort($sorted, 'filenameSort'); + usort($sorted, function($x, $y) use ($descending) { + if ($x['is_dir'] !== $y['is_dir']) { + return $y['is_dir'] ? 1 : -1; + } else { + return ($descending) + ? ($x['file_lcase'] < $y['file_lcase'] ? 1 : ($x['file_lcase'] == $y['file_lcase'] ? 0 : -1)) + : ($x['file_lcase'] >= $y['file_lcase'] ? 1 : ($x['file_lcase'] == $y['file_lcase'] ? 0 : -1)); + } + }); + break; + } + + if ($subdir != "") { + $sorted = array_merge([['file' => '..']], $sorted); + } + + $files = $sorted; + ?> + + + + + + + +
+ + +
+ +
+
+ isDir( + $config['ftp_base_folder'] . $config['upload_dir'] . $rfm_subfolder . $subdir + )) || (!$ftp && @opendir($config['current_path'] . $rfm_subfolder . $subdir) === false)){ ?> +
+
There is an error! The upload folder there isn't. Check your config.php + file. +
+ +

+ +
+ + + + + + + + +
    " id="main-item-container"> + $config['file_number_limit_js'] && $file != ".." && stripos( + $file, + $filter + ) === false)) { + continue; + } + $new_name = fix_filename($file, $config); + if ($ftp && $file != '..' && $file != $new_name) { + //rename + rename_folder($config['current_path'] . $subdir . $file, $new_name, $ftp, $config); + $file = $new_name; + } + //add in thumbs folder if not exist + if ($file != '..') { + if (!$ftp && !file_exists($thumbs_path . $file)) { + create_folder(false, $thumbs_path . $file, $ftp, $config); + } + } + + $class_ext = 3; + if ($file == '..' && trim($subdir) != '') { + $src = explode("/", $subdir); + unset($src[count($src) - 2]); + $src = implode("/", $src); + if ($src == '') { + $src = "/"; + } + } elseif ($file != '..') { + $src = $subdir . $file . "/"; + } + + ?> + + $file_array) { + $file = $file_array['file']; + + if ($file == '.' || $file == '..' || $file_array['extension'] == fix_strtolower( + trans('Type_dir') + ) || !check_extension( + $file_array['extension'], + $config + ) || ($filter != '' && $n_files > $config['file_number_limit_js'] && stripos( + $file, + $filter + ) === false)) { + continue; + } + foreach ($config['hidden_files'] as $hidden_file) { + if (fnmatch($hidden_file, $file, FNM_PATHNAME)) { + continue 2; + } + } + $filename = substr($file, 0, '-' . (strlen($file_array['extension']) + 1)); + if (strlen($file_array['extension']) === 0) { + $filename = $file; + } + if (!$ftp) { + $file_path = $config['current_path'] . $rfm_subfolder . $subdir . $file; + //check if file have illegal caracter + + if ($file != fix_filename($file, $config)) { + $file1 = fix_filename($file, $config); + $file_path1 = ($config['current_path'] . $rfm_subfolder . $subdir . $file1); + if (file_exists($file_path1)) { + $i = 1; + $info = pathinfo($file1); + while (file_exists( + $config['current_path'] . $rfm_subfolder . $subdir . $info['filename'] . ".[" . $i . "]." . $info['extension'] + )) { + $i++; + } + $file1 = $info['filename'] . ".[" . $i . "]." . $info['extension']; + $file_path1 = ($config['current_path'] . $rfm_subfolder . $subdir . $file1); + } + + $filename = substr($file1, 0, '-' . (strlen($file_array['extension']) + 1)); + if (strlen($file_array['extension']) === 0) { + $filename = $file1; + } + rename_file($file_path1, fix_filename($filename, $config), $ftp, $config); + $file = $file1; + $file_array['extension'] = fix_filename($file_array['extension'], $config); + $file_path = $file_path1; + } + } else { + $file_path = $config['ftp_base_url'] . $config['upload_dir'] . $rfm_subfolder . $subdir . $file; + } + + $is_img = false; + $is_video = false; + $is_audio = false; + $show_original = false; + $show_original_mini = false; + $mini_src = ""; + $src_thumb = ""; + if (in_array($file_array['extension'], $config['ext_img'])) { + $src = $file_path; + $is_img = true; + + $img_width = $img_height = ""; + if ($ftp) { + $mini_src = $src_thumb = $config['ftp_base_url'] . $config['ftp_thumbs_dir'] . $subdir . $file; + $creation_thumb_path = "/" . $config['ftp_base_folder'] . $config['ftp_thumbs_dir'] . $subdir . $file; + } else { + $creation_thumb_path = $mini_src = $src_thumb = $thumbs_path . $file; + + if (!file_exists($src_thumb)) { + if (create_img($file_path, $creation_thumb_path, 122, 91, 'crop', $config) !== true) { + $src_thumb = $mini_src = ""; + } + } + //check if is smaller than thumb + list($img_width, $img_height, $img_type, $attr) = @getimagesize($file_path); + if ($img_width < 122 && $img_height < 91) { + $src_thumb = $file_path; + $show_original = true; + } + + if ($img_width < 45 && $img_height < 38) { + $mini_src = $config['current_path'] . $rfm_subfolder . $subdir . $file; + $show_original_mini = true; + } + } + } + $is_icon_thumb = false; + $is_icon_thumb_mini = false; + $no_thumb = false; + if ($src_thumb == "") { + $no_thumb = true; + if (file_exists('img/' . $config['icon_theme'] . '/' . $file_array['extension'] . ".jpg")) { + $src_thumb = 'img/' . $config['icon_theme'] . '/' . $file_array['extension'] . ".jpg"; + } else { + $src_thumb = "img/" . $config['icon_theme'] . "/default.jpg"; + } + $is_icon_thumb = true; + } + if ($mini_src == "") { + $is_icon_thumb_mini = false; + } + + $class_ext = 0; + if (in_array($file_array['extension'], $config['ext_video'])) { + $class_ext = 4; + $is_video = true; + } elseif (in_array($file_array['extension'], $config['ext_img'])) { + $class_ext = 2; + } elseif (in_array($file_array['extension'], $config['ext_music'])) { + $class_ext = 5; + $is_audio = true; + } elseif (in_array($file_array['extension'], $config['ext_misc'])) { + $class_ext = 3; + } else { + $class_ext = 1; + } + if ((!($_GET['type'] == 1 && !$is_img) && !(($_GET['type'] == 3 && !$is_video) && ($_GET['type'] == 3 && !$is_audio))) && $class_ext > 0){ + ?> + +
+ + +
+
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + diff --git a/libraries/filemanager-9.14.2/execute.php b/libraries/filemanager-9.14.2/execute.php new file mode 100644 index 0000000..83c0c55 --- /dev/null +++ b/libraries/filemanager-9.14.2/execute.php @@ -0,0 +1,519 @@ +send(); + exit; +} + +if (!checkRelativePath($_POST['path'])) { + response(trans('wrong path') . AddErrorLocation())->send(); + exit; +} + +if (isset($_SESSION['RF']['language']) && file_exists('lang/' . basename($_SESSION['RF']['language']) . '.php')) { + $languages = include 'lang/languages.php'; + if (array_key_exists($_SESSION['RF']['language'], $languages)) { + include 'lang/' . basename($_SESSION['RF']['language']) . '.php'; + } else { + response(trans('Lang_Not_Found') . AddErrorLocation())->send(); + exit; + } +} else { + response(trans('Lang_Not_Found') . AddErrorLocation())->send(); + exit; +} + +$ftp = ftp_con($config); + +$base = $config['current_path']; +$path = $base . $_POST['path']; +$cycle = true; +$max_cycles = 50; +$i = 0; + +while ($cycle && $i < $max_cycles) { + $i++; + if ($path == $base) { + $cycle = false; + } + + if (file_exists($path . "config.php")) { + $configMain = $config; + $configTemp = include $path . "config.php"; + if(is_array($configTemp) && count($configTemp) > 0){ + $config = array_merge($configMain, $configTemp); + $config['ext'] = array_merge( + $config['ext_img'], + $config['ext_file'], + $config['ext_misc'], + $config['ext_video'], + $config['ext_music'] + ); + } + else{ + $config = $configMain; + } + $cycle = false; + } + $path = fix_dirname($path) . "/"; +} + +function returnPaths($_path, $_name, $config) +{ + global $ftp; + $path = $config['current_path'] . $_path; + $path_thumb = $config['thumbs_base_path'] . $_path; + $name = null; + if ($ftp) { + $path = $config['ftp_base_folder'] . $config['upload_dir'] . $_path; + $path_thumb = $config['ftp_base_folder'] . $config['ftp_thumbs_dir'] . $_path; + } + if ($_name) { + $name = fix_filename($_name, $config); + if (strpos($name, '../') !== false || strpos($name, '..\\') !== false) { + response(trans('wrong name') . AddErrorLocation())->send(); + exit; + } + } + return [$path, $path_thumb, $name]; +} + +if(isset($_POST['paths'])){ + $paths = $paths_thumb = $names = []; + foreach ($_POST['paths'] as $key => $path) { + if (!checkRelativePath($path)) + { + response(trans('wrong path').AddErrorLocation())->send(); + exit; + } + $name = null; + if(isset($_POST['names'][$key])){ + $name = $_POST['names'][$key]; + } + list($path,$path_thumb,$name) = returnPaths($path,$name,$config); + $paths[] = $path; + $paths_thumb[] = $path_thumb; + $names = $name; + } +} else { + $name = null; + if(isset($_POST['name'])){ + $name = $_POST['name']; + } + list($path,$path_thumb,$name) = returnPaths($_POST['path'],$name,$config); + +} + +$info = pathinfo($path); +if (isset($info['extension']) && !(isset($_GET['action']) && $_GET['action'] == 'delete_folder') && + !check_extension($info['extension'], $config) + && $_GET['action'] != 'create_file') { + response(trans('wrong extension') . AddErrorLocation())->send(); + exit; +} + +if (isset($_GET['action'])) { + switch ($_GET['action']) { + case 'delete_file': + + deleteFile($path, $path_thumb, $config); + + break; + + case 'delete_files': + foreach ($paths as $key => $p) { + deleteFile($p, $paths_thumb[$key], $config); + } + + break; + case 'delete_folder': + if ($config['delete_folders']){ + + if($ftp){ + deleteDir($path,$ftp,$config); + deleteDir($path_thumb,$ftp,$config); + }else{ + if (is_dir($path_thumb)) + { + deleteDir($path_thumb,NULL,$config); + } + + if (is_dir($path)) + { + deleteDir($path,NULL,$config); + if ($config['fixed_image_creation']) + { + foreach($config['fixed_path_from_filemanager'] as $k=>$paths){ + if ($paths!="" && $paths[strlen($paths)-1] != "/") $paths.="/"; + + $base_dir=$paths.substr_replace($path, '', 0, strlen($config['current_path'])); + if (is_dir($base_dir)) deleteDir($base_dir,NULL,$config); + } + } + } + } + } + break; + case 'create_folder': + if ($config['create_folders']) + { + + $name = fix_filename($_POST['name'],$config); + $path .= $name; + $path_thumb .= $name; + $res = create_folder(fix_path($path,$config),fix_path($path_thumb,$config),$ftp,$config); + if(!$res){ + response(trans('Rename_existing_folder').AddErrorLocation())->send(); + } + } + break; + case 'rename_folder': + if ($config['rename_folders']){ + if(!is_dir($path)) { + response(trans('wrong path').AddErrorLocation())->send(); + exit; + } + $name = fix_filename($name, $config); + $name = str_replace('.', '', $name); + + if (!empty($name)) { + if (!rename_folder($path, $name, $ftp, $config)) { + response(trans('Rename_existing_folder') . AddErrorLocation())->send(); + exit; + } + rename_folder($path_thumb, $name, $ftp, $config); + if (!$ftp && $config['fixed_image_creation']) { + foreach ($config['fixed_path_from_filemanager'] as $k => $paths) { + if ($paths != "" && $paths[strlen($paths) - 1] != "/") { + $paths .= "/"; + } + + $base_dir = $paths . substr_replace($path, '', 0, strlen($config['current_path'])); + rename_folder($base_dir, $name, $ftp, $config); + } + } + } else { + response(trans('Empty_name') . AddErrorLocation())->send(); + exit; + } + } + break; + + case 'create_file': + if ($config['create_text_files'] === false) { + response(sprintf(trans('File_Open_Edit_Not_Allowed'), strtolower(trans('Edit'))) . AddErrorLocation())->send(); + exit; + } + + if (!isset($config['editable_text_file_exts']) || !is_array($config['editable_text_file_exts'])) { + $config['editable_text_file_exts'] = []; + } + + // check if user supplied extension + if (strpos($name, '.') === false) { + response(trans('No_Extension') . ' ' . sprintf(trans('Valid_Extensions'), implode(', ', $config['editable_text_file_exts'])) . AddErrorLocation())->send(); + exit; + } + + // correct name + $old_name = $name; + $name = fix_filename($name, $config); + if (empty($name)) { + response(trans('Empty_name') . AddErrorLocation())->send(); + exit; + } + + // check extension + $parts = explode('.', $name); + if (!in_array(end($parts), $config['editable_text_file_exts'])) { + response(trans('Error_extension') . ' ' . sprintf(trans('Valid_Extensions'), implode(', ', $config['editable_text_file_exts'])) . AddErrorLocation(), 400)->send(); + exit; + } + + $content = $_POST['new_content']; + + if ($ftp) { + $temp = tempnam('/tmp', 'RF'); + file_put_contents($temp, $content); + $ftp->put("/" . $path . $name, $temp, FTP_BINARY); + unlink($temp); + response(trans('File_Save_OK'))->send(); + } else { + if (!checkresultingsize(strlen($content))) { + response(sprintf(trans('max_size_reached'), $config['MaxSizeTotal']) . AddErrorLocation())->send(); + exit; + } + // file already exists + if (file_exists($path . $name)) { + response(trans('Rename_existing_file') . AddErrorLocation())->send(); + exit; + } + + if (@file_put_contents($path . $name, $content) === false) { + response(trans('File_Save_Error') . AddErrorLocation())->send(); + exit; + } else { + if (is_function_callable('chmod') !== false) { + chmod($path . $name, 0644); + } + response(trans('File_Save_OK'))->send(); + exit; + } + } + + break; + + case 'rename_file': + if ($config['rename_files']) { + $name = fix_filename($name, $config); + if (!empty($name)) { + if (!rename_file($path, $name, $ftp, $config)) { + response(trans('Rename_existing_file') . AddErrorLocation())->send(); + exit; + } + + rename_file($path_thumb, $name, $ftp, $config); + + if ($config['fixed_image_creation']) { + $info = pathinfo($path); + + foreach ($config['fixed_path_from_filemanager'] as $k => $paths) { + if ($paths != "" && $paths[strlen($paths) - 1] != "/") { + $paths .= "/"; + } + + $base_dir = $paths . substr_replace($info['dirname'] . "/", '', 0, strlen($config['current_path'])); + if (file_exists($base_dir . $config['fixed_image_creation_name_to_prepend'][$k] . $info['filename'] . $config['fixed_image_creation_to_append'][$k] . "." . $info['extension'])) { + rename_file($base_dir . $config['fixed_image_creation_name_to_prepend'][$k] . $info['filename'] . $config['fixed_image_creation_to_append'][$k] . "." . $info['extension'], $config['fixed_image_creation_name_to_prepend'][$k] . $name . $config['fixed_image_creation_to_append'][$k], $ftp, $config); + } + } + } + } else { + response(trans('Empty_name') . AddErrorLocation())->send(); + exit; + } + } + break; + + case 'duplicate_file': + if ($config['duplicate_files']) { + $name = fix_filename($name, $config); + if (!empty($name)) { + if (!$ftp && !checkresultingsize(filesize($path))) { + response(sprintf(trans('max_size_reached'), $config['MaxSizeTotal']) . AddErrorLocation())->send(); + exit; + } + if (!duplicate_file($path, $name, $ftp, $config)) { + response(trans('Rename_existing_file') . AddErrorLocation())->send(); + exit; + } + + duplicate_file($path_thumb, $name, $ftp, $config); + + if (!$ftp && $config['fixed_image_creation']) { + $info = pathinfo($path); + foreach ($config['fixed_path_from_filemanager'] as $k => $paths) { + if ($paths != "" && $paths[strlen($paths) - 1] != "/") { + $paths .= "/"; + } + + $base_dir = $paths . substr_replace($info['dirname'] . "/", '', 0, strlen($config['current_path'])); + + if (file_exists($base_dir . $config['fixed_image_creation_name_to_prepend'][$k] . $info['filename'] . $config['fixed_image_creation_to_append'][$k] . "." . $info['extension'])) { + duplicate_file($base_dir . $config['fixed_image_creation_name_to_prepend'][$k] . $info['filename'] . $config['fixed_image_creation_to_append'][$k] . "." . $info['extension'], $config['fixed_image_creation_name_to_prepend'][$k] . $name . $config['fixed_image_creation_to_append'][$k]); + } + } + } + } else { + response(trans('Empty_name') . AddErrorLocation())->send(); + exit; + } + } + break; + + case 'paste_clipboard': + if (!isset($_SESSION['RF']['clipboard_action'], $_SESSION['RF']['clipboard']['path']) + || $_SESSION['RF']['clipboard_action'] == '' + || $_SESSION['RF']['clipboard']['path'] == '') { + response()->send(); + exit; + } + + $action = $_SESSION['RF']['clipboard_action']; + $data = $_SESSION['RF']['clipboard']; + + + if ($ftp) { + if ($_POST['path'] != "") { + $path .= DIRECTORY_SEPARATOR; + $path_thumb .= DIRECTORY_SEPARATOR; + } + $path_thumb .= basename($data['path']); + $path .= basename($data['path']); + $data['path_thumb'] = DIRECTORY_SEPARATOR . $config['ftp_base_folder'] . $config['ftp_thumbs_dir'] . $data['path']; + $data['path'] = DIRECTORY_SEPARATOR . $config['ftp_base_folder'] . $config['upload_dir'] . $data['path']; + } else { + $data['path_thumb'] = $config['thumbs_base_path'] . $data['path']; + $data['path'] = $config['current_path'] . $data['path']; + } + + $pinfo = pathinfo($data['path']); + + // user wants to paste to the same dir. nothing to do here... + if ($pinfo['dirname'] == rtrim($path, DIRECTORY_SEPARATOR)) { + response()->send(); + exit; + } + + // user wants to paste folder to it's own sub folder.. baaaah. + if (is_dir($data['path']) && strpos($path, $data['path']) !== false) { + response()->send(); + exit; + } + + // something terribly gone wrong + if ($action != 'copy' && $action != 'cut') { + response(trans('wrong action') . AddErrorLocation())->send(); + exit; + } + if ($ftp) { + if ($action == 'copy') { + $tmp = time() . basename($data['path']); + $ftp->get($tmp, $data['path'], FTP_BINARY); + $ftp->put(DIRECTORY_SEPARATOR . $path, $tmp, FTP_BINARY); + unlink($tmp); + + if (url_exists($data['path_thumb'])) { + $tmp = time() . basename($data['path_thumb']); + @$ftp->get($tmp, $data['path_thumb'], FTP_BINARY); + @$ftp->put(DIRECTORY_SEPARATOR . $path_thumb, $tmp, FTP_BINARY); + unlink($tmp); + } + } elseif ($action == 'cut') { + $ftp->rename($data['path'], DIRECTORY_SEPARATOR . $path); + if (url_exists($data['path_thumb'])) { + @$ftp->rename($data['path_thumb'], DIRECTORY_SEPARATOR . $path_thumb); + } + } + } else { + // check for writability + if (is_really_writable($path) === false || is_really_writable($path_thumb) === false) { + response(trans('Dir_No_Write') . '
' . str_replace('../', '', $path) . '
' . str_replace('../', '', $path_thumb) . AddErrorLocation())->send(); + exit; + } + + // check if server disables copy or rename + if (is_function_callable(($action == 'copy' ? 'copy' : 'rename')) === false) { + response(sprintf(trans('Function_Disabled'), ($action == 'copy' ? (trans('Copy')) : (trans('Cut')))) . AddErrorLocation())->send(); + exit; + } + if ($action == 'copy') { + list($sizeFolderToCopy, $fileNum, $foldersCount) = folder_info($path, false); + if (!checkresultingsize($sizeFolderToCopy)) { + response(sprintf(trans('max_size_reached'), $config['MaxSizeTotal']) . AddErrorLocation())->send(); + exit; + } + rcopy($data['path'], $path); + rcopy($data['path_thumb'], $path_thumb); + } elseif ($action == 'cut') { + rrename($data['path'], $path); + rrename($data['path_thumb'], $path_thumb); + + // cleanup + if (is_dir($data['path']) === TRUE){ + rrename_after_cleaner($data['path']); + rrename_after_cleaner($data['path_thumb']); + } + } + } + + // cleanup + $_SESSION['RF']['clipboard']['path'] = null; + $_SESSION['RF']['clipboard_action'] = null; + + break; + + case 'chmod': + $mode = $_POST['new_mode']; + $rec_option = $_POST['is_recursive']; + $valid_options = ['none', 'files', 'folders', 'both']; + $chmod_perm = ($_POST['folder'] ? $config['chmod_dirs'] : $config['chmod_files']); + + // check perm + if ($chmod_perm === false) { + response(sprintf(trans('File_Permission_Not_Allowed'), (is_dir($path) ? (trans('Folders')) : (trans('Files')))) . AddErrorLocation())->send(); + exit; + } + // check mode + if (!preg_match("/^[0-7]{3}$/", $mode)) { + response(trans('File_Permission_Wrong_Mode') . AddErrorLocation())->send(); + exit; + } + // check recursive option + if (!in_array($rec_option, $valid_options)) { + response(trans("wrong option") . AddErrorLocation())->send(); + exit; + } + // check if server disabled chmod + if (!$ftp && is_function_callable('chmod') === false) { + response(sprintf(trans('Function_Disabled'), 'chmod') . AddErrorLocation())->send(); + exit; + } + + $mode = "0" . $mode; + $mode = octdec($mode); + if ($ftp) { + $ftp->chmod($mode, "/" . $path); + } else { + rchmod($path, $mode, $rec_option); + } + + break; + + case 'save_text_file': + $content = $_POST['new_content']; + // $content = htmlspecialchars($content); not needed + // $content = stripslashes($content); + + if ($ftp) { + $tmp = time(); + file_put_contents($tmp, $content); + $ftp->put("/" . $path, $tmp, FTP_BINARY); + unlink($tmp); + response(trans('File_Save_OK'))->send(); + } else { + // no file + if (!file_exists($path)) { + response(trans('File_Not_Found') . AddErrorLocation())->send(); + exit; + } + + // not writable or edit not allowed + if (!is_writable($path) || $config['edit_text_files'] === false) { + response(sprintf(trans('File_Open_Edit_Not_Allowed'), strtolower(trans('Edit'))) . AddErrorLocation())->send(); + exit; + } + + if (!checkresultingsize(strlen($content))) { + response(sprintf(trans('max_size_reached'), $config['MaxSizeTotal']) . AddErrorLocation())->send(); + exit; + } + if (@file_put_contents($path, $content) === false) { + response(trans('File_Save_Error') . AddErrorLocation())->send(); + exit; + } else { + response(trans('File_Save_OK'))->send(); + exit; + } + } + + break; + + default: + response(trans('wrong action') . AddErrorLocation())->send(); + exit; + } +} diff --git a/libraries/filemanager-9.14.2/force_download.php b/libraries/filemanager-9.14.2/force_download.php new file mode 100644 index 0000000..42f1666 --- /dev/null +++ b/libraries/filemanager-9.14.2/force_download.php @@ -0,0 +1,127 @@ +send(); + exit; +} + +if (!checkRelativePath($_POST['path']) || strpos($_POST['path'], '/') === 0) { + response(trans('wrong path') . AddErrorLocation(), 400)->send(); + exit; +} + +if (strpos($_POST['name'], '/') !== false) { + response(trans('wrong path') . AddErrorLocation(), 400)->send(); + exit; +} + +$ftp = ftp_con($config); + +if ($ftp) { + $path = $config['ftp_base_url'] . $config['upload_dir'] . $_POST['path']; +} else { + $path = $config['current_path'] . $_POST['path']; +} + +$name = $_POST['name']; +$info = pathinfo($name); + +if (!check_extension($info['extension'], $config)) { + response(trans('wrong extension') . AddErrorLocation(), 400)->send(); + exit; +} + +$file_name = $info['basename']; +$file_ext = $info['extension']; +$file_path = $path . $name; + + +// make sure the file exists +if ($ftp) { + header('Content-Type: application/octet-stream'); + header("Content-Transfer-Encoding: Binary"); + header("Content-disposition: attachment; filename=\"" . $file_name . "\""); + readfile($file_path); +} elseif (is_file($file_path) && is_readable($file_path)) { + if (!file_exists($path . $name)) { + response(trans('File_Not_Found') . AddErrorLocation(), 404)->send(); + exit; + } + + $size = filesize($file_path); + $file_name = rawurldecode($file_name); + + + if (function_exists('mime_content_type')) { + $mime_type = mime_content_type($file_path); + } elseif (function_exists('finfo_open')) { + $finfo = finfo_open(FILEINFO_MIME_TYPE); + $mime_type = finfo_file($finfo, $file_path); + } else { + $mime_type = get_file_mime_type($file_path); + } + + + @ob_end_clean(); + if (ini_get('zlib.output_compression')) { + ini_set('zlib.output_compression', 'Off'); + } + header('Content-Type: ' . $mime_type); + header('Content-Disposition: attachment; filename="' . $file_name . '"'); + header("Content-Transfer-Encoding: binary"); + header('Accept-Ranges: bytes'); + + if (isset($_SERVER['HTTP_RANGE'])) { + list($a, $range) = explode("=", $_SERVER['HTTP_RANGE'], 2); + list($range) = explode(",", $range, 2); + list($range, $range_end) = explode("-", $range); + $range = intval($range); + if (!$range_end) { + $range_end = $size - 1; + } else { + $range_end = intval($range_end); + } + + $new_length = $range_end - $range + 1; + header("HTTP/1.1 206 Partial Content"); + header("Content-Length: $new_length"); + header("Content-Range: bytes $range-$range_end/$size"); + } else { + $new_length = $size; + header("Content-Length: " . $size); + } + + $chunksize = 1 * (1024 * 1024); + $bytes_send = 0; + + if ($file = fopen($file_path, 'r')) { + if (isset($_SERVER['HTTP_RANGE'])) { + fseek($file, $range); + } + + while (!feof($file) && + (!connection_aborted()) && + ($bytes_send < $new_length) + ) { + $buffer = fread($file, $chunksize); + echo $buffer; + flush(); + $bytes_send += strlen($buffer); + } + fclose($file); + } else { + die('Error - can not open file.'); + } + + die(); +} else { + // file does not exist + header("HTTP/1.0 404 Not Found"); +} + +exit; diff --git a/libraries/filemanager-9.14.2/img/clipboard_apply.png b/libraries/filemanager-9.14.2/img/clipboard_apply.png new file mode 100644 index 0000000000000000000000000000000000000000..d470c4434ba88711588dbca8762cfc42e1781759 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?bRZ~;@|NlRbgn;N1pN{~g zSW1HYf*BZQo@qRE6QnfK)5S5QBF^;WL*51jo|cQs77YuyCm1kzS~py}U9T2><-Pmo zB3I3)5_K}{mQ1zE>t_a-{!ZdmfB3P?#r{dNBlDq+2?8m43{nq1Bp#f!Z-GI;)On_F cYz;0mA2Akl@XGwZ31|s}r>mdKI;Vst00Uz{t^fc4 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/clipboard_clear.png b/libraries/filemanager-9.14.2/img/clipboard_clear.png new file mode 100644 index 0000000000000000000000000000000000000000..e7fb9031bbaae2e99b053798a1a674cac64bf0b6 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VW6&4m&Q&ao@|38p~fZcD7 zumELQOM?7@f%MEXAFOs(0vXYsE{-7;alU5{avm_?V7;(r!41Z&ORQWwuQz|c^y1&@ zD=r#;*(*CfaT}X=3TC{!?sEUm`^KeOM~|H=vT*ssc}8c(EIkfRRR$rp1)NV>6fT$l ksbBwU;))x;j~o#Hxm@;>+u}8OKx-I0UHx3vIVCg!0Ckf|LI3~& literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/copy.png b/libraries/filemanager-9.14.2/img/copy.png new file mode 100644 index 0000000000000000000000000000000000000000..e1d89116d3fb4a7fb0874d9ab6d5f5b502d44f3b GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDURZ~+lHa7kb0}>Jvl9G}T zQd3h?OH0eh$OxzaC<0O0o?5R3)XQ5EiYG43ltY(aU2^428 z3GxeOn0e-edbJpk>+9*_7*Y|(du$_bgMx_bMQx+R8w2xS*Dn3Pe^z z1Ef+_RTanpiU0wS0n`NnKyg(KRj@FSR0RqG1t3yDE)W2vAc7ECAP>R-3c?v`AVD|+ zYJsqU=0J>sGJxVh7iw#3ZROYc2lTLiNswPK10xd)D;ql}7Z)#|kg$lTgrtmuqLQ+T zimIBrhM|e6rInq%qmyrHc1~_?US57tSwmw}OG{gS|CBlN<}X-!{^G@pmu}v=cmLs| zM=xHz{w*nQ`Uq(B1y2{pkcv3p?(2L_0U|8o(p?2>6}tA8vx>gqU3%mH|Lm6E33E~= zO+G1C(R1A1HcR_)ir(~P?{7wg7T#U`Ebw~&zGb`i9}qNn#b|qBIn}b0!^kX$^H;i)T>p_Li=96;b^Ka$rfhdkWmvn1b8=wf@4peL7Z*4- zeUlTqu6lU8Tl^-EsU905cqRpLMedrh&+5;^1LbkSyCz(`XS(yJ&AmI@6mM^s^g}uG w;XN;HFS~G!C!e||<=x#_X|-McT=8Gl&qtMB9C>mi3zSeiUHx3vIVCg!0Ev;nq5uE@ literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/dimension.png b/libraries/filemanager-9.14.2/img/dimension.png new file mode 100644 index 0000000000000000000000000000000000000000..43dcc10155703666c47b845df93feebcf8b7d21d GIT binary patch literal 489 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMfx&WUL*Z=?j1DQhw>^s?#0(7fo zNswPK1EUCwa_H~-z48IayIMMa-ae;rEB4m~Pw69uPd=)>z03OLp0WQ2lkmrvF5Wry zprN%b#9TNk@|aoo>K98yfQD@Jba4!+hzsq%I_anZkMq?fo~O=KOiYyg^xuBl<9mD7 z#OutJ?9I6lap3joO$mQaUA*|H3Gcx%1wQ2QuH%bW2&>r(gcV@;M}nonz|r-6DniZAF9D zTEvunv$(bU^ux1P;?8gX{kLpi(A&=&$~WHcmUollww$-bMz%LTh<~m8|9eOC6aL80 XKF#xG&C|*bP;7a+`njxgN@xNAsIHRv literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/down.png b/libraries/filemanager-9.14.2/img/down.png new file mode 100644 index 0000000000000000000000000000000000000000..76511223d957dd488561ac4eefda6f5ef835ba26 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^93afX3?$7I7w-U4asfUeuK)l42QqPiwjPVMKsnBm zAirP+rY>g1X2!~vUXj&uKtXL!7srr_xa0(55x)cmX7#HIqHGIi8jDIwXe~E3kSH)Q hFg7qU;9w9`W@gA?V!2g*uIVJm9#2<4mvv4FO#u5cAhQ4f literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/download.png b/libraries/filemanager-9.14.2/img/download.png new file mode 100644 index 0000000000000000000000000000000000000000..76125f22a6e94ecc3c4b53e6b6d009ee4793fb44 GIT binary patch literal 674 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47gs@Y0R@59Nl8foy#SFiGBN_{va+)B z_xHEAw+Gtm=;#P^2GB-i0CXzQVX6<(dw{{0R1)MD%wW!cc_L@c=~rA+_-b1ouddEN z^SE2J_Q{?8rRJJbZ@Bg=?n!3uyW@Z5lQvLu@S#mub?^WrjHws??gV1OwTZ} zE}f;U>FZy*9ljOG>wG<+;qO8DgiiY=-XFWQ8yxiyDr;J|e&~G6qcFW+#JkWsPRs3+ zWy9MI0jnRI#jO`TC*JVSNXmGp`?((1`STc!ZmznOwQjcV)>&s65=8s2hucl9jq_)9 zUXY+sQ(RsCUx1Hw?(&m^S3j3^P6&1*lQb>=It(xb?# zTVA{5J9AqnAHNxz_)cDCQk95(=h2{7KV4Y@%VzH0x083ryJG&9<6nyJRDP_!7gQuw i@&Ci$pTGVcblM-YNUrbm`%77%F!pryb6Mw<&;$T*ORLua literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/file_edit.png b/libraries/filemanager-9.14.2/img/file_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..4bcd072e9f7e228d3452973b7c0e9e76a9543a96 GIT binary patch literal 764 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pn}NEkcg59UmvUF{9L`nl>DSry^7odplSvNn+hu+GdHy)QK2F?C$HG5 z!d3~a!V1U+3F|8Y3;nDA{o-C@9zzrKDK}xwt{K19`Se z86_nJR{Hwo<>h+i#(Mch>H3D2mX`VkM*2oZx=P7{9O-#x!EwNQn0$BtH5O0c3d|4@L;p!@;Rg)2@GT#PZ!4!3&E+A z_j?_25NO~0Gx@dXJPt9ju8yXtj*g{ME8ahteWyAmb9vlT;~O__{bXo*oA_|Cz(HTWyN0mrWR^{QFrF_gkVo!0^< zI|{#HT*AGwX7cl&mLELBZ#WpPjAFkNP@!p-xypwBJj1uy3DxsI&VBxH45svE7W|_kWesGo$TRwW@yq=frGs zNiXHr+VXXl0e^Lx^eo~%eJ1(tHrpVj!>G%r%)HX(!N*-{w;D`i?#LWaweR{P^F1}v kZt|xlHID~Ee|Oa}%-oR7{dOvA5hzJ|y85}Sb4q9e0O7eBumAu6 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/glyphicons-halflings-white.png b/libraries/filemanager-9.14.2/img/glyphicons-halflings-white.png new file mode 100644 index 0000000000000000000000000000000000000000..a92969a174c8ed385127cbdf5f836b539cc88170 GIT binary patch literal 8583 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 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/glyphicons-halflings.png b/libraries/filemanager-9.14.2/img/glyphicons-halflings.png new file mode 100644 index 0000000000000000000000000000000000000000..f43139a488fa35166c45f8f760fa6842cc82826c GIT binary patch literal 15602 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 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/ade.jpg b/libraries/filemanager-9.14.2/img/ico/ade.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b653b3d1375113626f327305808833c8cf96fc58 GIT binary patch literal 2290 zcmb7Fc|4Ts9)I3>XR*&>X^e&$lMbRgW5!h|Gs!wR8H6mA-H>IZ#W)>_CgpIAx^XHZ zrMW0{>PlH6MQP!b6Cl_y}x(){GR9c{@&;N{VmU<=vRyYg1fVu zGk_ofAmjpyQNVTDCyWHZ!vmND08{{USP0OFhFAdwc>q9_pq6IDCGe6Ss5B}T0cUe! zvM^34jtHlPrqJ9yom}FC@j@DV_1e`|tF1TD+~SiXlHx;l(wO_K!XucRu+T`wAaDd2 z7)HS`1_h%qh~U(5I2guhsi~=`6SRm#f)*Z6(xK>)w8`3dyq=LBnPNbtQi*y-#zxDH zDa)w_%AY_=Pb^Lohto9B#%mk=-=b&*L=_MS#4uzGP(%nOLW(wEfY3+5$}lYn8UtZ* zFbXkJka@(oWI+^Uh{j+Q13&|rM-gBG62BhYcTXkCkFdN08^K*kA^@An=)m>zqDN^D zyoR`S%|-1acP_mUSD!IF^e8NP!*n52<$6Qb%%6+9o>ho)8_nyJ&AP76ADfAra;n~8 zKBSrfvMc36yE&ImcG#)<&nI+b0fr|B9qVM(J6H81)+~H#(SGxV2G@Q7*&sky5C957 zBRBjFD;fg>2!&-@>k^1MdUUQQ0$By217T2$jg4=&pGx|UXBS=icuSb))b$~2a?35} z(tcIDb-N;3e{J2UKRr?O!}|^PG#lSX<_Ttg5jy2z|D29@*P^nk2i+R@+}w#h6uZy_ z)#j+(F%;+LveC!33leXQJ->V8Z)!V(lB}D#W-x0el4-_>ixD3x6RwGD(hIG^wX38? z^xE97$UPgHim|utJfwc-P{juGzB`MDjjDf;Gpa_NtvUDCJfmGp(7JWm(VI`#{;?Th zXhsAO3}Ml@Zv+u`FcF|h+B7;3!(d6RxFMqS(XlTyk$gHp?|cX2O6&u97mm*iC;$AR zJYx=$4!$W&)r*R=lDz!`qumu7-)UH{4=ci>!y zh-zentiVxb6{$BIM)hkABAfx5h#}FLAy|U8F>6-~!-^;H($VF5hKZ8WrQKh%jCDYL zmV>CgD&m46BUt@*&X#}g{psXv-{oeL;lL|hL*r|!9HWnnUosyXv(uV#ZL_PI&lf|DBBAHrSH=MLScSDOS^xhvyReQ+(V6j^^ zJbcf8r!2VN(BX^sh2EZ_&XxP$U(do^zV)fYjt)pnPZm^3EXIK}C z%~d}QxqGO`9Y0DOjory?*mOI2;xnZ#CZgV>sd#d8%ERvVF$W|+D+x%(As9w4)c^#D zbQVv*6qORBwJjm(T+iumedj=59I_lA&MH7p>OEufO@AC;HQ;E~nbeecy#T`dF=@@6 zRvKw#teOJWukVuTd_-BhOOn|WKKr~%8cQ1MeLuUr;w7`s^zrX@QW(C^{`RCYWBmF0 z;%wqmAMDEVYZ;i*Ovcufo-uwTQ^NB* z*dgHKV($>1MxD)?TD>=*m$W>+Tz(>(!YcQHBSl*mOEiERqgAA!;(8r&ghm?-WdT~(Z^1U?Z;p5I$-O>2aB0ik!@tnKE~RD3z|o{zo#t# zn{$GL?8LVQ^XmjJkE`a#d2DO0u~dopBah~PkZe6#+mp;LyBDDSvFuIwDv|y+mj~`Q zO`|(bS^50K@T_aljTqZ?Q7Nl@rlULbCI=<$;JA<#B7w&a-J9g)iQO9gpX^)Vzf7&? z)4!l|CHG#q3&E}MvJXG4G{ZTxtDe@H`si38%Tbvockli_dWJ#wfh~-Kx`Hkf`nO%2 j>&fMIzK~?woIOmQ4-EEX4<32%-F{!n#~xZ}SN!%L0k>Q) literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/adp.jpg b/libraries/filemanager-9.14.2/img/ico/adp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b653b3d1375113626f327305808833c8cf96fc58 GIT binary patch literal 2290 zcmb7Fc|4Ts9)I3>XR*&>X^e&$lMbRgW5!h|Gs!wR8H6mA-H>IZ#W)>_CgpIAx^XHZ zrMW0{>PlH6MQP!b6Cl_y}x(){GR9c{@&;N{VmU<=vRyYg1fVu zGk_ofAmjpyQNVTDCyWHZ!vmND08{{USP0OFhFAdwc>q9_pq6IDCGe6Ss5B}T0cUe! zvM^34jtHlPrqJ9yom}FC@j@DV_1e`|tF1TD+~SiXlHx;l(wO_K!XucRu+T`wAaDd2 z7)HS`1_h%qh~U(5I2guhsi~=`6SRm#f)*Z6(xK>)w8`3dyq=LBnPNbtQi*y-#zxDH zDa)w_%AY_=Pb^Lohto9B#%mk=-=b&*L=_MS#4uzGP(%nOLW(wEfY3+5$}lYn8UtZ* zFbXkJka@(oWI+^Uh{j+Q13&|rM-gBG62BhYcTXkCkFdN08^K*kA^@An=)m>zqDN^D zyoR`S%|-1acP_mUSD!IF^e8NP!*n52<$6Qb%%6+9o>ho)8_nyJ&AP76ADfAra;n~8 zKBSrfvMc36yE&ImcG#)<&nI+b0fr|B9qVM(J6H81)+~H#(SGxV2G@Q7*&sky5C957 zBRBjFD;fg>2!&-@>k^1MdUUQQ0$By217T2$jg4=&pGx|UXBS=icuSb))b$~2a?35} z(tcIDb-N;3e{J2UKRr?O!}|^PG#lSX<_Ttg5jy2z|D29@*P^nk2i+R@+}w#h6uZy_ z)#j+(F%;+LveC!33leXQJ->V8Z)!V(lB}D#W-x0el4-_>ixD3x6RwGD(hIG^wX38? z^xE97$UPgHim|utJfwc-P{juGzB`MDjjDf;Gpa_NtvUDCJfmGp(7JWm(VI`#{;?Th zXhsAO3}Ml@Zv+u`FcF|h+B7;3!(d6RxFMqS(XlTyk$gHp?|cX2O6&u97mm*iC;$AR zJYx=$4!$W&)r*R=lDz!`qumu7-)UH{4=ci>!y zh-zentiVxb6{$BIM)hkABAfx5h#}FLAy|U8F>6-~!-^;H($VF5hKZ8WrQKh%jCDYL zmV>CgD&m46BUt@*&X#}g{psXv-{oeL;lL|hL*r|!9HWnnUosyXv(uV#ZL_PI&lf|DBBAHrSH=MLScSDOS^xhvyReQ+(V6j^^ zJbcf8r!2VN(BX^sh2EZ_&XxP$U(do^zV)fYjt)pnPZm^3EXIK}C z%~d}QxqGO`9Y0DOjory?*mOI2;xnZ#CZgV>sd#d8%ERvVF$W|+D+x%(As9w4)c^#D zbQVv*6qORBwJjm(T+iumedj=59I_lA&MH7p>OEufO@AC;HQ;E~nbeecy#T`dF=@@6 zRvKw#teOJWukVuTd_-BhOOn|WKKr~%8cQ1MeLuUr;w7`s^zrX@QW(C^{`RCYWBmF0 z;%wqmAMDEVYZ;i*Ovcufo-uwTQ^NB* z*dgHKV($>1MxD)?TD>=*m$W>+Tz(>(!YcQHBSl*mOEiERqgAA!;(8r&ghm?-WdT~(Z^1U?Z;p5I$-O>2aB0ik!@tnKE~RD3z|o{zo#t# zn{$GL?8LVQ^XmjJkE`a#d2DO0u~dopBah~PkZe6#+mp;LyBDDSvFuIwDv|y+mj~`Q zO`|(bS^50K@T_aljTqZ?Q7Nl@rlULbCI=<$;JA<#B7w&a-J9g)iQO9gpX^)Vzf7&? z)4!l|CHG#q3&E}MvJXG4G{ZTxtDe@H`si38%Tbvockli_dWJ#wfh~-Kx`Hkf`nO%2 j>&fMIzK~?woIOmQ4-EEX4<32%-F{!n#~xZ}SN!%L0k>Q) literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/ai.jpg b/libraries/filemanager-9.14.2/img/ico/ai.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e469be3df8781b9a24e84ec22c5e6433dfd2feb7 GIT binary patch literal 1776 zcmb7^dpJ~S9LL{t&YYRS;EaiFC1zx$+L&RCt%&KukZV+ya@!QcOjuF0iLT4a79p21 z+Y{_e%4+Irs_Jk^Q~U%@ zSImTSaT=9OrTuTo>j0e!yg>|x=mV6FV01)&11644N|EBEC}f<3VlXxbx(B%x{!9xa zAt+9!$R7h527?4fK>yyUCykX%elf2h2-+A*wjnK{eh4a$E_6ubnmMnIW&PyZ4p#o2 z!mBPQi0>c$-Y5BXURZ32tge55@=8BM&8sp$OZf1&1M?dra@%_1h9j?BVLczS@qEYw zMDM%?0JO|iPeLRE0w5#=dN2(HASwg`2wP*81w)JD>Id1VkQu?z(J~Klf5gXG4dE3A zo>gaZGRu^<@QTU=%@)IkmXY^|4JiwXVw2mCYR8P$OM;eNuZ%pfEXn+ZM{B53R_2@A zMr#JP?ub5I8X_Ttt*^5jkLW&*;(uPhI~#Hs(kF_F<1^+UDC`$HlZ6u+`g}IWG~tMB zf&}_!jeI)qS+t(3w)XvOt!`1~khx1lp$9MaF!!*#WrSV$&eo+P@ta2H55-hg1*Dg* z3Y(iT@a4h6PY!c+5OfU| z2WLVI(-l(`sDfg|xTUi7qj%#r?$W!NNq^pJeHU@6y=mF%2AT#f91cB?rQ09ymz#OG+=ISl2&f&#O@b- zvfSpUojm`TpVY38e#?1}j|sA|$o4?x~uQ ztMa=!W?U|IW|(HJf36(#ZZ!qfUslX>Q-RQMHf})Te#&VSq-G z#qwEyEE`N6P7KqZbJHZ+%HvVtrCg`CvtwzC+j8?oReJPs{@v7_<$9~n8U(4+-%1S` z4y~ano>n49_d~)=;`+cd!hqcB7&L%-UJ*L*L z3t9wHW&3FB?{Fe{4A+TrYad&1^M+GRR+Q_5y~eTE7*U?DPHkFnE~COn4w@nF)OH3K zWQ99=QhX9&1K5}jr~zy}OZen!J1WL7S_3m=(G|x70{7qa1Vx4%g30E?4C8BOx}O+0 zU<+k+=3FPkyR^EfRrf4e%cQAxNcQrgBTzO$R3ak>@47ub-lysNB*khk@1ltJrb`;< zxq)i1u(5p8Wid6$d11;6X@%t%bt~)1r4`2jX=Y^rmnK*oK9lVh?mxA(qUDLcyd%xy zy^Dty^FHm*=`mCb_}Tu@kvkeXy1sZ>S42Z^Xd+MlM&KoqOx4DP3Py)S(VYc6YWELj z^pEE%{P)@H$ssri$M*5p&`6(=?2zi0&R63gfF1#>i{bw{8YgmRySjzP^ZzX@F)Rbd$r1&!C-&dV0+~(lt4dea78=QP0^*QNA6W%#jO4S64F5eEEwZfAkONwN$_)yl2R zkbAQ7r0e7|lPsd*AxV!hO6$_fN+K$>!t8fK?4SFd=RD_ozTfwK@9+11zxNng4G#g~ zKih9MKo9^B_y9u(5csA_VgQ&wA200oX<6j;C)0Q4|AG9y2Xjf^A6py4Cn z3#EyYc!^vb&5c^e^$+r$6E8`SaHlxAIk`AZoyYY{NEEM05XEtwQ(atLqIj-6k)a)U z0~Enf3_(#0C4o^f5;O`0qta<~I-SO%(Q&2`9XG~lETd6I#!M!Q#iARHG8x4(fkP&F z2;5HYG{!JvCeFf{{~Lx&fQ^F)Ajc3JfU*&cjTq{I6)c}TnXK?LXgHOQFi?yF!6}5WZvbf{7ew&eJa^iwT9HG8; zqW0V!SrebQ&rf4)iBQ#P8v6w2?x^l3IUWyHXI^>EyK-gc`ZYX@Ty1XO{u@`dWgL}y zVoW*xnX3C>^922c!*SOGT3#%8_T>L~$*}W1{nBfd) z@JhY_wjH3Dno-$YYo3=gU+{968zs31?@ijs-@Md6o%X88k5#>C^bYy4V|&>_;{$DJ z1GnBv+oK%jKHad6ZnXyy)t*Enf+Vc;pQr6gqXJR#++pz*2c;);7*w z!BsA66BUJotsrDUq)7IuVg%4U(V_3Bhu+)nt*H97Q{Pb9n{ai0kKVrR%D9b9&*t=} zi&Ire#g8u^NN=-J+2J zZ*ES@xz!b-u4bSg7m8DUes*qK>|eFn(+(`M z+xnEfN6b9YT20v@-hIe@{J3R3k_t3j-<~h^JKS&Dy6$AX({62%cAFc2qx|;cz^3Kb zJSN+A1`dU&3R+69{_$Q2MHo*&SEE$QSGf^3unu|jFtJmf8wRbGuFE~&a%(Rh;bJh zz@v){g|t8k*@yiJNT>YQn!wyn4JXZT(z)@Q$bK<{FD%Q34IK^rMJ4Bkfv~Ls*Gt3` z>~hWc?Blb%joJ>!Tje6Ebyyzg4-id}nNyFa{9 z09kAak_DxG{cQ}hIC}*Ji)49Kk%gbk0T+1^gYG#A| uoKv9I8EKD(DymX6r|XiE!`>XqbsrMGzU^QsJp;yE>Qd*8BaVsP@hB#wgs7CfK#+t&ZU@+)xwkwzA?8;0p2uj0YbOh3G z0}<*CXTcpe01HA;0wW-O);$-xhW-JXvwEA;BV7H=O4-4<oHK7nl!tfX&mki(Uupd7(nVI;o1~$zkMRUR zD9&hub!aF~2Mi`A2|x%gZ@5%zfK4&sb|W}uZq=-D?y%nqr#!dsc`@r|P#+r-SIY~Jn}5+w+^awF!P4SQ z@6>_1Dp$JJgG=R=erFfWjf=M%v{^i8bU0eq}CdWk2GBF ze*BgxdMMhbQ@aVuaiQ0Il}BCN{@eGJn;qbv#mV(6I~|~KhWKw=b3w<;a{I5>qo?S% ztEcIS1j@T$J4c(LmYa;r0I#O5s0teoD8jagXY-gISs*t5t!#)oQm z--Ky+*8KCdFO+-lua=*kZW4Cyg2nsK6rlDJ9;=}ij!WRDrI`ePy?rfw_8T0_g9`FYh9O{Uw&p=eyP2f0Fj4W6+uOQ?~7$NU*7;lrFDIKFz;brgT!bk zOM5WQgTBQ}GN)XB1Fc$jnocHeg?z`tZzq8%nQ4Op9 z18^^QPj`SI03h%Iswv>I?Lb^C06spz8UR28NKPCe!5!2BW4Hi7tI?H{%xY|9AEs8S zmVn*Pl(e{{xJ*$DE9xN2%XgbcQe1Kz%htxxhG(&w1S1gD4VX9rFhpIZ6(LioBpL>F zCh!=>{bwCULQtqzDS$Qxl{kjO`jz~}U^;8X9DvQr4{T#aLx#g;wN>?TQd_yyZ+d~( zq;oV2Tz=4GpHX%CMC;__=9ct@za4(O)}#IK&F_n(^1JfKkxiP$038gvAiF$NKl_z) z!oH8*OzU);k@>vLHV=qzt$Kv8U1bd`{%BPXHBr* zSoX%l6GpSOMoia@hVT3Wj)gvT+(XVwHypA0Fu3jSBNoG~ri!L^w+X53Gbe-Ga|zQK zi-EI8ilSQ&9h)hy4Y5zgvvNyA`i@p~TU0arYbx$!G>fCO{VmNxUdb=K`!X^L;?+Hw1MG%z0^jPK$HfJlB=dzp$?1nS4$PKTwZfq+fYJ;x0J`2AP z#r+{U{Os%@i@}(q-f4Mm@$9%@rZdF+D*+G`!)RK6f`qr4OfVp1K z3ZwRk;&By#0rJ)TLr_f`iTW-?RNYX5LDn3Rhorg;C$+AmP*_r*c^6VX^Uz)7_aAcv;)*I|?w`BmI&rapy8n}+F; zp^?FLTe349Lwf^CdX)i~B*|pFVcEdL?s$g7w6ZeLlVVy^(B$>P;FsX_p|0Ed+P^op z@p<^EJT>|9iPOdDpV@_<|J?K6Jte8>o}q$kUO%XSD1>A1^K?n>?w(h>VcD(JWk)Fp zd4<{tAk4V}j-OC0e~zqq9&q;i?>x=7&)-3!hS^psW*<&>pB|qO zC5K9s`rbgdXR>fXPHd`~}tVwP*?UKj} zBR18Q?o)xKrS!>xMu)^fn{=aQR3<^my$E9OXKF48XfDy8r_egQ4jikEOh)MKM7^BNzO)QszL-nJP3BZvLf zLP;Gaeo1|lr{C{(@O)!LxlYuq%^B0%_nvVA7^NCdmbqey!+{IQfvosLV9$WS4`*?n z`$h`IlCG7O;R||i&r7|xvhSw(ZPRzr!_kTSc;%@=hm((b+J^0dQa6;Y8K&RgE7qLq z+rjChj}v3-hf<%g z8?8S31scpI-8s7*FW`HkPuh$k(0hJoSmI4719}19bt-y4`PDHLJw}+Dz2_8@u}99A q-P?KT$Db74$!(m0MXjF0?PqdN?AKGi%o@JMxpl>DuG@&L8u>4o$F|J? literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/c4d.jpg b/libraries/filemanager-9.14.2/img/ico/c4d.jpg new file mode 100644 index 0000000000000000000000000000000000000000..62994da7a372dd446ff991e89eb2b1f38f863865 GIT binary patch literal 6241 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 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/css.jpg b/libraries/filemanager-9.14.2/img/ico/css.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e1673b0743b8c26007a9828f0d61ff3ff8b4e8d1 GIT binary patch literal 1722 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 T4edi=31f=DPE=aUT^Rf?WJ=VB literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/default.jpg b/libraries/filemanager-9.14.2/img/ico/default.jpg new file mode 100644 index 0000000000000000000000000000000000000000..94ca6691a6257d6e13d45455484f99d08fb8b88c GIT binary patch literal 1723 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 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/doc.jpg b/libraries/filemanager-9.14.2/img/ico/doc.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c0e14b3f4b883770eb061827cc9eb8497a75805f GIT binary patch literal 2511 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

~yju=_>uu*lZ*+Of!ulMa&( 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 I;$e>dH<`FnivR!s literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/dxf.jpg b/libraries/filemanager-9.14.2/img/ico/dxf.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7041cbe6f750106d9461dce3648976613f6cef82 GIT binary patch literal 5419 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 R2Z9KsF=E#Y5-ahq@dHtmFyR0I literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/fla.jpg b/libraries/filemanager-9.14.2/img/ico/fla.jpg new file mode 100644 index 0000000000000000000000000000000000000000..41bd2ec10832000d145e32e4652a41a932b64cc2 GIT binary patch literal 1859 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 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/folder_back.png b/libraries/filemanager-9.14.2/img/ico/folder_back.png new file mode 100644 index 0000000000000000000000000000000000000000..dc0786ec6cea1394a7bd1c394727ce9604c9141b GIT binary patch literal 1128 zcmeAS@N?(olHy`uVBq!ia0vp^RX`lg!3-q3%M)E07#M2L^NvAv_Sw|~OKsWav-ShQ@-+I8zUZQinN`;MKvcJJMP;NX#? zr_Y={cj5AtYu9hzx&QFV(`PT2FPYU7|t)Hku3cJ}G-&`8KU6hAq87==kjTKgss` z3im7Prq4Y3|MX{@^I+sJ+563aVM>$D(hVQ4ggNY6+j#l@iR@3gyfG@Wm8?>Wc&ze_ zi%Ql!NxjWz#Gk2bl(bYlYRjHQA^OHCo?nusOZqNuiu<>VF{4JNat;cS?{w6kwl+^nZGMyT_}1@~(|4b`Rj$vmG!~4%eUWdGvtt+AyJJr~xZ4FB zH20p+@m5sjlIUFTd;0W=1(s89X;)4)OUn87^~;sbpPn4~@#Dsg7efA7a(8zd7yUhS zbKxSdm1_(8^fcXbj`o(6N#|@X@p0Lv_D48-ZE>Fs&*W1te)Iec*O7NvzUdc_ZnW@K zi*#)nztpWvUTgIJR+@b+w14~dIW4^Kd-mDcpKMT#?^!cAwpZUXC<(25)zVb5ySm9# zJyAio!Oq^ais@}a14BRtdn!Y-+0W_a7ooAaCw|FmjY&OoIxYiKEQ6=3pUXO@geCwO CHQzk| literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/gif.jpg b/libraries/filemanager-9.14.2/img/ico/gif.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c771ca3c3e3c87d3eb8409538ccc6187ddd717c GIT binary patch literal 1979 zcmb7Ed010d7QgSkY%GEI0*Gvx5D=BNOcIcQm4OI?AdG-4Wvc`T$|^x%6qk|@6gTBQ}GN)XB1Fc$jnocHeg?z`tZzq8%nQ4Op9 z18^^QPj`SI03h%Iswv>I?Lb^C06spz8UR28NKPCe!5!2BW4Hi7tI?H{%xY|9AEs8S zmVn*Pl(e{{xJ*$DE9xN2%XgbcQe1Kz%htxxhG(&w1S1gD4VX9rFhpIZ6(LioBpL>F zCh!=>{bwCULQtqzDS$Qxl{kjO`jz~}U^;8X9DvQr4{T#aLx#g;wN>?TQd_yyZ+d~( zq;oV2Tz=4GpHX%CMC;__=9ct@za4(O)}#IK&F_n(^1JfKkxiP$038gvAiF$NKl_z) z!oH8*OzU);k@>vLHV=qzt$Kv8U1bd`{%BPXHBr* zSoX%l6GpSOMoia@hVT3Wj)gvT+(XVwHypA0Fu3jSBNoG~ri!L^w+X53Gbe-Ga|zQK zi-EI8ilSQ&9h)hy4Y5zgvvNyA`i@p~TU0arYbx$!G>fCO{VmNxUdb=K`!X^L;?+Hw1MG%z0^jPK$HfJlB=dzp$?1nS4$PKTwZfq+fYJ;x0J`2AP z#r+{U{Os%@i@}(q-f4Mm@$9%@rZdF+D*+G`!)RK6f`qr4OfVp1K z3ZwRk;&By#0rJ)TLr_f`iTW-?RNYX5LDn3Rhorg;C$+AmP*_r*c^6VX^Uz)7_aAcv;)*I|?w`BmI&rapy8n}+F; zp^?FLTe349Lwf^CdX)i~B*|pFVcEdL?s$g7w6ZeLlVVy^(B$>P;FsX_p|0Ed+P^op z@p<^EJT>|9iPOdDpV@_<|J?K6Jte8>o}q$kUO%XSD1>A1^K?n>?w(h>VcD(JWk)Fp zd4<{tAk4V}j-OC0e~zqq9&q;i?>x=7&)-3!hS^psW*<&>pB|qO zC5K9s`rbgdXR>fXPHd`~}tVwP*?UKj} zBR18Q?o)xKrS!>xMu)^fn{=aQR3<^my$E9OXKF48XfDy8r_egQ4jikEOh)MKM7^BNzO)QszL-nJP3BZvLf zLP;Gaeo1|lr{C{(@O)!LxlYuq%^B0%_nvVA7^NCdmbqey!+{IQfvosLV9$WS4`*?n z`$h`IlCG7O;R||i&r7|xvhSw(ZPRzr!_kTSc;%@=hm((b+J^0dQa6;Y8K&RgE7qLq z+rjChj}v3-hf<%g z8?8S31scpI-8s7*FW`HkPuh$k(0hJoSmI4719}19bt-y4`PDHLJw}+Dz2_8@u}99A q-P?KT$Db74$!(m0MXjF0?PqdN?AKGi%o@JMxpl>DuG@&L8u>4o$F|J? literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/gz.jpg b/libraries/filemanager-9.14.2/img/ico/gz.jpg new file mode 100644 index 0000000000000000000000000000000000000000..36d159166e47d37b44fd4ed6dd800c2eca16f903 GIT binary patch literal 1718 zcmb7EdpuNG96$Hod3lWH65}z}jFeQXnPG}z8A+&Nrc$J0@-Bvv3aQ3!QlgDYeaPlf z5?fw9cGvcx6urIrc&iqxQh9$$W%gV)yZh&U&*z@cx#xGz{eFM1t87+22Mkvy7bk!q z03dJxP$MFPF2;Ip+TRaPNy@8kHG81 zO*ITtW76m}=KqGW3g9&04Pr6G7@#$i3;`$uW558`CqAma(JCAD43`Eeao)5>W%2iS>b!Ts@wZteVlM_ zj9DQZ(mQ{0q!;_M=QIAto^Q))oAvrg=}w*RqGi3S7w)MYP0qZs-7tvNJowO>UpcG< zK3Bb#VzwZyrmf=%y}8!ui(1AQO9>)+vYuI=?U7`*+eFOY@xZG5}fwnuTW zifL1vjuu=hd1WMm8ccBj=@3L^S_6z3Mj}%fI7gGs$2CthC5H1u4O)>=Lu*J`(^dwAg9 zn`=-a7iNhlDeAOD*ermAGc>h0v$#A6Wy=^F^^kKQUFZ??j$B zD?9haWcHZz!f*6r2jZ*!Gq0E5+hEHtlVi@oy+=1UAF8$s7U}+GDPeo$uVk)uF|er` z75vaJ-$?s?a9fkk?FEA2aWB*RKKhlfPW)(A9E9yn$=of9EBa98e*6Y;aH%zRm>a%W z9%ptUE$-aU%jCC0&2{`Qrwnh-|7G8ZL>(IQ|R9vS7&@~R> z8Wq4c`3eN*00x&Qkq(G`D|5cqo*idIoa^j-RCmShF|=6IIr>Ns&$uY(f;AG3-PH~3 z?@R1sFPjiK(0^AA zVBkECu$0Y}#t%s3sX29%;)$ANbSo0b5J83aTTpR!V#TPR&&iz?O?zHqhZ`Q>G;r+< z-SFNcBiF@YJVFufR?}_omZi4o&F!6#$YiQLNQAg4AOL4@ctVMk&6TGP1dt?EX*!=IdZXNJaxP1_c3b6))-Gab04 zf|IJEwrG3Lz$$Knd7`Tkq@2Y7@E=e4Pf`G6WN_^zQn?s%PN#)2AY)lYj8+|@B*}P literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/html.jpg b/libraries/filemanager-9.14.2/img/ico/html.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a1af20d076fc5c79e6db7996e79bfefe2f241a7b GIT binary patch literal 2152 zcmb7_dpK0<9>?Fc)?68yam%GN!xlPdh^?_>u;nf@qlC~5%{ikQxr@Ck_XvqI)seJK zbcS3qDzwEGC6}JLuBk}sq)z9-oHbL~XP^JhZ>{yL_g%mDeV@;cILWB_0agis*aZJ;L)5sb)V@YV2G9E=b!sB@jd z2avBG^o?L(EDpjGWRCy|-35~oG8)0W0&%N6sQ+bJfks|TlcoRw^zL!^wypj5f`^^5 zUa{=#vC4XtFLj02lefI|31S!+Rtx~JZf=n8wO*7|ZgqEESa*0I85jEHEEL0#3?K{) zA=uU9aR>&B2N0~TMc1HiWN}d%0?G3*nIL@=Yg7#9hXOT zFL;WMa@|j8rxl&r_i*P8s-&%Dqu`qz0ey+O>XT~le8Uy3`G0!3l(+Z<)Q9?X^N$!1 ztBcz6ZR5v0LfuWFgl=m=lf6lOU@vX*)A}fjt+vLSo=5!lNCr?sGYWtZ7y~PhzZT-=CL|LjsI36oLm}@pdBEx>lY=XZm!09 zD&e0>UE2k=|2UP|6ZK83$;vD5C&dgQsHosd*S5ACGY&cno$5-?;PbL|pcyqe<{dIiO!%kdzD@JBofP@`ehsa8(x=t2zxl+l@! znzrC49#kNr1l z5@(hIhtq}EF9rHzl#DdH*O2V`bZcmjYg`i5eZBj=e&8Ik?qM8xYApHC@IaJ-)g9oE zT8NBWbQu0kn$Oi6QkH%pUbDu|rv=xUiv+jh9A@lyJN=TqO<4PMcVKCIX;m=e^2_;| z-bRxoBV`XUhE)Jn_B_yU?sd`@5S^AfZj97TJu|oHEk3Z)`%~je{G^byLV3ZT&OW#s zX?{1Ckri*l!+XoX8O(BmYC>+#!G~GDX8sh-43U%;-MfA^Oy7U%+oDVQ&K>+@N!Yyf zX5;D1t#AImq2Xwx)^RoMcz^xoi8Cpu?N{#K@*HJ55A7#d8$2qV;}=g6N7!oL$$-|6 zvwYKQV;(ldch{aaCxmR#Nl(^#hGAFC3`@f4wyv-mG%h;AF*R zCG}*c+-kvhozE4Wx4dn4V#D`Q2doMPSazg|l62nB;WZ(do%mY73UnOb#|*2KSle>< z7792)qUK^s*I3%#p+fwA!{YNpSWGo8g?CSfMm`FO}F^dB-tpnq|pp`lUa5`;lz`s;FtVhLz$ zo>Me6mF_5A?R@gGdtFMBd)w&`ZUy=A-6r+Ho%wp{6C08_6VJ}UbNKzU;faHibUILu zdoDK2e}7BI)#2;{t-mYh%9b@A86O0lpt6&%mPJe$@2c@O%2XAN&Yip<4h$K7{4a$Z zDM$dS;;XW*NRktqM~$XC7Jep?H#qs?wl;!%QQ;?XhBfoH)tmPN}=* z*@jyKJL=;=Hz|Gat%Ai+UN9Jd`(G9^oz3N;6(jvDH|QcJ`E_cR!w-ASj=e6|j)Pnr zh1w?rz4k}l-(TMqT5Xm{x}EpeSW9Kmk@CaV-u^bTDF?eQ3Xi||WKIeh;X1JDCHC90 zr%Me^xyyh literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/iso.jpg b/libraries/filemanager-9.14.2/img/ico/iso.jpg new file mode 100644 index 0000000000000000000000000000000000000000..379f50667f68117eeaa2ced50fcc0ace9c45a143 GIT binary patch literal 1496 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 IMcNzx1#lOing9R* literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/jpg.jpg b/libraries/filemanager-9.14.2/img/ico/jpg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c771ca3c3e3c87d3eb8409538ccc6187ddd717c GIT binary patch literal 1979 zcmb7Ed010d7QgSkY%GEI0*Gvx5D=BNOcIcQm4OI?AdG-4Wvc`T$|^x%6qk|@6gTBQ}GN)XB1Fc$jnocHeg?z`tZzq8%nQ4Op9 z18^^QPj`SI03h%Iswv>I?Lb^C06spz8UR28NKPCe!5!2BW4Hi7tI?H{%xY|9AEs8S zmVn*Pl(e{{xJ*$DE9xN2%XgbcQe1Kz%htxxhG(&w1S1gD4VX9rFhpIZ6(LioBpL>F zCh!=>{bwCULQtqzDS$Qxl{kjO`jz~}U^;8X9DvQr4{T#aLx#g;wN>?TQd_yyZ+d~( zq;oV2Tz=4GpHX%CMC;__=9ct@za4(O)}#IK&F_n(^1JfKkxiP$038gvAiF$NKl_z) z!oH8*OzU);k@>vLHV=qzt$Kv8U1bd`{%BPXHBr* zSoX%l6GpSOMoia@hVT3Wj)gvT+(XVwHypA0Fu3jSBNoG~ri!L^w+X53Gbe-Ga|zQK zi-EI8ilSQ&9h)hy4Y5zgvvNyA`i@p~TU0arYbx$!G>fCO{VmNxUdb=K`!X^L;?+Hw1MG%z0^jPK$HfJlB=dzp$?1nS4$PKTwZfq+fYJ;x0J`2AP z#r+{U{Os%@i@}(q-f4Mm@$9%@rZdF+D*+G`!)RK6f`qr4OfVp1K z3ZwRk;&By#0rJ)TLr_f`iTW-?RNYX5LDn3Rhorg;C$+AmP*_r*c^6VX^Uz)7_aAcv;)*I|?w`BmI&rapy8n}+F; zp^?FLTe349Lwf^CdX)i~B*|pFVcEdL?s$g7w6ZeLlVVy^(B$>P;FsX_p|0Ed+P^op z@p<^EJT>|9iPOdDpV@_<|J?K6Jte8>o}q$kUO%XSD1>A1^K?n>?w(h>VcD(JWk)Fp zd4<{tAk4V}j-OC0e~zqq9&q;i?>x=7&)-3!hS^psW*<&>pB|qO zC5K9s`rbgdXR>fXPHd`~}tVwP*?UKj} zBR18Q?o)xKrS!>xMu)^fn{=aQR3<^my$E9OXKF48XfDy8r_egQ4jikEOh)MKM7^BNzO)QszL-nJP3BZvLf zLP;Gaeo1|lr{C{(@O)!LxlYuq%^B0%_nvVA7^NCdmbqey!+{IQfvosLV9$WS4`*?n z`$h`IlCG7O;R||i&r7|xvhSw(ZPRzr!_kTSc;%@=hm((b+J^0dQa6;Y8K&RgE7qLq z+rjChj}v3-hf<%g z8?8S31scpI-8s7*FW`HkPuh$k(0hJoSmI4719}19bt-y4`PDHLJw}+Dz2_8@u}99A q-P?KT$Db74$!(m0MXjF0?PqdN?AKGi%o@JMxpl>DuG@&L8u>4o$F|J? literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/log.jpg b/libraries/filemanager-9.14.2/img/ico/log.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ec6d3e3f5f5b5ea808a90bb21ba75007d3802a95 GIT binary patch literal 1765 zcmb7EdpJ~S82`>W=HfEzj7yVC84N|ca+{J%lyNJ=P>B>vshN#RROmu-Yh82MbYX`? zs8FNwL=>XvGL(|gkdlYUsKsNt9|x&p7WjWy?pO^-{1FspZKNt4M5k~JJ|yW z0sz7uAQk`{yD-j90GLdm4*(znD4qkPuo-3rs@Mwv%!R*eBDl!+xwph9o&~0^`$9QE zoQQxORR3`5I+mS75N8jEYGSa;z}SH9Om*558nAzlUm(>mj7~Q(_4D@&5O)Dv07D3j zKroEJ5+FE40=$$o0Y|_S2n0NdBu|!;ktfO$NhHOe6lLWoBo&gpjM}1~Nb+(d5=9aO zTP|5Ciy*QTB8f=(-w@veWFqhe5eTFOU^0Y|A#npx$I3?_2_!Xs1%W7yL!=-)W>xx^ zdd@0-1>_J2z$k)Z)IAxSQ`6dvnf^-5$Qb?UW4~eso>>i#ak*ICe=x%RwrYT!+s}+Q z03hs&L+pf*{DKKA^xtQm_+k;zT`!i}DG zzlsUgSTZ`;52f&s6oSd$Aceyd0E{d!TnV9M1&XE(3(Jm(8eGmIJ>z!3=q+&niBj9~PTHA58?m9z}$Yxt;<@u~F8EN$8fH~+hR zHmu;|d2?*xtzpq~MSs?KK|@ISzysbMX&=)Nwdl>s>i6Gd^*b2d(h1|Yn$;&?DLUhp z$M*8v5zygnUK8UuQdE7A-($fZrKl{t?D>3n=nGjZ^k#7t(#^~hhQ?G0O9o)$b9-<9ET?xD{X+OE$ZZ+!BsDD8Ycti>2;Ihd?Bbaa<)XUb{b z!;XHTDs6?pIU{}dqnk$kw`wb@WLs-m*@oMd9IJM|vv(`?oa|Y)fPPq#d&GL4(h}da z>%om@77dy3S~+Qh+2wEFo;69(9$J02G1=#FnV(|Y^*)A4Vu-cX_+RXf&mxD3lN)1V z-_u(6bq9NRg%1n(%ks{i;})%mUuVB}b3CF!TJq$WwxD2YwBZ+>&1jaME@Rh<-tvgF z%ulsC!s^-HrVnC(ZKp1ZbtsITvG1J>k%610q0yQ#)bBVo@9rmTcji0UT2oXqptO)% zuaM3xpEx-3Qo8*bU)i*SmD995<+klwy)Iw7vixUH)skLlAGs4T;<&|c&mGSz~t+C@%A3y8MOuUXAGQO(0GNoFg5VvC*OLTzw6@8X<-?`t zD^+XUokpK>^-dJY(=~7Dfm(xzqA(4x!7kY! zp9b{5PQzCR3BNGFNdbZ+xC9Vc6QG7hZZ>QD#;B~|yb8YHJHO~uNqox8(WOqqN8nhQ z2(DKhHMJ1G;YRjxl;WX;pb5SznVWvkjt#U8wBEqtTsL=n8O^{Mbvw_BE^{mYSlX9x zF1)E$aEU%dQFc&`*VG&Fs*iW|++anvke=!99ebv#;y%uxT0}7(ExeT5G;s7R>sg0;Tf8-%H+AQ{bIqHKT*OJTGTVly_in$NlplnuaV~1Dof7W5*X6#M Rx=kP#X|PH7&OB1w`8S?lY>xl{ literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/m4a.jpg b/libraries/filemanager-9.14.2/img/ico/m4a.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5c6417c870d36a1433acfa810ec20ac75026b1d5 GIT binary patch literal 1529 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 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/mid.jpg b/libraries/filemanager-9.14.2/img/ico/mid.jpg new file mode 100644 index 0000000000000000000000000000000000000000..176cd71a923a95c591c6e0c5da3e88377952ed24 GIT binary patch literal 1630 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 Hp3V9%0{PkZ literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/mpeg.jpg b/libraries/filemanager-9.14.2/img/ico/mpeg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..50f99ff0a74487f5478ecf274344071a182ac813 GIT binary patch literal 1589 zcmb7DeK=HU6o2o%Gk3-`!@WMr(?&C95zYGWpqM2xRe)@DQ*8=4l$R?0>n?35C_ z;aRFFNs7VRNs(0Bl2E(JN5xYlTRuu{J=N@c$Flz2bD#IQ=f3Bj-}`%i=NwI&<_REH zt#Drf5Ci}OK0wnAM9ULon*dn78dw1Um;l)?12pKtD3}fx0BAlsv6GmOP541nQ1cns zd2fxCMadGw!?>Y4xT_?~-J)dCGVTIvCu>`4drz)=bZq#xXz3QNAR#ndDzFm@9W))l z6`%-)VhD<2C}kKOqYS6fFggQgFc>(FGni}^gE@tX<1Ag)6gHc~;V@Xbdb%7v=&~sg zm`-KFTsoVHGui*!G*GXQM?S*;qd#PQWxqce}P0tbr=i({+HBQnkRjG;mvvj~7d$!OTb zIdqhUV+>eC0YNTw(3gZjPE1&BgpPhZy^`1CpCf+yq9b8en(Dd#Ih`X5cGsuSF2pJG z8#(mrimSN;yHeCP@llNlqC}@}yQ>`s`kPK0?t5xp)^|NYK2*CXe)vlKdGFiPcMioF zhRLVeYHVWEG{O*<^x zr?*8IZI!0BxCpadC}9wc#v;cNsQQqAt`C!ihFmjSv5$0HYzAS(UtqUX;_DX@D*wJz zRoA*V`Pj9Ve>KBh&{022{lU22xt>J_Tz72_Ru%oVIrshNV=*js(($B}gC3I8BM$r# zW#zo8lKS1p>q?8|ip8_bd0vjHWlA&Uisrt?aJGYepniIA3x2#ymt%By`0C{xkD^!7 zsLGND&!$$qSn8U3Haj@^L`+x{f4gPN4(wIb`fj6?^nOB$-F

eCZ0wrm-f@}a>ynvifXXp@H=;Q@l= z3Pj=p?d_;0CHi%zHaIt@pZIjA)KqvW@>C>R$e0PUO-V|i@&3|cA|zKRCIlj>T$@hy zC(&)O&LoWU<-Ko~HCR>7$~5&5FV3R`=8g&cpT1yBU@@g`#@P9go(u8P!!#o!-^PgV z>VBxYtIuwxVtUwG#yd{?+;lBBjZ92Wb@i}wz5;}9O-KbPgcc` zGP?1zGQ^~1j+etVcIQ*_nGqiMTS%5=_OvHv-Bo|`e^TKfu=}myjf;DDdd0b^7do0Y QFchgdje#Jm3(ETNA2~qyvH$=8 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/mpg.jpg b/libraries/filemanager-9.14.2/img/ico/mpg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..daa2bc4633d71a8205d00348edea30d4a8ed9345 GIT binary patch literal 1532 zcmb7Dc~BE)6#sTN7a>b_MUG)m7EnQ@Gzm}yWdJEhFqq(xQaniH7{Vn;Vi9Uk6Q1Xuw8-~c2~1sKqSQD6sO08kw|x00>H=KL*m z&}aaj(sZ>dRh1ndNA1`{h0B6NQ&njy%ER5qUF7a1p~PwG_+4qr6iSfgB@)Fem7-YV zeGmjt1Vb?dMKP2%jET|4Vwka+Y!;i%X5l!W!L!1CgA{dDn^}rss4-?ZI%o>ZsHbYP*14eBT zlg&oxFM={KV;|r_2uffCT&Sdk;Pu*KqwMWg`4M57@9wV7wOBek*9jzHjP~AFGP_j-FDPEiSUrs(O!xWIE28jo`>g=ZQ;ye6xdGdwhv>VC_8*iX- z&zua)FL^91TsNGe)F5}C$WtyDbhitBJPT{0NPu7%a~^S!5E5HJ5tag>D8N(@h9LgP z^f~TCW!Ejg6`y5z%CEVRW;KiqBY+tkNGJ@HJ=YU-kOe4((FpA1jBz@kKv8JQYw(}gZ#p_Q}HQ?_BFV#ogW zHzcwA(SKx1LR%cFe2%t`I46Ez)!h7Y`}^D%XTuHM<0l=9?c@%@Q-;Cy!H0fos`Dys z9vF=1ROZEnY0|Cl+smtqt|W4kv)cpw+*Wm0#4G;ndEGPSUbMg6ZjJn?OaInMnZ)<6 z&DOrjV!znOl~z$NPv?Zb+2t+oJ6fB!*eU;!-n^vj=bNkhR}nK@7nU7Tlq$2U(QE^F_79N1k?hCvfk<%A%UYXP$`Ja(3UpI6zyHJit%@xsguQ7 z`W)t}T|GQ%e^{~f;4o8CqFz@$ZLd8xQ=j3?>rP0s6|@E=$E-={FqBs^@J*|uYr;_f zsL7t@2U(*hh9-v&jk+8zu%8l&hhUQTM_`9!&0)R&{W`nS|MI=43^JW1~Fi8ax zLP3Di)D*2cV(ReIz41>uU&Y=ptORY;ZvDsSo%|u%9*XXNV1SSW1t9pX;)oHx8OPV_ z4&zB!X?~{d!)cS`D4J8oe5{F6r67=slqoXi_#|ekMKddT{RcO`&^LrjqB?SwJ>?Pj z!hO%{)XWoA`QJLZ-quIwW}7L-bmalMwd?IyE$$ViT)iyxtk!(d{3$9k+iLZ>OZ_jM zE?SFwk0}Xf$+&`7Qzpz=bHK5;qh=?!@%1*HbA5w;dcX*_?M&20p0$o`YPoKwh%xs5 E3(f1;z5oCK literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/odb.jpg b/libraries/filemanager-9.14.2/img/ico/odb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1a4157e4570faf5b2e20efaff272e816ae735290 GIT binary patch literal 1748 zcmb7EYfw{16yAGpZW8h!2>~OBlAuMzS3*Rwib+6-APAz>QHllvlvqXN9mHCSJQWZX zOMDGMsE=4HXrVz-p^Ohi6tpTbMU*O5r3Mg85l#1kqW#ey{qF4S&Ys=xeCOPA)^yL* z0oXoX-d+Gf06^deOb>z7Gf5QzfS(_50sv3}lBohDxPn$-0|x+TF*>@FT#Svbg9xMP z9hl`G9jDr$N)8X>hpPEL0iN;=swfp-JY((*=NT@(eDA2Z@R+EO^?YHHQZy&jRTS!C zY6BhsMKBaYP!vN6U^qsAOd?Tm3YkKokeN&tl|f@s=~O0@X3nKEcuXdfLNjNXGg%BK zlSh!i>%>huhS7OcCYATUVX6ZhDhL9}7-A1l4uWwIQ#}|5!^aQ^BE%8kWC{sEsnBRm z>|>vp03bmT6w`gcfZHe=W5e|6^4Iji`4jAK?lFPv$ky1V;Ju%p&YRaQnWkFf=l)8| zC?7e6L}&hd)$hgyyTYzuh2AHj?_^c;)_ESQrVplf>aQ@XFOD385+5|Lx1uU*>&DYv7yNmv zYmg_e29(*Ah37KGiDhl{#IKBTK5aoZnh3Y-$J3HF9*n1kpB}%5|NT6M`Ic?A$#c*D z{h;gFV%L>b>dsbI-=Klzwl!J3$&pQdmvY9MT|Zm-#JH8v$RPw`B}>XPmY~ z6I#@CI3?KxAp0Z^K}VvDk^=TSIm1MgKw71ClkiB1n6P1!E~{l+hC`to=Ft-6g2a%D$`|R;hqb;*kxwgPb#LE%(KN*|rF3$gUPUkHcX?wwr6_7le*4T2 zs|MeUy9(M`+HcvX{J)-@Yb9VbE*i4h5Ey)5aR2!lEXV{7S!n_^4F{jA!;CGvN-sIR zogK6FxWl9!er20aR*cDe(`Tc!%3kb$bb?;$7C-Q)Az35!T-#EV{;v9XCud93Wwp#Z zBGy}RaCO96pXHIO=gy2f7hmamM{N46M~IXSzz7J)7bs}&7bu3XHdMhkqMaBfhvPnyo{ z$kC$WG`F-cOZJ|7-JaPAofBW(JIPmaNqM#W;<)Xv`+diz@Ix22=Uvra6qdIL3|W>7 ztr?3V$c~1U3!Xm4w+%U3o^9xJaoW+!8|Ntbs_wKpDdR9hF`?y#{;41d6agbr-@Q~?tH zu|J_c$W$N@ic+=G07H+We1sFeA`pwU^Ky3g3 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/odf.jpg b/libraries/filemanager-9.14.2/img/ico/odf.jpg new file mode 100644 index 0000000000000000000000000000000000000000..da290dc7bb3c8b1bcc85a9d1dc48743d221b9517 GIT binary patch literal 1760 zcmb7Ddo+}37=OR-o0~FY#-%YX?F=d`nn7~utYM~U5r#I}!&=w25sJ*ZER~aJw-l1( zQsYt~vB+iH)RJtZGDo{zs9X|TZ4Fi}soD1{)SmropYOcqd(Zp4&-47=-}8Hvca#Hw z?kaK-0R#a6fgex~0{+@~$z}lD-GM0pfC7+o2_V27^a35Y06=Bv!bzeGTiE;IPUTx* z?YTWx5-CXx3uOlEoDLZvYOw<+5Ig97|OB8C_Ml!0IjMA;5>;qxIjoP&8Ik`Mx!f zfe!3rA0R*wWaT}e3Xf4bMu+sBITSDn{~y`ii@i3>O0J2{ORrW=-e{8j@#S#W262nA zz>NR?mTR)TFlX$AuxqlqvVZ3JsQp;8hqKyz~uRI0QpF4i6wG`F$h+ z1R{!&5C-6?vw3_caUcXkfiMvw`c~WZdE+?4v5r)h?5nc(NFRUXhLQ7~xO$Aq%8mUsBB+-_lyB)$VCFrfvt}|nd6@RZKSQ-~`-FtaJ@N zt#awlQ`6bq_FeVDE^C*!d#>uN+kV{B`NA2S7Z|ywugT);6LFVzK%hnp0J}_BfQjo0 z#Rv=y4wt8{Wyu#rr@TW7xpqXJ4gE5)Tp*gwk58`Pl<8YsY9CmcTgbb7;Z$c~Q;1Zb z2((9TFAAS=FA2^XC`gHPgaww(75LB&1jQJT4i48+T~mv}7ER#j|!$ad}h zbt1pH#jb+!+GV*_Z*%mUs_#!u1q_+=yJ?t?v<3ERM?N1dJe4Wqh+>rh*0H7I4?&2k zi?BJ$p?nE|p-$A`7zAk=a(R}{VlVHI=vpl&fp9}$aLkUBV)@`)8%U1mG)qTvdTDfg zDp@PIf04=qTSH&}!okzuI!jYJt{?W09MoxEn>{4mFKnppJ)1mG+FIUV^7oK`LcQ0S z8E2^y*m;|VF$+De^^N!$UnWS;vIkZl@_gl!0SL*$>3}1e#j={!-2J|`iqzNcyn>0b zBs0-Y*H=M_=Q|_?v+EAOsfk%hu5h_Z8}Qii-N@pb`TWpxCB{Rhw_~=_PqyonTM>30UN$<0(4RNv3Z5M`j4VJAImD*53yl5@lF)@4s@6w~6m z2{RV4m}f5E6@Ya*sYL7TZ%Znd!zJ`=)EJ1=Y*cv@=;QsLH+x zC#vUJdo8uny$yx>2&wL+~|2= z$Uoa<(h;J2H`@U3{=df>*qM9JPhn2E>+ZQdd^#J~CPw@qO(=c_ha0Wndj(~+$`^!B zm*e!>^nH?5-GM4>jTC-=nhoXE-%$WA$DYHv36$hq5iT_QNrQkbxwaVWQ5iW7M zJb%*_k0kdo=BCmJvYzJFy(iOl)^evvucVs0j5B`Fym92E`7J!<3S7|$i8QZgd^BNW zxIC|*lwx{xR;^+jc4nb1^x0KU5ATvWkq?qTXR)Ei3_)BbXr z4X;0cpw@wAl^0GQ9Ij8Vj0vc~^p+6{6nz~I5yeGmDE;80T7tjZsnGZ+!ISGphYhuc Z4$#L_PgjO4k@_VX812q>-|4Bm`w!SQM)d#y literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/odg.jpg b/libraries/filemanager-9.14.2/img/ico/odg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1a4157e4570faf5b2e20efaff272e816ae735290 GIT binary patch literal 1748 zcmb7EYfw{16yAGpZW8h!2>~OBlAuMzS3*Rwib+6-APAz>QHllvlvqXN9mHCSJQWZX zOMDGMsE=4HXrVz-p^Ohi6tpTbMU*O5r3Mg85l#1kqW#ey{qF4S&Ys=xeCOPA)^yL* z0oXoX-d+Gf06^deOb>z7Gf5QzfS(_50sv3}lBohDxPn$-0|x+TF*>@FT#Svbg9xMP z9hl`G9jDr$N)8X>hpPEL0iN;=swfp-JY((*=NT@(eDA2Z@R+EO^?YHHQZy&jRTS!C zY6BhsMKBaYP!vN6U^qsAOd?Tm3YkKokeN&tl|f@s=~O0@X3nKEcuXdfLNjNXGg%BK zlSh!i>%>huhS7OcCYATUVX6ZhDhL9}7-A1l4uWwIQ#}|5!^aQ^BE%8kWC{sEsnBRm z>|>vp03bmT6w`gcfZHe=W5e|6^4Iji`4jAK?lFPv$ky1V;Ju%p&YRaQnWkFf=l)8| zC?7e6L}&hd)$hgyyTYzuh2AHj?_^c;)_ESQrVplf>aQ@XFOD385+5|Lx1uU*>&DYv7yNmv zYmg_e29(*Ah37KGiDhl{#IKBTK5aoZnh3Y-$J3HF9*n1kpB}%5|NT6M`Ic?A$#c*D z{h;gFV%L>b>dsbI-=Klzwl!J3$&pQdmvY9MT|Zm-#JH8v$RPw`B}>XPmY~ z6I#@CI3?KxAp0Z^K}VvDk^=TSIm1MgKw71ClkiB1n6P1!E~{l+hC`to=Ft-6g2a%D$`|R;hqb;*kxwgPb#LE%(KN*|rF3$gUPUkHcX?wwr6_7le*4T2 zs|MeUy9(M`+HcvX{J)-@Yb9VbE*i4h5Ey)5aR2!lEXV{7S!n_^4F{jA!;CGvN-sIR zogK6FxWl9!er20aR*cDe(`Tc!%3kb$bb?;$7C-Q)Az35!T-#EV{;v9XCud93Wwp#Z zBGy}RaCO96pXHIO=gy2f7hmamM{N46M~IXSzz7J)7bs}&7bu3XHdMhkqMaBfhvPnyo{ z$kC$WG`F-cOZJ|7-JaPAofBW(JIPmaNqM#W;<)Xv`+diz@Ix22=Uvra6qdIL3|W>7 ztr?3V$c~1U3!Xm4w+%U3o^9xJaoW+!8|Ntbs_wKpDdR9hF`?y#{;41d6agbr-@Q~?tH zu|J_c$W$N@ic+=G07H+We1sFeA`pwU^Ky3g3 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/odp.jpg b/libraries/filemanager-9.14.2/img/ico/odp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..da290dc7bb3c8b1bcc85a9d1dc48743d221b9517 GIT binary patch literal 1760 zcmb7Ddo+}37=OR-o0~FY#-%YX?F=d`nn7~utYM~U5r#I}!&=w25sJ*ZER~aJw-l1( zQsYt~vB+iH)RJtZGDo{zs9X|TZ4Fi}soD1{)SmropYOcqd(Zp4&-47=-}8Hvca#Hw z?kaK-0R#a6fgex~0{+@~$z}lD-GM0pfC7+o2_V27^a35Y06=Bv!bzeGTiE;IPUTx* z?YTWx5-CXx3uOlEoDLZvYOw<+5Ig97|OB8C_Ml!0IjMA;5>;qxIjoP&8Ik`Mx!f zfe!3rA0R*wWaT}e3Xf4bMu+sBITSDn{~y`ii@i3>O0J2{ORrW=-e{8j@#S#W262nA zz>NR?mTR)TFlX$AuxqlqvVZ3JsQp;8hqKyz~uRI0QpF4i6wG`F$h+ z1R{!&5C-6?vw3_caUcXkfiMvw`c~WZdE+?4v5r)h?5nc(NFRUXhLQ7~xO$Aq%8mUsBB+-_lyB)$VCFrfvt}|nd6@RZKSQ-~`-FtaJ@N zt#awlQ`6bq_FeVDE^C*!d#>uN+kV{B`NA2S7Z|ywugT);6LFVzK%hnp0J}_BfQjo0 z#Rv=y4wt8{Wyu#rr@TW7xpqXJ4gE5)Tp*gwk58`Pl<8YsY9CmcTgbb7;Z$c~Q;1Zb z2((9TFAAS=FA2^XC`gHPgaww(75LB&1jQJT4i48+T~mv}7ER#j|!$ad}h zbt1pH#jb+!+GV*_Z*%mUs_#!u1q_+=yJ?t?v<3ERM?N1dJe4Wqh+>rh*0H7I4?&2k zi?BJ$p?nE|p-$A`7zAk=a(R}{VlVHI=vpl&fp9}$aLkUBV)@`)8%U1mG)qTvdTDfg zDp@PIf04=qTSH&}!okzuI!jYJt{?W09MoxEn>{4mFKnppJ)1mG+FIUV^7oK`LcQ0S z8E2^y*m;|VF$+De^^N!$UnWS;vIkZl@_gl!0SL*$>3}1e#j={!-2J|`iqzNcyn>0b zBs0-Y*H=M_=Q|_?v+EAOsfk%hu5h_Z8}Qii-N@pb`TWpxCB{Rhw_~=_PqyonTM>30UN$<0(4RNv3Z5M`j4VJAImD*53yl5@lF)@4s@6w~6m z2{RV4m}f5E6@Ya*sYL7TZ%Znd!zJ`=)EJ1=Y*cv@=;QsLH+x zC#vUJdo8uny$yx>2&wL+~|2= z$Uoa<(h;J2H`@U3{=df>*qM9JPhn2E>+ZQdd^#J~CPw@qO(=c_ha0Wndj(~+$`^!B zm*e!>^nH?5-GM4>jTC-=nhoXE-%$WA$DYHv36$hq5iT_QNrQkbxwaVWQ5iW7M zJb%*_k0kdo=BCmJvYzJFy(iOl)^evvucVs0j5B`Fym92E`7J!<3S7|$i8QZgd^BNW zxIC|*lwx{xR;^+jc4nb1^x0KU5ATvWkq?qTXR)Ei3_)BbXr z4X;0cpw@wAl^0GQ9Ij8Vj0vc~^p+6{6nz~I5yeGmDE;80T7tjZsnGZ+!ISGphYhuc Z4$#L_PgjO4k@_VX812q>-|4Bm`w!SQM)d#y literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/ods.jpg b/libraries/filemanager-9.14.2/img/ico/ods.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1a4157e4570faf5b2e20efaff272e816ae735290 GIT binary patch literal 1748 zcmb7EYfw{16yAGpZW8h!2>~OBlAuMzS3*Rwib+6-APAz>QHllvlvqXN9mHCSJQWZX zOMDGMsE=4HXrVz-p^Ohi6tpTbMU*O5r3Mg85l#1kqW#ey{qF4S&Ys=xeCOPA)^yL* z0oXoX-d+Gf06^deOb>z7Gf5QzfS(_50sv3}lBohDxPn$-0|x+TF*>@FT#Svbg9xMP z9hl`G9jDr$N)8X>hpPEL0iN;=swfp-JY((*=NT@(eDA2Z@R+EO^?YHHQZy&jRTS!C zY6BhsMKBaYP!vN6U^qsAOd?Tm3YkKokeN&tl|f@s=~O0@X3nKEcuXdfLNjNXGg%BK zlSh!i>%>huhS7OcCYATUVX6ZhDhL9}7-A1l4uWwIQ#}|5!^aQ^BE%8kWC{sEsnBRm z>|>vp03bmT6w`gcfZHe=W5e|6^4Iji`4jAK?lFPv$ky1V;Ju%p&YRaQnWkFf=l)8| zC?7e6L}&hd)$hgyyTYzuh2AHj?_^c;)_ESQrVplf>aQ@XFOD385+5|Lx1uU*>&DYv7yNmv zYmg_e29(*Ah37KGiDhl{#IKBTK5aoZnh3Y-$J3HF9*n1kpB}%5|NT6M`Ic?A$#c*D z{h;gFV%L>b>dsbI-=Klzwl!J3$&pQdmvY9MT|Zm-#JH8v$RPw`B}>XPmY~ z6I#@CI3?KxAp0Z^K}VvDk^=TSIm1MgKw71ClkiB1n6P1!E~{l+hC`to=Ft-6g2a%D$`|R;hqb;*kxwgPb#LE%(KN*|rF3$gUPUkHcX?wwr6_7le*4T2 zs|MeUy9(M`+HcvX{J)-@Yb9VbE*i4h5Ey)5aR2!lEXV{7S!n_^4F{jA!;CGvN-sIR zogK6FxWl9!er20aR*cDe(`Tc!%3kb$bb?;$7C-Q)Az35!T-#EV{;v9XCud93Wwp#Z zBGy}RaCO96pXHIO=gy2f7hmamM{N46M~IXSzz7J)7bs}&7bu3XHdMhkqMaBfhvPnyo{ z$kC$WG`F-cOZJ|7-JaPAofBW(JIPmaNqM#W;<)Xv`+diz@Ix22=Uvra6qdIL3|W>7 ztr?3V$c~1U3!Xm4w+%U3o^9xJaoW+!8|Ntbs_wKpDdR9hF`?y#{;41d6agbr-@Q~?tH zu|J_c$W$N@ic+=G07H+We1sFeA`pwU^Ky3g3 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/odt.jpg b/libraries/filemanager-9.14.2/img/ico/odt.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1a4157e4570faf5b2e20efaff272e816ae735290 GIT binary patch literal 1748 zcmb7EYfw{16yAGpZW8h!2>~OBlAuMzS3*Rwib+6-APAz>QHllvlvqXN9mHCSJQWZX zOMDGMsE=4HXrVz-p^Ohi6tpTbMU*O5r3Mg85l#1kqW#ey{qF4S&Ys=xeCOPA)^yL* z0oXoX-d+Gf06^deOb>z7Gf5QzfS(_50sv3}lBohDxPn$-0|x+TF*>@FT#Svbg9xMP z9hl`G9jDr$N)8X>hpPEL0iN;=swfp-JY((*=NT@(eDA2Z@R+EO^?YHHQZy&jRTS!C zY6BhsMKBaYP!vN6U^qsAOd?Tm3YkKokeN&tl|f@s=~O0@X3nKEcuXdfLNjNXGg%BK zlSh!i>%>huhS7OcCYATUVX6ZhDhL9}7-A1l4uWwIQ#}|5!^aQ^BE%8kWC{sEsnBRm z>|>vp03bmT6w`gcfZHe=W5e|6^4Iji`4jAK?lFPv$ky1V;Ju%p&YRaQnWkFf=l)8| zC?7e6L}&hd)$hgyyTYzuh2AHj?_^c;)_ESQrVplf>aQ@XFOD385+5|Lx1uU*>&DYv7yNmv zYmg_e29(*Ah37KGiDhl{#IKBTK5aoZnh3Y-$J3HF9*n1kpB}%5|NT6M`Ic?A$#c*D z{h;gFV%L>b>dsbI-=Klzwl!J3$&pQdmvY9MT|Zm-#JH8v$RPw`B}>XPmY~ z6I#@CI3?KxAp0Z^K}VvDk^=TSIm1MgKw71ClkiB1n6P1!E~{l+hC`to=Ft-6g2a%D$`|R;hqb;*kxwgPb#LE%(KN*|rF3$gUPUkHcX?wwr6_7le*4T2 zs|MeUy9(M`+HcvX{J)-@Yb9VbE*i4h5Ey)5aR2!lEXV{7S!n_^4F{jA!;CGvN-sIR zogK6FxWl9!er20aR*cDe(`Tc!%3kb$bb?;$7C-Q)Az35!T-#EV{;v9XCud93Wwp#Z zBGy}RaCO96pXHIO=gy2f7hmamM{N46M~IXSzz7J)7bs}&7bu3XHdMhkqMaBfhvPnyo{ z$kC$WG`F-cOZJ|7-JaPAofBW(JIPmaNqM#W;<)Xv`+diz@Ix22=Uvra6qdIL3|W>7 ztr?3V$c~1U3!Xm4w+%U3o^9xJaoW+!8|Ntbs_wKpDdR9hF`?y#{;41d6agbr-@Q~?tH zu|J_c$W$N@ic+=G07H+We1sFeA`pwU^Ky3g3 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/ogg.jpg b/libraries/filemanager-9.14.2/img/ico/ogg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e20ab2fcba8688bc85b520c7c8e54c8cb0870f52 GIT binary patch literal 1557 zcmb7EYfuwc7`?lj$0EdJNkUK=yP=|tA|{bXd1yc-0)h<#MFhnpfEalUp%f9Vg<{3l zN~N@lDWVh~o$81+GNK?l7%a6Y4l)6;f)BtNCfWQY>9)WU@DWSA zJbWzo!AgK47>Xe%ilJ0sbc_lH&4x*5GMG#zgT-PKb~D(xEzV+bXL4=r1S~i;V-9;J zi*3hZ38*HpoT{|NFk1o6!Ug|3EDeCbK^(}%5NCiA2u2_lJ(vTxj{%I*U^*B~93t6J zNhlvA{%(@SMCl9+w{!wKScGyg4ivEEN5dF7T|V{Yx~A36b=ZF^wz8`9p;;2?(C;R1 zxdWG`o9jLOdlQakIqVoY^nMXHyW*e%pr+%CgSFi!Hk=-NU4K&7OaJq4gG-zJ{Jb|k znUIQ*0}zY`$yj0ND2;(&OcCx42)P0h!XZ(Fj!rC>CVp%G)O^mUI{>)+jWtVjnfm>z zul0$}cHY_xk+WpYf_rt}4bTi1qQ38KKRc|iEPSscFQ}>L(DTT1UJ9jQ)9-hUU%n_d zhMu3_EQ|g;vGUfhCNJ$xef8G($&q>WQb=b$0qH;jn3WES(dYoN=aPYh&{-t*3|OI= z;soWBBBPlLIn^#$O4QEXt?KoiSCqLSfn+mlI4n$}%Umf~&PVzSo|lBJ%3vJU#1AyZ zZ9lGxpM6;6>1253#al8w_!)$pM*wI6Kx0}V5r_%w>C=!N0aJh|1vruY$KEyWA64u5 zJ|?4M(TssBV^!T%H@8gee6i=#phh|4^xd4`lw!f{)w1hec}c-pyJb6e9EB*0IFwrv zI+H#P15p5tfG|Q)1jkt%nDzO2o?M~)<*nijDLOH?C0SSchCO%CyZPT|!N5q~PjLhl%fj2H0PiBbARksh|i@O^_)@pTEQ%4yUF%(zJm&0ZRb)Au zhkGrar2Cq)heAG4=Mi?0xHJ{;cfxF4M4{l|^2Uv58JuX7Z2qzasr=H@+1l zytL_W-}6PP|j1@i(f0xGP=;=Fvhvw%%Edp!}hrY`L%8+9Bx;^zK%uP&c{F@&qC$+EAPi6!= z9#s6)A?_m_Ug%52TpkwddURN~k>7jS^}wvTH?&)lTo&|%^kog^@vrf2G$nKuE)Ez^ lY%te7Rb@%$qsyo0)s(es`YYfuavE z)~s?}1rP)P1U^8~5BSczq#*#fxd9^p00kfkQb2$sm<0=90|3oK=f1?`VRK`VGO3sX z%iJTjOSed4B%9blyV+|zoL#m^!=-F<6B`pV6N`0h*YNFj6hoDP5iw%F+YIVgFgYuDdr`_;d7;yq6grgrY}>O>TJQL# zib0D{SoP&ec~C>|vU--A-P>A`?FT;->7aFoC~53&h;bJGc2SD|8F_O0<_etx`^|jg zQ`-A<>RWdkw_C@Lsc8n}_Bei9@>R7od}BJKw+IJ-1PCN-mK^L56eHjqF3*gp&eY%w z93y4ZETM`kk&$j|1z5yUbqwf;noM9NihTCPz3dbjSNV>{M?a)DvPUM0&lOawxhEH_ zrW>Zbs%(ZB1~VAs&#EwuK~(3O&DY@Q@%Xb4s1jo0(GsifeCiP!?e^1slJ~`R79Z5V z^WQ#TqdQh9*xMub2+%up*3Xuibz`q($Y2gF@3#_{n0*k&k^!Je5h88gCmCAX;Lkp#xH9Yhe~|*w_a$udve$E_HFvry^@P6VR+VJ>|KZB52X%!Op_I$ zCO4aEWsz~IO7ls-i_89I*X|cdlSUm{67q>)qEAy|YS~cD$rrJ&=}u`A#XeyncJ@0H z-qujUhSfai4H@NqDntc%Y9Mz{44eqn)LHY8m3FG=55ofzFMQ9k_|ikE$Aa!G%sgNj zYmJV#ro3Yg_jvy4{;XWe$hXYZztCxscKU-bpo1qV&Yr(Pa4OOu_t5oU``4zjmK*?G4%Z?a5?C*8ro3ZPggiCk1>`lD# zD9%$Hf*dc9FaKie8DB=(~6BVgEp9^N_SL=86XiWB_u>{ho> zc(Faf3iaXYMVVw}HZ8>e_Q+=EJYFidFl5uFct> z(G|yD!I~c|X=F4t4*9jMEfgU#JHbmQ+Y|3wN`7osy70etBfCjH_fb3Vdxu!n_;>; z3|J8x?$_n*uRB1l9q999vYM_uDR-I3AIUMUO)z0;^{Bt{?)0N-pZB!(Z1}(~w3!?z YzC{g4`O>ny8r+H literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/otp.jpg b/libraries/filemanager-9.14.2/img/ico/otp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..802e78ccdd971db4d8429b0bd900befb86351b75 GIT binary patch literal 1870 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 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/ott.jpg b/libraries/filemanager-9.14.2/img/ico/ott.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1a4157e4570faf5b2e20efaff272e816ae735290 GIT binary patch literal 1748 zcmb7EYfw{16yAGpZW8h!2>~OBlAuMzS3*Rwib+6-APAz>QHllvlvqXN9mHCSJQWZX zOMDGMsE=4HXrVz-p^Ohi6tpTbMU*O5r3Mg85l#1kqW#ey{qF4S&Ys=xeCOPA)^yL* z0oXoX-d+Gf06^deOb>z7Gf5QzfS(_50sv3}lBohDxPn$-0|x+TF*>@FT#Svbg9xMP z9hl`G9jDr$N)8X>hpPEL0iN;=swfp-JY((*=NT@(eDA2Z@R+EO^?YHHQZy&jRTS!C zY6BhsMKBaYP!vN6U^qsAOd?Tm3YkKokeN&tl|f@s=~O0@X3nKEcuXdfLNjNXGg%BK zlSh!i>%>huhS7OcCYATUVX6ZhDhL9}7-A1l4uWwIQ#}|5!^aQ^BE%8kWC{sEsnBRm z>|>vp03bmT6w`gcfZHe=W5e|6^4Iji`4jAK?lFPv$ky1V;Ju%p&YRaQnWkFf=l)8| zC?7e6L}&hd)$hgyyTYzuh2AHj?_^c;)_ESQrVplf>aQ@XFOD385+5|Lx1uU*>&DYv7yNmv zYmg_e29(*Ah37KGiDhl{#IKBTK5aoZnh3Y-$J3HF9*n1kpB}%5|NT6M`Ic?A$#c*D z{h;gFV%L>b>dsbI-=Klzwl!J3$&pQdmvY9MT|Zm-#JH8v$RPw`B}>XPmY~ z6I#@CI3?KxAp0Z^K}VvDk^=TSIm1MgKw71ClkiB1n6P1!E~{l+hC`to=Ft-6g2a%D$`|R;hqb;*kxwgPb#LE%(KN*|rF3$gUPUkHcX?wwr6_7le*4T2 zs|MeUy9(M`+HcvX{J)-@Yb9VbE*i4h5Ey)5aR2!lEXV{7S!n_^4F{jA!;CGvN-sIR zogK6FxWl9!er20aR*cDe(`Tc!%3kb$bb?;$7C-Q)Az35!T-#EV{;v9XCud93Wwp#Z zBGy}RaCO96pXHIO=gy2f7hmamM{N46M~IXSzz7J)7bs}&7bu3XHdMhkqMaBfhvPnyo{ z$kC$WG`F-cOZJ|7-JaPAofBW(JIPmaNqM#W;<)Xv`+diz@Ix22=Uvra6qdIL3|W>7 ztr?3V$c~1U3!Xm4w+%U3o^9xJaoW+!8|Ntbs_wKpDdR9hF`?y#{;41d6agbr-@Q~?tH zu|J_c$W$N@ic+=G07H+We1sFeA`pwU^Ky3g3 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/pdf.jpg b/libraries/filemanager-9.14.2/img/ico/pdf.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2080921c1ddef54ff2d192666250b86b47707fa4 GIT binary patch literal 2050 zcmb7FdpJ~U7k~HObHmUKMsi9sZXu=_m*VSU-0zo(N)bkeCPTnwV%D8wcquu{r-Nxwbr}E{o-LjaLW9>Aa;8U-ro4FFsWudW;~Mpk_X&E9>R#p}-Ew@Hab`9zhB_Bc4 zC7Eb0mPo)6i2t{Vn*o^syufh;QUfpu~zdX&dGfqo1VqF9O{@(HB8AEr@ih*7dOZzPuQ!* zGva*Gj?`H0HjGvsR4RP{@HMk9tvY`*PG}SxGb;&vtN`B3?$79SIkb8^jH6xJ3pkkl88m0H0C!3Y_H1vr|# zB2|rvH@Dz~D^Ltr>{D4K)ypVR!Ofum?CJ@n@TVrYeY71za+jO826c20DN4Qjo*R#K zjSsHBai_L8cin#W%;_Y|!WAa}>743A|N5}mNGe=xH*N2fW^#8>N4JpPOJ{X|#B8*D zc-he6--RK>GH>suotQ+|ZvS5|)?HkD{6%`u_w+k3bwORUaCr|m*u63(&*cK%?zQ^V zrALBJdxwG0EQVChO^vJW&7~Tx-J>WcH3=sS+HotCfP@pk$WyU2HKsZ%e3=F;p|Nlx z_^_#6!M=vNYLRs8lKcJme8)qAsNB-#*4pTwvt3JE2M>w7=CE4h-2u8+;(`t8gN~v* zn2;o@!8kl3`)v<&N-$V5kXN8Fmg`R*`-UQKSTLtYKfYW!h&BY9f0 zL-(_7!Gf>i8H!Fm=FcsgKb_Nc7&!2t$Uf2A_S0!s?(+jKHz)MUU)|q4kTF}{)*F4z zPHMtBRS+iNu>Bct!}xiR3;QTa9k+X|&y}gSjvonWq_h;Y{9Ldvx%|8QPdynatI_zfHoAekG@{evGS`1S%4pI2)4bNu zkCE*MDLcDzBNAQ?d7)*{BB3*mU?6mkzLfzY0~(WIjy5YNyqe`#($q7vGFfJ{MHP+o z7!tk{(yJ|2-@NJeqO;u{Wse5q3vKoz8uJzXMS9m?8`d^{myQzA(NE*`!>u4DYr#r z%H-XA%9eYpB5%PrOi5PjKi$SBLuOfHcW%AUXy41##=WR$9$~6k{?6<4D}FV3roXYo z_C?&Jnot=dpx-$x%BxfL>`mIZDRn3Y1+qgq&^&s`2PBEty_?-MTND|?`Cepj+OrNInQEV#+=<&QO*PV zNo$SHx)bnxd7shz(UFpE*DOsPmpq)L+BLI%nC8iTGkiv9&H2rKCMF(o^%;6|-d3vA c@aHkR&OiOwlJa4%n;AAy)jzAKAVNIwUy^9o$^ZZW literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/png.jpg b/libraries/filemanager-9.14.2/img/ico/png.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c771ca3c3e3c87d3eb8409538ccc6187ddd717c GIT binary patch literal 1979 zcmb7Ed010d7QgSkY%GEI0*Gvx5D=BNOcIcQm4OI?AdG-4Wvc`T$|^x%6qk|@6gTBQ}GN)XB1Fc$jnocHeg?z`tZzq8%nQ4Op9 z18^^QPj`SI03h%Iswv>I?Lb^C06spz8UR28NKPCe!5!2BW4Hi7tI?H{%xY|9AEs8S zmVn*Pl(e{{xJ*$DE9xN2%XgbcQe1Kz%htxxhG(&w1S1gD4VX9rFhpIZ6(LioBpL>F zCh!=>{bwCULQtqzDS$Qxl{kjO`jz~}U^;8X9DvQr4{T#aLx#g;wN>?TQd_yyZ+d~( zq;oV2Tz=4GpHX%CMC;__=9ct@za4(O)}#IK&F_n(^1JfKkxiP$038gvAiF$NKl_z) z!oH8*OzU);k@>vLHV=qzt$Kv8U1bd`{%BPXHBr* zSoX%l6GpSOMoia@hVT3Wj)gvT+(XVwHypA0Fu3jSBNoG~ri!L^w+X53Gbe-Ga|zQK zi-EI8ilSQ&9h)hy4Y5zgvvNyA`i@p~TU0arYbx$!G>fCO{VmNxUdb=K`!X^L;?+Hw1MG%z0^jPK$HfJlB=dzp$?1nS4$PKTwZfq+fYJ;x0J`2AP z#r+{U{Os%@i@}(q-f4Mm@$9%@rZdF+D*+G`!)RK6f`qr4OfVp1K z3ZwRk;&By#0rJ)TLr_f`iTW-?RNYX5LDn3Rhorg;C$+AmP*_r*c^6VX^Uz)7_aAcv;)*I|?w`BmI&rapy8n}+F; zp^?FLTe349Lwf^CdX)i~B*|pFVcEdL?s$g7w6ZeLlVVy^(B$>P;FsX_p|0Ed+P^op z@p<^EJT>|9iPOdDpV@_<|J?K6Jte8>o}q$kUO%XSD1>A1^K?n>?w(h>VcD(JWk)Fp zd4<{tAk4V}j-OC0e~zqq9&q;i?>x=7&)-3!hS^psW*<&>pB|qO zC5K9s`rbgdXR>fXPHd`~}tVwP*?UKj} zBR18Q?o)xKrS!>xMu)^fn{=aQR3<^my$E9OXKF48XfDy8r_egQ4jikEOh)MKM7^BNzO)QszL-nJP3BZvLf zLP;Gaeo1|lr{C{(@O)!LxlYuq%^B0%_nvVA7^NCdmbqey!+{IQfvosLV9$WS4`*?n z`$h`IlCG7O;R||i&r7|xvhSw(ZPRzr!_kTSc;%@=hm((b+J^0dQa6;Y8K&RgE7qLq z+rjChj}v3-hf<%g z8?8S31scpI-8s7*FW`HkPuh$k(0hJoSmI4719}19bt-y4`PDHLJw}+Dz2_8@u}99A q-P?KT$Db74$!(m0MXjF0?PqdN?AKGi%o@JMxpl>DuG@&L8u>4o$F|J? literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/ppt.jpg b/libraries/filemanager-9.14.2/img/ico/ppt.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aa13f733428128a02fb020ae18a70c8511142c39 GIT binary patch literal 2386 zcmb7FdpK0<8voW>Gh+ooD}f-nG{Ae9wBn_j`Z8_x4GiNCp7vXwS9> z5Ci~(JwP%DZ0wE&_yVwP8!!d{5CIeu0C3m}(*jNG0|3s2fBcEeMSiS3q)N#GFxwsy z77!c|>2rX}i=aAk?6w34915VWGg)t9YQl7)vJZv%gdXw^qSBA;_x9zn=nMAgtb~0{7kgTJ`4dfPKKz{( zVp}&pg`vOuH4eNNkF;i;Y8q0H5Uh-f&CI|E>7vqP;1GZ;vBlvLm>>fnItx`+U1r0< zh!HWu5FTEr>fF9+N3eVMR9|c%gYNzz(u_3B8A-U-pF#1k-q(F_B*e8jBSs~R)o7yW z?V+E1f^#ML@YX`O*0gbSuf=bo;pTvn*=FM?virJZc2Gh1d8^r!-CHcTYTpQXl^BzG z;&PVr)gg;~PQB%jBS}3}V|L}|Z-y`9&*@K04wxOU3^mQ{eKH>yqglR-d|gAQWw@?m z`oZ=Ec2*v>fPoXL?2+D#^R8>ch zzRrwk>n%(wdo{U87R#?S^eL#8>^yhX&+swVD*dO85v~smwJm$ad0O&ymd`CE;Gf0I z_wGGza;)mO_|=I832^h%FNp8at>M=8+6QUJY72^MmwzDvcZsZ&LpylcapA@8%Pyqu z(IYgrkGZ-e|E}p?)=)?8yS7cY+684BDD$;3%;qS-x*5jFBeLH^jA6zB3Lb+@XAn>o zny#&jcbKrO+>{@x%4FGac>7aC->ZsX4bOYEmX8*Erd~9n=CfJUagB?2&IFsh%#1#w zwadaGY5LB=cLVn9@utX9NVhs)wY`4FAK`my152i75)I~=EGMJ#OQEDq@mpJ;x;Lv` ze&NrW6KC$x5V}Sdva)T@Hil30ozJ|wqnVcDD63JD{k4!aiC_I?x%1Fo+T?FtW1@)p zH>Gd7C#$0M=FYUP)3@;OarW;LUVrW;8@S35Pkr{+>zLzeeO#O34{TLfPjz`-Qp@;{I*?Fx4ffe{7uzv-N?9-MAxGyGoYc=Tj#uQq*dqbh^&~nS#ROVYnpY} z>-96!+^EqX_K$q?=U13FKEKp{^rXOxMT+q8eJ%l+Sk4TkT@T~%Sl=(@i~@8RbXymZ zH(!uchIUR)*>D~#wZ65^e3{U`g{XJZ=8@2Zq42Vcpmo$CGe;Zdbm&}&n(+;J93{HK zKSi~Q-_w5MxNT^m(5d8$N7DqY%GBaff?03Rc`ikrDpoQc9+{jS?0VsB8mBERw3nkf z)C%oJh5~Z3*79T(4xtJcjyN9z%?B*DI(~ z3Jnm$9 zZ7q!mdsIBL(_ApHR5cKRfQ_X8RSiQ2s~T?sYQs+wm32;1zeB(-3~O{)#l?<-!PwAe z+&;Le6TSKALNc{D{9e!a!FX-l@Fi2Ou8QrZBl@;amRNu&3wdj4Tp9G}n zltou^Ns&S#N-Yy8;{@Z5goXjX3x+msK6z7bvz!t{WB#Jo1lKSXm3sLN^0LM0owxil zUi5}G7i$YDV+S+hBO+hHJ+i( z)$t0#t_l8g!}H#sU&CWB*IxE4?;gX6<7V2Q**?3y%iJ@Y{Yk^2YTws@w{VX~4MWoR EU*kK4SO5S3 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/pptx.jpg b/libraries/filemanager-9.14.2/img/ico/pptx.jpg new file mode 100644 index 0000000000000000000000000000000000000000..85049696aed2ab58dda7b0adccd5fd70624528f9 GIT binary patch literal 2479 zcmb7FdpuNI8(uSeW{k^Zk4wT-gK<5{U|i>5hQyEuF^C!8dJgOW z8U>*t6dDbo#Rg#^vEeY15?BeGgoFf+K#(QM$jjmt@dSeWDtSdEC1qu0St-@Es)V&N z1Z5?05@fn~rZfaeE8z)vrT^QO?gJtoc!4+wr4GnrGJ17gaT+7f{_Z=o%!pP)6ZK=(^$S8;2UNiHNPF} zKF-+YVRSAvQT3a3*W%m;ug8lSe)YWg;*i+~5#BLW;d49B{+%biZ=EmC>D~f9+=(0a zi5AwxnY~GWs~j93mM|02)>Scgs;Y;_xK{f!)!P1&nANVeqNF3Nu7;z6zKnPE-g}#P zVf^`%_JW^z<~q3&^`}H#jeM?4!oT$=f~%@Ve_cddA_)*;6d0f|C#bh*k2aeyXm?|5D_wN!Us2-&C?eCtu8n*^- zbWT(jU--tMdMbh#dbjxDYL}tjbpe={RooW0FV5c_kLZn-6~1a~tFm0QZnyLGqc0S& zJ(@f|mA<8O~U&$abQ9T5W+gW*DJ_a_!XT~^w!{MTk@r zF(5ZrZmr>2R#tZZDmCN!`?dErLDIHJ0XSUTe{Qf(gVn(XKV9sk@b2 zN}g@r{AG-OEOu9`)2}ya&O>i&NH<{DAe$Ex(4&GD)3b}_K4~2@(FU%s5VSAWK{FGgdTy%XiHxeT}wB z_HFB719#_pN?mqq6Qb!HjsfN1;}C<^{10{WM=O$F9iDB^xR_$ns<$V$liobmrKmBI z)j!RN;f=PR`dvQFSMajj*}8o13%$sV>gw=#8(q3qO&H7LZkaYM%5Zw5J1;pHQ1;g$ zMFg@L(oYZsa5&sD<{yxWa#%I0Au~!|U4zZ3fhk5NzGoE3G={C4`~HY*{(oBxXMtwubP+^oDb`adX3ygLPbGBYEk?!w;d z_s?xgc|&)(II$VTJ|z<0Q47Mp_fisZGl3<$+_));vu%nh7dk9zdYdYavDp+YRQMI3jA_6r-DhFm~O_3SQLVm9s zH)(oV6>QWNP@}SIWN6po^DSXN;W}zbqT7XDN}lmcJt_ThhwFGiI<8x$YauC0b4fV! z^|In{W;efdU=mcRJt%Jo0h*$t_e}Wf`^bA{LW~zHmq6Vmzv$}ldn)cK3Mr21<=|{i zchXzOu#Vu4iU4=3w!WA}-Zz)cV~OzOjw^AKzeT!N<`{VPUro8vsV)rOlY4D| z^`_!$bLpzK?8bNJiQC%Z2E>W8SUYj?sK{GGE~Ng$3xWoXJl}u3Dr$>jA2W{#0~_V% ziupav*&_4_9b1y}mZUT5ybzW@)cuD%!aC&Rcyb~h;AH?Bj~h4zqw#t)2I9-y8$o

Pt^fOKD(e?!4mursha)Xj-HjME6lG= zhx;#0Mbm$*Z^&kHv&fvn8%g}1`X&|&n48k-Yq%!OVbx5&ITO2{@e#Ga zTnO)SA{hw1iZc56@{L?&){>7^jP17XDYJq6)oyuptaE?GX^l|CK z3{~m(xBun5CS(K#irPG@;4tL|25P=lJhV^LdpG=gTB9kJ_I{nSuQ}m!Z{gcD&FyCe p+N)06^2|@9do&N!oa8e_@A8e}wUV3|JzC%Lx-9 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/psd.jpg b/libraries/filemanager-9.14.2/img/ico/psd.jpg new file mode 100644 index 0000000000000000000000000000000000000000..53028c560d07ba15c963e5136a5ca6d4246ff4e6 GIT binary patch literal 2110 zcmb7F2~bp57JdK!UZER)v$d@GYyn|JK=#FMWN$P`140xOB_Pe-fPigcfPgD5fCdl< z&u`rlxA{uUGHYyYJn)=bU%%mkvrF z1DxmK?Ew%300e$OItsY%>4HcAHf;hX000_54hjGXuAmoazySbSfqvK#RbU_1+hk7Z zGO+SZOcBHhL=j&QyY>>i&F-FYf_MS3&dlD-(#(1z;T@k6krcl(mM~AZh_H&Zva+?5 z{t8?HieM;)peTmQ3?pMQqmbxSGL=H5QYlQPB8wrXNRy{AnaT>v@(ebU$)w6@Dk?A) z8B8Wy76e|G-IT{Lc{YtnWB=bKy$M(}unmYXL=T`W1Y;r64xk0$!`x&%tr&$yrqVH# z1iczE2lTGE;7mp-R1A?00|o|f;usDIydPdK?D^;n@?yHQUQHoRoUlh2b^lplcXvUZ zqe5%>K%w5%z(R)V*$gyLb+LW@57q~|$6CK|YL#?eYR0xM8acLYydGyWGn;$tXea=d z12bh3b!$-?-zHA`aMJD9L8^oN^fr&E-G>06o-3aEgbS!JOG6wWBovZNUde%sVk8Pe z1#0HF3PDp=<%Yq8X%GiOMwgYYQ&L``6UQUIE7UAAvvmlG_pYw`<6+jRRhKb3|53&9 zu(-5=l=3{KNSfM$Ls9p*`XHXED*KyP_eRpQ z=7x!4lM$0|Imy0SHqCOQ7Psa(z}`}<++VZnw9eiK=E{=%-;)h*v6Y6R?{f3#+jV`r za=EOoapV1|r>%;f>CCSEl$I+Be4>uHOKKY7ynH)N3zNnV_vlOHS)b{aQ&d5!=)ie-^ zFZb2e6b1@&7W7pwwB$rTsdLqOo^W#OFV!KfUvd6NA}po9Kk(<(xwaL(bMb|Aeag zlj1&2C$CdwUP-~*b!j~R91W3-5CLmQX(ts>X}Myk^9P}N{usYcPUdj}fi&-2olz-mv;E~rz_Z!r27h_UGH_uZK8%hpp#SV+@CnmI~t@ZiaTqM;xl|!{Rd2h1fE-bYd93}T( z5RFcjl`A$f8k*(!rzeMFlpZJFH!f)%k47ljyD6+1(h?ord1K_daLjPlt~l1EGJ1>0 zF1uBYhNcNmBRbdromSKlS)(M$KV$dDdY9#H<>0JYpXa^4q*+C#kAMEl^M%9qhn5|y zrW)7xEIo~xQRpf?LzfF^luyA1O*NZ+I{jMC{uoHotDlhkrKsr9k4*^h{g#Iopu8;aY%(XaH(pj04ydF&eD)6%ANG*TTgwa|$QS zA^DYU+_3uImHOi7E*eHRb=13ZiTc;Y;&n#T8v4IQoe+whJ95A0WvmnFy=At&D0rN2 zjGMV5lpY+h+BmB=-sEPiN;=nL`i&el$jNquaW>{AX~fSxvnlatNxJ;KwRd$;hm@rs z1lW!Yg+EDCa#NozOy6oEc%aqh6J;xsC<9oys1XvOLo(g0^pvGfCywYJYBD zAXM*H~h4%jCfIDeyg zf`jsj!EC*CpO`{i?;9P!AbQyAKC;wyEiQbYKdHh!##FXBob=&#}b!51#x2xp7Zy5@3r*irgL%B#|9+q)m8gwJGe zqB26N?~Ly@jjn$m8~#p6AB6@83;aiHSxMrP-t?mV5&OysyA09kgSdO$wKmPl5%Vnu zBBV5DJFRJUUNB9HXg`V#citj<+4}yeHLN!h}%G6bTrh&iHXRMJ;jUM zwT@%IxyipY*56kdvTUuBfBXI`n}woZN74oRbu!P$MFPF2;Ip+TRaPNy@8kHG81 zO*ITtW76m}=KqGW3g9&04Pr6G7@#$i3;`$uW558`CqAma(JCAD43`Eeao)5>W%2iS>b!Ts@wZteVlM_ zj9DQZ(mQ{0q!;_M=QIAto^Q))oAvrg=}w*RqGi3S7w)MYP0qZs-7tvNJowO>UpcG< zK3Bb#VzwZyrmf=%y}8!ui(1AQO9>)+vYuI=?U7`*+eFOY@xZG5}fwnuTW zifL1vjuu=hd1WMm8ccBj=@3L^S_6z3Mj}%fI7gGs$2CthC5H1u4O)>=Lu*J`(^dwAg9 zn`=-a7iNhlDeAOD*ermAGc>h0v$#A6Wy=^F^^kKQUFZ??j$B zD?9haWcHZz!f*6r2jZ*!Gq0E5+hEHtlVi@oy+=1UAF8$s7U}+GDPeo$uVk)uF|er` z75vaJ-$?s?a9fkk?FEA2aWB*RKKhlfPW)(A9E9yn$=of9EBa98e*6Y;aH%zRm>a%W z9%ptUE$-aU%jCC0&2{`Qrwnh-|7G8ZL>(IQ|R9vS7&@~R> z8Wq4c`3eN*00x&Qkq(G`D|5cqo*idIoa^j-RCmShF|=6IIr>Ns&$uY(f;AG3-PH~3 z?@R1sFPjiK(0^AA zVBkECu$0Y}#t%s3sX29%;)$ANbSo0b5J83aTTpR!V#TPR&&iz?O?zHqhZ`Q>G;r+< z-SFNcBiF@YJVFufR?}_omZi4o&F!6#$YiQLNQAg4AOL4@ctVMk&6TGP1dt?EX*!=IdZXNJaxP1_c3b6))-Gab04 zf|IJEwrG3Lz$$Knd7`Tkq@2Y7@E=e4Pf`G6WN_^zQn?s%PN#)2AY)lYj8+|@B*}P literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/rtf.jpg b/libraries/filemanager-9.14.2/img/ico/rtf.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c0e14b3f4b883770eb061827cc9eb8497a75805f GIT binary patch literal 2511 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 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/stp.jpg b/libraries/filemanager-9.14.2/img/ico/stp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cab6077ed3a0644c1e190818b2de3a45a662dd23 GIT binary patch literal 5539 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 GBK;R3t(Um~ literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/svg.jpg b/libraries/filemanager-9.14.2/img/ico/svg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c771ca3c3e3c87d3eb8409538ccc6187ddd717c GIT binary patch literal 1979 zcmb7Ed010d7QgSkY%GEI0*Gvx5D=BNOcIcQm4OI?AdG-4Wvc`T$|^x%6qk|@6gTBQ}GN)XB1Fc$jnocHeg?z`tZzq8%nQ4Op9 z18^^QPj`SI03h%Iswv>I?Lb^C06spz8UR28NKPCe!5!2BW4Hi7tI?H{%xY|9AEs8S zmVn*Pl(e{{xJ*$DE9xN2%XgbcQe1Kz%htxxhG(&w1S1gD4VX9rFhpIZ6(LioBpL>F zCh!=>{bwCULQtqzDS$Qxl{kjO`jz~}U^;8X9DvQr4{T#aLx#g;wN>?TQd_yyZ+d~( zq;oV2Tz=4GpHX%CMC;__=9ct@za4(O)}#IK&F_n(^1JfKkxiP$038gvAiF$NKl_z) z!oH8*OzU);k@>vLHV=qzt$Kv8U1bd`{%BPXHBr* zSoX%l6GpSOMoia@hVT3Wj)gvT+(XVwHypA0Fu3jSBNoG~ri!L^w+X53Gbe-Ga|zQK zi-EI8ilSQ&9h)hy4Y5zgvvNyA`i@p~TU0arYbx$!G>fCO{VmNxUdb=K`!X^L;?+Hw1MG%z0^jPK$HfJlB=dzp$?1nS4$PKTwZfq+fYJ;x0J`2AP z#r+{U{Os%@i@}(q-f4Mm@$9%@rZdF+D*+G`!)RK6f`qr4OfVp1K z3ZwRk;&By#0rJ)TLr_f`iTW-?RNYX5LDn3Rhorg;C$+AmP*_r*c^6VX^Uz)7_aAcv;)*I|?w`BmI&rapy8n}+F; zp^?FLTe349Lwf^CdX)i~B*|pFVcEdL?s$g7w6ZeLlVVy^(B$>P;FsX_p|0Ed+P^op z@p<^EJT>|9iPOdDpV@_<|J?K6Jte8>o}q$kUO%XSD1>A1^K?n>?w(h>VcD(JWk)Fp zd4<{tAk4V}j-OC0e~zqq9&q;i?>x=7&)-3!hS^psW*<&>pB|qO zC5K9s`rbgdXR>fXPHd`~}tVwP*?UKj} zBR18Q?o)xKrS!>xMu)^fn{=aQR3<^my$E9OXKF48XfDy8r_egQ4jikEOh)MKM7^BNzO)QszL-nJP3BZvLf zLP;Gaeo1|lr{C{(@O)!LxlYuq%^B0%_nvVA7^NCdmbqey!+{IQfvosLV9$WS4`*?n z`$h`IlCG7O;R||i&r7|xvhSw(ZPRzr!_kTSc;%@=hm((b+J^0dQa6;Y8K&RgE7qLq z+rjChj}v3-hf<%g z8?8S31scpI-8s7*FW`HkPuh$k(0hJoSmI4719}19bt-y4`PDHLJw}+Dz2_8@u}99A q-P?KT$Db74$!(m0MXjF0?PqdN?AKGi%o@JMxpl>DuG@&L8u>4o$F|J? literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/tar.jpg b/libraries/filemanager-9.14.2/img/ico/tar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..665cd0364930df93b3fd32d88df6b235796d26ca GIT binary patch literal 1747 zcmb7EdpJ~S82`>Wb8{JHObDqNvM!++W|WnTT#7DhkSi}v@U`W&Y^yEtqO;f3<3=BAdWW~QtiRHx8L|L{<5FqM9c#WH7deYpP8L0|`9 z2!Rm@h7nk12o{kU4kL%h;&FI99!Df9lNIHa2?_)vk)lLVP*f*s5S8V%w3Ud;ibSHi z>?i1U*-ixnQBWrk3F`mbq^*EV0G=Qkfph>&h7d9&y@@6cEtxFEC4=w;EDnRlv{3aB zS@cr`RS1j2BM?D402C1jz$Ao(>enM2{dr;W8%QrBO_>g$;JUMN@#i{Ao6<&SzweAo zpK8>#e*7Xl$Gq^kgjTSiYnWT-8Arb$XIz$bxZNT)G|av`a?@nllgKw=<4R%qwezAs zqGM|Y=M!%@`MVEpW)zK=SX}NNltkAd_M`vCsonE>=PR1t?q4rigb|*<58(cgh1M{X zwJr%jFb)-KnKcH%0vLyszPUyX$+Pve~|{NuMO01@}uf_7ejG4 z=t)w<4o`XhA*_7EMT4G7y<~;@-V4QiHRDvDW(F;y>e=|H;ABZM&Uvp}s71gLwHOVP zPS&Pu>uO^uKv7LlR15~j%Pr>)P*4aWup0x;EPHsPbz_-ImOn6X>^X4JhspIZdf4KS)=%Tz~7Q`H}ZC|4j4N zpFcl5!Q9nZaja#R>#ifa)l=_o5K1f#hhHi+-pjuJ-3=Zbc+W#mH-bGlmYuQxLuZs5 zN|Y`u5`rOM@Sm8XuKon%lYhMtE{m$DR5umGTuczpOF%mKhQlm6+sZ zH!obd+r)ww)e}@=CahYOzmF&B&s$CFGI}V?Oup_VSX@84D(|HCZ%nP>N@RBw$=iXFZq>|-Tq933`O)U23JND(M#Ej;>ne!-x4h%nT+J0}qx*^A6UAv;;0mFE!#L$(44_iZ;KcXQRfcru) zKxU9=wp1xlnYFFC7BV3y4 cl~nYexN1^UKBZm$LwC;87hgqY#!37C1NakCm;e9( literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/tiff.jpg b/libraries/filemanager-9.14.2/img/ico/tiff.jpg new file mode 100644 index 0000000000000000000000000000000000000000..afe2cde90e7aeed960ce94fc279d0e22919144ae GIT binary patch literal 1953 zcmb7EdpMN&9{;`XJGYo&h7l(^`;HAANi&1kRAypEg*A-m(1nr9=pwR+k|;GwE{9d& zK@B_7<}9{2rHsdAg>6N0iA-)?WVKE9Ji?rJEO!4rpZ9s6_xF3h&-eTNe6Olr)i9v$ z=I`PI2m%1Y9-vYH4lh<541k*(Fb4pT0CYhNaM%fxf;HF+09*vG{D~_1vYoDHIA(LrYtWqD`hy z^wmZ%b+x7@f@tcKC?x&=8>$9CBLP1Uhd{;vra=e|QZ)iYb&3#3ou_3G5j=qe!D``> z>@PwXherqyQPmH~2n1j%Ld6o;uiX^MSysoshHm>cy3>c!`SIDGzP4Vc6nr=M#K519 z0uB1i`GnZ&7h}SEeLg2DK5cu`82E7Px1*Af5&P{{+E<_*02I5&yHtLDM~Z&g>vuaO z!)De;X*H_b_kM_?D0^ivm-vStjGY-3KroH~;aBM45IlehM2N13T5o1hbyl+k{uomd z76yce7byAPwA%Aer2Xw@>kzxn{E@{YGbl>(!0lmQ^!1H*0;T0i`TE`trzq zH*{QPw})VH__Cl#bU3H!up3U)|2wnuFTuu0766Bn{j{O_l94uC;%ym$BnU(B25gC(Q{~9||we8P|M) z9(=3<5-cDF4L~>uhvjt{ScVar4$3fQ>oPez7DK^m7fs^`$qar4TDFw{!;m3_knM( z=6a31sn2_CEa3~&`)3ZdT$CxQ&Q)D)P%>stiiBRcr@L=lsf}Lq?+N>sy`Q2TXgx+{ zZDree?}oNCaixrme)ibbx# zlot*NpIdCcb$oS}X!!P)^QBVDHs)t`Lb&+CR%f)}={%!nDtWRdtaO0#LqhdAT&m!# z?3?KCb#A{>r~uQT)HPsbw*Ub%eX~kaQ+Lz4o%%(b`3%pELxvl4i z))m`Uclr2^n4D|2#?hp; zIioc)LdxEEEsc>i+U}xE9<(xlJ9c)hM3ls(R>=zG>J~8lV^FXawA=#_pfNlGrm0L8 zH=;AM7!~--m*>QRF=vq1`Abn*xtniTm-qGRXX~o-|Gr~q%9lphhHE6r6~ku)foSNJ za0ioLyIKo<9;H=3oT0~5S=ww>AbH8jZJA2l4fUR(Uk@1hJaRWZo!}+>lo2`QJrqzg zOXH*(-do#k=A?C;+s*KQ8+C7di#%TW@w=~XN@b#)G-t6vNBK}iR|m-;Mg>&hOx?j> zooqj60X}&9)9gWv;^NW)2o?vncm4vX9vKEe+qJ450NaiBoFx$!{1-HAh#+h+tN;t1 zi?RZ!3?|28F>3WlQI)&yv!??u<8upTT)Pdc3rW?sZI}}is(M$!_&@nVGzMT%xmdNBSfMxq|FbKVqR#(g zD&Yf3eGI zOa-HeBXUvDUdVcCI{Iw9TOm()HwpZ^b5EBzOAPo1#a_$qEe1;}N&@gbKh b9hK$e}}|o`bza literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/txt.jpg b/libraries/filemanager-9.14.2/img/ico/txt.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ec6d3e3f5f5b5ea808a90bb21ba75007d3802a95 GIT binary patch literal 1765 zcmb7EdpJ~S82`>W=HfEzj7yVC84N|ca+{J%lyNJ=P>B>vshN#RROmu-Yh82MbYX`? zs8FNwL=>XvGL(|gkdlYUsKsNt9|x&p7WjWy?pO^-{1FspZKNt4M5k~JJ|yW z0sz7uAQk`{yD-j90GLdm4*(znD4qkPuo-3rs@Mwv%!R*eBDl!+xwph9o&~0^`$9QE zoQQxORR3`5I+mS75N8jEYGSa;z}SH9Om*558nAzlUm(>mj7~Q(_4D@&5O)Dv07D3j zKroEJ5+FE40=$$o0Y|_S2n0NdBu|!;ktfO$NhHOe6lLWoBo&gpjM}1~Nb+(d5=9aO zTP|5Ciy*QTB8f=(-w@veWFqhe5eTFOU^0Y|A#npx$I3?_2_!Xs1%W7yL!=-)W>xx^ zdd@0-1>_J2z$k)Z)IAxSQ`6dvnf^-5$Qb?UW4~eso>>i#ak*ICe=x%RwrYT!+s}+Q z03hs&L+pf*{DKKA^xtQm_+k;zT`!i}DG zzlsUgSTZ`;52f&s6oSd$Aceyd0E{d!TnV9M1&XE(3(Jm(8eGmIJ>z!3=q+&niBj9~PTHA58?m9z}$Yxt;<@u~F8EN$8fH~+hR zHmu;|d2?*xtzpq~MSs?KK|@ISzysbMX&=)Nwdl>s>i6Gd^*b2d(h1|Yn$;&?DLUhp z$M*8v5zygnUK8UuQdE7A-($fZrKl{t?D>3n=nGjZ^k#7t(#^~hhQ?G0O9o)$b9-<9ET?xD{X+OE$ZZ+!BsDD8Ycti>2;Ihd?Bbaa<)XUb{b z!;XHTDs6?pIU{}dqnk$kw`wb@WLs-m*@oMd9IJM|vv(`?oa|Y)fPPq#d&GL4(h}da z>%om@77dy3S~+Qh+2wEFo;69(9$J02G1=#FnV(|Y^*)A4Vu-cX_+RXf&mxD3lN)1V z-_u(6bq9NRg%1n(%ks{i;})%mUuVB}b3CF!TJq$WwxD2YwBZ+>&1jaME@Rh<-tvgF z%ulsC!s^-HrVnC(ZKp1ZbtsITvG1J>k%610q0yQ#)bBVo@9rmTcji0UT2oXqptO)% zuaM3xpEx-3Qo8*bU)i*SmD995<+klwy)Iw7vixUH)skLlAGs4T;<&|c&mGSz~t+C@%A3y8MOuUXAGQO(0GNoFg5VvC*OLTzw6@8X<-?`t zD^+XUokpK>^-dJY(=~7Dfm(xzqA(4x!7kY! zp9b{5PQzCR3BNGFNdbZ+xC9Vc6QG7hZZ>QD#;B~|yb8YHJHO~uNqox8(WOqqN8nhQ z2(DKhHMJ1G;YRjxl;WX;pb5SznVWvkjt#U8wBEqtTsL=n8O^{Mbvw_BE^{mYSlX9x zF1)E$aEU%dQFc&`*VG&Fs*iW|++anvke=!99ebv#;y%uxT0}7(ExeT5G;s7R>sg0;Tf8-%H+AQ{bIqHKT*OJTGTVly_in$NlplnuaV~1Dof7W5*X6#M Rx=kP#X|PH7&OB1w`8S?lY>xl{ literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/vwx.jpg b/libraries/filemanager-9.14.2/img/ico/vwx.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c56cad7ec6b5fc5ef19911d191292e0b99afe5ec GIT binary patch literal 5463 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 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/xls.jpg b/libraries/filemanager-9.14.2/img/ico/xls.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4f656f73dc2dc53e6ee67b95bf8ef0b08365f3da GIT binary patch literal 2691 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 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico/zip.jpg b/libraries/filemanager-9.14.2/img/ico/zip.jpg new file mode 100644 index 0000000000000000000000000000000000000000..36d159166e47d37b44fd4ed6dd800c2eca16f903 GIT binary patch literal 1718 zcmb7EdpuNG96$Hod3lWH65}z}jFeQXnPG}z8A+&Nrc$J0@-Bvv3aQ3!QlgDYeaPlf z5?fw9cGvcx6urIrc&iqxQh9$$W%gV)yZh&U&*z@cx#xGz{eFM1t87+22Mkvy7bk!q z03dJxP$MFPF2;Ip+TRaPNy@8kHG81 zO*ITtW76m}=KqGW3g9&04Pr6G7@#$i3;`$uW558`CqAma(JCAD43`Eeao)5>W%2iS>b!Ts@wZteVlM_ zj9DQZ(mQ{0q!;_M=QIAto^Q))oAvrg=}w*RqGi3S7w)MYP0qZs-7tvNJowO>UpcG< zK3Bb#VzwZyrmf=%y}8!ui(1AQO9>)+vYuI=?U7`*+eFOY@xZG5}fwnuTW zifL1vjuu=hd1WMm8ccBj=@3L^S_6z3Mj}%fI7gGs$2CthC5H1u4O)>=Lu*J`(^dwAg9 zn`=-a7iNhlDeAOD*ermAGc>h0v$#A6Wy=^F^^kKQUFZ??j$B zD?9haWcHZz!f*6r2jZ*!Gq0E5+hEHtlVi@oy+=1UAF8$s7U}+GDPeo$uVk)uF|er` z75vaJ-$?s?a9fkk?FEA2aWB*RKKhlfPW)(A9E9yn$=of9EBa98e*6Y;aH%zRm>a%W z9%ptUE$-aU%jCC0&2{`Qrwnh-|7G8ZL>(IQ|R9vS7&@~R> z8Wq4c`3eN*00x&Qkq(G`D|5cqo*idIoa^j-RCmShF|=6IIr>Ns&$uY(f;AG3-PH~3 z?@R1sFPjiK(0^AA zVBkECu$0Y}#t%s3sX29%;)$ANbSo0b5J83aTTpR!V#TPR&&iz?O?zHqhZ`Q>G;r+< z-SFNcBiF@YJVFufR?}_omZi4o&F!6#$YiQLNQAg4AOL4@ctVMk&6TGP1dt?EX*!=IdZXNJaxP1_c3b6))-Gab04 zf|IJEwrG3Lz$$Knd7`Tkq@2Y7@E=e4Pf`G6WN_^zQn?s%PN#)2AY)lYj8+|@B*}P literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/ac3.jpg b/libraries/filemanager-9.14.2/img/ico_dark/ac3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0530f2800a2882ca5aebdb09e9bbda8031849ff4 GIT binary patch literal 3462 zcmb7G2~<;88vbA2%OZpr5H}d{$tHCaf}p~vVAw&H7_dcgl#o0^B%4VU7+g z&U8?FrWTpgnQj&>j!S!ljs?cn%2X`_Zlh>Lt*uKJ6*cqU5EAI|=$V_teINh*?tj1k zzyG`U+5cnzFGw>|(o=wc06&7w?A zVDpzOWraP!gNfh?e&DH6Tg`HXA``F?E_se@KYb183Er;m?h|KdMS4QEvYP$IOO zG*-0%aRmThuQpq30D>!Mk6CRqBNqM&v9ARMB9;-X9mGil7Y*Wk2PaRNh#aC-qApQs z5LY9fUNp?E9fk)rAOroRaz@UgQ?n!&3X7>&r{^34gWYq6hcTZ84f-;S+0g>97h6kn z7veLF#9m@aQ#$c(wJJFmaWL9D&9($$4@LZKS?OXq;%NXppJGeO;z2%dUR6onONhsz zU8A$5=Q-_F#-i*T#5kANSZZ2G{18s3+M0;Dgh0d>O1N~g$Eb$}4VRRRcsk;MlCm_X ze>%fjo=fZwKUF1(*@)2(ZCRv0F|eS7R7k+587w$b3_8%Gg~L$} zEjr2zO40Uop2EQyoa1I_9kct%Y+U8(oWT{YJ2@t1JR@VG@NX`Y$;@YBm{?$$cxC|; z$0VUOmYM5Ppctl;1ua}hrGtJ}K^d-0bi4=&+x^PITyxku%L<+P*k3}P3AGL>9kHXu#_fLY5t0dRWA;zkP&eIe zm37N*$`<_V_aSS|yg)U8L|oQ$vFS#2_;gmK*RzfxD{JAboTZ%8gaf$;$vl92O2_?1jXUYK z*|GrUe}`vQm)o|q4B$O0!1!plEey}Zv2Ow#oUJailn?sDi}wV8wK!^~<9|w=fM?SM zyZs)XSHeF4Jg&Ff2O916$9vHKIe=EZ{SwqBSLliXva-mj4*n zW+;+V4LYNajS7zqpBX+Y6LV?fEJl@{l~rhD(XpBswZ?uH5`jk=O*%e4X#qoH6Y}|t zKqT}QiG(7Nho?mBF~-YNBoa%-UXsz+JjC8UlSlgyOq@_WJ|Aa!F^tz}50M99{C~~< zDR_&Z0IFyz5P04c?M>N_fj@@Nqse!Wt5G6aAmlSR=sUvhAlQ3BOyd+OEyc|3Ep*Ky zK=6H2{us>%Ki5o@_l1+s6Zvf6j{MhN?jJZhXMPQfhDjGUlPaeKQZpf+p@$Ksf$cq;K31l|xKQVKkZ zrWn50kSB_V_2litA0vyLB41^-NqqyO79=cE7OIMx+v=UM3F3JVC+UO!ysCekHfVdJ z{y^QiIiCk!KjB|GU^PWt?e1weiEGM2Pu@#8RPu@Xg)1vd*tK)|5ARv>n}FGGZ)u;D zJ$mfNQR{A&uD*Eu)f>H8r|-P+uE(Lno_ngV9)C3IvS44&tzhjRH>hfQqi%U-oen*> zMc#J(guyuQ;Ir4i`F7?0mUeaAfM4Dg8#@6;hjw?QUA$v7MC>Z#f9cU#`NBZg>vNk* zIy(z5H@(`fT2q}eR&gc5kUsCk2TS~On{Uq3YkQAkZi1y)9vD31+D8h!r!0z;$yZ5L z^|u!ku5TXN$@nRc{V!ZvJ~1|B>!a3D`?beH+WuJ~kaUZ=A9|-=yzbFb+m+CNE-F*3 zRCnI~I^>f0hlU&0xLrBf@s_S@J?C!}Z7bNYwED-nz3kqbJ|C{%(Y86Rp`-FZ>7Gp$ zdw;i;z5nk0SGt+Psl|PLoe^yTyU(uniFsh^U3RH<)WMG;R<6-L@b-M8Zub7)Dm)Zt zjz4-6WjSiwabjS3k7&)USnuMfTKrbUI>k>c{B(n7lme+0>GNvEK?o!X!@_sJg(P9J zNcp1rX4R^<3fH^RC4J(zv!!7x*U%L3>E=ODT>*dH`Pst;bL)2tW8PnoyM0T2 z!Nk^_q#Hh28Jk-=-`jj7WMAX$cRK1{_Ix|#o1Uc)59g(yUsu28#~@*_Uh02QI`-(P z$kk0BO*`GYo;4nSX~#}gdS}QxZFhcMbMmW@h9ixW-}mjAc_M#C+=qAN_gc5r1(ll* y-H*S&EBdQ_Uuq32uJi}Tg^DJMJ%WFKp}Vg@x-3j;{#>?Pbc|~5TYf&m-t#{!r#E!~ literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/accdb.jpg b/libraries/filemanager-9.14.2/img/ico_dark/accdb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..13607b106309e9ef258633eb883fe7ce779fa780 GIT binary patch literal 4130 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 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/adp.jpg b/libraries/filemanager-9.14.2/img/ico_dark/adp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..92d67d93e94f02deda3cce2f8c27016af09a6799 GIT binary patch literal 4126 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 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/ai.jpg b/libraries/filemanager-9.14.2/img/ico_dark/ai.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b7c353b410632b2c9226647d236ad3b8ef887e40 GIT binary patch literal 3416 zcmb7G3s6&M7Ctxk<{^X_5Jkbq6P%_7_1X2++U)t0kbvXp?4QYhznt^^ z=l{<6A2;qx?jDe9Gc*}MQ54L@54is=Zq=w%@91)KGBjCgbO4B3^me;NzyefQoqTR) z8e6!qh!uB(07gJCL_)CM;IJ!ox-7s(xa2voJ^ThR62RA!U+f>qe(qPWk#iUTC<)qa zMu(vSaW#O@VzBd00MRY9CsjG^h{Yojhw~^9v4Y?-FHR@8#ET0(ocvrBa)?%$!K61L zUXD1fq@TU4ANFcM2FA(ctQ>DPu%s3`-d1Y1a2|)Zdxg6n^JTEY;=-IgZ8Y{$M|s{n ze8!U8P5j(kA8s<})p>|tL;G2~GmY5CBmR%8yg-R~B7h*Ql+P&e@&ze1ru?@M4@0}r z?9}A@>^0Vs>>R{6R?u8-n@8dh&RK&)g|&oe#MexmhO9B_p~1+ds}aW`9&K{X^~I;P zj>0|z!J!QKE?cm^!wLMEi)(+)g(O2G^kv~cL<&|;=S zpd4*4=IJ~f@0b9i%rm-|jK*1B%<<0fosVNt6wIUKi#0j z6|i^|RiG-fXC)kd-sAx}oIs`%^w{4(o(;A3DIKt)rPeKx0S~DJw=Vl(Hmr#YSQQr) zKPtKu+Z8(%KMa^75OF}2==bTv^v84?eT+T_EZsq$pg*Bc)BEVZ`(wU%?Y&X_YwyXI z*hscy75e7uUuzC5vNTzgY@94zHb(ZkEX&VgWf8Ij*<4u+dZPU6W(oKQ`{H>5Ydk-Y)u71c&XVzM#GV02#r6$nV9Nhic7En;YFVxf=`NyMQN ziC7{D3YJNOhJ*x5BvQFFL^c>(kTf)G%-}GBNf1gP6ym55h6x!QBncvn|F5}ELZ}25 zK@CksgCLZmLn-$uh$8=iXitqulB7`rk(g$L=nN$*ZZ+O3-K$Lre;7IF-I&v~iCQLEKJLzcj~`M#*tDvC z^n}KVRYwk7ZZ16f^m@^eqZ77W%-S&R;K|lJKI`OD8_7EK`K)!G32BO&L#bXu5cCnI z%7LPB!Gj0&MWO_BC=&+4u|pK{@aTjo$~67b+55A8EKk?O#yS|J>a|BNo{#kQ4 zsLSZ0)_!l^mbd$O*Y!yI_`^dTe<~bQz9jkEx04^WZL&U64>~-%sPXjFi81rLC~frb zo~Z8B%^W#n>+kniTW*~_x-06ktLQ++yL(G^gUULp zImHbJ*RT4`;`{XtuTyXB>(GB*6tO1K%ud=O-81C0@^*L3h?SOan%T#b7W{grb4<>@ z>YL{h|2XW>l}Xz~qgHfITFPmA9%{GF``}*0h}QC??A%2;5jo|H+P>{^1J-CfE+IuT z0uc8tAr(3n5^5F71$y~*UGdWT{U^TaTgN$LpG3PhS}wJ{ccHg*BR^3+mSJZE&mI}G z>{jil&H2GO2|aVRhTpDii(0XEg1lqHrr5_0+0E@&KF)Dfv}?-Sw*Oet*C6e9B)9<1VgVFsQhG|LR@$c6~bi z)cFs8`J#GjY7_h3vBo%=>2i7F;#0=Q4GkN9a4G)s=^qYRRwjr4vm>JC=adaS@26Ir z-F+!YrWt?p?u|k>II^$r2(fIOwzCm>JIiKoo>0=1sz_+sTvt#vde`7dDs|Ah40`9G L{Np2x?(Y8q`&$$H literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/aiff.jpg b/libraries/filemanager-9.14.2/img/ico_dark/aiff.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f0422da52b1777393733719c441478a6a9209db7 GIT binary patch literal 3454 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 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/bmp.jpg b/libraries/filemanager-9.14.2/img/ico_dark/bmp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f479380fb0db7d03a6580c674582f7f2fa9acc84 GIT binary patch literal 3754 zcmb7G3s_WT8vf3lb7m$kb3p`UL=T9~{v3fgYcF_8<7qJKz8Q-~aya ze>vm$%yAhc8L8>1KoA6^;RhU71c%a-lb5RVRH^A%3Tyxn?A4gfdL9E{Fxo76$|R;} zaWNz41s+TWPY3`{jn-;TRI9T93&-W2 z_zdIbUTI0o8^MiQjbb6<5R7-4ZAn~wCgQK{RRxKNX94hh$}On{!+hSub(Q&x5c^@g zOlM2aABoo)OLJ6+u`h3Tl_`_U!*M#b)@1Y&f)QV=WYf7dMm;2yu_+3~vk_0Nw5N^a zCo`-y3%R&6PhDkl4r0thT9#=t)QAHRueX@;xUo<(xtrB1xv?-m*LQFMtu%9 z7S5Lvu~z3CF()}-tIWrJ%JrpUZI=9zzEp9!E;W6Gzsjt4?nTr_?XlSNIBl4p>e5&g zO2n9ly2Tm`INuP{lgczHoVO8(AAv$b11y-J6l*OQ;Vv+c2TDl7rx`5RQVu%MV}!+4 z79%>s8>%pNf1cXO8Sdj|R5*JNaJ_Mq`*VgzxIV%$QT~*iipKx>R2CIa&7d>!@@%Pc_(aWKKsRBy9??hq?MNYb{H4+K)HhL^bYNn%wP} z$2DWrY#QqTSkZye*@chw>4Q~AC%IafZtBpZpLl(+3RJ)6FWpZM(A`+~(ihzQ=|1`b zetIDhS3vJnWI$Cq=So;zyzp^zXh)_EG+2LuJQHdiRXT1(%Z-}?+%23F>@zt( zqgSJ@-hV9a1n8gumFQqOaxLg8=dclKG3(fKGNP24N<~uXzuL9)xV=28g0JAG@DqXI z&*I1NBl#H|9zA*dP;86CTH#VZd~#fjaWi1Yu+SA(o^a=`7v8&9o|=h%>Z{B9F9A?9ge$AnEwL6alPXUSgly0D+kEV=5Bou0!{efMU5{5P8$&b zv=akl5Hc6eBf>^FJb-6(K#g#?JD)4uU5mX(p1ek$i&57|y6_T?>bM6nDzi;z(ABYJ zOld8Xp;jmjI-`z>j);qhig+jsy|l3wqejojS43)}*oPwL#X0&Q8F*YFxr(NFq<~Ke zNKzo6X^JltNTou7Q0U<)^75GA?I{#`P4oAbi30-zJ-nno)5Ja^aiEw>LeMlVAO+qO zhZ}t}8Xka?8&h^Yc08H%&a_hP4p{s#CYAUml&Czi5Zw`Ev?G%H6(O zL!B#E+?g@}WMD$%!&!G#nHhf9x}zeB{?k%$Hg-oE{&0bgL#wZ1I(Y^Dot}W1fqaUHhr|BkhYD z{9d=0?tWkPhpqKRp`D)$eYtqsrMYJ!mS3K@Wmfn5>XlE&-+A}-!invM#)6iL_Y;WZ-yrZt3G*aC z;2siq(A-|<3W26XQnb{^5+sk!-Mre z*B(3g;khE!hi&&JzBbDNky8g+BKMzVgPrRJH&21?MiUWfbA01REhYWA-F&H;a zIv4wn@_C(XNmEBm{p)A12Bh{33_UCR^vLaIn_WQnJgd6WSGw)H)SjMZiG5=)w`QTZ z_Xv{5Cq@kiLJC2VxrrJHBVW_dUacwRXu$@D;xYOf%;;b`)eOP?L|w#EAOeEZ(joSoTW;(^w{ z?<1a5nW`JJp6^uTp8Lz9)qn30{&@78!o>rk4YGxhd#mtpcC2{Q(A6{lJiq_IB;Tq- z3m^a2-pVJQL-EcN?Yt-PP`eAy(}~wkVel4yfk{4&w=RR#Z){a=FH3%JFFOh7EE-Ew z?o&;G6rGhPYS!G8FxBk~N*Z>(>2g-`v+stm%=(}O4IYw{UIkO%p7+bN&oAHWVx(au zr8(=TzM%J%0@HcwXx!|*zMkzj3%ddieJ1(3{Z6rBk4o*=06k5mD-BP*t&@=-9_!zi z@xo1U$K|*DTkS=J_~lEXf4*UWq4iU;!~xf4bS+qW=#;#*_pSG;jCS7qn zN*&zKK3O(7yJFM7L%h$QnV8vMFrhI-)}JuB-0!71GsE}YI?~^68Bizs&}V7$t6|L( s93WA~MXQ$!D&}N$h9zznl*EKBIp+Cd1JAd-bB$CxC3kX^sov51KS1K1&;S4c literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/css.jpg b/libraries/filemanager-9.14.2/img/ico_dark/css.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c80e1571791a5144ae7af5c824fe8e3b7bb5153 GIT binary patch literal 3444 zcmb7G3sh5A7CkTTB}51zLDY&Co+y<%h~XnbQISu8AYu&Q54DEm0g;fzmjs2TVWn{dq*38aQM9Yh1P~f^7TyLR`UdSuD{L0TexnhG@F)tCce%fM7C-yfGKd@I6r6HaGAP6qyvx;1N!PJ`a!g+{? zqg`*XsS4fp8dFLBY{WQL&{$!fN#YRBX`M9#YY7pEd&)T#S!2{ggPzM&B92BJR&LL6 z$ES0xRRzTEj8jvdk&hVT(EKuOt{QPD;Jx{)(xlUx{|K4r0~-5TgVlQEy< z!uc{%&gz^a#-#gf<%PIU$yg@Q#uvKBG7C!$St>Wb)?#$-MbySL@pcW-hVhy6T3(rr z7~?PxIa3j-8)D&WdTl1DZ4Bb+FqhH-2WBY2UI!+44lHOO8`AM<0UkZ2U;rapIP`L8 zF;Ia}fwmX()J~3TjF(a79NkAoW0n_lTp8}VIc8=AqhR9ko5JKV)0iYC8CWKjnZZnF zGSQmMq<9pleRQ%=26s`ZE6#GTV`idbE~M9o+M_&U*gF1ggYMjKzDG6QS(?3mjN_Rx zYBu{;0IXPnf!R&;ty5?1vDZ8v_A=A9=%S>v7G}SyzQS*WeZtGwcL{HJ#|y6uZ{Vj3 z(r^WgPDPcd%HUiHtA{sn&>T)6(*|1XZzIo)S_hO4TG3KdeW=$%D#5ME@6U(2Xs=aq zRq?IjvZ6uJq_{sQhd1J&D$!f$Pw960DE%k;46t+ueS$ttpP~=YpLt@wct^)&2hGI*3$RuL zRefL*PG*E44MJw!@{a~;!JezIN;|C-|@$i+|$ zH8d3g0y#y?DaYq{Vc~xu0V$)W`3Xc6BSc>a`Fk|DIl4hY;{X{g!@_M{ zp$HVit?pJ?JsXxy*Fv;2cy)t!F;8>{Qr zZ%9<=5*MZq@k=;s-4;0M%1*9+mlf7rsrrzFrqC~9Cc_P1fKkLGV+Tw(g zcaP-!HpKzqfs*mRpboe1T-M$Hm&d!<&RKb3ms3Nl^vWE5BfG%jlYJ-6xcHi>7DH*yMk;R z*{imVlMo>zFC2wc8`yw8RU<|7)J*o{$dI_U_`g5xpaOb~BX54#eBnkwUBDJWL&?=+ z?<+nY-t%~IQPPwp$^IWFeibLHmd{8mfcE4)f4kN(NxtyxHBr-|iL1L~U%&f($L>G; z`=7Ajlj4G>?>xSvi>6yA)%Z2tT^qUlZ0Zxc_3_BI4J8s@+btX-YO0i)9>f=qC=)?z zp*i5$3e_#^>9PCwt$~zXQT7Fj%=?jT(SL5P5Z}Ie>r~{7C~D6S;~xHNXh`z79pR3y F{{feV5BLB8 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/csv.jpg b/libraries/filemanager-9.14.2/img/ico_dark/csv.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b81a32b0fd8e7127b883b7a59e63532e41f6720b GIT binary patch literal 4189 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 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/default.jpg b/libraries/filemanager-9.14.2/img/ico_dark/default.jpg new file mode 100644 index 0000000000000000000000000000000000000000..433adcfbaa07a89b1a9decbccabd571d48dd70d6 GIT binary patch literal 3783 zcmb7G3s_S}7Ctxk<^h2aC`_m(+&QiIJrDcku)tjExw%@76d+q?)F;J6NN1)h zrTk040S^#@1cWNJAvav1hzD$hOP>AP3GnK?4oD*t;9CHbth_7a`ab%BC4-FY?WEA2th=*k5#aiRj zQw$4d5W6`}L6$rbF~*_wZ>gpz5K9ohqt8hqbD?Isg4M>5xiCI`JlCkOYM^iHw25Rc zTrVSH4dyjsO!~GlD;duz8OuyG>XWTw8D*v>I?l>3%+;FDB5GrH>hqF_HjK}lRq3N* z5MvzXcUG4|@`jk}o}r2)xgCo*1YW09z(NkBW3L7sbb}OB3m^|?COTe+h;@=YZ`&B@a($Xc-MY35)%311r`L~h zY%501Iejw#2FyUu>U{d<>FdJ7?lzCKojEl7oWs|JFzxU1%e~3H&27j261SswJogH> z1OF~TIPQSftSB2*Y0NueuCfL%%$BD3f zOs`dTL3U5pF54m7DZATmj^2p@csTZ_6`BfA*i z9RTv2+Z$GsXgW50Y^J50cF9 zH)>#Oug#bMF!@)kS!a7~$~=HQ1^~C$dTriV69;SqI5bh6r(bA^hcDh107ItVc=LD4 zAp&dDRg>uf)+_!7fbR7s)3XYbsk;*6cK|eMP1m6)YOy90AR&QNeGmYba=}84F9V{D zk^t9?0j5xcY&ePXwsJTCr5a$Y98&X1BefPsTc4cm92=uxJ8i?W2-S223C{+GX_)=Y%G3-0;8Pc^I17J1W}SS_*4AQuCHhnija(1j=8wYSAHS_&`~|)Zgv0 zVb_+xKlC2u1NNOf--wZF>Y{3PRz0l>D_m~xF)L_D0FsrG!{aV57e1O6Pz10P^$ZsS zMKdH7=ruPUaQQUj=FgE);+F=7g)2~>098|5&hr|@(Py32!G1HlTGU4;taWJb{P2ol zQ?h(l@ORgLY&{iM`1z(av-3x(^BzS`$}M&e>^LfkIVFiX5s+P6aCPSQZ%-F}G}L3w z{nH^^T=rHU`y}wAlHUt{#gj55?8}v7bpQUOG%@WT?@bCy zEfMl#>4ifzv|>!mVIvN@&mUt!W|q2V7@gmzRcm$|f3&>-T-@I^J)>^bH?;*mi>_ z4qqT07N$_`Y_evH7s~1W?(R2Lx;Yi{*=08!l#f;K{gD6pVYUC&>~Zcb|JgG2xZm5i z+I}lZ4bj!S5$7l>Ul#6AuDrbMrXo@C%3)*i{g~Lqhv{XGkKLEKKS z^~%o3gWoOtIit#+np>h3objKNzP8$L^@Xy^JEfiL;|DBBIX$auYm;kTm8Qk%rs{c# zPvgm|e}3vT_{^=Q}o} z_hXVwph-&(7{0m8Z*((f?=ANW$@{)7ed>CU996#_loE2 z-|$6vTXcOw#QCbhNBpgG-^_Gn?nKUx|uZKh?I*zSpcjT}(BuDLvp@DSmHk znAf7)ryrf^7*Q`CJYmc?@wLv-Ltxy)ai8Jg0pc zR~lA?CEOu`^kNS7q|(A)oOp62#D8}s%!J`$QUoxmwn{-c4+YxZ`H|2p6zb@YicF?M(SNM-wu&F;RQseT)dU1>Pbuvy6|&kkBOa_pYXblHs6 zqecz%b4vX6@`J;}uHA4M!S(DsTQulF3H7e<-nS7Uqm|OnnPVP{7GCiASJAy|GQ%L= zyYFvo94@X~{Cm*+Lm!t%Wji_A`PSy#5U-r*yTV`YHuBXY+TE8M?EPf!t0Zx4-B0ai U)s)3AZ5UPi%|T&En(5O20Ih7m)c^nh literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/dmg.jpg b/libraries/filemanager-9.14.2/img/ico_dark/dmg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..509039ef7c0c6ed1a1c0fa5a661330d0eef53204 GIT binary patch literal 3619 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 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/docx.jpg b/libraries/filemanager-9.14.2/img/ico_dark/docx.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9b0bc4b3940e66cdc5ebce60cbc4008af13c41c6 GIT binary patch literal 4075 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 S&G)qb@Qz#3g}fEI*8c$n9ZWy~ literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/favicon.ico b/libraries/filemanager-9.14.2/img/ico_dark/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..73837074b18ff48735fcf5a33cc8c6a09498853c GIT binary patch literal 1150 zcmbu-O(;ZB6u|NO=J|@vNGT~7>yF5rQH494Viy&5I&Gh8V}RNt4k7#Ky=XkK>*W2- zO72CiAJ>p`7qO02Ea1U$oT%-W-*A8$w4oi%*u;)^PtB=^>5tj|M&_4z#U9qM4cW8L z)8jBtJa=M*{xi?KoBRnCcF$b$Ki`|I)f!Rz^<8&TyGM!b*K;zdWh2W*egE?*&X@1c zulJiSvMxlwe5-m+5BW1%QG^PVB`LS{eBuT!p!eTE{(=Ww;Rf>Vyrd@NS$|>+dVUUh R2Z9KsF=E#Y5-ahq@dHtmFyR0I literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/fla.jpg b/libraries/filemanager-9.14.2/img/ico_dark/fla.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e8757e637d54d25ea9463e59e533792973abb335 GIT binary patch literal 3608 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 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/flv.jpg b/libraries/filemanager-9.14.2/img/ico_dark/flv.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c53f1357d26860de8075242a2f0abe6e14754d10 GIT binary patch literal 3572 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 Uj$G~U_K%LB)Y~C%Y_zrfADhWeZ2$lO literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/folder.png b/libraries/filemanager-9.14.2/img/ico_dark/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..a5fac96d05b3ba566375d81fa94f660acf7bcb5a GIT binary patch literal 535 zcmeAS@N?(olHy`uVBq!ia0vp^RX`lg!3-q3%M)FJ)an4A5D*On4h{~+#>RSjdfM9B z*4EbM=H@`Ifq{Xpt}al-$jC@vU*E*U1jsNnGz5wR0gw&h0!4rTs2)Nhi^CPb1>p>^ zCPPdGKykPrL=9BL$gt+g^AkX~T9gF&1v4;maB=hS^6?7@3TbK^8k<;I2Zm?l=H(Zc zl$KT0O`W!M?fQ*-_w7G&?D(nEXV0C#`RMVhcRzmqS~IV32GESho-U3d6>&)l+&xW! z23&3jH6&OUCx{e${xq4VV&{qk!)~31SgTu#5*O23ZhQWB{+X@2 zFVD3tH2%+Bb26nyvsb&jRC?-ecg{B#7+)@BF+ct!PR!3b=To7qU$}F}J+2FE6Qjdh z${ObQ*mL}yw{(B6&{~_5*_}~Sms?eSnDSz8$@SZvj@6>In-_44zSVuv-nB3K!aS4A zOG~6(W`QWr$!fkZ#@qky@j5Rycg00q&=$RGe{}l(;D;#+TpK*HBmzV;JT@BesKY$N Zz`zmUek&^CzCO^q44$rjF6*2UngHF~w6g#J literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/folder_back.png b/libraries/filemanager-9.14.2/img/ico_dark/folder_back.png new file mode 100644 index 0000000000000000000000000000000000000000..dc0786ec6cea1394a7bd1c394727ce9604c9141b GIT binary patch literal 1128 zcmeAS@N?(olHy`uVBq!ia0vp^RX`lg!3-q3%M)E07#M2L^NvAv_Sw|~OKsWav-ShQ@-+I8zUZQinN`;MKvcJJMP;NX#? zr_Y={cj5AtYu9hzx&QFV(`PT2FPYU7|t)Hku3cJ}G-&`8KU6hAq87==kjTKgss` z3im7Prq4Y3|MX{@^I+sJ+563aVM>$D(hVQ4ggNY6+j#l@iR@3gyfG@Wm8?>Wc&ze_ zi%Ql!NxjWz#Gk2bl(bYlYRjHQA^OHCo?nusOZqNuiu<>VF{4JNat;cS?{w6kwl+^nZGMyT_}1@~(|4b`Rj$vmG!~4%eUWdGvtt+AyJJr~xZ4FB zH20p+@m5sjlIUFTd;0W=1(s89X;)4)OUn87^~;sbpPn4~@#Dsg7efA7a(8zd7yUhS zbKxSdm1_(8^fcXbj`o(6N#|@X@p0Lv_D48-ZE>Fs&*W1te)Iec*O7NvzUdc_ZnW@K zi*#)nztpWvUTgIJR+@b+w14~dIW4^Kd-mDcpKMT#?^!cAwpZUXC<(25)zVb5ySm9# zJyAio!Oq^ais@}a14BRtdn!Y-+0W_a7ooAaCw|FmjY&OoIxYiKEQ6=3pUXO@geCwO CHQzk| literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/gif.jpg b/libraries/filemanager-9.14.2/img/ico_dark/gif.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f479380fb0db7d03a6580c674582f7f2fa9acc84 GIT binary patch literal 3754 zcmb7G3s_WT8vf3lb7m$kb3p`UL=T9~{v3fgYcF_8<7qJKz8Q-~aya ze>vm$%yAhc8L8>1KoA6^;RhU71c%a-lb5RVRH^A%3Tyxn?A4gfdL9E{Fxo76$|R;} zaWNz41s+TWPY3`{jn-;TRI9T93&-W2 z_zdIbUTI0o8^MiQjbb6<5R7-4ZAn~wCgQK{RRxKNX94hh$}On{!+hSub(Q&x5c^@g zOlM2aABoo)OLJ6+u`h3Tl_`_U!*M#b)@1Y&f)QV=WYf7dMm;2yu_+3~vk_0Nw5N^a zCo`-y3%R&6PhDkl4r0thT9#=t)QAHRueX@;xUo<(xtrB1xv?-m*LQFMtu%9 z7S5Lvu~z3CF()}-tIWrJ%JrpUZI=9zzEp9!E;W6Gzsjt4?nTr_?XlSNIBl4p>e5&g zO2n9ly2Tm`INuP{lgczHoVO8(AAv$b11y-J6l*OQ;Vv+c2TDl7rx`5RQVu%MV}!+4 z79%>s8>%pNf1cXO8Sdj|R5*JNaJ_Mq`*VgzxIV%$QT~*iipKx>R2CIa&7d>!@@%Pc_(aWKKsRBy9??hq?MNYb{H4+K)HhL^bYNn%wP} z$2DWrY#QqTSkZye*@chw>4Q~AC%IafZtBpZpLl(+3RJ)6FWpZM(A`+~(ihzQ=|1`b zetIDhS3vJnWI$Cq=So;zyzp^zXh)_EG+2LuJQHdiRXT1(%Z-}?+%23F>@zt( zqgSJ@-hV9a1n8gumFQqOaxLg8=dclKG3(fKGNP24N<~uXzuL9)xV=28g0JAG@DqXI z&*I1NBl#H|9zA*dP;86CTH#VZd~#fjaWi1Yu+SA(o^a=`7v8&9o|=h%>Z{B9F9A?9ge$AnEwL6alPXUSgly0D+kEV=5Bou0!{efMU5{5P8$&b zv=akl5Hc6eBf>^FJb-6(K#g#?JD)4uU5mX(p1ek$i&57|y6_T?>bM6nDzi;z(ABYJ zOld8Xp;jmjI-`z>j);qhig+jsy|l3wqejojS43)}*oPwL#X0&Q8F*YFxr(NFq<~Ke zNKzo6X^JltNTou7Q0U<)^75GA?I{#`P4oAbi30-zJ-nno)5Ja^aiEw>LeMlVAO+qO zhZ}t}8Xka?8&h^Yc08H%&a_hP4p{s#CYAUml&Czi5Zw`Ev?G%H6(O zL!B#E+?g@}WMD$%!&!G#nHhf9x}zeB{?k%$Hg-oE{&0bgL#wZ1I(Y^Dot}W1fqaUHhr|BkhYD z{9d=0?tWkPhpqKRp`D)$eYtqsrMYJ!mS3K@Wmfn5>XlE&-+A}-!invM#)6iL_Y;WZ-yrZt3G*aC z;2siq(A-|<3W26XQnb{^5+sk!-Mre z*B(3g;khE!hi&&JzBbDNky8g+BKMzVgPrRJH&21?MiUWfbA01REhYWA-F&H;a zIv4wn@_C(XNmEBm{p)A12Bh{33_UCR^vLaIn_WQnJgd6WSGw)H)SjMZiG5=)w`QTZ z_Xv{5Cq@kiLJC2VxrrJHBVW_dUacwRXu$@D;xYOf%;;b`)eOP?L|w#EAOeEZ(joSoTW;(^w{ z?<1a5nW`JJp6^uTp8Lz9)qn30{&@78!o>rk4YGxhd#mtpcC2{Q(A6{lJiq_IB;Tq- z3m^a2-pVJQL-EcN?Yt-PP`eAy(}~wkVel4yfk{4&w=RR#Z){a=FH3%JFFOh7EE-Ew z?o&;G6rGhPYS!G8FxBk~N*Z>(>2g-`v+stm%=(}O4IYw{UIkO%p7+bN&oAHWVx(au zr8(=TzM%J%0@HcwXx!|*zMkzj3%ddieJ1(3{Z6rBk4o*=06k5mD-BP*t&@=-9_!zi z@xo1U$K|*DTkS=J_~lEXf4*UWq4iU;!~xf4bS+qW=#;#*_pSG;jCS7qn zN*&zKK3O(7yJFM7L%h$QnV8vMFrhI-)}JuB-0!71GsE}YI?~^68Bizs&}V7$t6|L( s93WA~MXQ$!D&}N$h9zznl*EKBIp+Cd1JAd-bB$CxC3kX^sov51KS1K1&;S4c literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/gz.jpg b/libraries/filemanager-9.14.2/img/ico_dark/gz.jpg new file mode 100644 index 0000000000000000000000000000000000000000..414d5da6fc4e3c926d0d2c3fad61ded968eef4a0 GIT binary patch literal 3372 zcmb7G3se(V8vZ9UlSBw1AiluLfEtli41ywyRzi5oBZfzPZ8eVpQj!oR!3WD$+Ox-& zszRVppvmZELNH?yC5}t*-92wxznh+EU%tF1xz+tX<9icM_7&aOa!< z|L%Xk|G#(cjOPo_4Nw*47UTj&QIL;6@Z6FeD$wZ`>J6p21w}dN0Fdo8I-NEN2Vi%& z1w&pIH)rlVPSyhw7y+RW4WUM}%c<4tivSzplIy_s;4{ET0G~{JvVS1^XLq3%-em@$ zw1^V{B#~7@ZiSaGnci4a{sQ8m zXt!A11?4__qr+5EiWtXA+H31(kvN3YZFcFfmJpBlS`A-7))@8BVBxcK5Kllns-_{| z7oRS4EiNN=F-~KRt^_g0p@o->g?hx%h+h}#3}i0UOtCJ z=E8g#CGQe*#F+GLcTG9&Q!K4j87J{>3{gNZk;#!!5>aQrjfN&qF0;1RmQ6s=x|1wD9QV z(PE{-pcZXU=IKR_cT9j$EsnlTM&m3`=6GkgjhK z8KdU9;0k~XE6|_a#NaxeZ8|#K@8K>phZcOIINJoJ&#Eu`HG7-AjC~J#H87sN!d}H+ z4`^`(Y@#ANs%O-`Cpgtc_@g2QOzG)q&aO-(lO$rjHQ(1CMVK-?{JHQDMMPw5cqHO*5`-VqayPAtWZKf(xsTH{+0O4{JGgbu@ zsT)~lZ)4CPRcY8Esgn4VC@wBjkLu*8nPMf6)TbWz9;MHhR-W6vD_hNE<_v1tS8}i1 z11YVOcG)vWQ0wUz+j`r7>aAFasI_-{MwJh>cgJ*mQ}G|ol>6h`M;`mU*kDU3J#uIF z_Ax?ZU)m+xbyAp!pn8d7yi;Q#XHvSS5G4JCi7NcQq?tj1bSS)!U{sNV<3?+eC#MRo zby4xN^@c^JdS6!3nUenwOU$a|)AH0!zg6^PSM-Jd`>nb}B?z&RD_wb9~UifUn z4^gq>2feE}kl0}``>m`$HP4x*GE4{oBPX{nzn;S>Nh(_mv(&g z*6GwodmGkoJJ@oic6HmOhb!79Q6srunQzqqV&h^IG_th@w(?;Ko9^F=& zJhZHO^Kf>`$=ds5VaBL%KLAU!{+dt_5vNJk&Q{g;W$KNuym_;KU1r8Th<{=KnnPjV zuif_hWnVNcS^3=J!Ldgw(ps{Yk2^DeRBP{olPj0o)d{~iaN}jw2KRgQ>sM^(nsR>1 zTcP#MW507u*IBvg#?o1%ZWX~b`suD|a1ljiMD73!Xlj*Z2gJGYE~`}p>aO+~GXR{z~z IzQxn?KLAko>;M1& literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/html.jpg b/libraries/filemanager-9.14.2/img/ico_dark/html.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6bb674362029da0c86910b8b32cc3a6b1ce55c32 GIT binary patch literal 3719 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 U==pE^vdV2`T8G0Y*I4fS5AsT9EdT%j literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/jpeg.jpg b/libraries/filemanager-9.14.2/img/ico_dark/jpeg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b4f258a742e86858281211ae7605b69cae66e2f8 GIT binary patch literal 3700 zcmb7G2~<;O7QQd9KmyR;yK+3RtynWja*5=(Ig>Mmt(tJ5p%ozLyZ7$79d@f%m@L`~CO- z?)|s8{^|M#B-t5R89)#OEW;1Dt_wfNQYxQNYw|L(a#ZL55dKwbwHkRefXVEzX)@F3 z;*wRgupf9Z4g4Sk{Ioi|RiRer05+D(z9+W3{{V~xaCyP~{S(>0`{t)->^cBKgm#PG zt}`L71K=BVR+|Gr@GaVt*Ep<*g<*&TZ72}2oW+%HoX+BMH!kKlg&HMtSgm4Rl~#|q z0daKsID6$d?ACw`jFZWj8Jj^zv$as$EENVL!#UiKKX8v@J_wqOPRyBW5%~1CR~IbD zcNCj@m2H{EgWGgkRRQ8zXz#T;(pdW(#5bJPMGD080Co_Ih)9ZXROn%iB|JSc9*mK!XM{Ar0SFu%V{{3}8eHgI)$L z24WIaqwW4YHOF!H8Dms(y$9IdILiGw?hyt(919gp$*Fk!e}u}R7E{So3eZ$4wUk;y zrK2^4dc>dXI@Kfv$9XFvbySbzQ%{#E?+ zg92y3$SE?RDg!qYb}w(igd9#H(*at1UPGP*wT>#CFryXb=8!QDTM4Eq_iipUMvqzL zpUZE``{eENH|77HFveKK2~{Fn$b;lD@-TUXJPR~=f;>qcC%egg5mEOrMNpa_*1U=4C@SXH*dW>||+$L|x5QYwOqrLumvYLnTuJgP#V5~K?hKnvyx zQUtMrY!;91Ji%P_rQlQLRqx(8UdDtBm~kwuiZ{*zZq>1CmF-=Nx{autaWHjwcK|3Y z*0nZ6WtD@DlgpE61zu$gon_X=MAKTMk>*@>+Q!%!TP>rH0rnnb`vKh1aQ7P#bbid{ zSOKv32RySbjM-K>0Xpme!3krwC_EEoy8%8()H!Xn?s$0do&&H~#K&>p3I8-ao4#_n z?%;VP+yyYQ)8+bgkIOak2FAY%aKh-i2J2OIh6;ccE7(&XM8GE|<3Wv=0jrG&0X~NT zvWZYH)(}x14iBKo0F;Nrp80HJ&syy5dGp$MUPgTz>BWz+RM&5ikY{xmOon6hlfi7D<6}}{;$jx&U@aYt&8#)j^18&t*ra6r!g$vePy&x_B>Uj=d8AN42}x2Y zd1Ff1nh(P}d*3;g+A<hp!AS6C{zF&#u zuHT#*eoJ!W>AxuSpV9{^B_;7&=3XxJn{9dF;VnstPPus{4H z{gupeZ{WGC885$d_*&exn7u7?!)~rBY3g3S`*y_RJ)MJBe)#fEXWjG!S;qH{&lE@J zZL113?prWj6`oK!?ZZ2PU(O_sSk{#akKOLQQhYlDQxwgPTAwfr4@DQCSSwg?)sUI(&1pN z@*K8^6#lX22iFLY=10aVZk?3KwRBDUes$T-(Iu4{IpUvoc)d^5vm43fpC?{19Xb(n zwz(`+7BRAO$9u1DyrfI=*%4i|eesP~eA@7@(XT++}~mvrG- z_u!Q(`J(rJW{A(ws>xn^inz~1!Zt?6eJy9W-=xoA==tl7?A{5SUx6bVm$man+^ zv!*oT`5?y&=Q<=$J0(B9d^-AE>m(mqBTCp>@l996*#JS>z)!`iV-+nw%}zTr_dmzq zd1LFpUb}FhX%V!yg%HudHrKA3S{iWvy}u{=S=qT@Nq7{ig nfrouJ%HD=b{lS=9v(h$%o^4A?m28|9)t_Ge=a-YZUH$(916_s= literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/jpg.jpg b/libraries/filemanager-9.14.2/img/ico_dark/jpg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f479380fb0db7d03a6580c674582f7f2fa9acc84 GIT binary patch literal 3754 zcmb7G3s_WT8vf3lb7m$kb3p`UL=T9~{v3fgYcF_8<7qJKz8Q-~aya ze>vm$%yAhc8L8>1KoA6^;RhU71c%a-lb5RVRH^A%3Tyxn?A4gfdL9E{Fxo76$|R;} zaWNz41s+TWPY3`{jn-;TRI9T93&-W2 z_zdIbUTI0o8^MiQjbb6<5R7-4ZAn~wCgQK{RRxKNX94hh$}On{!+hSub(Q&x5c^@g zOlM2aABoo)OLJ6+u`h3Tl_`_U!*M#b)@1Y&f)QV=WYf7dMm;2yu_+3~vk_0Nw5N^a zCo`-y3%R&6PhDkl4r0thT9#=t)QAHRueX@;xUo<(xtrB1xv?-m*LQFMtu%9 z7S5Lvu~z3CF()}-tIWrJ%JrpUZI=9zzEp9!E;W6Gzsjt4?nTr_?XlSNIBl4p>e5&g zO2n9ly2Tm`INuP{lgczHoVO8(AAv$b11y-J6l*OQ;Vv+c2TDl7rx`5RQVu%MV}!+4 z79%>s8>%pNf1cXO8Sdj|R5*JNaJ_Mq`*VgzxIV%$QT~*iipKx>R2CIa&7d>!@@%Pc_(aWKKsRBy9??hq?MNYb{H4+K)HhL^bYNn%wP} z$2DWrY#QqTSkZye*@chw>4Q~AC%IafZtBpZpLl(+3RJ)6FWpZM(A`+~(ihzQ=|1`b zetIDhS3vJnWI$Cq=So;zyzp^zXh)_EG+2LuJQHdiRXT1(%Z-}?+%23F>@zt( zqgSJ@-hV9a1n8gumFQqOaxLg8=dclKG3(fKGNP24N<~uXzuL9)xV=28g0JAG@DqXI z&*I1NBl#H|9zA*dP;86CTH#VZd~#fjaWi1Yu+SA(o^a=`7v8&9o|=h%>Z{B9F9A?9ge$AnEwL6alPXUSgly0D+kEV=5Bou0!{efMU5{5P8$&b zv=akl5Hc6eBf>^FJb-6(K#g#?JD)4uU5mX(p1ek$i&57|y6_T?>bM6nDzi;z(ABYJ zOld8Xp;jmjI-`z>j);qhig+jsy|l3wqejojS43)}*oPwL#X0&Q8F*YFxr(NFq<~Ke zNKzo6X^JltNTou7Q0U<)^75GA?I{#`P4oAbi30-zJ-nno)5Ja^aiEw>LeMlVAO+qO zhZ}t}8Xka?8&h^Yc08H%&a_hP4p{s#CYAUml&Czi5Zw`Ev?G%H6(O zL!B#E+?g@}WMD$%!&!G#nHhf9x}zeB{?k%$Hg-oE{&0bgL#wZ1I(Y^Dot}W1fqaUHhr|BkhYD z{9d=0?tWkPhpqKRp`D)$eYtqsrMYJ!mS3K@Wmfn5>XlE&-+A}-!invM#)6iL_Y;WZ-yrZt3G*aC z;2siq(A-|<3W26XQnb{^5+sk!-Mre z*B(3g;khE!hi&&JzBbDNky8g+BKMzVgPrRJH&21?MiUWfbA01REhYWA-F&H;a zIv4wn@_C(XNmEBm{p)A12Bh{33_UCR^vLaIn_WQnJgd6WSGw)H)SjMZiG5=)w`QTZ z_Xv{5Cq@kiLJC2VxrrJHBVW_dUacwRXu$@D;xYOf%;;b`)eOP?L|w#EAOeEZ(joSoTW;(^w{ z?<1a5nW`JJp6^uTp8Lz9)qn30{&@78!o>rk4YGxhd#mtpcC2{Q(A6{lJiq_IB;Tq- z3m^a2-pVJQL-EcN?Yt-PP`eAy(}~wkVel4yfk{4&w=RR#Z){a=FH3%JFFOh7EE-Ew z?o&;G6rGhPYS!G8FxBk~N*Z>(>2g-`v+stm%=(}O4IYw{UIkO%p7+bN&oAHWVx(au zr8(=TzM%J%0@HcwXx!|*zMkzj3%ddieJ1(3{Z6rBk4o*=06k5mD-BP*t&@=-9_!zi z@xo1U$K|*DTkS=J_~lEXf4*UWq4iU;!~xf4bS+qW=#;#*_pSG;jCS7qn zN*&zKK3O(7yJFM7L%h$QnV8vMFrhI-)}JuB-0!71GsE}YI?~^68Bizs&}V7$t6|L( s93WA~MXQ$!D&}N$h9zznl*EKBIp+Cd1JAd-bB$CxC3kX^sov51KS1K1&;S4c literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/log.jpg b/libraries/filemanager-9.14.2/img/ico_dark/log.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c2fe0e7c6934d35614774e055b9079361c736c03 GIT binary patch literal 3804 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 Nx-%|O*PHC@`X45_7oGqB literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/mp3.jpg b/libraries/filemanager-9.14.2/img/ico_dark/mp3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fd66149082a8a8484c4ccf579445183f5810140d GIT binary patch literal 3335 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 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/mpg.jpg b/libraries/filemanager-9.14.2/img/ico_dark/mpg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0da2aadb1a51c1bbbd4d392a0f697be2b4a5848e GIT binary patch literal 3459 zcmb7G3s6&M7CtxkCWKcYh+?tDtJp%V(tu!L6_ocIVgN<0N=Pn}8X(*RL`16AT~X0h z*}ALlC?Zz7wRRPkVr$1owYZM2^?^kwJ_ZM>*ln@PSRc)v|K>sHI6D0^`R|u=zW@B+ zIsfCv{H^&Gc%~#ICjdoJkc1yF-*IY5j*VTQRAnY4r^TZKz-gb_V9<+LfTCg(uS$$z zb7#+Co!UVJuYfD~f~#6%G(;N=20MG1;Gm~IF8_a3(gfd*{WFN5Unyzp<0W$ z3h{(|2m3+?Y|(%WjFZR}bG%N&l3FPFk^-Hc6C9TAC2j}ii(rwy409HmANFp>MOmr% z3?#W1@<}QyuGgsJvk;F%`x%2NhS=Xg+*h_JCmQj10FhS#pO9nWi>6iV#Uq}8*sriG$r_(d zF_vc$yAY?cFg61*#-aK5)G12DzKCo15*3*XHPa28K9S6Y@#$|2CZ$ya-CL~BAah~9 zjEpl1Ibuw@*HoB|`;?4jCY$(d>sV$^fi5B0%C9o$g}sQ{m`1)#MYLgj=8~F^PehDy zn0~G}htv(Rc%)VxM`{~{I0|M`YT%#*^0C)IF+2knRFDWU_%r~Io&wN;9xWVtIke~~ zcUXkB=kt^T$1-M+u}~P@OGe`?&*xZX_} ztr5%=y8@+yP8Jrz_o&norxeO?W};&z#BB5}3$%}6SMm#Vnu~w_5!DQ4Su*IyIQEQD zbBSXGz=##FWjE2WPOVi(N7_B?HKyg=D{ie-komIuio3RiLRsnMSn#fp}(Nd0ZSjJPteEcZ|KkHFYPg(zxI|W_O%!C zB{q^RSq0mCjy8*62& z>htF!CqM@|s6+>gk;`LMNrj7H2}X51Csw759}~Qlf7(HA&Hm7Nuq(3jF&`6 zf+Z;g+fJS&0DTeI$J^CgPL7>1Bm>TYg;lY~nJDZ!vRBFIa@4Iy-JFT5z;_2gY>8nB zuUlAXVnY;)ci3orm2qrxu_kB&tJdpT!DVE5&dBlQoHhu^dytF+c&HNIZ`6p3gEmt- zK;#d2XI&b!%_#%eZv^lO9kd1Foj80aK+9xJ8DDORhcDjq0LFqzA;NFUEe7wVF0=U| z-d9eW0iJC#o1Zk8&ChmY{7!)5dh=~q9$%p=07y?Kw?0TgOnKo&jV}YDjq(MtfB{md zQFg4N0<9boz-k>ZRt~xINh5bHjLiuAxXRpIhPk^+rEZ>X?lKRL*F0R@DJPL^i{$PO?BMHp|ryT1E6wP3@tTz1rLo;HaL{6TH&@j0&4+Th379|!vZB(kqU2wj~ z*WPViugzG0R(7*dbLC-FVDG-hs`=xJB3rvnwUyQR-kDx& zJF63uHs$vJr{xd&Pv>QSno+Q;{oAv;fVzebRdYx4fwud<9J}^D$zSeJ7D13wm>vr@ zjf#B%L1ZIDkaQ?oBK5FE5@C9B5RZ{~4O0Z4VEsd)jb#U$JiUi2RatrJ{8E0!=DI_d ztyxN@i3XI~m@i#VuiJdTars;Q2RgDhgg?tX(B15%slIH6$*Pgd??$Grx|td=Lc@5) zZt3_SKJ^`6e};E2bZ-vJIjlI^5f|a!v(~vMtMiNfJMOhjIecsWxsZOQe6Dt<>0m>k zF(C5r;;QP1tlEtgE$=UDYkBN5B`c@yyE(1pe|I}jlpgv=zmS^i!|OF2w=6DGT>mGU z@lz+?DBXK8;mFC*o{slEXNN}(i*F7JxXaC+wR=ov#`HaVx~_+wK9_cW*n_Jx8$wT> zKY2F0HSYrT>y^qmcft=br!`y0HZS>i{JUY>tFB=o{XKC{Q8X>Kl?f>M7zmEuq?n;r z=9RA4bz2QEZ{zIh$l!FpkY%%?K13zL5fCmG+upTp zSMpm5q$k&rwY^}ckgeqTvaKW#NQtmQ44yt~qvS9qSP?zLQ(gL_GH=Budx<=KF z?au29o&9&XaU*cP{$yRLb!ghF@m6 z)+BAsjp+)@^#9-AN+&9U^HTr0YU<9BU>{+IqS%_3p>*H))npD lu*Q4q@cM literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/odb.jpg b/libraries/filemanager-9.14.2/img/ico_dark/odb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eb6522c84b5ddfc8dfb785525b64adea20581b95 GIT binary patch literal 3581 zcmb7G2~bm67QKHSPPk&Kfl=o-E9nfwxInwi7 z_Hv6pI|nh2rPmf)hmbggbJAc>#9BgU#Mg_2bh5^%hXJFIl#DnWai^lvG*^5k!(KLw z*rhn-MTyynF%Bb6&}C>5cSQV+Xw4;ap=M^SU`{1-VSMJe&7pN^VD4GW*<>!vmsJXO zDMyUS+;bG=;XWl}*=UED=NilA7noAgUHqvwv$Pjc8@paC%_Z6}KKqkSOio3Nao8t< zWjLuDVlKd_OCq(6Ks*RWP&yF63VQ4fV1akQLoTF30zPdZqNe~%U`C68UI8s8$_t9o z_FG7Q za4XQZ(8)s~)T7eII1`~1XC^vEK*EBKrD5(d{0woN$#Cx522|6WrM20QaoicBW^2m| zfE_E)lwGfubviNiV1V1h*RlJ?T=YCK6>>gRU+xZfkE_G}GIzCkJa>h=il566k1Jr7 z6qTSVle7|cH?LQ#9BPs203G%>k!MA%O-fs>Xn|!x$7Tv0sUNEA z)RpS>>IbdnXpY#bO3Y$r5AzRZKXZUN4LnoB)G~*eB$Z6PHr96RTm<|FCOg$X;$zAxoAe$>M>R^^nENG_nkW zn@*mrJNja=Pj;(sJUMPgs|J}WrWPEo3BwB4#L{njr zgYTnO_v7R7RVMK17DGfhuQQu@$z|t7!7hkpf-wTfdytF+c$zD{->44fnr)6OfPs(j z&ibj@mR}06%?{un)ocsHJF)$0fPK-1Qn9Qt9=>?b0N4v6`$)ej&jh@it~;Gi@xGET z0(iI3>3p-+>3p{i<6i}+F*|RyE+F6TH_rjV;t z3b{hj)_EmZZd6OU%$8mB-?!~fR-fb0az5nm# zJOU~OjD~WC>I}4sVpNp#CHXS-H*iQxP{%1G;Wf-*1~3E0zbIY*^~W-0y#}zO;Wo zrtm@CtN+xTR(corK34nVq`i@khIFY{&yp>Bc7wN_>-_jZ_O7o6^z>Z+g?~m-;Nn%o zdnPnk4pwvsK34pFT(bE2;w!=D{_eOvdEly-S8^)mk3Cd#X~` z3&!*i4sGqd(r1y4EEA zGGYF-`bX+r6Q}%YZ3ul3RCpmWbM2UQ&(G?op6;`=^6Oi72Whi|hHAH;Sy{R4?EBlZ zqqb;{R}T6$@8RC?(N|9Oj!tXiAG7<76Uydp>~`02J?8Pug>z3Sa!xFL^<`>k-v~d` z;@9>K{#(tqrF$~(8YTp-I5ZS1+|37f1IJRFdnG7PVeJ-H#_J|d*YfJ|wGHQ+w#nd- zmm1C0GvWv~z;}C^nm<@Ko({QWEU?(ZnAz!ij`ogPP%VZW&FsH%;AU0TsOVan4(m|X zBOq>h%3q(I+T?vU?nuP(=M2oQs#t1xX|l~~*FN%b(3Vzp%<(Q=hjT=XCO$F{B}j-JBgfH_-Z9 zvia#o>V<{&e3sNTcgLhP%fCCLT;#iNdj1+V&tvztx2heFerKqlCzZA}-B*+_<&WEW z=qqNl?=VvH!`x6-Ngdvnecn{(w@F>69a&L6R}(dXy7=Jzu&8%ypTxvb`nYvhr#;iW zYF~Y};z)jI^%9k3Ov3M-^aGENf7114(AtKsQOV`J6D(5`A@BCxuq8*jZ`$bu=jHza DNg__S literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/odf.jpg b/libraries/filemanager-9.14.2/img/ico_dark/odf.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8f40c746036378c31397e2a0cc49a743daebd865 GIT binary patch literal 3590 zcmb7G2~bm67QH|J|0Kl{0w~ZR^3hfq6$~HG-F6v8 zQCoYe1VpiIm%`H4aT&K(anJ#^U2y4c8B1|m9m{p5)Xv=Z69RNuTJutQ|K#5D?mO?k z``(Z3rtKGyrzNK*14U6V20vhHl^jk@Oq`)qjZaQZPeKQPWT)C_)QdQPqGF3lm6E_s znmmP*w15ac16S||SGC4$j8`ht0UP0xXV>=nI$$J#tDztEcV++Xmuntx)&Njav>Wow znj*w=09d`oXtDr^@1s5DON$Y)qzB?|CKQNRL2!W`k0vj#yGTTmO4#|*dOt7lR-u1Ld|pyuTLR!VSM_W(V}!{pxcV|8DuV8 zFC*j4!WuCq-Dc5dW1W(*Oti(6?HJ2U$=4;PI{0Nqy-FbagxZDcgg@?nmBhDQ#Lf$?P&OeB7XG3m?*CWeUxj)`MNF(aAL zXpLotITa{7>ExgQ9-&fuoD#6&%tXfoNLcG{4RMa)7Mf=0G)-%sp_-0W8an(K$GKwE zZ0MW;Fk=SVR~OnjPv^^y`8hq@HRkXaSKZE+!T3+*m%Y!nvDdI~VefQ|XK%B2@Y4eE zxC44YQ4y-r2|HnS@WbMJ-q z5*t}9*@gD`I_H`Py(~c%AnPp~Een$Mk)=CXoXl4iE*m53hn@iEzUe#sUDl$5$(XD5 ztbTYdasqUagGzMpC2~!eRg&Rin2S+6pA&~trY955r2ejIV@NHxs}LuNM~mZu6ZaR# zio?Ze1h=0&aX<9MVxQzxZ$CLsMwb=vomiL^XPi)>>PW4U(X&yv9(D5;eh$7n01^$x zxh7qK*1|<76hpXpe3kKBYOyA4Ag9*rIl*P-OuU&l&F1sMfV>CEIDi)_;r&MWGAhVkzJoYdRyL3z>~T|U6LapcwqDX^3mUex$9AlfK@U-(@MIez$+9TmlU_4oGuU-kNit76A!MzoU%1pJU z#I)e@z3_CED8BCo6Vc$_(7#yWiCit*T#l zEUWvh%(Jq}?a46{D!2OeUa8`DTrb~uAg!=wz>z@{&+TM=*8MoN=Xw9ujrW%yH(8SkavEo*$#W5C{>uXcUI$Y1T4GGpq(BW~WohVLJ? zwPvs1QQ11EAHQ;WkL5AJ(;mbSKV`>r=fnBO$- zi<^{vwAb@_in5*mRu~>iwa?RA`~AEn4wD=r#}W`REKSb3&?xW>4v$wa$SkR-ex|6u z%#Bjcyw_eVal!8cq<^oT%^e!@++7)3I&J&p)s0KsH*c$cs9ce`rf==}xUoTWz;}a_ zSF2x~TpCmKbkSS)=EKJhm`0qs@cPJU$QyQf#mLmfL1&t^C6E5Igqj}sh}v1`|7Mjw zyr%5wj%U`}-`3@~WldbrCih-CKEQRLPyUczo3yv;4&7MuV8gsU8LAs=LRUZOcCwja ztS(2dD(-si+AE&E{FQ%G-I7h(`ioDz7man|P0}djicQy=Z=DV{f0j7iJd`E3G+D-lt!}m7((T z!4V?=a_`+^j*N%{uj++Ex1#5p{yA;_OY!N@Wy#>bnl zHZ5)#(DHRuQlV$aP|6VCJt83ci(jV{)KOGa;qd)0Q%Vg_znLtG7+mtVioQN~pnH|P Sck`w#)b@*CMP58%Yxy7chgaAD literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/odg.jpg b/libraries/filemanager-9.14.2/img/ico_dark/odg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eb6522c84b5ddfc8dfb785525b64adea20581b95 GIT binary patch literal 3581 zcmb7G2~bm67QKHSPPk&Kfl=o-E9nfwxInwi7 z_Hv6pI|nh2rPmf)hmbggbJAc>#9BgU#Mg_2bh5^%hXJFIl#DnWai^lvG*^5k!(KLw z*rhn-MTyynF%Bb6&}C>5cSQV+Xw4;ap=M^SU`{1-VSMJe&7pN^VD4GW*<>!vmsJXO zDMyUS+;bG=;XWl}*=UED=NilA7noAgUHqvwv$Pjc8@paC%_Z6}KKqkSOio3Nao8t< zWjLuDVlKd_OCq(6Ks*RWP&yF63VQ4fV1akQLoTF30zPdZqNe~%U`C68UI8s8$_t9o z_FG7Q za4XQZ(8)s~)T7eII1`~1XC^vEK*EBKrD5(d{0woN$#Cx522|6WrM20QaoicBW^2m| zfE_E)lwGfubviNiV1V1h*RlJ?T=YCK6>>gRU+xZfkE_G}GIzCkJa>h=il566k1Jr7 z6qTSVle7|cH?LQ#9BPs203G%>k!MA%O-fs>Xn|!x$7Tv0sUNEA z)RpS>>IbdnXpY#bO3Y$r5AzRZKXZUN4LnoB)G~*eB$Z6PHr96RTm<|FCOg$X;$zAxoAe$>M>R^^nENG_nkW zn@*mrJNja=Pj;(sJUMPgs|J}WrWPEo3BwB4#L{njr zgYTnO_v7R7RVMK17DGfhuQQu@$z|t7!7hkpf-wTfdytF+c$zD{->44fnr)6OfPs(j z&ibj@mR}06%?{un)ocsHJF)$0fPK-1Qn9Qt9=>?b0N4v6`$)ej&jh@it~;Gi@xGET z0(iI3>3p-+>3p{i<6i}+F*|RyE+F6TH_rjV;t z3b{hj)_EmZZd6OU%$8mB-?!~fR-fb0az5nm# zJOU~OjD~WC>I}4sVpNp#CHXS-H*iQxP{%1G;Wf-*1~3E0zbIY*^~W-0y#}zO;Wo zrtm@CtN+xTR(corK34nVq`i@khIFY{&yp>Bc7wN_>-_jZ_O7o6^z>Z+g?~m-;Nn%o zdnPnk4pwvsK34pFT(bE2;w!=D{_eOvdEly-S8^)mk3Cd#X~` z3&!*i4sGqd(r1y4EEA zGGYF-`bX+r6Q}%YZ3ul3RCpmWbM2UQ&(G?op6;`=^6Oi72Whi|hHAH;Sy{R4?EBlZ zqqb;{R}T6$@8RC?(N|9Oj!tXiAG7<76Uydp>~`02J?8Pug>z3Sa!xFL^<`>k-v~d` z;@9>K{#(tqrF$~(8YTp-I5ZS1+|37f1IJRFdnG7PVeJ-H#_J|d*YfJ|wGHQ+w#nd- zmm1C0GvWv~z;}C^nm<@Ko({QWEU?(ZnAz!ij`ogPP%VZW&FsH%;AU0TsOVan4(m|X zBOq>h%3q(I+T?vU?nuP(=M2oQs#t1xX|l~~*FN%b(3Vzp%<(Q=hjT=XCO$F{B}j-JBgfH_-Z9 zvia#o>V<{&e3sNTcgLhP%fCCLT;#iNdj1+V&tvztx2heFerKqlCzZA}-B*+_<&WEW z=qqNl?=VvH!`x6-Ngdvnecn{(w@F>69a&L6R}(dXy7=Jzu&8%ypTxvb`nYvhr#;iW zYF~Y};z)jI^%9k3Ov3M-^aGENf7114(AtKsQOV`J6D(5`A@BCxuq8*jZ`$bu=jHza DNg__S literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/odp.jpg b/libraries/filemanager-9.14.2/img/ico_dark/odp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8f40c746036378c31397e2a0cc49a743daebd865 GIT binary patch literal 3590 zcmb7G2~bm67QH|J|0Kl{0w~ZR^3hfq6$~HG-F6v8 zQCoYe1VpiIm%`H4aT&K(anJ#^U2y4c8B1|m9m{p5)Xv=Z69RNuTJutQ|K#5D?mO?k z``(Z3rtKGyrzNK*14U6V20vhHl^jk@Oq`)qjZaQZPeKQPWT)C_)QdQPqGF3lm6E_s znmmP*w15ac16S||SGC4$j8`ht0UP0xXV>=nI$$J#tDztEcV++Xmuntx)&Njav>Wow znj*w=09d`oXtDr^@1s5DON$Y)qzB?|CKQNRL2!W`k0vj#yGTTmO4#|*dOt7lR-u1Ld|pyuTLR!VSM_W(V}!{pxcV|8DuV8 zFC*j4!WuCq-Dc5dW1W(*Oti(6?HJ2U$=4;PI{0Nqy-FbagxZDcgg@?nmBhDQ#Lf$?P&OeB7XG3m?*CWeUxj)`MNF(aAL zXpLotITa{7>ExgQ9-&fuoD#6&%tXfoNLcG{4RMa)7Mf=0G)-%sp_-0W8an(K$GKwE zZ0MW;Fk=SVR~OnjPv^^y`8hq@HRkXaSKZE+!T3+*m%Y!nvDdI~VefQ|XK%B2@Y4eE zxC44YQ4y-r2|HnS@WbMJ-q z5*t}9*@gD`I_H`Py(~c%AnPp~Een$Mk)=CXoXl4iE*m53hn@iEzUe#sUDl$5$(XD5 ztbTYdasqUagGzMpC2~!eRg&Rin2S+6pA&~trY955r2ejIV@NHxs}LuNM~mZu6ZaR# zio?Ze1h=0&aX<9MVxQzxZ$CLsMwb=vomiL^XPi)>>PW4U(X&yv9(D5;eh$7n01^$x zxh7qK*1|<76hpXpe3kKBYOyA4Ag9*rIl*P-OuU&l&F1sMfV>CEIDi)_;r&MWGAhVkzJoYdRyL3z>~T|U6LapcwqDX^3mUex$9AlfK@U-(@MIez$+9TmlU_4oGuU-kNit76A!MzoU%1pJU z#I)e@z3_CED8BCo6Vc$_(7#yWiCit*T#l zEUWvh%(Jq}?a46{D!2OeUa8`DTrb~uAg!=wz>z@{&+TM=*8MoN=Xw9ujrW%yH(8SkavEo*$#W5C{>uXcUI$Y1T4GGpq(BW~WohVLJ? zwPvs1QQ11EAHQ;WkL5AJ(;mbSKV`>r=fnBO$- zi<^{vwAb@_in5*mRu~>iwa?RA`~AEn4wD=r#}W`REKSb3&?xW>4v$wa$SkR-ex|6u z%#Bjcyw_eVal!8cq<^oT%^e!@++7)3I&J&p)s0KsH*c$cs9ce`rf==}xUoTWz;}a_ zSF2x~TpCmKbkSS)=EKJhm`0qs@cPJU$QyQf#mLmfL1&t^C6E5Igqj}sh}v1`|7Mjw zyr%5wj%U`}-`3@~WldbrCih-CKEQRLPyUczo3yv;4&7MuV8gsU8LAs=LRUZOcCwja ztS(2dD(-si+AE&E{FQ%G-I7h(`ioDz7man|P0}djicQy=Z=DV{f0j7iJd`E3G+D-lt!}m7((T z!4V?=a_`+^j*N%{uj++Ex1#5p{yA;_OY!N@Wy#>bnl zHZ5)#(DHRuQlV$aP|6VCJt83ci(jV{)KOGa;qd)0Q%Vg_znLtG7+mtVioQN~pnH|P Sck`w#)b@*CMP58%Yxy7chgaAD literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/ods.jpg b/libraries/filemanager-9.14.2/img/ico_dark/ods.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eb6522c84b5ddfc8dfb785525b64adea20581b95 GIT binary patch literal 3581 zcmb7G2~bm67QKHSPPk&Kfl=o-E9nfwxInwi7 z_Hv6pI|nh2rPmf)hmbggbJAc>#9BgU#Mg_2bh5^%hXJFIl#DnWai^lvG*^5k!(KLw z*rhn-MTyynF%Bb6&}C>5cSQV+Xw4;ap=M^SU`{1-VSMJe&7pN^VD4GW*<>!vmsJXO zDMyUS+;bG=;XWl}*=UED=NilA7noAgUHqvwv$Pjc8@paC%_Z6}KKqkSOio3Nao8t< zWjLuDVlKd_OCq(6Ks*RWP&yF63VQ4fV1akQLoTF30zPdZqNe~%U`C68UI8s8$_t9o z_FG7Q za4XQZ(8)s~)T7eII1`~1XC^vEK*EBKrD5(d{0woN$#Cx522|6WrM20QaoicBW^2m| zfE_E)lwGfubviNiV1V1h*RlJ?T=YCK6>>gRU+xZfkE_G}GIzCkJa>h=il566k1Jr7 z6qTSVle7|cH?LQ#9BPs203G%>k!MA%O-fs>Xn|!x$7Tv0sUNEA z)RpS>>IbdnXpY#bO3Y$r5AzRZKXZUN4LnoB)G~*eB$Z6PHr96RTm<|FCOg$X;$zAxoAe$>M>R^^nENG_nkW zn@*mrJNja=Pj;(sJUMPgs|J}WrWPEo3BwB4#L{njr zgYTnO_v7R7RVMK17DGfhuQQu@$z|t7!7hkpf-wTfdytF+c$zD{->44fnr)6OfPs(j z&ibj@mR}06%?{un)ocsHJF)$0fPK-1Qn9Qt9=>?b0N4v6`$)ej&jh@it~;Gi@xGET z0(iI3>3p-+>3p{i<6i}+F*|RyE+F6TH_rjV;t z3b{hj)_EmZZd6OU%$8mB-?!~fR-fb0az5nm# zJOU~OjD~WC>I}4sVpNp#CHXS-H*iQxP{%1G;Wf-*1~3E0zbIY*^~W-0y#}zO;Wo zrtm@CtN+xTR(corK34nVq`i@khIFY{&yp>Bc7wN_>-_jZ_O7o6^z>Z+g?~m-;Nn%o zdnPnk4pwvsK34pFT(bE2;w!=D{_eOvdEly-S8^)mk3Cd#X~` z3&!*i4sGqd(r1y4EEA zGGYF-`bX+r6Q}%YZ3ul3RCpmWbM2UQ&(G?op6;`=^6Oi72Whi|hHAH;Sy{R4?EBlZ zqqb;{R}T6$@8RC?(N|9Oj!tXiAG7<76Uydp>~`02J?8Pug>z3Sa!xFL^<`>k-v~d` z;@9>K{#(tqrF$~(8YTp-I5ZS1+|37f1IJRFdnG7PVeJ-H#_J|d*YfJ|wGHQ+w#nd- zmm1C0GvWv~z;}C^nm<@Ko({QWEU?(ZnAz!ij`ogPP%VZW&FsH%;AU0TsOVan4(m|X zBOq>h%3q(I+T?vU?nuP(=M2oQs#t1xX|l~~*FN%b(3Vzp%<(Q=hjT=XCO$F{B}j-JBgfH_-Z9 zvia#o>V<{&e3sNTcgLhP%fCCLT;#iNdj1+V&tvztx2heFerKqlCzZA}-B*+_<&WEW z=qqNl?=VvH!`x6-Ngdvnecn{(w@F>69a&L6R}(dXy7=Jzu&8%ypTxvb`nYvhr#;iW zYF~Y};z)jI^%9k3Ov3M-^aGENf7114(AtKsQOV`J6D(5`A@BCxuq8*jZ`$bu=jHza DNg__S literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/odt.jpg b/libraries/filemanager-9.14.2/img/ico_dark/odt.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eb6522c84b5ddfc8dfb785525b64adea20581b95 GIT binary patch literal 3581 zcmb7G2~bm67QKHSPPk&Kfl=o-E9nfwxInwi7 z_Hv6pI|nh2rPmf)hmbggbJAc>#9BgU#Mg_2bh5^%hXJFIl#DnWai^lvG*^5k!(KLw z*rhn-MTyynF%Bb6&}C>5cSQV+Xw4;ap=M^SU`{1-VSMJe&7pN^VD4GW*<>!vmsJXO zDMyUS+;bG=;XWl}*=UED=NilA7noAgUHqvwv$Pjc8@paC%_Z6}KKqkSOio3Nao8t< zWjLuDVlKd_OCq(6Ks*RWP&yF63VQ4fV1akQLoTF30zPdZqNe~%U`C68UI8s8$_t9o z_FG7Q za4XQZ(8)s~)T7eII1`~1XC^vEK*EBKrD5(d{0woN$#Cx522|6WrM20QaoicBW^2m| zfE_E)lwGfubviNiV1V1h*RlJ?T=YCK6>>gRU+xZfkE_G}GIzCkJa>h=il566k1Jr7 z6qTSVle7|cH?LQ#9BPs203G%>k!MA%O-fs>Xn|!x$7Tv0sUNEA z)RpS>>IbdnXpY#bO3Y$r5AzRZKXZUN4LnoB)G~*eB$Z6PHr96RTm<|FCOg$X;$zAxoAe$>M>R^^nENG_nkW zn@*mrJNja=Pj;(sJUMPgs|J}WrWPEo3BwB4#L{njr zgYTnO_v7R7RVMK17DGfhuQQu@$z|t7!7hkpf-wTfdytF+c$zD{->44fnr)6OfPs(j z&ibj@mR}06%?{un)ocsHJF)$0fPK-1Qn9Qt9=>?b0N4v6`$)ej&jh@it~;Gi@xGET z0(iI3>3p-+>3p{i<6i}+F*|RyE+F6TH_rjV;t z3b{hj)_EmZZd6OU%$8mB-?!~fR-fb0az5nm# zJOU~OjD~WC>I}4sVpNp#CHXS-H*iQxP{%1G;Wf-*1~3E0zbIY*^~W-0y#}zO;Wo zrtm@CtN+xTR(corK34nVq`i@khIFY{&yp>Bc7wN_>-_jZ_O7o6^z>Z+g?~m-;Nn%o zdnPnk4pwvsK34pFT(bE2;w!=D{_eOvdEly-S8^)mk3Cd#X~` z3&!*i4sGqd(r1y4EEA zGGYF-`bX+r6Q}%YZ3ul3RCpmWbM2UQ&(G?op6;`=^6Oi72Whi|hHAH;Sy{R4?EBlZ zqqb;{R}T6$@8RC?(N|9Oj!tXiAG7<76Uydp>~`02J?8Pug>z3Sa!xFL^<`>k-v~d` z;@9>K{#(tqrF$~(8YTp-I5ZS1+|37f1IJRFdnG7PVeJ-H#_J|d*YfJ|wGHQ+w#nd- zmm1C0GvWv~z;}C^nm<@Ko({QWEU?(ZnAz!ij`ogPP%VZW&FsH%;AU0TsOVan4(m|X zBOq>h%3q(I+T?vU?nuP(=M2oQs#t1xX|l~~*FN%b(3Vzp%<(Q=hjT=XCO$F{B}j-JBgfH_-Z9 zvia#o>V<{&e3sNTcgLhP%fCCLT;#iNdj1+V&tvztx2heFerKqlCzZA}-B*+_<&WEW z=qqNl?=VvH!`x6-Ngdvnecn{(w@F>69a&L6R}(dXy7=Jzu&8%ypTxvb`nYvhr#;iW zYF~Y};z)jI^%9k3Ov3M-^aGENf7114(AtKsQOV`J6D(5`A@BCxuq8*jZ`$bu=jHza DNg__S literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/ogg.jpg b/libraries/filemanager-9.14.2/img/ico_dark/ogg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..23ed22b8925ceff4621392d15a022715ca9dc0ba GIT binary patch literal 3440 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 ADF6Tf literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/ots.jpg b/libraries/filemanager-9.14.2/img/ico_dark/ots.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eb6522c84b5ddfc8dfb785525b64adea20581b95 GIT binary patch literal 3581 zcmb7G2~bm67QKHSPPk&Kfl=o-E9nfwxInwi7 z_Hv6pI|nh2rPmf)hmbggbJAc>#9BgU#Mg_2bh5^%hXJFIl#DnWai^lvG*^5k!(KLw z*rhn-MTyynF%Bb6&}C>5cSQV+Xw4;ap=M^SU`{1-VSMJe&7pN^VD4GW*<>!vmsJXO zDMyUS+;bG=;XWl}*=UED=NilA7noAgUHqvwv$Pjc8@paC%_Z6}KKqkSOio3Nao8t< zWjLuDVlKd_OCq(6Ks*RWP&yF63VQ4fV1akQLoTF30zPdZqNe~%U`C68UI8s8$_t9o z_FG7Q za4XQZ(8)s~)T7eII1`~1XC^vEK*EBKrD5(d{0woN$#Cx522|6WrM20QaoicBW^2m| zfE_E)lwGfubviNiV1V1h*RlJ?T=YCK6>>gRU+xZfkE_G}GIzCkJa>h=il566k1Jr7 z6qTSVle7|cH?LQ#9BPs203G%>k!MA%O-fs>Xn|!x$7Tv0sUNEA z)RpS>>IbdnXpY#bO3Y$r5AzRZKXZUN4LnoB)G~*eB$Z6PHr96RTm<|FCOg$X;$zAxoAe$>M>R^^nENG_nkW zn@*mrJNja=Pj;(sJUMPgs|J}WrWPEo3BwB4#L{njr zgYTnO_v7R7RVMK17DGfhuQQu@$z|t7!7hkpf-wTfdytF+c$zD{->44fnr)6OfPs(j z&ibj@mR}06%?{un)ocsHJF)$0fPK-1Qn9Qt9=>?b0N4v6`$)ej&jh@it~;Gi@xGET z0(iI3>3p-+>3p{i<6i}+F*|RyE+F6TH_rjV;t z3b{hj)_EmZZd6OU%$8mB-?!~fR-fb0az5nm# zJOU~OjD~WC>I}4sVpNp#CHXS-H*iQxP{%1G;Wf-*1~3E0zbIY*^~W-0y#}zO;Wo zrtm@CtN+xTR(corK34nVq`i@khIFY{&yp>Bc7wN_>-_jZ_O7o6^z>Z+g?~m-;Nn%o zdnPnk4pwvsK34pFT(bE2;w!=D{_eOvdEly-S8^)mk3Cd#X~` z3&!*i4sGqd(r1y4EEA zGGYF-`bX+r6Q}%YZ3ul3RCpmWbM2UQ&(G?op6;`=^6Oi72Whi|hHAH;Sy{R4?EBlZ zqqb;{R}T6$@8RC?(N|9Oj!tXiAG7<76Uydp>~`02J?8Pug>z3Sa!xFL^<`>k-v~d` z;@9>K{#(tqrF$~(8YTp-I5ZS1+|37f1IJRFdnG7PVeJ-H#_J|d*YfJ|wGHQ+w#nd- zmm1C0GvWv~z;}C^nm<@Ko({QWEU?(ZnAz!ij`ogPP%VZW&FsH%;AU0TsOVan4(m|X zBOq>h%3q(I+T?vU?nuP(=M2oQs#t1xX|l~~*FN%b(3Vzp%<(Q=hjT=XCO$F{B}j-JBgfH_-Z9 zvia#o>V<{&e3sNTcgLhP%fCCLT;#iNdj1+V&tvztx2heFerKqlCzZA}-B*+_<&WEW z=qqNl?=VvH!`x6-Ngdvnecn{(w@F>69a&L6R}(dXy7=Jzu&8%ypTxvb`nYvhr#;iW zYF~Y};z)jI^%9k3Ov3M-^aGENf7114(AtKsQOV`J6D(5`A@BCxuq8*jZ`$bu=jHza DNg__S literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/ott.jpg b/libraries/filemanager-9.14.2/img/ico_dark/ott.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eb6522c84b5ddfc8dfb785525b64adea20581b95 GIT binary patch literal 3581 zcmb7G2~bm67QKHSPPk&Kfl=o-E9nfwxInwi7 z_Hv6pI|nh2rPmf)hmbggbJAc>#9BgU#Mg_2bh5^%hXJFIl#DnWai^lvG*^5k!(KLw z*rhn-MTyynF%Bb6&}C>5cSQV+Xw4;ap=M^SU`{1-VSMJe&7pN^VD4GW*<>!vmsJXO zDMyUS+;bG=;XWl}*=UED=NilA7noAgUHqvwv$Pjc8@paC%_Z6}KKqkSOio3Nao8t< zWjLuDVlKd_OCq(6Ks*RWP&yF63VQ4fV1akQLoTF30zPdZqNe~%U`C68UI8s8$_t9o z_FG7Q za4XQZ(8)s~)T7eII1`~1XC^vEK*EBKrD5(d{0woN$#Cx522|6WrM20QaoicBW^2m| zfE_E)lwGfubviNiV1V1h*RlJ?T=YCK6>>gRU+xZfkE_G}GIzCkJa>h=il566k1Jr7 z6qTSVle7|cH?LQ#9BPs203G%>k!MA%O-fs>Xn|!x$7Tv0sUNEA z)RpS>>IbdnXpY#bO3Y$r5AzRZKXZUN4LnoB)G~*eB$Z6PHr96RTm<|FCOg$X;$zAxoAe$>M>R^^nENG_nkW zn@*mrJNja=Pj;(sJUMPgs|J}WrWPEo3BwB4#L{njr zgYTnO_v7R7RVMK17DGfhuQQu@$z|t7!7hkpf-wTfdytF+c$zD{->44fnr)6OfPs(j z&ibj@mR}06%?{un)ocsHJF)$0fPK-1Qn9Qt9=>?b0N4v6`$)ej&jh@it~;Gi@xGET z0(iI3>3p-+>3p{i<6i}+F*|RyE+F6TH_rjV;t z3b{hj)_EmZZd6OU%$8mB-?!~fR-fb0az5nm# zJOU~OjD~WC>I}4sVpNp#CHXS-H*iQxP{%1G;Wf-*1~3E0zbIY*^~W-0y#}zO;Wo zrtm@CtN+xTR(corK34nVq`i@khIFY{&yp>Bc7wN_>-_jZ_O7o6^z>Z+g?~m-;Nn%o zdnPnk4pwvsK34pFT(bE2;w!=D{_eOvdEly-S8^)mk3Cd#X~` z3&!*i4sGqd(r1y4EEA zGGYF-`bX+r6Q}%YZ3ul3RCpmWbM2UQ&(G?op6;`=^6Oi72Whi|hHAH;Sy{R4?EBlZ zqqb;{R}T6$@8RC?(N|9Oj!tXiAG7<76Uydp>~`02J?8Pug>z3Sa!xFL^<`>k-v~d` z;@9>K{#(tqrF$~(8YTp-I5ZS1+|37f1IJRFdnG7PVeJ-H#_J|d*YfJ|wGHQ+w#nd- zmm1C0GvWv~z;}C^nm<@Ko({QWEU?(ZnAz!ij`ogPP%VZW&FsH%;AU0TsOVan4(m|X zBOq>h%3q(I+T?vU?nuP(=M2oQs#t1xX|l~~*FN%b(3Vzp%<(Q=hjT=XCO$F{B}j-JBgfH_-Z9 zvia#o>V<{&e3sNTcgLhP%fCCLT;#iNdj1+V&tvztx2heFerKqlCzZA}-B*+_<&WEW z=qqNl?=VvH!`x6-Ngdvnecn{(w@F>69a&L6R}(dXy7=Jzu&8%ypTxvb`nYvhr#;iW zYF~Y};z)jI^%9k3Ov3M-^aGENf7114(AtKsQOV`J6D(5`A@BCxuq8*jZ`$bu=jHza DNg__S literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/pdf.jpg b/libraries/filemanager-9.14.2/img/ico_dark/pdf.jpg new file mode 100644 index 0000000000000000000000000000000000000000..809b5e605e76730d02b0e17dbafebe7db8bc1a87 GIT binary patch literal 3705 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 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/png.jpg b/libraries/filemanager-9.14.2/img/ico_dark/png.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f479380fb0db7d03a6580c674582f7f2fa9acc84 GIT binary patch literal 3754 zcmb7G3s_WT8vf3lb7m$kb3p`UL=T9~{v3fgYcF_8<7qJKz8Q-~aya ze>vm$%yAhc8L8>1KoA6^;RhU71c%a-lb5RVRH^A%3Tyxn?A4gfdL9E{Fxo76$|R;} zaWNz41s+TWPY3`{jn-;TRI9T93&-W2 z_zdIbUTI0o8^MiQjbb6<5R7-4ZAn~wCgQK{RRxKNX94hh$}On{!+hSub(Q&x5c^@g zOlM2aABoo)OLJ6+u`h3Tl_`_U!*M#b)@1Y&f)QV=WYf7dMm;2yu_+3~vk_0Nw5N^a zCo`-y3%R&6PhDkl4r0thT9#=t)QAHRueX@;xUo<(xtrB1xv?-m*LQFMtu%9 z7S5Lvu~z3CF()}-tIWrJ%JrpUZI=9zzEp9!E;W6Gzsjt4?nTr_?XlSNIBl4p>e5&g zO2n9ly2Tm`INuP{lgczHoVO8(AAv$b11y-J6l*OQ;Vv+c2TDl7rx`5RQVu%MV}!+4 z79%>s8>%pNf1cXO8Sdj|R5*JNaJ_Mq`*VgzxIV%$QT~*iipKx>R2CIa&7d>!@@%Pc_(aWKKsRBy9??hq?MNYb{H4+K)HhL^bYNn%wP} z$2DWrY#QqTSkZye*@chw>4Q~AC%IafZtBpZpLl(+3RJ)6FWpZM(A`+~(ihzQ=|1`b zetIDhS3vJnWI$Cq=So;zyzp^zXh)_EG+2LuJQHdiRXT1(%Z-}?+%23F>@zt( zqgSJ@-hV9a1n8gumFQqOaxLg8=dclKG3(fKGNP24N<~uXzuL9)xV=28g0JAG@DqXI z&*I1NBl#H|9zA*dP;86CTH#VZd~#fjaWi1Yu+SA(o^a=`7v8&9o|=h%>Z{B9F9A?9ge$AnEwL6alPXUSgly0D+kEV=5Bou0!{efMU5{5P8$&b zv=akl5Hc6eBf>^FJb-6(K#g#?JD)4uU5mX(p1ek$i&57|y6_T?>bM6nDzi;z(ABYJ zOld8Xp;jmjI-`z>j);qhig+jsy|l3wqejojS43)}*oPwL#X0&Q8F*YFxr(NFq<~Ke zNKzo6X^JltNTou7Q0U<)^75GA?I{#`P4oAbi30-zJ-nno)5Ja^aiEw>LeMlVAO+qO zhZ}t}8Xka?8&h^Yc08H%&a_hP4p{s#CYAUml&Czi5Zw`Ev?G%H6(O zL!B#E+?g@}WMD$%!&!G#nHhf9x}zeB{?k%$Hg-oE{&0bgL#wZ1I(Y^Dot}W1fqaUHhr|BkhYD z{9d=0?tWkPhpqKRp`D)$eYtqsrMYJ!mS3K@Wmfn5>XlE&-+A}-!invM#)6iL_Y;WZ-yrZt3G*aC z;2siq(A-|<3W26XQnb{^5+sk!-Mre z*B(3g;khE!hi&&JzBbDNky8g+BKMzVgPrRJH&21?MiUWfbA01REhYWA-F&H;a zIv4wn@_C(XNmEBm{p)A12Bh{33_UCR^vLaIn_WQnJgd6WSGw)H)SjMZiG5=)w`QTZ z_Xv{5Cq@kiLJC2VxrrJHBVW_dUacwRXu$@D;xYOf%;;b`)eOP?L|w#EAOeEZ(joSoTW;(^w{ z?<1a5nW`JJp6^uTp8Lz9)qn30{&@78!o>rk4YGxhd#mtpcC2{Q(A6{lJiq_IB;Tq- z3m^a2-pVJQL-EcN?Yt-PP`eAy(}~wkVel4yfk{4&w=RR#Z){a=FH3%JFFOh7EE-Ew z?o&;G6rGhPYS!G8FxBk~N*Z>(>2g-`v+stm%=(}O4IYw{UIkO%p7+bN&oAHWVx(au zr8(=TzM%J%0@HcwXx!|*zMkzj3%ddieJ1(3{Z6rBk4o*=06k5mD-BP*t&@=-9_!zi z@xo1U$K|*DTkS=J_~lEXf4*UWq4iU;!~xf4bS+qW=#;#*_pSG;jCS7qn zN*&zKK3O(7yJFM7L%h$QnV8vMFrhI-)}JuB-0!71GsE}YI?~^68Bizs&}V7$t6|L( s93WA~MXQ$!D&}N$h9zznl*EKBIp+Cd1JAd-bB$CxC3kX^sov51KS1K1&;S4c literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/ppt.jpg b/libraries/filemanager-9.14.2/img/ico_dark/ppt.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b87590a2b8d7796fff1aec41d704d499337364ee GIT binary patch literal 4035 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 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/pptx.jpg b/libraries/filemanager-9.14.2/img/ico_dark/pptx.jpg new file mode 100644 index 0000000000000000000000000000000000000000..62cbe2faf4eb2ad4ea9d5ae0fdfa114d31048ef9 GIT binary patch literal 4089 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 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/psd.jpg b/libraries/filemanager-9.14.2/img/ico_dark/psd.jpg new file mode 100644 index 0000000000000000000000000000000000000000..312af5c8b938e172c7c61b6c461e6999bf027619 GIT binary patch literal 3859 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 KZjXZWSN;#Qw(cPS literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/rar.jpg b/libraries/filemanager-9.14.2/img/ico_dark/rar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6057cbc5447e64c29d3c4017f7464d7229973ca7 GIT binary patch literal 3387 zcmb7G2~+^_;jw zt!Tocsi)P%Eiv(g*4EQl>vEKcL~E@Jbs;WQYjdzt>vBTVMl=2In_++)PjYhS%zfYd z_q+f7{{O%CzHwc1-3C=&wmusuih^AHfa|X8kY1}@WH1(G>+^Lu03iF=R9|nSIe=Qb zQ!wUaa%J=8bFx05VLbRk2>6;Tj`|FPAs?_2E_se_gI54O0rbYbcziVbJHLD@c!vdm zlB2z@!eOaJ+yo%8S?UERfb<^PQyQK1h-E)P94Meb#2SLD+&GJ1vm2L*oD!oJIYg_{ zQf;b0yaI8od4#=c1a@mc2Kve2?Yv;Ma3mK7p{~+u6~qG#HKiGdV*u!YN+G+{&8KHHSC`C1 zJQnR0R;RwiV{f*b3yTorTzYp+-7MmVa86qsTFfOxAih=2>q(7K4+9l^mJV?&;?U}b zT#tVy&#`Pav5S71tF?uQ(GMdmG36N$hampBP-i4-p=M?`Z_6QTp?{{Q-f8e?VEXO0 zLb4Xd%PM(?7$f>*`kmD!xKGJkcA8Tt@yuoCS6Z|69{!4Yo46NI8~cIKU?kemKYPI> z=yDLFANC1vFC}?HEE!i}$|AXqNBla>p-jL-9hkAVfE}I#2S&(&OnlaZfFqS)1shs; z9OcnsrTm}sTFr!MG-A`uYDlg`^SGe!t)Um;=hE2lnYivF{lTBe$fn(Fy zboO;N3$3Z_YhDG05jr`jg8Qh{?Pn=8;L1eD9LQ`7X^8gD;Z_Tatd{ewk5J8Uly$@7 z=*Jr|YOWiZ0dQajhN6obnWxWJ93AH!;V!d>7W67UUjaowlwZj`Nx$SW_I;8Y!}BHA zB{%TX2N_rao2aN3RawPKIJ~^LQ89EO(+MW*?;x)ZwGJsARnba&TgdPT$ppW?aIg?o z#|~RHS2h3AT-NN;e4u$SYK>u!qq4+oW$C(~xKXb(E^ToAy zd-2v@jF;F*w4@3{>y6Ac4>o0{a)L5anWYRgmz5C>N8KWZLN3bv}UO#c-t|NPu%wC4NZK#`f@=f^e z0MOReFBhy;)lM!^qj{Cfz*ia1>Ft*ISk7d#apI7J6L<$NEaNNUfxHLFJbjG~S6pI{*$%vor|H-2U*zdk(-+nUpC0rWBcY zH{Ei%p5lEa>i~G(?s9#z+vR$`2mRjwIAL?$ft9)@Yb8KI0lD=-4iYK=FKT=l5N%Wl zNJI>fM@{fzBNgr8&;aYLzlSpVrCS_#| zBa=xatW+*jtK~Ae+{ag`@EPOhE0-%&3O}X)#EBDq6zYI5{{Y1P#0e#lNMwx6k7fP* zedIp=Kf1X-1GOC9fM$k@09s8kYRc6O6UcuchWtVDHky*kk6D{VMGJ)^%ge_ds!D z-rEm!w_39vmtXDfJ-9UfdiN(=HdHQ2hjXVkAM4+?;eKJk(VCxL{JOQ^-ue{ZBqK=e zv5aCV5B8?5f|t7qsZW*^ct8r`oND&zid1j%GiIYuVI(<|=#CPRBc@n3I6Pi~LDjr!JZe_BOz4^jxNFAP_$xxXdr57*u=1TP}mU_PGYna)^ zc8*ic=(tvyyUJO5l6!Rc_NCKZjoWnx-a1&eSsH!m({k19sQg@+-{PL%g_OU#pnYX) z^>-ieNE2fl%DbC<|DZa Mf3yBi@TRNp|7IcnbpQYW literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/rtf.jpg b/libraries/filemanager-9.14.2/img/ico_dark/rtf.jpg new file mode 100644 index 0000000000000000000000000000000000000000..122d3825b90e6a38dc8f628296c3a45ffe78941e GIT binary patch literal 4081 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 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/sql.jpg b/libraries/filemanager-9.14.2/img/ico_dark/sql.jpg new file mode 100644 index 0000000000000000000000000000000000000000..73485f1521ba06efc0e66d441cb1b9994c245580 GIT binary patch literal 3766 zcmb7G30M=?7Cw`iEG!M62#6vhs4M~viXejQ0oh~3Em|dnfkXm{lR$-H>-MzR`YLMs zs#c4LU6Izh6t`DV6t&_;tp%5-wED!YwN|WE%sUf8fPQ}M_bzbfpL70u?z#Ux_YS5X zOxM6MB{4Y>2!en~_yeYPVSRFZ{9KtlGch?$iVgtbCrZ6u%cB7bi;S#1DUO~oQ$Y(` zfd_-Z4&1>`sWRweWwJED#&Nl4|JM0EU?hN+z!&@bv;XvFm&+Jb0E7tbx?F>*5b**4 zzE-7YjR1n5&_4cEqaLwvC}L+86GSZGaDF#V;BZbio?+%>$>Wj3nzk-F@VqCMi4a45vP%tGGpT6AM z)$Am>1y`w*(kX~Xp#8Ys7{}R1A--E&Ff|sjKLBq)9-BC|o6n0ZQ)f*_?1J`OjWIdP zVlOMo$;d>EV|mpDx>PO>$2qPt#G{trh4`wPN#^z#^C2OZNsuBAKs-!cJjoKDOfi&9 z;q2x(W$O40#2ANU=P6TUh}{vt$?D|XT$nRi&1jRjxiCI?OmCD~av*ONX*0OFaJ`h6 zF__ngG09s-br#ksH$T=u#N4PFwph;PhViMhN>-YL7~@dC zGDTB4-4OHLa+L|3wn2!aU>czW26T{vy$Xt;3uur-62#$C4=j4}Km%H|Fz98_q9I;_ z0<^uDCo^-p$MiDt&7*H|qj8oObGm2fuyAygDuGf!otSiQx zb$t~811iw7y1>3VHI*N5vwG+YRQ>E0`=)Zp{5yU5Kk;wzFJRxwzuY^Xe~Et?e_A0H zcR*{-s1UQ#n0LZp!>wBk7N5V5y7LF_3WDNeJpXtAp}SUgGWgPtMQebe^(`>jO-Gf}G^ zRbM<8cLFpp6*JMmtH@HA_=2o@l(do$wjK509vWl(q@-|W*Gy+mN2T=K%L!i#hX=4i1C)is-T7SO?phpedGe}wRz_JBX~nZRs_8j|Wa^EYLQNTyOXrl* zDKcqNp{7Vfj|~bB8WS`w4Yf2fY>`q+OBRHN28WH$9XHl=3F3jrHInQ2d>$zjP(qRv z3i*6W;N;-sBytdmYzK+$Z3hmv6Ny|sT?Y?w@bK`kwRiHSJqCz9JRGLrJPqJa+ocQYLZClSnoGLrBDo)bYj5vE2MipwX>zuX$ljV}<22$HfvuQT@#QvYUZ z1A836b0i&6y0`i{ZQSm!r|(_zJ@VE4!=9V&jLSu@(KYI4LB)?3BjcVt%{g86ahv}& z+|z=iVFuMx<-D5}vL}H)Bc^|(T!dVo!qWPK=MT~-b|ZK@0>K9!L2-L*ZWQoHzJQQ8 zI}IGTm6H)ef%Xq2g>{BvW_mS8o$Kb=JO^)_OXmpYXiRZyl|@UV`IYQ{rOV2 zta}p%iA@3 z-@W?&_N=s9A>)C8)`U4t&iYc6kA zbfu-8c5d-6NN+oH_;jG(AF)SHhW`-dmnJ*2I$~XBo9z|-r}?$DnKw*a^^M}B=VR?* zt#>y9oQ4O-Dz```FRq-wqXFyhK~Dij4}b2ub@bzqB!O?lP6xHY<;sU|CjU6AeG~Do zSqGj!vRRrxp|I`^s&f7N?M%tS@GBd(&@t*ICWxsON4*ylw|QCuE1mOuKxoa<3jtLS zrD>~MyXsnF=Ti9c<&6#NW7eOUDbl|3)Mt;KDrD7CAK#5ON51w>SbO8Q6UXAS&oy`q zS9N+S-5#y3cssICx9&fpI)zR?Pt@QQ+j^p9NQ$yqVzZh-&j}D6Dcz<5ZUf$4*wxUtH<9rQsL)K}_}ztL~0nE~gJT zjIPrvsvXMSHx70^mH9*EK61%2idZ=7_geR9XVcn#e&%eu%ei@<-Fzl&TSDzush>TO zX&T@ADZTXE!cTX3PWE>5`9v1*?7L;QBR>yQ#Ee{?TitQqarL>p=GhMl6hoW*SFNZL zjY_Ldok3UZtvFRloVi(3FaJZjvfy_8nr-{1XS;T&ls<3I`SkUBO7TLS$;b!&|k2jxF|@tsNO|aaXRr J9x=t#`ai+~z0Uvu literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/svg.jpg b/libraries/filemanager-9.14.2/img/ico_dark/svg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f479380fb0db7d03a6580c674582f7f2fa9acc84 GIT binary patch literal 3754 zcmb7G3s_WT8vf3lb7m$kb3p`UL=T9~{v3fgYcF_8<7qJKz8Q-~aya ze>vm$%yAhc8L8>1KoA6^;RhU71c%a-lb5RVRH^A%3Tyxn?A4gfdL9E{Fxo76$|R;} zaWNz41s+TWPY3`{jn-;TRI9T93&-W2 z_zdIbUTI0o8^MiQjbb6<5R7-4ZAn~wCgQK{RRxKNX94hh$}On{!+hSub(Q&x5c^@g zOlM2aABoo)OLJ6+u`h3Tl_`_U!*M#b)@1Y&f)QV=WYf7dMm;2yu_+3~vk_0Nw5N^a zCo`-y3%R&6PhDkl4r0thT9#=t)QAHRueX@;xUo<(xtrB1xv?-m*LQFMtu%9 z7S5Lvu~z3CF()}-tIWrJ%JrpUZI=9zzEp9!E;W6Gzsjt4?nTr_?XlSNIBl4p>e5&g zO2n9ly2Tm`INuP{lgczHoVO8(AAv$b11y-J6l*OQ;Vv+c2TDl7rx`5RQVu%MV}!+4 z79%>s8>%pNf1cXO8Sdj|R5*JNaJ_Mq`*VgzxIV%$QT~*iipKx>R2CIa&7d>!@@%Pc_(aWKKsRBy9??hq?MNYb{H4+K)HhL^bYNn%wP} z$2DWrY#QqTSkZye*@chw>4Q~AC%IafZtBpZpLl(+3RJ)6FWpZM(A`+~(ihzQ=|1`b zetIDhS3vJnWI$Cq=So;zyzp^zXh)_EG+2LuJQHdiRXT1(%Z-}?+%23F>@zt( zqgSJ@-hV9a1n8gumFQqOaxLg8=dclKG3(fKGNP24N<~uXzuL9)xV=28g0JAG@DqXI z&*I1NBl#H|9zA*dP;86CTH#VZd~#fjaWi1Yu+SA(o^a=`7v8&9o|=h%>Z{B9F9A?9ge$AnEwL6alPXUSgly0D+kEV=5Bou0!{efMU5{5P8$&b zv=akl5Hc6eBf>^FJb-6(K#g#?JD)4uU5mX(p1ek$i&57|y6_T?>bM6nDzi;z(ABYJ zOld8Xp;jmjI-`z>j);qhig+jsy|l3wqejojS43)}*oPwL#X0&Q8F*YFxr(NFq<~Ke zNKzo6X^JltNTou7Q0U<)^75GA?I{#`P4oAbi30-zJ-nno)5Ja^aiEw>LeMlVAO+qO zhZ}t}8Xka?8&h^Yc08H%&a_hP4p{s#CYAUml&Czi5Zw`Ev?G%H6(O zL!B#E+?g@}WMD$%!&!G#nHhf9x}zeB{?k%$Hg-oE{&0bgL#wZ1I(Y^Dot}W1fqaUHhr|BkhYD z{9d=0?tWkPhpqKRp`D)$eYtqsrMYJ!mS3K@Wmfn5>XlE&-+A}-!invM#)6iL_Y;WZ-yrZt3G*aC z;2siq(A-|<3W26XQnb{^5+sk!-Mre z*B(3g;khE!hi&&JzBbDNky8g+BKMzVgPrRJH&21?MiUWfbA01REhYWA-F&H;a zIv4wn@_C(XNmEBm{p)A12Bh{33_UCR^vLaIn_WQnJgd6WSGw)H)SjMZiG5=)w`QTZ z_Xv{5Cq@kiLJC2VxrrJHBVW_dUacwRXu$@D;xYOf%;;b`)eOP?L|w#EAOeEZ(joSoTW;(^w{ z?<1a5nW`JJp6^uTp8Lz9)qn30{&@78!o>rk4YGxhd#mtpcC2{Q(A6{lJiq_IB;Tq- z3m^a2-pVJQL-EcN?Yt-PP`eAy(}~wkVel4yfk{4&w=RR#Z){a=FH3%JFFOh7EE-Ew z?o&;G6rGhPYS!G8FxBk~N*Z>(>2g-`v+stm%=(}O4IYw{UIkO%p7+bN&oAHWVx(au zr8(=TzM%J%0@HcwXx!|*zMkzj3%ddieJ1(3{Z6rBk4o*=06k5mD-BP*t&@=-9_!zi z@xo1U$K|*DTkS=J_~lEXf4*UWq4iU;!~xf4bS+qW=#;#*_pSG;jCS7qn zN*&zKK3O(7yJFM7L%h$QnV8vMFrhI-)}JuB-0!71GsE}YI?~^68Bizs&}V7$t6|L( s93WA~MXQ$!D&}N$h9zznl*EKBIp+Cd1JAd-bB$CxC3kX^sov51KS1K1&;S4c literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/tar.jpg b/libraries/filemanager-9.14.2/img/ico_dark/tar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bb5adaf98c1aa16496d445a1fd43cb78bf126f33 GIT binary patch literal 3346 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 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/txt.jpg b/libraries/filemanager-9.14.2/img/ico_dark/txt.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c2fe0e7c6934d35614774e055b9079361c736c03 GIT binary patch literal 3804 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 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/wma.jpg b/libraries/filemanager-9.14.2/img/ico_dark/wma.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9dfa9fee6dd23939e537b615a6c28e09734df3e6 GIT binary patch literal 3461 zcmb7G3se(l7QU02JP?S9pdwftMSQTphUdajOCbad0)}UWq7ae+0wIJXC{R4Us?@r^ zYt^bf&DNae8VdbY6D7PVS;mCfEiFTmr`vv&?NU+(?>`+xWT z|NMjXy7eYVQj(NOKv5J-#|x~tg@=`Ld7&zEW|A^hfdK$vv)X9X^H_jNgT<7YoWRb? z%V&ihz=KiX4!+>7)|id)Dpe|=5iWTSw#U~1GXY!;d2xI&`?+84TF$HiphW1e(wa4u zh-(4(dX3R!0TA3lf6P3K5wUPIVs8@)L@Xn?)Q%GgF1F)YHcob?963a*SW~9fB5pt& zTs**EIsn@>AOrIxa|X_&)3Br$DpOU7PS4o__S-AM1DG#^mHHa2*=GKD_b^vv&A{g* zQhS+cdZq(!*Qga)h{vP6}3r`j2QDU z4>&^(=^J9ck5-*XdK-%Pb;zaEz(Exh<6Q#==mQoqAsG_zX#^8SNrt@t%TXd3mH_yNn~0;jrUu~t3s_#rGr+q#IVMO;GAz@uQ||*6U2Vv0CA#tj5tu7>SD3tk>W7%bn!%t__@|i-ya`Tiw^RzSI(}! zcrNk==pYA`=wKdlP1se^VFT1*)`9PdLn-6WgfYtJc5MvV%T5&ng&ei!f&cfB=w*x?4Wvnyl zO3N&4xJ>p3HXc7^9IG^FLW5bgUeDS>X4b@+In!KD8w%t*NX7v?%(Q*qs1cX@eU>zU zX+Ptcb*0~zUjy)&8DL~&zi$$riNpT{a5!31W14HvhacW=0n8;4;kMtDM*^NrT~_Nu zJg8Tqa9D)cAkq-znymBw+PkxUx=J(wCE~z^_-S1u47YF zisVY2LB~df#)gK6Mx|meEu6`q*0Zu&tt>KD8>7)$Z-5+l#AtHk98?FhY?JYP&_^#M|m=g=g=XdA%yY&ne}Us zir_7%r>SwklTx&lvYvv`SUzeZJ#d=HO(4YCXpDN3e~<>7^#|}kI!{7Nuyu{>py;J} zl;66I7Xsc6I=#y8_oT@qB7$!3`V`*nID2Eh^uhjny!|Ht+)jq~sAm7NIi*ke_Nt_e z;wW5Vn-N6;5}+8o$a30^541qYP!d@bPwF*NRfG~mD2(Fso^9Xs@AV(HQEW4o{Zk+-DN7w-F9a8zUxK$#;&@_7b1N;9w%-*(=lgBd(20V4nA1j z6}|al)c37vKL$S1b(Rk|1V?XM^JLG;FvF7k(%|+PiqN}XPW;$=cWUU)qodz%_FlBg zf90N2*Sh>4cL};w^Y7((eONRiP-8?IFxKKRL`c3!9aw=!w?=&dOw%yPHolZS7G4FwCY{aJf|+U~?dq1VH< z_!S(SkR?c1d~O6ggU^dumS0d8@RNQ?`pM7z3cgz%c-=iu&>Xe9z5K49@yO1}S!=H> k&Y-7EOUd6U?tV|?Kff$##R5f0{m`YS=~3GnCR#iG2ah8hu>b%7 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/xhtml.jpg b/libraries/filemanager-9.14.2/img/ico_dark/xhtml.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3420b3359ce45ce5defb7c0ebccaf9eee669ce9b GIT binary patch literal 3653 zcmb7G2~bn#7CtxkCZrHTK&uEY*9D=B&;YSQwIWM^AWPWXXsaQ)KqLvtO+et`dy3Yj zIx5;eowh3A?%4W7u`aEORrI~Oj$0A6ZgjL&Yt?7#Li5g_ga93yUR;jjFqeEPc zctk-rdr>#+)PM|(lgyboUaw_IE!2Ezq29nb9M0}9+})Ue291U?%-PWfVlT0l z2+6&ePsw)SI;}>TgLoL)kDG1r#6BGHy|R+LIK-g<0>45&DbL9ljHxQlort&(+I4!H zD%WMNG8JTGBF3?ThLY0pBo5&m*IE;>mM{eIwPH?1))@8BpyLvih({nESX`FkichCn z%X5g`5vQs+AptCu&S-dLGGdIw zJmO4wq;80X{yI$}scksou`q$s00*T|fV~z>&;cxDLo&qU(+oU%3PBGBv~cL<(4wcj zp#*KO=BXVV=a?==kz@27G8$)jHOD!_T^Fa6>C4EODEy9Q(wKLcXeI_&CYBk;jAath z8pDisD^PdS$wCp_MWxO-7AV7+iH->nzbv3E#65oR zSIf9lt3_Jl;*$?Dofa zUwJGC=%}^ZUo_b59qTau6@Wtq`wf_-tk4$%q^FZxAH*P}{P3d2mjTg61%S|j0aB?z zH_oO)TpR(wd_6EO4!QG5BX=#1c0C1k0ym?oj&|dGLbd-6icGUjZ`4bM9Pl>PJARj-1Nf1gP6yhjvhVl0C6nhfJ|JUq?!B-6V zP(@QiK;TQ!zLfn4^e6v;P!!3~)jTL#C>Agx^!6ryka{-zWsuM~L`KW7bPH$o^cI}! zgG)*a)!(1!D9S$-TlB%)_VQz2^Yh=huUPyka=*`CvN&r~LZ9M`-p^^)Ihe+o2FgG{ z!gdLv8G%p)l)R668qO(3C6rL`vZZq5#O?pRc+0qE(ePvEyw>&0Jhd5S>Hbi&)zrIk6U7RCkC@3Zzuj3rulCFl<85J3#-RG&5B{uQ z_>u4|cy4+2x3|AKsMz^ST_a!fFrV{Z`FFq9ZjS9}T|PHhHC>U?-)PnC5ABGWsn}{U zzZlzavMFfAiWy6mEKR%AJaMg0(+)}9`^z$R9qd&yapgY>_V&7Q({KH(`F>Q+)GRK2 zZ{wUVJ_(!@oEw-^-Q=Slp*^u=^LC%wBj+Nwzc!`*y^}WwWIfn?_2r{o`Y?6W%$F<{$!VuZ7ln%ZR{Wn#Tp9)6hn3HVyy9Ch=`NP zvuauOG>v7pyS}m)?E2N$m#n$Hrs~2jI_aMOtjs&NWC!*=DcKqRFHc2SCI52Blk%-8 zx~y70`bO>w^VyK|9u*;Ni&|37)gSKjpIMdG>_;J!*681UviO=YPY#J~n&pd*)_t`n z??AdaVPk#k``5&hek4`Y7~+{ku`YSCld(+#W%xf2$ z>O@atn)BKOFJB(2_~7j2$-8CBpi^o6UT*oPW!dS_lBgqT+cvzxi<8-e{4G&JTu_=oA%cK0giBoivR!s literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/xls.jpg b/libraries/filemanager-9.14.2/img/ico_dark/xls.jpg new file mode 100644 index 0000000000000000000000000000000000000000..62e21ddf236050f1c0d9ae46b96d2bda00c2b735 GIT binary patch literal 4183 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 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/xml.jpg b/libraries/filemanager-9.14.2/img/ico_dark/xml.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7b2d75b9ece1ca16ca87b4be2b2ce76566ffd7af GIT binary patch literal 3774 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 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/ico_dark/zip.jpg b/libraries/filemanager-9.14.2/img/ico_dark/zip.jpg new file mode 100644 index 0000000000000000000000000000000000000000..414d5da6fc4e3c926d0d2c3fad61ded968eef4a0 GIT binary patch literal 3372 zcmb7G3se(V8vZ9UlSBw1AiluLfEtli41ywyRzi5oBZfzPZ8eVpQj!oR!3WD$+Ox-& zszRVppvmZELNH?yC5}t*-92wxznh+EU%tF1xz+tX<9icM_7&aOa!< z|L%Xk|G#(cjOPo_4Nw*47UTj&QIL;6@Z6FeD$wZ`>J6p21w}dN0Fdo8I-NEN2Vi%& z1w&pIH)rlVPSyhw7y+RW4WUM}%c<4tivSzplIy_s;4{ET0G~{JvVS1^XLq3%-em@$ zw1^V{B#~7@ZiSaGnci4a{sQ8m zXt!A11?4__qr+5EiWtXA+H31(kvN3YZFcFfmJpBlS`A-7))@8BVBxcK5Kllns-_{| z7oRS4EiNN=F-~KRt^_g0p@o->g?hx%h+h}#3}i0UOtCJ z=E8g#CGQe*#F+GLcTG9&Q!K4j87J{>3{gNZk;#!!5>aQrjfN&qF0;1RmQ6s=x|1wD9QV z(PE{-pcZXU=IKR_cT9j$EsnlTM&m3`=6GkgjhK z8KdU9;0k~XE6|_a#NaxeZ8|#K@8K>phZcOIINJoJ&#Eu`HG7-AjC~J#H87sN!d}H+ z4`^`(Y@#ANs%O-`Cpgtc_@g2QOzG)q&aO-(lO$rjHQ(1CMVK-?{JHQDMMPw5cqHO*5`-VqayPAtWZKf(xsTH{+0O4{JGgbu@ zsT)~lZ)4CPRcY8Esgn4VC@wBjkLu*8nPMf6)TbWz9;MHhR-W6vD_hNE<_v1tS8}i1 z11YVOcG)vWQ0wUz+j`r7>aAFasI_-{MwJh>cgJ*mQ}G|ol>6h`M;`mU*kDU3J#uIF z_Ax?ZU)m+xbyAp!pn8d7yi;Q#XHvSS5G4JCi7NcQq?tj1bSS)!U{sNV<3?+eC#MRo zby4xN^@c^JdS6!3nUenwOU$a|)AH0!zg6^PSM-Jd`>nb}B?z&RD_wb9~UifUn z4^gq>2feE}kl0}``>m`$HP4x*GE4{oBPX{nzn;S>Nh(_mv(&g z*6GwodmGkoJJ@oic6HmOhb!79Q6srunQzqqV&h^IG_th@w(?;Ko9^F=& zJhZHO^Kf>`$=ds5VaBL%KLAU!{+dt_5vNJk&Q{g;W$KNuym_;KU1r8Th<{=KnnPjV zuif_hWnVNcS^3=J!Ldgw(ps{Yk2^DeRBP{olPj0o)d{~iaN}jw2KRgQ>sM^(nsR>1 zTcP#MW507u*IBvg#?o1%ZWX~b`suD|a1ljiMD73!Xlj*Z2gJGYE~`}p>aO+~GXR{z~z IzQxn?KLAko>;M1& literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/info.png b/libraries/filemanager-9.14.2/img/info.png new file mode 100644 index 0000000000000000000000000000000000000000..6baffc3307de0704eb7a515da29edaeb2285a9aa GIT binary patch literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}W`IwK>;M1%flNApZDpIffYvCL z1o;IsFbc9U3w(b6*6+pN=feL!+-2uya=-t^$CZ`k9p6I{4xz{VNA|e^Ro8mDIEGZj z<@Ry%H9K&)9*mqLS-M5(SCp4pC=vRg^dro%TLIC+vyZ=a0{oyPt94M=4aF?JzVB} smLt)m%=R{;CG%Y6IG2Zkj#)pSaF&L#uQ=J&=>-ZMPgg&ebxsLQ0GQ@qmH+?% literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/key.png b/libraries/filemanager-9.14.2/img/key.png new file mode 100644 index 0000000000000000000000000000000000000000..463d08262dc74d741461f60e6643339e03b5f6f2 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa4)6(aH8wW>|NlRb#00EYOb-B+ zag+r41v4-(GO;&oKBK<4X)jRB)zif>q#`a^poM8q&xQ~;HUWXxFFY8!T}n!}w6?Xe z8KiKOG&oq#xOguxkYO4ZM`~(90#HF}Vp3W{0*5ziW}3<|J%)flF=6i3f;6Ck44$rj JF6*2UngD%zHDUk& literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/label.png b/libraries/filemanager-9.14.2/img/label.png new file mode 100644 index 0000000000000000000000000000000000000000..fa65317110b69e3e174d9c885e191cf79aaec208 GIT binary patch literal 479 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

j18u&F);XYTzQ4ESARIc40xcFMNx;gYyfz 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 literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/processing.gif b/libraries/filemanager-9.14.2/img/processing.gif new file mode 100644 index 0000000000000000000000000000000000000000..7c99504e10b085b4d083e7473df26e4e1f4ecf18 GIT binary patch literal 3209 zcmcK6eN4z}Q2rbDSRQTqiegkVMdcOh*)yl$90>MUHO; z$`puTM1;T!MiGo+m3fqAYLQvxXtjzut!L|YXxFvO(^-ylmi4qdoVq8Ac4uw>ME>Hx zocsO!zR&Zxvt0|GTSFoe9Yl!B<~B4nTzL0_!{wN~HyJw=vs$d>FO`q~c|5u=8u&$E z`rp$d!y^Wr0TW~4*6`T%v8gYo7Cpac;**Ks+TexJ3tT?e=kZNFn2Ha@)1OMOsjC_P zXgt;*3#<-Ie=|LDb|lgsxqa*Q!-o&i6ZkVfl;k+`^X!>Ro%83;zjs-6o^)Wvce| zZqW)6eWXI%a||6<_iJLECXwi6I=XNFG6NgG=#Yq4NL#MZ@>*%3MR=0z)YW;K6q>plt6OP!bKnhyus2S=!ILt)->zn-N}q+ zGe8?u0Syen(?A(O@=4I~f4jK7GAmuT%f$-Oix-9rsQwGX^R^x=-(%crz4R;MJ}y>l zKeUvUQop1B#KpJUwuV`6zW6EkX(G#{saf9Gt9M%9;sk*8foPYtGYPQrszc3jFH3UMy z10i6WSr7in#T`kBoH?VJ3qz?W<$=Ls>$@?}akN)(zrWgu+foz7K zr7WgvqXtKoTvk)m*p#MLhg=lWtlPn;D^W`$o82DiDtf~%)*$h2M{{gIrKa7a*sRZy zDG)|DRo2SmF4bF=0*57HW@x?OXh($aAp86WNS>d^rEmD#3i}jf8Y{vot`u=ya!Z*m zqGR-Y;?8o;4Gm{NIg72#eN18d4#n06$She3h!$c74M;9o4H!i*z<>zC1{Me#Vopr8 zD`Nl%sRKoF96}=i6B<P!NEHc7Pi&&J+lLcyZ*v6z(Og_pC1| zn_pPJf?R%h>EGjRsB$~+=_8|?4Q^CF@aBn{ofE9myQg#h@zwPG;5)qMZmrK8MrO6PEVU!6Gi5$LgB2Rt3I@0tB_!$zU!vV!e75p*n_mf zA-hbeyynY%Ja&JW19r>Z$;6oIkHKyM3xI%rz*Y+|VeIen~i2W>60 z+|K$D;&i}^PqD0R9ekZ)o=aI23sNg7k%8u=)n$td8nex$#mtBmip^fLFd%GI1Qd$QM2i&~%O*oUNC zMoth~rXLBn+r^l2_O5lvR3v^)D6cbK3K;FGL60CHIORyetslF$KK4lcPCc3$AYypU zurMHH7)nqE2r)6EWEg~-NE~)RX%I#hJa$D+BOuwEbifLD8Nee#mi~TETclLyNabIlb4}{ZBp$rtyd_QztL)1 zX-XAp#QmX||IonEkbV!^+vaPJoH`TY;be}~${`AP#%0(N(K1ef&Tm}Oi>!8)Ojbqu z)j1SS+v8e0W>i;&))tO1IHH5PmRzT$; zN^!BzRE-24V+F$N@=Pq@O0S92Qq;TOOOg&{PoG()Qpp%4n?2A=u0^Vt@%T_tJogl1 zJkv`YB@X8uxOC+TFXmGa`|_lSzpgEZRm2NOy-Lc^$#DK?Ch^>Ny~bN+eXiclkrJc6 z5c>QoL#Cu$|7wne{r&SWaZAC$1gXN>fSC@XD!DcwcHl^?U^t;Z8i#nH3s4*&fbd~= z0}3F5AoK!?1Eol;7FZ9%BcK4RfC5(mutI}ich7huk}mvs;=G+Ie^%6AmF+7=^_lG} zGq~ialo;-l{WQ1!;L#5^xcQj-Kt?&Md$;N-P^o&s0cyFiqhWpNO-T z@72qM0(>=PT9NU@zwl49tL`UDj%F~VXY=uL%^JyFY2%dra0(CRokd8j$Y92u+< zNF;*1^H;~Njp6JVn^X?lrRe7BHNWx7rR7DGLy3gyt2(Xrue6Hz>?*dl`?_8H%P+5I HqM!T+FLlTe literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/rename.png b/libraries/filemanager-9.14.2/img/rename.png new file mode 100644 index 0000000000000000000000000000000000000000..a425ee7529301df781a5c3f21f23263a7c3e3c81 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Uw}`D>wg#!6cmh%j0Exo1O!x6 zRK&!@fb7GE56_u1XZiBw;^N}&?(U+ZqCkecyu6l{mY$xTfq?-~8Bjz?Nl8sjO;uHu zwVY`O&}8wFAirP+77l)K8F^)W69?b$!k!BkuiU(K`@@HKla&jBN&-Ax978JNde2&m zH7E!;UtGY!RVQ%q;NSd^Q$4N6OTI6u_!0F!?%uh;o6mm-)ptEj=w2dmV{2OW6z?DT v^QUgyA}3w_dgI(FS0^Pt&rCR6qGJH{an^LB{Ts5hht&W literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/size.png b/libraries/filemanager-9.14.2/img/size.png new file mode 100644 index 0000000000000000000000000000000000000000..fcc302f200c97c361acf473d0d8f9bd4a868b47d GIT binary patch literal 660 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47?lHjLR|m<{|^+w1dNOfEKH2- zEX+WX4Tu>T7#SE?7#TTPnORss%2}8hK~iiWh7cQ@AU8-A511>%z`)GJC=N4}nTZJ~ z#m>yk%ESaT1Y`~i0}lfO&`_Wj|)hH#DP`= zHM6q-9RqTe2p3R-5h%#c4l)O5CO;P|&;>v?Py|Sef-Mr@W(67oGyh@;U?|+T2e^oB#d1s(qc>II>)t^TVX1@8O*HCw~<+mizmSdhSjv*CsvAtLG zjsyre&wZ9QS;u(#Odz;vzWeR}de^mYqWhm6Jif_9fHS1%=hC2H#bb`U>yryIDweF! zxWN8CK}chY?9qFR=51NK%J-Vc+|9_weCnqN(BO{PO z5EvO5A*=EA^#yX7nL)+^0S5;MgaIMBxIhj-1FWp95D_LY0BQl+&d$yb5roJB4dmnF zgNp#w0M)XvumDB4xw(NPgbh&ulmaRM0tgpK0u6+i1F-@q0`VP?1S*63)ZE-0s1l+J zXd_S@Xl(fNxr=~8;Uz(S!3=uR-<^&sOlzB<@|BIrL3!%;!>%!0dk@M=?ft_YH}%A% zDc@QIf9(D8sklg9X21TS6txr~>vbm4SrhycGwr%NOEakt5hr>oc-j#M28WB`hPSrm7H3FLJ@Zfe((?cM6N~a@$Q^(8 zB}8W0rM0eCm(9*sS6KOFJ&*EaUVrWYotslvfKc0EN_xm)p|5Q}6Rt2a6_5c7p z9>1}%k&%&s!C>0j+DIhQ;^HEWMx#(DtE;PIGWpl9U;F#}$H&K1Dir_#h@5cfX&64e zucogdFC)vuaQf=E;HCR7?XA7-?Sv6mGgNZqWd?~HQJ7}eL_Ul0D;6=BEi z5N5&qI*88)84ZZ_kLP*I9O?Ex)gz7jL#9o3m|`BFAQ%ZME&-OIlQ3BKlIpjGu#XMW z5E=P)w(EYCWo=MViGDGu-eD4Xm_Wkhp@yNk0PIf3q1xW^mZa7v7wL7u5$+<>7w(Rr(N{|Csw`}U8&onDt z*^8=DSBtq6oOB*Qw$cGhng7Q58Z5Vb z0-g9N@Afa~r)V8Kk+wFNeOGP=n6X_liZxMi4)l|^1J%HFohzL7=FJ;Sm#|&KV@npz zhP3=|$|$H+nKR4ytE0n8WakTryK5kSwPmmO(Cr{;#pik4-QYv;T$3-E^>0BF?BH_Rq{Axgjmg5A8ww9*-synW4P{uG_%rL{P{2%|o}*e_-c%2b5OWw8Oi8od^oa4Fkc znU_{f178`sz0eHcd9CQ}g5dSDd&3>29~=@23y;u!9b*~ClVFkvc$fJ!n>*L^!^@&4 zC4e$_v=hea+VzH;=25k3AFn{gr90SU@I8cHVqgEj;LtFMz{z?F+D#T@1wDApYq4(P&e+L{8LeMz*6LKv@Cx5DtSIk5H8t z)zq2q-}wgl$5^NBIpW%@IHN088t%}0j2yi(_G-yu%BczvrVE5*@p?BaC4EO`=ZR3W zk!4&dsX$AG)r446Hd3rDdME2I?{*~G1n1lm6IVW71gnqf(n%=h%mB3dpHYTwYN+si zd15~e+nCn$T!N+Ok8d@hc=xwK!-$PpeLs*wk-0D4+9-tY+VXVTre$2TsDjK-6PR5u z}Hh}e7Y57O*zWCphi6jVS2*?WOw;gXl;C*E2FJIBi&9t zfXu%8p-A5gw!J6V8R%*4gs3*k7^?I3x(Xknc=#o8RZ@2y{q-P0VNX3C+S-KM*=za5 zyoj?4jEYW<1xFYlEd}J{rLKc>^JKCN#mdnY80^Q&s%l(KZC!nXASYXMOKS_KY;iu8 z4MgW9uq7cd-9!?oKkZ$`FuC{3hxowD6O%pDX0u%jQv<<6D}8Hk(DMt6ycu`rpu3ZM zu1g!6Bio9{w)G$N+FVWmFt0Z|mTG_^_4rWKjo+0Fc(x56FwV=9Dm3wx8r zAICiEm0t>HkhLXdvL%Ny0TsR0XV#GFeL13*ofHD`V#`?VqwBz?^~*UO7cbH;x7 zUv(J92^iOHB3@08Jr|pq(Z1t2G+nGIY57}{@jr4Mpu3VzT}$scYUWY{J*+-Gry|(c z5uIO?P!;?rUE&^picAt7jg?Gi|73x=h6V*hDpr~5wuUk|I-I**QrtivLC?FPR< zgob!W_`EiW^p6dU4+49}B)Q7ol)es@L&>COW{KtH7Zes1mz0*3i!h$Leng+Es;$Ba z)-_@p1ezKPnA)g)J_lbSN0r{xyul}D+KXuJ}un=aSEzT#Z;;MNak!PXhf~r;dU9r3pimLdk zf}XcrO@CUShbPg^#GjTwi_T>X1JYgNdhv|C8CQ(g4JY5Jhcc>$v7h;XUmi$OLTqm; zEvyWefMQ^ZG2ZRkMYq#+JlKs&4cQIlu5=M`jN@3b_*en2piQMJhoXWX zsmy`?Ws8Gp9d(22FN@vMZj^k;uG}r4CWwf#U(|bM1pHr5;J@{1;(zz5%hkq{`TBS} zaJF?B)@d5EvsyR$a>h4EIt{bYOyo5BpD~P-lT3NEAgkedH_0HD)>!kXEP3mO`8S&u zOM}tC%O59SsGD7IKwSIk7`QFbk>L{%$Qb0{$?d1_6d3U=5*V!=8t4878T{n^t2DEa zSg&|nRBC!I@7;TfYT(i`jfQer%(>&caj$6`|X3-cY^g;&1#%O3czX3y6e2okIT4A%|v5r z+hG`smi7u^pNipX-a&a?^q81=y7D@S_}1p6JVQV81GMPu#C7M<=cbFV;stIRPKK-X)&4SC9-v(J z`imQ0t*HH8B3a6EF!26AVgLVysp`l|{LO`1nNH=|BdZBZb%XF9bLthO=J=+RZfh-R zAwh`Hz#)$jS4gS1pyK5eDF>eYLVpa{6;>T#kUJ;Qa0v$Qo2~KIg^v^L$)G?=6FT((h#$rl!5~%X7|h%TZMO6RTw%iN1AP zpb!xAthPzuQ*1LGwxg2{E5OBi+OJ%MW>(#&mH{-W=)_V3+4i0yZ0}Z5GHpJZ1?&^V==cL3pbH#&xmCA80pEYWaqWosyjWWpZ z_JNR;^?F1V@qG3GGWbw7=aV)E4QIofiVj7N-pK_R7ri*1HHdXzP8vN7eB27jg1-L52Xr90On9iHu@$cZh%| zMkQOMSfP;VPcvXyh#ajvW1qs%u#$%bZbh0H>)SeBMoSUC7+=C?p!hglf*_Gt_(8{1p-v3ziFBvUy8k@?UT zyw7OHueFn<7Ea@ZS!pHa;KI&|KFKW|vQda*?YN;gzd8t2NIZF+$uvnU@qLVN(ky}$8rep__OhNzoQqs`%7 zj57Z58(guwNTA0zTjZZL3;MUQT=}naXMRQ44xY_*qr!Cq3r_C$)}>!On}JklIV#a! zTReeqSw3k`DFEN=VPp1@I%G=L?yfm3I95G&NH5#J9ASa^WWyb3NNkAfSI?p zsoN9lYnwX<%-{FE(GID{e^HKTE{A_u-3npi5adNx=BS6Ap{fA+NplZg^DS6pqDYk5 zh=pcJ&V8pd-_(+zY(dw1&)O5?*9Tu)O+Hz^nR-)sxW5-yGL%D4@6xAvBt5-5D_Ea#1D literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/trans.jpg b/libraries/filemanager-9.14.2/img/trans.jpg new file mode 100644 index 0000000000000000000000000000000000000000..147175ee8e65cf8d678b66368995de1b70123c06 GIT binary patch literal 4024 zcmbtX2Uru!+MdlOfh4qq4uV0t^xl*zRl0xzg7l{JZleiOM2d|nh#&~k5mB*$fC}dT zQUvrM%}x^w!2`+Nz`6Q7xBcbLKC}Dox9@y2@06WyXk)Y~z-DG-Y6Kt%02AZ_v}th0 zFvi~p01FGS69B*nun-o&2!a3#xsm?DNCAisU^eXlI6(YAu`49;i+|c5p#S0^J~tCm z3*w7j-=@z})K3Pf6#j+jT-pLqxAqH;2oCoP4k0Va$^&(MQwucRBa$|;=q6+v7C1AW z1)9(w;&FNN6#bL58N!&Ufx#hbTPq_|bHh!6geUGHAx97qATTH*%+^?+e8AC(%rK6$ z76-V2BoK1<3=h$>wl?4N`7dwZM>pFJhGgiz{w3w#8=1q93K7v{gu>ywg_Y^pV++%J zgd;j4Bm&_aq+?G%cP|8oAXqxg&ej0IMF?i`-NHBM*kcQ~({YriFTHFZ09aCxmwyld z3{wEWEMDH>o&eyN5l*mYNEpH)xFJ|KFfbVLPbfvO1ideiCz3)R0ibyb0MyH0HkU~N z8Uq2~k^E&7S3{bJrVl|XaZ2J>lqmqwaG;qkMaiKe|q22`Bw=TnN0LSWdUZO6G}#jp-NzN_yal!gU7UE zZLnV$su+zKS8z3WYXVHT%jCl>z&yfohSh=%%hp9qBN?$XvG;MD<#gcU=9=cd&J)h7 z&xhw5=P%zDE?^+YCOEgfnVc%*yhBbHBRnqBEP7hZLtI0GBrz}9z4NNnNoiLZ4Ou?f zRk;`Pw-hcZ#ws}}Ypak|8B{;0^{Y2)^8C+X6u;^gv_n$yjx?P*=<{TX9tW;5r{ zu4Y3ygj~*Z+s{i}kiV#TNiWYd->SgA(6Pw1*zK}siASl&6}K{%s|U*WRqVZ{U#V6l zb)CN&U;VXa@c0O>;*}@y*!QeYa%W7~AG3{zT!a)HAVOp+14%_${KME&XUk^=vpW&Z1oQrrxNxs$Y#`F9KeO+h4BvvUQ8TJx0yXzcvv2>2C<2<4H1(`x}-1cwH!w{g*j)q%D7#5 zgm|WT%lQ2HrTAC2wF@K(T5spwK1Xg5O4zYaSVZ`{NT29su_$qK2~kNPIll9jRJL@m zjD@VU9E;qd{IJ4J#R8=`Wp5R8RYf&^by$5-V^p(4t9Dnx?o{n)9Y0+sJxhIk1C2eh zhT=wo#yln@Q&uzlUIuft1#AgfK~^+tnhnjCwvTE@wcl`9-~Z=cj`Rug5pJ& zODTB``QwFfk#w>B<+zf{(*7&ouL_hKRQO%XtZb|rx&FO|=Z0#neO*|6Rzr2;Vx1%(kJNC=lNF)J&W~A7nWl`JFRFT5A&f>1!F7?r|~FI6$%wf0_{#}(iT9FvPW2}br;MB) zNgYZXOz+EhdZr`u-r1X3wb>Opg}J%sQqRX-2*2om$tBM=->5*VP`*gGnD;Vs30y)c zUAQt^Hhy)Wyr<&fwYJKpsvFlUtFP9S-YBUpsVl87Yq-`})70GD-qLe(xOMi{%5C@# z`(4p?)q7_5T^@uzJdLdFmd?J%vt1iKT*%5cf9Btt(pUal=kGHEs6mnEMnnF?nIlc3 zV=rjq;uBUckG?AZqkrujGx4)^bFbbK-f6xM_)z%q_j$0OvKX*bx;(Z*{9^t! z^;_2}hGM*y{$pUBXTyWqK%)V$wcpYA1Q-jz)lLBHHUKbv2tYoP#qt0kA$yIr9%9!4 zD0MA>lAi!5Oc}EK$87E&Xut+UfG+R?*`N!8AVVkzdW$kZRl*!_8kzxp2E&JGz*=Iz zF_bepm3i7*ORYt8(tt-aE9zD^jSDV zR8H)*M8VEO(sHsmxdnv@r2&lMTU%D1irlRx_x%~J!)QXS>dZDMRi@6-d{+(#tGzsJvasK zLnz1wszx!PVvs*)5WI>`!-!&@Vxt(O89p*L;u7$V1P!Jg%ItVA{eq5{dBJ&5BX zXEzs>XBTf0-{3Y0fmFfIWN)Ea;lm;uV)+uIna%B`w}>Zdhhb_Htt z=z8dT?C~>-FiAEmHos#zX@lFRX&<`3(Q);lk!z9Lx~G@-sGm*1SfGChHmo7iCuZl- zjT5iq2b20!CeoHO*|YV}#a(<_AXJ=Mx>253#a+{0AJ(jKi~TORPwOQ1$o4w+pC6hX zGk(=I?fRDM-q$-&HJmXP{>pvIcFy>{_PpA%+*fgmz&aaU?^eu*j587h`uO|$ zl2tY_{T28Cf8dK;WUy)chwp#q{okGu-Z4mA34lRxNNkwDuU`aN4~dYy$)-V`veINl zd3lZh>~AX;rE{=s0OW2*ZBY5zY0v(t5bYr#G6E7H!4MIkh!9MKXpg~mByz+cixx?L zF9D%oGzQDSh{F>Q!c8`Sf?ybhhA|lW0RlRKdJ9~%yNa%~qSs!0N z|A6p_$f)R;*rQ3Ol2cBnrlseeJAdKgrM&!tva974*D9;7S2s1c+-$wocKc38=i{#K zo+nSAJs%n#8GSJ}J~2HrJNM@8yZ0YHeqQ0Vz%U137TQvJ1#+q%}+4aQNt5m(G;`eth!kxqI$8 aK4MRt&fO?7DRw&0ZU#?RKbLh*2~7aatZW|u literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/url.png b/libraries/filemanager-9.14.2/img/url.png new file mode 100644 index 0000000000000000000000000000000000000000..f18499afb62d9ce8961936ccd9a358d2da20362b GIT binary patch literal 593 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMfw*a3I*Z=?j1DW&zy1Kgbu?Wo; zV`F19kuwuz4+Dh)OM?7@8JJlcz|j;hs_CjCY1%U^9+?9iMqY4gVR;b%?h zUT#6H2O4MYU6vCNeZN`l&Lid7&!Y~e@APzW45^6oJ)7Eh*g>G>;-UDf^!NQfYXX&i{{Fe-RU4DBeu=b} z-%d79UEZf0eXj4<%%3nJj6ZhnO|c*$mf`~?*U~sAPT^Udc6`P3?{*5|j?IS;&RG2H z$bS9P@vWBPr$w*N)-9hJ5pv~RW#H;hpI*%}XH}SXdw0_3g9&{7IV{J$k8W7>@#W9f z^&Q@>8Xw>OeJpIny5xcO=`-eabwAl>Hf=ffYrp$xM<R#a>3ve0!aO@p;+@f! RR|cR!^K|udS?83{1OP*>n)?6% literal 0 HcmV?d00001 diff --git a/libraries/filemanager-9.14.2/img/zip.png b/libraries/filemanager-9.14.2/img/zip.png new file mode 100644 index 0000000000000000000000000000000000000000..9ef55c7b72fd530e37881c36f0bfd697250e297a GIT binary patch literal 819 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47<&SILR|m<{|^*F2BD#$wzl>_ z5eSJa1z|flIM~>L6aWDm8yk?cu&}kYwPR&v<>26e=<@aTwXv}SN*NoQ0!g42paMNT zJzHA`AlJ?gXo4LN4-b&d!omX7%*n~gzy!3>PFh+p8)7w3pP896kd%^=1_}b*1|)55?7_C% z0PO;DK_XzIfTX>hqk(}DPz0h9$glw#WCwD&jI1m(Gbreg0mK$pcfz_ z5H&zo0rfgLxwyKz0}Xd{bOxH>;NT1lFpDBTy%fED z3#hrMB*-tAp_1`;MHTZ-rr&in5#Rp&tY-<8ydOBtddsEOPiwfo1%7Yhc_?<|(vL%z zA}6FoP2Bk7QV+L_vn+?*=aX)exBiF~`F1w%pIOM?qG;iUuZ9kP=Y~(M+M?dZRzK7-e%HH|>t5YnpvX}Za!6iO#MbeqG;^}k^F=%Yp0__-wUu-` zl6mX%Pu|dvX*@HcUAa#&yj?ga?!R#DX)}{W9YQL>?`N91e|;YAn=8vHdu27VgNbO= znf@4?r*mcJ#@;+CxCZ3|_WMQ88~L + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + * @copyright Nicolas Tallefourtane http://nicolab.net + */ +namespace FtpClient; + +use \Countable; + +/** + * The FTP and SSL-FTP client for PHP. + * + * @method bool alloc() alloc(int $filesize, string &$result = null) Allocates space for a file to be uploaded + * @method bool cdup() cdup() Changes to the parent directory + * @method bool chdir() chdir(string $directory) Changes the current directory on a FTP server + * @method int chmod() chmod(int $mode, string $filename) Set permissions on a file via FTP + * @method bool delete() delete(string $path) Deletes a file on the FTP server + * @method bool exec() exec(string $command) Requests execution of a command on the FTP server + * @method bool fget() fget(resource $handle, string $remote_file, int $mode, int $resumepos = 0) Downloads a file from the FTP server and saves to an open file + * @method bool fput() fput(string $remote_file, resource $handle, int $mode, int $startpos = 0) Uploads from an open file to the FTP server + * @method mixed get_option() get_option(int $option) Retrieves various runtime behaviours of the current FTP stream + * @method bool get() get(string $local_file, string $remote_file, int $mode, int $resumepos = 0) Downloads a file from the FTP server + * @method int mdtm() mdtm(string $remote_file) Returns the last modified time of the given file + * @method int nb_continue() nb_continue() Continues retrieving/sending a file (non-blocking) + * @method int nb_fget() nb_fget(resource $handle, string $remote_file, int $mode, int $resumepos = 0) Retrieves a file from the FTP server and writes it to an open file (non-blocking) + * @method int nb_fput() nb_fput(string $remote_file, resource $handle, int $mode, int $startpos = 0) Stores a file from an open file to the FTP server (non-blocking) + * @method int nb_get() nb_get(string $local_file, string $remote_file, int $mode, int $resumepos = 0) Retrieves a file from the FTP server and writes it to a local file (non-blocking) + * @method int nb_put() nb_put(string $remote_file, string $local_file, int $mode, int $startpos = 0) Stores a file on the FTP server (non-blocking) + * @method bool pasv() pasv(bool $pasv) Turns passive mode on or off + * @method bool put() put(string $remote_file, string $local_file, int $mode, int $startpos = 0) Uploads a file to the FTP server + * @method string pwd() pwd() Returns the current directory name + * @method bool quit() quit() Closes an FTP connection + * @method array raw() raw(string $command) Sends an arbitrary command to an FTP server + * @method bool rename() rename(string $oldname, string $newname) Renames a file or a directory on the FTP server + * @method bool set_option() set_option(int $option, mixed $value) Set miscellaneous runtime FTP options + * @method bool site() site(string $command) Sends a SITE command to the server + * @method int size() size(string $remote_file) Returns the size of the given file + * @method string systype() systype() Returns the system type identifier of the remote FTP server + * + * @author Nicolas Tallefourtane + */ +class FtpClient implements Countable +{ + /** + * The connection with the server. + * + * @var resource + */ + protected $conn; + + /** + * PHP FTP functions wrapper. + * + * @var FtpWrapper + */ + private $ftp; + + /** + * Constructor. + * + * @param resource|null $connection + * @throws FtpException If FTP extension is not loaded. + */ + public function __construct($connection = null) + { + if (!extension_loaded('ftp')) { + throw new FtpException('FTP extension is not loaded!'); + } + + if ($connection) { + $this->conn = $connection; + } + + $this->setWrapper(new FtpWrapper($this->conn)); + } + + /** + * Close the connection when the object is destroyed. + */ + public function __destruct() + { + if ($this->conn) { + $this->ftp->close(); + } + } + + /** + * Call an internal method or a FTP method handled by the wrapper. + * + * Wrap the FTP PHP functions to call as method of FtpClient object. + * The connection is automaticaly passed to the FTP PHP functions. + * + * @param string $method + * @param array $arguments + * @return mixed + * @throws FtpException When the function is not valid + */ + public function __call($method, array $arguments) + { + return $this->ftp->__call($method, $arguments); + } + + /** + * Overwrites the PHP limit + * + * @param string|null $memory The memory limit, if null is not modified + * @param int $time_limit The max execution time, unlimited by default + * @param bool $ignore_user_abort Ignore user abort, true by default + * @return FtpClient + */ + public function setPhpLimit($memory = null, $time_limit = 0, $ignore_user_abort = true) + { + if (null !== $memory) { + ini_set('memory_limit', $memory); + } + + ignore_user_abort(true); + set_time_limit($time_limit); + + return $this; + } + + /** + * Get the help information of the remote FTP server. + * + * @return array + */ + public function help() + { + return $this->ftp->raw('help'); + } + + /** + * Open a FTP connection. + * + * @param string $host + * @param bool $ssl + * @param int $port + * @param int $timeout + * + * @return FTPClient + * @throws FtpException If unable to connect + */ + public function connect($host, $ssl = false, $port = 21, $timeout = 90) + { + if ($ssl) { + $this->conn = @$this->ftp->ssl_connect($host, $port, $timeout); + } else { + $this->conn = @$this->ftp->connect($host, $port, $timeout); + } + + if (!$this->conn) { + throw new FtpException('Unable to connect'); + } + + return $this; + } + + /** + * Closes the current FTP connection. + * + * @return bool + */ + public function close() + { + if ($this->conn) { + $this->ftp->close(); + $this->conn = null; + } + } + + /** + * Get the connection with the server. + * + * @return resource + */ + public function getConnection() + { + return $this->conn; + } + + /** + * Get the wrapper. + * + * @return FtpWrapper + */ + public function getWrapper() + { + return $this->ftp; + } + + /** + * Logs in to an FTP connection. + * + * @param string $username + * @param string $password + * + * @return FtpClient + * @throws FtpException If the login is incorrect + */ + public function login($username = 'anonymous', $password = '') + { + $result = $this->ftp->login($username, $password); + + if ($result === false) { + throw new FtpException('Login incorrect'); + } + + return $this; + } + + /** + * Returns the last modified time of the given file. + * Return -1 on error + * + * @param string $remoteFile + * @param string|null $format + * + * @return int + */ + public function modifiedTime($remoteFile, $format = null) + { + $time = $this->ftp->mdtm($remoteFile); + + if ($time !== -1 && $format !== null) { + return date($format, $time); + } + + return $time; + } + + /** + * Changes to the parent directory. + * + * @throws FtpException + * @return FtpClient + */ + public function up() + { + $result = @$this->ftp->cdup(); + + if ($result === false) { + throw new FtpException('Unable to get parent folder'); + } + + return $this; + } + + /** + * Returns a list of files in the given directory. + * + * @param string $directory The directory, by default is "." the current directory + * @param bool $recursive + * @param callable $filter A callable to filter the result, by default is asort() PHP function. + * The result is passed in array argument, + * must take the argument by reference ! + * The callable should proceed with the reference array + * because is the behavior of several PHP sorting + * functions (by reference ensure directly the compatibility + * with all PHP sorting functions). + * + * @return array + * @throws FtpException If unable to list the directory + */ + public function nlist($directory = '.', $recursive = false, $filter = 'sort') + { + if (!$this->isDir($directory)) { + throw new FtpException('"'.$directory.'" is not a directory'); + } + + $files = $this->ftp->nlist($directory); + + if ($files === false) { + throw new FtpException('Unable to list directory'); + } + + $result = []; + $dir_len = strlen($directory); + + // if it's the current + if (false !== ($kdot = array_search('.', $files))) { + unset($files[$kdot]); + } + + // if it's the parent + if(false !== ($kdot = array_search('..', $files))) { + unset($files[$kdot]); + } + + if (!$recursive) { + foreach ($files as $file) { + $result[] = $directory.'/'.$file; + } + + // working with the reference (behavior of several PHP sorting functions) + $filter($result); + + return $result; + } + + // utils for recursion + $flatten = function (array $arr) use (&$flatten) { + + $flat = []; + + foreach ($arr as $k => $v) { + if (is_array($v)) { + $flat = array_merge($flat, $flatten($v)); + } else { + $flat[] = $v; + } + } + + return $flat; + }; + + foreach ($files as $file) { + $file = $directory.'/'.$file; + + // if contains the root path (behavior of the recursivity) + if (0 === strpos($file, $directory, $dir_len)) { + $file = substr($file, $dir_len); + } + + if ($this->isDir($file)) { + $result[] = $file; + $items = $flatten($this->nlist($file, true, $filter)); + + foreach ($items as $item) { + $result[] = $item; + } + + } else { + $result[] = $file; + } + } + + $result = array_unique($result); + + $filter($result); + + return $result; + } + + /** + * Creates a directory. + * + * @see FtpClient::rmdir() + * @see FtpClient::remove() + * @see FtpClient::put() + * @see FtpClient::putAll() + * + * @param string $directory The directory + * @param bool $recursive + * @return array + */ + public function mkdir($directory, $recursive = false) + { + if (!$recursive or $this->isDir($directory)) { + return $this->ftp->mkdir($directory); + } + + $result = false; + $pwd = $this->ftp->pwd(); + $parts = explode('/', $directory); + + foreach ($parts as $part) { + + if (!@$this->ftp->chdir($part)) { + $result = $this->ftp->mkdir($part); + $this->ftp->chdir($part); + } + } + + $this->ftp->chdir($pwd); + + return $result; + } + + /** + * Remove a directory. + * + * @see FtpClient::mkdir() + * @see FtpClient::cleanDir() + * @see FtpClient::remove() + * @see FtpClient::delete() + * @param string $directory + * @param bool $recursive Forces deletion if the directory is not empty + * @return bool + * @throws FtpException If unable to list the directory to remove + */ + public function rmdir($directory, $recursive = true) + { + if ($recursive) { + $files = $this->nlist($directory, false, 'rsort'); + + // remove children + foreach ($files as $file) { + $this->remove($file, true); + } + } + + // remove the directory + return $this->ftp->rmdir($directory); + } + + /** + * Empty directory. + * + * @see FtpClient::remove() + * @see FtpClient::delete() + * @see FtpClient::rmdir() + * + * @param string $directory + * @return bool + */ + public function cleanDir($directory) + { + if(!$files = $this->nlist($directory)) { + return $this->isEmpty($directory); + } + + // remove children + foreach ($files as $file) { + $this->remove($file, true); + } + + return $this->isEmpty($directory); + } + + /** + * Remove a file or a directory. + * + * @see FtpClient::rmdir() + * @see FtpClient::cleanDir() + * @see FtpClient::delete() + * @param string $path The path of the file or directory to remove + * @param bool $recursive Is effective only if $path is a directory, {@see FtpClient::rmdir()} + * @return bool + */ + public function remove($path, $recursive = false) + { + try { + if (@$this->ftp->delete($path) + or ($this->isDir($path) and @$this->rmdir($path, $recursive))) { + return true; + } + + return false; + } catch (\Exception $e) { + return false; + } + } + + /** + * Check if a directory exist. + * + * @param string $directory + * @return bool + * @throws FtpException + */ + public function isDir($directory) + { + $pwd = $this->ftp->pwd(); + + if ($pwd === false) { + throw new FtpException('Unable to resolve the current directory'); + } + + if (@$this->ftp->chdir($directory)) { + $this->ftp->chdir($pwd); + return true; + } + + $this->ftp->chdir($pwd); + + return false; + } + + /** + * Check if a directory is empty. + * + * @param string $directory + * @return bool + */ + public function isEmpty($directory) + { + return $this->count($directory, null, false) === 0; + } + + /** + * Scan a directory and returns the details of each item. + * + * @see FtpClient::nlist() + * @see FtpClient::rawlist() + * @see FtpClient::parseRawList() + * @see FtpClient::dirSize() + * @param string $directory + * @param bool $recursive + * @return array + */ + public function scanDir($directory = '.', $recursive = false) + { + return $this->parseRawList($this->rawlist($directory, $recursive)); + } + + /** + * Returns the total size of the given directory in bytes. + * + * @param string $directory The directory, by default is the current directory. + * @param bool $recursive true by default + * @return int The size in bytes. + */ + public function dirSize($directory = '.', $recursive = true) + { + $items = $this->scanDir($directory, $recursive); + $size = 0; + + foreach ($items as $item) { + $size += (int) $item['size']; + } + + return $size; + } + + /** + * Count the items (file, directory, link, unknown). + * + * @param string $directory The directory, by default is the current directory. + * @param string|null $type The type of item to count (file, directory, link, unknown) + * @param bool $recursive true by default + * @return int + */ + public function count($directory = '.', $type = null, $recursive = true) + { + $items = (null === $type ? $this->nlist($directory, $recursive) + : $this->scanDir($directory, $recursive)); + + $count = 0; + foreach ($items as $item) { + if (null === $type or $item['type'] == $type) { + $count++; + } + } + + return $count; + } + + /** + * Uploads a file to the server from a string. + * + * @param string $remote_file + * @param string $content + * @return FtpClient + * @throws FtpException When the transfer fails + */ + public function putFromString($remote_file, $content) + { + $handle = fopen('php://temp', 'w'); + + fwrite($handle, $content); + rewind($handle); + + if ($this->ftp->fput($remote_file, $handle, FTP_BINARY)) { + return $this; + } + + throw new FtpException('Unable to put the file "'.$remote_file.'"'); + } + + /** + * Uploads a file to the server. + * + * @param string $local_file + * @return FtpClient + * @throws FtpException When the transfer fails + */ + public function putFromPath($local_file) + { + $remote_file = basename($local_file); + $handle = fopen($local_file, 'r'); + + if ($this->ftp->fput($remote_file, $handle, FTP_BINARY)) { + rewind($handle); + return $this; + } + + throw new FtpException( + 'Unable to put the remote file from the local file "'.$local_file.'"' + ); + } + + /** + * Upload files. + * + * @param string $source_directory + * @param string $target_directory + * @param int $mode + * @return FtpClient + */ + public function putAll($source_directory, $target_directory, $mode = FTP_BINARY) + { + $d = dir($source_directory); + + // do this for each file in the directory + while ($file = $d->read()) { + + // to prevent an infinite loop + if ($file != "." && $file != "..") { + + // do the following if it is a directory + if (is_dir($source_directory.'/'.$file)) { + + if (!$this->isDir($target_directory.'/'.$file)) { + + // create directories that do not yet exist + $this->ftp->mkdir($target_directory.'/'.$file); + } + + // recursive part + $this->putAll( + $source_directory.'/'.$file, $target_directory.'/'.$file, + $mode + ); + } else { + + // put the files + $this->ftp->put( + $target_directory.'/'.$file, $source_directory.'/'.$file, + $mode + ); + } + } + } + + return $this; + } + + /** + * Returns a detailed list of files in the given directory. + * + * @see FtpClient::nlist() + * @see FtpClient::scanDir() + * @see FtpClient::dirSize() + * @param string $directory The directory, by default is the current directory + * @param bool $recursive + * @return array + * @throws FtpException + */ + public function rawlist($directory = '.', $recursive = false) + { + if (!$this->isDir($directory)) { + throw new FtpException('"'.$directory.'" is not a directory.'); + } + + $list = $this->ftp->rawlist($directory); + $items = []; + + if (!$list) { + return $items; + } + + if (false == $recursive) { + + foreach ($list as $path => $item) { + $chunks = preg_split("/\s+/", $item); + + // if not "name" + if (empty($chunks[8]) || $chunks[8] == '.' || $chunks[8] == '..') { + continue; + } + + $path = $directory.'/'.$chunks[8]; + + if (isset($chunks[9])) { + $nbChunks = count($chunks); + + for ($i = 9; $i < $nbChunks; $i++) { + $path .= ' '.$chunks[$i]; + } + } + + + if (substr($path, 0, 2) == './') { + $path = substr($path, 2); + } + + $items[ $this->rawToType($item).'#'.$path ] = $item; + } + + return $items; + } + + $path = ''; + + foreach ($list as $item) { + $len = strlen($item); + + if (!$len + + // "." + || ($item[$len-1] == '.' && $item[$len-2] == ' ' + + // ".." + or $item[$len-1] == '.' && $item[$len-2] == '.' && $item[$len-3] == ' ') + ){ + + continue; + } + + $chunks = preg_split("/\s+/", $item); + + // if not "name" + if (empty($chunks[8]) || $chunks[8] == '.' || $chunks[8] == '..') { + continue; + } + + $path = $directory.'/'.$chunks[8]; + + if (isset($chunks[9])) { + $nbChunks = count($chunks); + + for ($i = 9; $i < $nbChunks; $i++) { + $path .= ' '.$chunks[$i]; + } + } + + if (substr($path, 0, 2) == './') { + $path = substr($path, 2); + } + + $items[$this->rawToType($item).'#'.$path] = $item; + + if ($item[0] == 'd') { + $sublist = $this->rawlist($path, true); + + foreach ($sublist as $subpath => $subitem) { + $items[$subpath] = $subitem; + } + } + } + + return $items; + } + + /** + * Parse raw list. + * + * @see FtpClient::rawlist() + * @see FtpClient::scanDir() + * @see FtpClient::dirSize() + * @param array $rawlist + * @return array + */ + public function parseRawList(array $rawlist) + { + $items = []; + $path = ''; + + foreach ($rawlist as $key => $child) { + $chunks = preg_split("/\s+/", $child); + + if (isset($chunks[8]) && ($chunks[8] == '.' or $chunks[8] == '..')) { + continue; + } + + if (count($chunks) === 1) { + $len = strlen($chunks[0]); + + if ($len && $chunks[0][$len-1] == ':') { + $path = substr($chunks[0], 0, -1); + } + + continue; + } + + $item = [ + 'permissions' => $chunks[0], + 'number' => $chunks[1], + 'owner' => $chunks[2], + 'group' => $chunks[3], + 'size' => $chunks[4], + 'month' => $chunks[5], + 'day' => $chunks[6], + 'time' => $chunks[7], + 'name' => $chunks[8], + 'type' => $this->rawToType($chunks[0]), + ]; + + unset($chunks[0]); + unset($chunks[1]); + unset($chunks[2]); + unset($chunks[3]); + unset($chunks[4]); + unset($chunks[5]); + unset($chunks[6]); + unset($chunks[7]); + $item['name'] = implode(' ', $chunks); + + if ($item['type'] == 'link') { + $item['target'] = $chunks[10]; // 9 is "->" + } + + // if the key is not the path, behavior of ftp_rawlist() PHP function + if (is_int($key) || false === strpos($key, $item['name'])) { + array_splice($chunks, 0, 8); + + $key = $item['type'].'#' + .($path ? $path.'/' : '') + .implode(" ", $chunks); + + if ($item['type'] == 'link') { + + // get the first part of 'link#the-link.ext -> /path/of/the/source.ext' + $exp = explode(' ->', $key); + $key = rtrim($exp[0]); + } + + $items[$key] = $item; + + } else { + + // the key is the path, behavior of FtpClient::rawlist() method() + $items[$key] = $item; + } + } + + return $items; + } + + /** + * Convert raw info (drwx---r-x ...) to type (file, directory, link, unknown). + * Only the first char is used for resolving. + * + * @param string $permission Example : drwx---r-x + * + * @return string The file type (file, directory, link, unknown) + * @throws FtpException + */ + public function rawToType($permission) + { + if (!is_string($permission)) { + throw new FtpException('The "$permission" argument must be a string, "' + .gettype($permission).'" given.'); + } + + if (empty($permission[0])) { + return 'unknown'; + } + + switch ($permission[0]) { + case '-': + return 'file'; + + case 'd': + return 'directory'; + + case 'l': + return 'link'; + + default: + return 'unknown'; + } + } + + /** + * Set the wrapper which forward the PHP FTP functions to use in FtpClient instance. + * + * @param FtpWrapper $wrapper + * @return FtpClient + */ + protected function setWrapper(FtpWrapper $wrapper) + { + $this->ftp = $wrapper; + + return $this; + } +} diff --git a/libraries/filemanager-9.14.2/include/FtpException.php b/libraries/filemanager-9.14.2/include/FtpException.php new file mode 100644 index 0000000..f17ed7f --- /dev/null +++ b/libraries/filemanager-9.14.2/include/FtpException.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + * @copyright Nicolas Tallefourtane http://nicolab.net + */ +namespace FtpClient; + +/** + * The FtpException class. + * Exception thrown if an error on runtime of the FTP client occurs. + * @inheritDoc + * @author Nicolas Tallefourtane + */ +class FtpException extends \Exception {} diff --git a/libraries/filemanager-9.14.2/include/FtpWrapper.php b/libraries/filemanager-9.14.2/include/FtpWrapper.php new file mode 100644 index 0000000..cd12de0 --- /dev/null +++ b/libraries/filemanager-9.14.2/include/FtpWrapper.php @@ -0,0 +1,115 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + * @copyright Nicolas Tallefourtane http://nicolab.net + */ +namespace FtpClient; + +/** + * Wrap the PHP FTP functions + * + * @method bool alloc() alloc(int $filesize, string &$result = null) Allocates space for a file to be uploaded + * @method bool cdup() cdup() Changes to the parent directory + * @method bool chdir() chdir(string $directory) Changes the current directory on a FTP server + * @method int chmod() chmod(int $mode, string $filename) Set permissions on a file via FTP + * @method bool close() close() Closes an FTP connection + * @method bool delete() delete(string $path) Deletes a file on the FTP server + * @method bool exec() exec(string $command) Requests execution of a command on the FTP server + * @method bool fget() fget(resource $handle, string $remote_file, int $mode, int $resumepos = 0) Downloads a file from the FTP server and saves to an open file + * @method bool fput() fput(string $remote_file, resource $handle, int $mode, int $startpos = 0) Uploads from an open file to the FTP server + * @method mixed get_option() get_option(int $option) Retrieves various runtime behaviours of the current FTP stream + * @method bool get() get(string $local_file, string $remote_file, int $mode, int $resumepos = 0) Downloads a file from the FTP server + * @method bool login() login(string $username, string $password) Logs in to an FTP connection + * @method int mdtm() mdtm(string $remote_file) Returns the last modified time of the given file + * @method string mkdir() mkdir(string $directory) Creates a directory + * @method int nb_continue() nb_continue() Continues retrieving/sending a file (non-blocking) + * @method int nb_fget() nb_fget(resource $handle, string $remote_file, int $mode, int $resumepos = 0) Retrieves a file from the FTP server and writes it to an open file (non-blocking) + * @method int nb_fput() nb_fput(string $remote_file, resource $handle, int $mode, int $startpos = 0) Stores a file from an open file to the FTP server (non-blocking) + * @method int nb_get() nb_get(string $local_file, string $remote_file, int $mode, int $resumepos = 0) Retrieves a file from the FTP server and writes it to a local file (non-blocking) + * @method int nb_put() nb_put(string $remote_file, string $local_file, int $mode, int $startpos = 0) Stores a file on the FTP server (non-blocking) + * @method array nlist() nlist(string $directory) Returns a list of files in the given directory + * @method bool pasv() pasv(bool $pasv) Turns passive mode on or off + * @method bool put() put(string $remote_file, string $local_file, int $mode, int $startpos = 0) Uploads a file to the FTP server + * @method string pwd() pwd() Returns the current directory name + * @method bool quit() quit() Closes an FTP connection + * @method array raw() raw(string $command) Sends an arbitrary command to an FTP server + * @method array rawlist() rawlist(string $directory, bool $recursive = false) Returns a detailed list of files in the given directory + * @method bool rename() rename(string $oldname, string $newname) Renames a file or a directory on the FTP server + * @method bool rmdir() rmdir(string $directory) Removes a directory + * @method bool set_option() set_option(int $option, mixed $value) Set miscellaneous runtime FTP options + * @method bool site() site(string $command) Sends a SITE command to the server + * @method int size() size(string $remote_file) Returns the size of the given file + * @method string systype() systype() Returns the system type identifier of the remote FTP server + * + * @author Nicolas Tallefourtane + */ +class FtpWrapper +{ + /** + * The connection with the server + * + * @var resource + */ + protected $conn; + + /** + * Constructor. + * + * @param resource &$connection The FTP (or SSL-FTP) connection (takes by reference). + */ + public function __construct(&$connection) + { + $this->conn = &$connection; + } + + /** + * Forward the method call to FTP functions + * + * @param string $function + * @param array $arguments + * @return mixed + * @throws FtpException When the function is not valid + */ + public function __call($function, array $arguments) + { + $function = 'ftp_' . $function; + + if (function_exists($function)) { + array_unshift($arguments, $this->conn); + return call_user_func_array($function, $arguments); + } + + throw new FtpException("{$function} is not a valid FTP function"); + } + + /** + * Opens a FTP connection + * + * @param string $host + * @param int $port + * @param int $timeout + * @return resource + */ + public function connect($host, $port = 21, $timeout = 90) + { + return ftp_connect($host, $port, $timeout); + } + + /** + * Opens a Secure SSL-FTP connection + * @param string $host + * @param int $port + * @param int $timeout + * @return resource + */ + public function ssl_connect($host, $port = 21, $timeout = 90) + { + return ftp_ssl_connect($host, $port, $timeout); + } +} diff --git a/libraries/filemanager-9.14.2/include/Response.php b/libraries/filemanager-9.14.2/include/Response.php new file mode 100644 index 0000000..46980f0 --- /dev/null +++ b/libraries/filemanager-9.14.2/include/Response.php @@ -0,0 +1,365 @@ + 'Continue', + 101 => 'Switching Protocols', + 102 => 'Processing', // RFC2518 + 200 => 'OK', + 201 => 'Created', + 202 => 'Accepted', + 203 => 'Non-Authoritative Information', + 204 => 'No Content', + 205 => 'Reset Content', + 206 => 'Partial Content', + 207 => 'Multi-Status', // RFC4918 + 208 => 'Already Reported', // RFC5842 + 226 => 'IM Used', // RFC3229 + 300 => 'Multiple Choices', + 301 => 'Moved Permanently', + 302 => 'Found', + 303 => 'See Other', + 304 => 'Not Modified', + 305 => 'Use Proxy', + 306 => 'Reserved', + 307 => 'Temporary Redirect', + 308 => 'Permanent Redirect', // RFC7238 + 400 => 'Bad Request', + 401 => 'Unauthorized', + 402 => 'Payment Required', + 403 => 'Forbidden', + 404 => 'Not Found', + 405 => 'Method Not Allowed', + 406 => 'Not Acceptable', + 407 => 'Proxy Authentication Required', + 408 => 'Request Timeout', + 409 => 'Conflict', + 410 => 'Gone', + 411 => 'Length Required', + 412 => 'Precondition Failed', + 413 => 'Request Entity Too Large', + 414 => 'Request-URI Too Long', + 415 => 'Unsupported Media Type', + 416 => 'Requested Range Not Satisfiable', + 417 => 'Expectation Failed', + 418 => 'I\'m a teapot', // RFC2324 + 422 => 'Unprocessable Entity', // RFC4918 + 423 => 'Locked', // RFC4918 + 424 => 'Failed Dependency', // RFC4918 + 425 => 'Reserved for WebDAV advanced collections expired proposal', // RFC2817 + 426 => 'Upgrade Required', // RFC2817 + 428 => 'Precondition Required', // RFC6585 + 429 => 'Too Many Requests', // RFC6585 + 431 => 'Request Header Fields Too Large', // RFC6585 + 500 => 'Internal Server Error', + 501 => 'Not Implemented', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Timeout', + 505 => 'HTTP Version Not Supported', + 506 => 'Variant Also Negotiates (Experimental)', // RFC2295 + 507 => 'Insufficient Storage', // RFC4918 + 508 => 'Loop Detected', // RFC5842 + 510 => 'Not Extended', // RFC2774 + 511 => 'Network Authentication Required', // RFC6585 + ]; + + /** + * @var string + */ + protected $content; + + /** + * @var int + */ + protected $statusCode; + + /** + * @var string + */ + protected $statusText; + + /** + * @var array + */ + public $headers; + + /** + * @var string + */ + protected $version; + + /** + * Construct the response + * + * @param mixed $content + * @param int $statusCode + * @param array $headers + */ + public function __construct($content = '', $statusCode = 200, $headers = []) + { + $this->setContent($content); + $this->setStatusCode($statusCode); + $this->headers = $headers; + $this->version = '1.1'; + } + + /** + * Set the content on the response. + * + * @param mixed $content + * @return $this + */ + public function setContent($content) + { + if ($content instanceof ArrayObject || is_array($content)) + { + $this->headers['Content-Type'] = ['application/json']; + + $content = json_encode($content); + } + + $this->content = $content; + } + + /** + * Returns the Response as an HTTP string. + * + * The string representation of the Response is the same as the + * one that will be sent to the client only if the prepare() method + * has been called before. + * + * @return string The Response as an HTTP string + * + * @see prepare() + */ + public function __toString() + { + return + sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText)."\r\n". + $this->headers."\r\n". + $this->getContent(); + } + + /** + * Sets the response status code. + * + * @param int $code HTTP status code + * @param mixed $text HTTP status text + * + * If the status text is null it will be automatically populated for the known + * status codes and left empty otherwise. + * + * @return Response + * + * @throws \InvalidArgumentException When the HTTP status code is not valid + * + * @api + */ + public function setStatusCode($code, $text = null) + { + $this->statusCode = $code = (int) $code; + if ($this->isInvalid()) { + throw new InvalidArgumentException(sprintf('The HTTP status code "%s" is not valid.', $code)); + } + + if (null === $text) { + $this->statusText = self::$statusTexts[$code] ?? ''; + + return $this; + } + + if (false === $text) { + $this->statusText = ''; + + return $this; + } + + $this->statusText = $text; + + return $this; + } + + // http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html + /** + * Is response invalid? + * + * @return bool + * + * @api + */ + public function isInvalid() + { + return $this->statusCode < 100 || $this->statusCode >= 600; + } + + /** + * Set a header on the Response. + * + * @param string $key + * @param string $value + * @param bool $replace + * @return $this + */ + public function header($key, $value, $replace = true) + { + if (empty($this->headers[$key])) + { + $this->headers[$key] = []; + } + if ($replace) + { + $this->headers[$key] = [$value]; + } + else + { + $this->headers[$key][] = $value; + } + + return $this; + } + + /** + * Sends HTTP headers and content. + * + * @return Response + * + * @api + */ + public function send() + { + $this->sendHeaders(); + $this->sendContent(); + + if (function_exists('fastcgi_finish_request')) { + fastcgi_finish_request(); + } + + return $this; + } + + /** + * Sends content for the current web response. + * + * @return Response + */ + public function sendContent() + { + echo $this->content; + + return $this; + } + + /** + * Sends HTTP headers. + * + * @return Response + */ + public function sendHeaders() + { + // headers have already been sent by the developer + if (headers_sent()) { + return $this; + } + + // status + header(sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText), true, $this->statusCode); + + // headers + foreach ($this->headers as $name => $values) { + if (is_array($values)) + { + foreach ($values as $value) + { + header($name . ': ' . $value, false, $this->statusCode); + } + } + else + { + header($name . ': ' . $values, false, $this->statusCode); + } + } + + return $this; + } +} \ No newline at end of file diff --git a/libraries/filemanager-9.14.2/include/ftp_class.php b/libraries/filemanager-9.14.2/include/ftp_class.php new file mode 100644 index 0000000..87a9be6 --- /dev/null +++ b/libraries/filemanager-9.14.2/include/ftp_class.php @@ -0,0 +1,82 @@ +messageArray[] = $message; + } + + public function getMessages() + { + return $this->messageArray; + } + + public function connect ($server, $ftpUser, $ftpPassword, $isPassive = false) + { + + // *** Set up basic connection + $this->connectionId = ftp_connect($server); + + // *** Login with username and password + $loginResult = ftp_login($this->connectionId, $ftpUser, $ftpPassword); + + // *** Sets passive mode on/off (default off) + ftp_pasv($this->connectionId, $isPassive); + + // *** Check connection + if ((!$this->connectionId) || (!$loginResult)) { + $this->logMessage('FTP connection has failed!'); + $this->logMessage('Attempted to connect to ' . $server . ' for user ' . $ftpUser, true); + return false; + } else { + $this->logMessage('Connected to ' . $server . ', for user ' . $ftpUser); + $this->loginOk = true; + return true; + } + } + public function makeDir($directory) + { + // *** If creating a directory is successful... + if (ftp_mkdir($this->connectionId, $directory)) { + + $this->logMessage('Directory "' . $directory . '" created successfully'); + return true; + + } else { + + // *** ...Else, FAIL. + $this->logMessage('Failed creating directory "' . $directory . '"'); + return false; + } + } + + public function changeDir($directory) + { + if (ftp_chdir($this->connectionId, $directory)) { + $this->logMessage('Current directory is now: ' . ftp_pwd($this->connectionId)); + return true; + } else { + $this->logMessage('Couldn\'t change directory'); + return false; + } + } + + public function getDirListing($directory = '.', $parameters = '-la') + { + echo shell_exec('whoami')." is who i am
"; + echo "Current directory is now: " . ftp_pwd($this->connectionId) . "
"; + + // get contents of the current directory + $contentsArray = ftp_rawlist($this->connectionId, $parameters . ' ' . $directory); + echo error_get_last(); + return $contentsArray; + } +} \ No newline at end of file diff --git a/libraries/filemanager-9.14.2/include/get_png_imageinfo.php b/libraries/filemanager-9.14.2/include/get_png_imageinfo.php new file mode 100644 index 0000000..38c7450 --- /dev/null +++ b/libraries/filemanager-9.14.2/include/get_png_imageinfo.php @@ -0,0 +1,75 @@ + + * @license Apache 2.0 + * @link https://github.com/ktomk/Miscellaneous/blob/master/get_png_imageinfo/get_png_imageinfo.php + * @link http://www.libpng.org/pub/png/spec/iso/index-object.html#11IHDR + * + * @param string $file filename + * @return array|bool image information, FALSE on error + */ +function get_png_imageinfo($file) { + if (! is_file($file)) { + return false; + } + + $info = unpack( + 'a8sig/Nchunksize/A4chunktype/Nwidth/Nheight/Cbit-depth/Ccolor/Ccompression/Cfilter/Cinterface', + file_get_contents($file, 0, null, 0, 29) + ); + + if (empty($info)) { + return false; + } + if ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A" != array_shift($info)) { + return false; // no PNG signature + } + if (13 != array_shift($info)) { + return false; // wrong length for IHDR chunk + } + if ('IHDR'!==array_shift($info)) { + return false; // a non-IHDR chunk singals invalid data + } + + $color = $info['color']; + $type = [ + 0 => 'Greyscale', + 2 => 'Truecolour', + 3 => 'Indexed-colour', + 4 => 'Greyscale with alpha', + 6 => 'Truecolour with alpha' + ]; + + if (empty($type[$color])) { + return false; // invalid color value + } + + $info['color-type'] = $type[$color]; + $samples = ((($color % 4) % 3) ? 3 : 1) + ($color > 3 ? 1 : 0); + $info['channels'] = $samples; + $info['bits'] = $info['bit-depth']; + + return $info; +} diff --git a/libraries/filemanager-9.14.2/include/mime_type_lib.php b/libraries/filemanager-9.14.2/include/mime_type_lib.php new file mode 100644 index 0000000..02b48b1 --- /dev/null +++ b/libraries/filemanager-9.14.2/include/mime_type_lib.php @@ -0,0 +1,270 @@ + "ps", + "audio/x-aiff" => "aiff", + "text/plain" => "txt", + "video/x-ms-asf" => "asx", + "audio/basic" => "snd", + "video/x-msvideo" => "avi", + "application/x-bcpio" => "bcpio", + "application/octet-stream" => "so", + "image/bmp" => "bmp", + "application/x-rar" => "rar", + "application/x-bzip2" => "bz2", + "application/x-netcdf" => "nc", + "application/x-kchart" => "chrt", + "application/x-cpio" => "cpio", + "application/mac-compactpro" => "cpt", + "application/x-csh" => "csh", + "text/css" => "css", + "text/csv" => "csv", + "application/x-director" => "dxr", + "image/vnd.djvu" => "djvu", + "application/x-dvi" => "dvi", + "image/vnd.dwg" => "dwg", + "application/epub" => "epub", + "application/epub+zip" => "epub", + "text/x-setext" => "etx", + "application/andrew-inset" => "ez", + "video/x-flv" => "flv", + "image/gif" => "gif", + "application/x-gtar" => "gtar", + "application/x-gzip" => "tgz", + "application/x-hdf" => "hdf", + "application/mac-binhex40" => "hqx", + "text/html" => "html", + "text/htm" => "htm", + "x-conference/x-cooltalk" => "ice", + "image/ief" => "ief", + "model/iges" => "igs", + "text/vnd.sun.j2me.app-descriptor" => "jad", + "application/x-java-archive" => "jar", + "application/x-java-jnlp-file" => "jnlp", + "image/jpeg" => "jpg", + "application/x-javascript" => "js", + "audio/midi" => "midi", + "application/x-killustrator" => "kil", + "application/x-kpresenter" => "kpt", + "application/x-kspread" => "ksp", + "application/x-kword" => "kwt", + "application/vnd.google-earth.kml+xml" => "kml", + "application/vnd.google-earth.kmz" => "kmz", + "application/x-latex" => "latex", + "audio/x-mpegurl" => "m3u", + "application/x-troff-man" => "man", + "application/x-troff-me" => "me", + "model/mesh" => "silo", + "application/vnd.mif" => "mif", + "video/quicktime" => "mov", + "video/x-sgi-movie" => "movie", + "audio/mpeg" => "mp3", + "video/mp4" => "mp4", + "video/mpeg" => "mpeg", + "application/x-troff-ms" => "ms", + "video/vnd.mpegurl" => "mxu", + "application/vnd.oasis.opendocument.database" => "odb", + "application/vnd.oasis.opendocument.chart" => "odc", + "application/vnd.oasis.opendocument.formula" => "odf", + "application/vnd.oasis.opendocument.graphics" => "odg", + "application/vnd.oasis.opendocument.image" => "odi", + "application/vnd.oasis.opendocument.text-master" => "odm", + "application/vnd.oasis.opendocument.presentation" => "odp", + "application/vnd.oasis.opendocument.spreadsheet" => "ods", + "application/vnd.oasis.opendocument.text" => "odt", + "application/ogg" => "ogg", + "video/ogg" => "ogv", + "application/vnd.oasis.opendocument.graphics-template" => "otg", + "application/vnd.oasis.opendocument.text-web" => "oth", + "application/vnd.oasis.opendocument.presentation-template" => "otp", + "application/vnd.oasis.opendocument.spreadsheet-template" => "ots", + "application/vnd.oasis.opendocument.text-template" => "ott", + "image/x-portable-bitmap" => "pbm", + "chemical/x-pdb" => "pdb", + "application/pdf" => "pdf", + "image/x-portable-graymap" => "pgm", + "application/x-chess-pgn" => "pgn", + "text/x-php" => "php", + "image/png" => "png", + "image/x-portable-anymap" => "pnm", + "image/x-portable-pixmap" => "ppm", + "application/vnd.ms-powerpoint" => "ppt", + "audio/x-realaudio" => "ra", + "audio/x-pn-realaudio" => "rm", + "image/x-cmu-raster" => "ras", + "image/x-rgb" => "rgb", + "application/x-troff" => "tr", + "application/x-rpm" => "rpm", + "text/rtf" => "rtf", + "text/richtext" => "rtx", + "text/sgml" => "sgml", + "application/x-sh" => "sh", + "application/x-shar" => "shar", + "application/vnd.symbian.install" => "sis", + "application/x-stuffit" => "sit", + "application/x-koan" => "skt", + "application/smil" => "smil", + "image/svg+xml" => "svg", + "application/x-futuresplash" => "spl", + "application/x-wais-source" => "src", + "application/vnd.sun.xml.calc.template" => "stc", + "application/vnd.sun.xml.draw.template" => "std", + "application/vnd.sun.xml.impress.template" => "sti", + "application/vnd.sun.xml.writer.template" => "stw", + "application/x-sv4cpio" => "sv4cpio", + "application/x-sv4crc" => "sv4crc", + "application/x-shockwave-flash" => "swf", + "application/vnd.sun.xml.calc" => "sxc", + "application/vnd.sun.xml.draw" => "sxd", + "application/vnd.sun.xml.writer.global" => "sxg", + "application/vnd.sun.xml.impress" => "sxi", + "application/vnd.sun.xml.math" => "sxm", + "application/vnd.sun.xml.writer" => "sxw", + "application/x-tar" => "tar", + "application/x-tcl" => "tcl", + "application/x-tex" => "tex", + "application/x-texinfo" => "texinfo", + "image/tiff" => "tiff", + "image/tiff-fx" => "tiff", + "application/x-bittorrent" => "torrent", + "text/tab-separated-values" => "tsv", + "application/x-ustar" => "ustar", + "application/x-cdlink" => "vcd", + "model/vrml" => "wrl", + "audio/x-wav" => "wav", + "audio/x-ms-wax" => "wax", + "image/vnd.wap.wbmp" => "wbmp", + "application/vnd.wap.wbxml" => "wbxml", + "video/webm" => "webm", + "image/webp" => "webp", + "video/x-ms-wm" => "wm", + "audio/x-ms-wma" => "wma", + "text/vnd.wap.wml" => "wml", + "application/vnd.wap.wmlc" => "wmlc", + "text/vnd.wap.wmlscript" => "wmls", + "application/vnd.wap.wmlscriptc" => "wmlsc", + "video/x-ms-wmv" => "wmv", + "video/x-ms-wmx" => "wmx", + "video/x-ms-wvx" => "wvx", + "image/x-xbitmap" => "xbm", + "application/xhtml+xml" => "xhtml", + "application/xml" => "xml", + "image/x-xpixmap" => "xpm", + "text/xsl" => "xsl", + "image/x-xwindowdump" => "xwd", + "chemical/x-xyz" => "xyz", + "application/zip" => "zip", + "application/msword" => "doc", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document" => "docx", + "application/vnd.openxmlformats-officedocument.wordprocessingml.template" => "dotx", + "application/vnd.ms-word.document.macroEnabled.12" => "docm", + "application/vnd.ms-excel" => "xls", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" => "xlsx", + "application/vnd.openxmlformats-officedocument.spreadsheetml.template" => "xltx", + "application/vnd.ms-excel.sheet.macroEnabled.12" => "xlsm", + "application/vnd.ms-excel.template.macroEnabled.12" => "xltm", + "application/vnd.ms-excel.addin.macroEnabled.12" => "xlam", + "application/vnd.ms-excel.sheet.binary.macroEnabled.12" => "xlsb", + "application/vnd.openxmlformats-officedocument.presentationml.presentation" => "pptx", + "application/vnd.openxmlformats-officedocument.presentationml.template" => "potx", + "application/vnd.openxmlformats-officedocument.presentationml.slideshow" => "ppsx", + "application/vnd.ms-powerpoint.addin.macroEnabled.12" => "ppam", + "application/vnd.ms-powerpoint.presentation.macroEnabled.12" => "pptm", + "application/vnd.ms-powerpoint.template.macroEnabled.12" => "potm", + "application/vnd.ms-powerpoint.slideshow.macroEnabled.12" => "ppsm", +]; + + +if ( ! function_exists('get_extension_from_mime')) +{ + function get_extension_from_mime($mime){ + global $mime_types; + if(strpos($mime, ';')!==FALSE){ + $mime = substr($mime, 0,strpos($mime, ';')); + } + if(isset($mime_types[$mime])){ + return $mime_types[$mime]; + } + return ''; + } +} + +if ( ! function_exists('get_file_mime_type')) +{ + function get_file_mime_type($filename, $debug = false) + { + if (function_exists('finfo_open') && function_exists('finfo_file') && function_exists('finfo_close')) + { + $fileinfo = finfo_open(FILEINFO_MIME_TYPE); + $mime_type = finfo_file($fileinfo, $filename); + finfo_close($fileinfo); + + if ( ! empty($mime_type)) + { + if (true === $debug) + { + return ['mime_type' => $mime_type, 'method' => 'fileinfo']; + } + + return $mime_type; + } + } + + if (function_exists('mime_content_type')) + { + $mime_type = mime_content_type($filename); + + if ( ! empty($mime_type)) + { + if (true === $debug) + { + return ['mime_type' => $mime_type, 'method' => 'mime_content_type']; + } + + return $mime_type; + } + } + + global $mime_types; + $mime_types = array_flip($mime_types); + + $tmp_array = explode('.', $filename); + $ext = strtolower(array_pop($tmp_array)); + + if ( ! empty($mime_types[ $ext ])) + { + if (true === $debug) + { + return ['mime_type' => $mime_types[ $ext ], 'method' => 'from_array']; + } + + return $mime_types[ $ext ]; + } + + if (true === $debug) + { + return ['mime_type' => 'application/octet-stream', 'method' => 'last_resort']; + } + + return 'application/octet-stream'; + } +} + + +/******************** + * The following code can be used to test the function. + * First put a plain text file named "test.txt" and a + * JPEG image file named "image.jpg" in the same folder + * as this file. + * + * Simply remove the "REMOVE ME TO TEST" lines below to have + * the code run when this file runs. + * + * Run the code with this command: + * php mime_type_lib.php + ********************/ + + +/* REMOVE ME TO TEST +echo get_file_mime_type( 'test.txt' ) . "\n"; +echo print_r( get_file_mime_type( 'image.jpg', true ), true ) . "\n"; +REMOVE ME TO TEST */ diff --git a/libraries/filemanager-9.14.2/include/php_image_magician.php b/libraries/filemanager-9.14.2/include/php_image_magician.php new file mode 100644 index 0000000..5e90e76 --- /dev/null +++ b/libraries/filemanager-9.14.2/include/php_image_magician.php @@ -0,0 +1,3804 @@ + resizeImage(150, 100, 0); +# $magicianObj -> saveImage('images/car_small.jpg', 100); +# +# - See end of doc for more examples - +# +# Supported file types include: jpg, png, gif, bmp, psd (read) +# +# +# +# The following functions are taken from phpThumb() [available from +# http://phpthumb.sourceforge.net], and are used with written permission +# from James Heinrich. +# - GD2BMPstring +# - GetPixelColor +# - LittleEndian2String +# +# The following functions are from Marc Hibbins and are used with written +# permission (are also under the Attribution-ShareAlike +# [http://creativecommons.org/licenses/by-sa/3.0/] license. +# - +# +# PhpPsdReader is used with written permission from Tim de Koning. +# [http://www.kingsquare.nl/phppsdreader] +# +# +# +# Modificatoin history +# Date Initials Ver Description +# 10-05-11 J.C.O 0.0 Initial build +# 01-06-11 J.C.O 0.1.1 * Added reflections +# * Added Rounded corners +# * You can now use PNG interlacing +# * Added shadow +# * Added caption box +# * Added vintage filter +# * Added dynamic image resizing (resize on the fly) +# * minor bug fixes +# 05-06-11 J.C.O 0.1.1.1 * Fixed undefined variables +# 17-06-11 J.C.O 0.1.2 * Added image_batch_class.php class +# * Minor bug fixes +# 26-07-11 J.C.O 0.1.4 * Added support for external images +# * Can now set the crop poisition +# 03-08-11 J.C.O 0.1.5 * Added reset() method to reset resource to +# original input file. +# * Added method addTextToCaptionBox() to +# simplify adding text to a caption box. +# * Added experimental writeIPTC. (not finished) +# * Added experimental readIPTC. (not finished) +# 11-08-11 J.C.O * Added initial border presets. +# 30-08-11 J.C.O * Added 'auto' crop option to crop portrait +# images near the top. +# 08-09-11 J.C.O * Added cropImage() method to allow standalone +# cropping. +# 17-09-11 J.C.O * Added setCropFromTop() set method - set the +# percentage to crop from the top when using +# crop 'auto' option. +# * Added setTransparency() set method - allows you +# to turn transparency off (like when saving +# as a jpg). +# * Added setFillColor() set method - set the +# background color to use instead of transparency. +# 05-11-11 J.C.O 0.1.5.1 * Fixed interlacing option +# 0-07-12 J.C.O 1.0 +# +# Known issues & Limitations: +# ------------------------------- +# Not so much an issue, the image is destroyed on the deconstruct rather than +# when we have finished with it. The reason for this is that we don't know +# when we're finished with it as you can both save the image and display +# it directly to the screen (imagedestroy($this->imageResized)) +# +# Opening BMP files is slow. A test with 884 bmp files processed in a loop +# takes forever - over 5 min. This test inlcuded opening the file, then +# getting and displaying its width and height. +# +# $forceStretch: +# ------------------------------- +# On by default. +# $forceStretch can be disabled by calling method setForceStretch with false +# parameter. If disabled, if an images original size is smaller than the size +# specified by the user, the original size will be used. This is useful when +# dealing with small images. +# +# If enabled, images smaller than the size specified will be stretched to +# that size. +# +# Tips: +# ------------------------------- +# * If you're resizing a transparent png and saving it as a jpg, set +# $keepTransparency to false with: $magicianObj->setTransparency(false); +# +# FEATURES: +# * EASY TO USE +# * BMP SUPPORT (read & write) +# * PSD (photoshop) support (read) +# * RESIZE IMAGES +# - Preserve transparency (png, gif) +# - Apply sharpening (jpg) (requires PHP >= 5.1.0) +# - Set image quality (jpg, png) +# - Resize modes: +# - exact size +# - resize by width (auto height) +# - resize by height (auto width) +# - auto (automatically determine the best of the above modes to use) +# - crop - resize as best as it can then crop the rest +# - Force stretching of smaller images (upscale) +# * APPLY FILTERS +# - Convert to grey scale +# - Convert to black and white +# - Convert to sepia +# - Convert to negative +# * ROTATE IMAGES +# - Rotate using predefined "left", "right", or "180"; or any custom degree amount +# * EXTRACT EXIF DATA (requires exif module) +# - make +# - model +# - date +# - exposure +# - aperture +# - f-stop +# - iso +# - focal length +# - exposure program +# - metering mode +# - flash status +# - creator +# - copyright +# * ADD WATERMARK +# - Specify exact x, y placement +# - Or, specify using one of the 9 pre-defined placements such as "tl" +# (for top left), "m" (for middle), "br" (for bottom right) +# - also specify padding from edge amount (optional). +# - Set opacity of watermark (png). +# * ADD BORDER +# * USE HEX WHEN SPECIFYING COLORS (eg: #ffffff) +# * SAVE IMAGE OR OUTPUT TO SCREEN +# +# +# ========================================================================# + + +class imageLib { + + private $fileName; + private $image; + protected $imageResized; + private $widthOriginal; # Always be the original width + private $heightOriginal; + private $width; # Current width (width after resize) + private $height; + private $imageSize; + private $fileExtension; + + private $debug = true; + private $errorArray = []; + + private $forceStretch = true; + private $aggresiveSharpening = false; + + private $transparentArray = ['.png', '.gif']; + private $keepTransparency = true; + private $fillColorArray = ['r' => 255, 'g' => 255, 'b' => 255]; + + private $sharpenArray = ['jpg']; + + private $psdReaderPath; + private $filterOverlayPath; + + private $isInterlace; + + private $captionBoxPositionArray = []; + + private $fontDir = 'fonts'; + + private $cropFromTopPercent = 10; + + +## -------------------------------------------------------- + + function __construct($fileName) + # Author: Jarrod Oberto + # Date: 27-02-08 + # Purpose: Constructor + # Param in: $fileName: File name and path. + # Param out: n/a + # Reference: + # Notes: + # + { + if ( ! $this->testGDInstalled()) + { + if ($this->debug) + { + throw new Exception('The GD Library is not installed.'); + } + else + { + throw new Exception(); + } + } + + $this->initialise(); + + // *** Save the image file name. Only store this incase you want to display it + $this->fileName = $fileName; + $this->fileExtension = fix_strtolower(strrchr($fileName, '.')); + + // *** Open up the file + $this->image = $this->openImage($fileName); + + // *** Assign here so we don't modify the original + $this->imageResized = $this->image; + + // *** If file is an image + if ($this->testIsImage($this->image)) + { + // *** Get width and height + $this->width = imagesx($this->image); + $this->widthOriginal = imagesx($this->image); + $this->height = imagesy($this->image); + $this->heightOriginal = imagesy($this->image); + + + /* Added 15-09-08 + * Get the filesize using this build in method. + * Stores an array of size + * + * $this->imageSize[1] = width + * $this->imageSize[2] = height + * $this->imageSize[3] = width x height + * + */ + $this->imageSize = getimagesize($this->fileName); + + } + else + { + $this->errorArray[] = 'File is not an image'; + } + } + +## -------------------------------------------------------- + + private function initialise() + { + + $this->psdReaderPath = dirname(__FILE__) . '/classPhpPsdReader.php'; + $this->filterOverlayPath = dirname(__FILE__) . '/filters'; + + // *** Set if image should be interlaced or not. + $this->isInterlace = false; + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Resize +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + + public function resizeImage($newWidth, $newHeight, $option = 0, $sharpen = false, $autoRotate = false) + # Author: Jarrod Oberto + # Date: 27-02-08 + # Purpose: Resizes the image + # Param in: $newWidth: + # $newHeight: + # $option: 0 / exact = defined size; + # 1 / portrait = keep aspect set height; + # 2 / landscape = keep aspect set width; + # 3 / auto = auto; + # 4 / crop= resize and crop; + # + # $option can also be an array containing options for + # cropping. E.G., array('crop', 'r') + # + # This array only applies to 'crop' and the 'r' refers to + # "crop right". Other value include; tl, t, tr, l, m (default), + # r, bl, b, br, or you can specify your own co-ords (which + # isn't recommended. + # + # $sharpen: true: sharpen (jpg only); + # false: don't sharpen + # Param out: n/a + # Reference: + # Notes: To clarify the $option input: + # 0 = The exact height and width dimensions you set. + # 1 = Whatever height is passed in will be the height that + # is set. The width will be calculated and set automatically + # to a the value that keeps the original aspect ratio. + # 2 = The same but based on the width. We try make the image the + # biggest size we can while stil fitting inside the box size + # 3 = Depending whether the image is landscape or portrait, this + # will automatically determine whether to resize via + # dimension 1,2 or 0 + # 4 = Will resize and then crop the image for best fit + # + # forceStretch can be applied to options 1,2,3 and 4 + # + { + + // *** We can pass in an array of options to change the crop position + $cropPos = 'm'; + if (is_array($option) && fix_strtolower($option[0]) == 'crop') + { + $cropPos = $option[1]; # get the crop option + } + else + { + if (strpos($option, '-') !== false) + { + // *** Or pass in a hyphen seperated option + $optionPiecesArray = explode('-', $option); + $cropPos = end($optionPiecesArray); + } + } + + // *** Check the option is valid + $option = $this->prepOption($option); + + // *** Make sure the file passed in is valid + if ( ! $this->image) + { + if ($this->debug) + { + throw new Exception('file ' . $this->getFileName() . ' is missing or invalid'); + } + else + { + throw new Exception(); + } + } + + // *** Get optimal width and height - based on $option + $dimensionsArray = $this->getDimensions($newWidth, $newHeight, $option); + + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + + // *** Resample - create image canvas of x, y size + $this->imageResized = imagecreatetruecolor($optimalWidth, $optimalHeight); + $this->keepTransparancy($optimalWidth, $optimalHeight, $this->imageResized); + imagecopyresampled($this->imageResized, $this->image, 0, 0, 0, 0, $optimalWidth, $optimalHeight, $this->width, $this->height); + + + // *** If '4', then crop too + if ($option == 4 || $option == 'crop') + { + + if (($optimalWidth >= $newWidth && $optimalHeight >= $newHeight)) + { + $this->crop($optimalWidth, $optimalHeight, $newWidth, $newHeight, $cropPos); + } + } + + // *** If Rotate. + if ($autoRotate) + { + + $exifData = $this->getExif(false); + if (count($exifData) > 0) + { + + switch ($exifData['orientation']) + { + case 8: + $this->imageResized = imagerotate($this->imageResized, 90, 0); + break; + case 3: + $this->imageResized = imagerotate($this->imageResized, 180, 0); + break; + case 6: + $this->imageResized = imagerotate($this->imageResized, -90, 0); + break; + } + } + } + + // *** Sharpen image (if jpg and the user wishes to do so) + if ($sharpen && in_array($this->fileExtension, $this->sharpenArray)) + { + + // *** Sharpen + $this->sharpen(); + } + } + +## -------------------------------------------------------- + + public function cropImage($newWidth, $newHeight, $cropPos = 'm') + # Author: Jarrod Oberto + # Date: 08-09-11 + # Purpose: Crops the image + # Param in: $newWidth: crop with + # $newHeight: crop height + # $cropPos: Can be any of the following: + # tl, t, tr, l, m, r, bl, b, br, auto + # Or: + # a custom position such as '30x50' + # Param out: n/a + # Reference: + # Notes: + # + { + + // *** Make sure the file passed in is valid + if ( ! $this->image) + { + if ($this->debug) + { + throw new Exception('file ' . $this->getFileName() . ' is missing or invalid'); + } + else + { + throw new Exception(); + } + } + + $this->imageResized = $this->image; + $this->crop($this->width, $this->height, $newWidth, $newHeight, $cropPos); + + } + +## -------------------------------------------------------- + + private function keepTransparancy($width, $height, $im) + # Author: Jarrod Oberto + # Date: 08-04-11 + # Purpose: Keep transparency for png and gif image + # Param in: + # Param out: n/a + # Reference: + # Notes: + # + { + // *** If PNG, perform some transparency retention actions (gif untested) + if (in_array($this->fileExtension, $this->transparentArray) && $this->keepTransparency) + { + imagealphablending($im, false); + imagesavealpha($im, true); + $transparent = imagecolorallocatealpha($im, 255, 255, 255, 127); + imagefilledrectangle($im, 0, 0, $width, $height, $transparent); + } + else + { + $color = imagecolorallocate($im, $this->fillColorArray['r'], $this->fillColorArray['g'], $this->fillColorArray['b']); + imagefilledrectangle($im, 0, 0, $width, $height, $color); + } + } + +## -------------------------------------------------------- + + private function crop($optimalWidth, $optimalHeight, $newWidth, $newHeight, $cropPos) + # Author: Jarrod Oberto + # Date: 15-09-08 + # Purpose: Crops the image + # Param in: $newWidth: + # $newHeight: + # Param out: n/a + # Reference: + # Notes: + # + { + + // *** Get cropping co-ordinates + $cropArray = $this->getCropPlacing($optimalWidth, $optimalHeight, $newWidth, $newHeight, $cropPos); + $cropStartX = $cropArray['x']; + $cropStartY = $cropArray['y']; + + // *** Crop this bad boy + $crop = imagecreatetruecolor($newWidth, $newHeight); + $this->keepTransparancy($optimalWidth, $optimalHeight, $crop); + imagecopyresampled($crop, $this->imageResized, 0, 0, $cropStartX, $cropStartY, $newWidth, $newHeight, $newWidth, $newHeight); + + $this->imageResized = $crop; + + // *** Set new width and height to our variables + $this->width = $newWidth; + $this->height = $newHeight; + + } + +## -------------------------------------------------------- + + private function getCropPlacing($optimalWidth, $optimalHeight, $newWidth, $newHeight, $pos = 'm') + # + # Author: Jarrod Oberto + # Date: July 11 + # Purpose: Set the cropping area. + # Params in: + # Params out: (array) the crop x and y co-ordinates. + # Notes: When specifying the exact pixel crop position (eg 10x15), be + # very careful as it's easy to crop out of the image leaving + # black borders. + # + { + $pos = fix_strtolower($pos); + + // *** If co-ords have been entered + if (strstr($pos, 'x')) + { + $pos = str_replace(' ', '', $pos); + + $xyArray = explode('x', $pos); + list($cropStartX, $cropStartY) = $xyArray; + + } + else + { + + switch ($pos) + { + case 'tl': + $cropStartX = 0; + $cropStartY = 0; + break; + + case 't': + $cropStartX = ($optimalWidth / 2) - ($newWidth / 2); + $cropStartY = 0; + break; + + case 'tr': + $cropStartX = $optimalWidth - $newWidth; + $cropStartY = 0; + break; + + case 'l': + $cropStartX = 0; + $cropStartY = ($optimalHeight / 2) - ($newHeight / 2); + break; + + case 'm': + $cropStartX = ($optimalWidth / 2) - ($newWidth / 2); + $cropStartY = ($optimalHeight / 2) - ($newHeight / 2); + break; + + case 'r': + $cropStartX = $optimalWidth - $newWidth; + $cropStartY = ($optimalHeight / 2) - ($newHeight / 2); + break; + + case 'bl': + $cropStartX = 0; + $cropStartY = $optimalHeight - $newHeight; + break; + + case 'b': + $cropStartX = ($optimalWidth / 2) - ($newWidth / 2); + $cropStartY = $optimalHeight - $newHeight; + break; + + case 'br': + $cropStartX = $optimalWidth - $newWidth; + $cropStartY = $optimalHeight - $newHeight; + break; + + case 'auto': + // *** If image is a portrait crop from top, not center. v1.5 + if ($optimalHeight > $optimalWidth) + { + $cropStartX = ($optimalWidth / 2) - ($newWidth / 2); + $cropStartY = ($this->cropFromTopPercent / 100) * $optimalHeight; + } + else + { + + // *** Else crop from the center + $cropStartX = ($optimalWidth / 2) - ($newWidth / 2); + $cropStartY = ($optimalHeight / 2) - ($newHeight / 2); + } + break; + + default: + // *** Default to center + $cropStartX = ($optimalWidth / 2) - ($newWidth / 2); + $cropStartY = ($optimalHeight / 2) - ($newHeight / 2); + break; + } + } + + return ['x' => $cropStartX, 'y' => $cropStartY]; + } + +## -------------------------------------------------------- + + private function getDimensions($newWidth, $newHeight, $option) + # Author: Jarrod Oberto + # Date: 17-11-09 + # Purpose: Get new image dimensions based on user specificaions + # Param in: $newWidth: + # $newHeight: + # Param out: Array of new width and height values + # Reference: + # Notes: If $option = 3 then this function is call recursivly + # + # To clarify the $option input: + # 0 = The exact height and width dimensions you set. + # 1 = Whatever height is passed in will be the height that + # is set. The width will be calculated and set automatically + # to a the value that keeps the original aspect ratio. + # 2 = The same but based on the width. + # 3 = Depending whether the image is landscape or portrait, this + # will automatically determine whether to resize via + # dimension 1,2 or 0. + # 4 = Resize the image as much as possible, then crop the + # remainder. + { + + switch (strval($option)) + { + case '0': + case 'exact': + $optimalWidth = $newWidth; + $optimalHeight = $newHeight; + break; + case '1': + case 'portrait': + $dimensionsArray = $this->getSizeByFixedHeight($newWidth, $newHeight); + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + break; + case '2': + case 'landscape': + $dimensionsArray = $this->getSizeByFixedWidth($newWidth, $newHeight); + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + break; + case '3': + case 'auto': + $dimensionsArray = $this->getSizeByAuto($newWidth, $newHeight); + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + break; + case '4': + case 'crop': + $dimensionsArray = $this->getOptimalCrop($newWidth, $newHeight); + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + break; + } + + return ['optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight]; + } + +## -------------------------------------------------------- + + private function getSizeByFixedHeight($newWidth, $newHeight) + { + // *** If forcing is off... + if ( ! $this->forceStretch) + { + + // *** ...check if actual height is less than target height + if ($this->height < $newHeight) + { + return ['optimalWidth' => $this->width, 'optimalHeight' => $this->height]; + } + } + + $ratio = $this->width / $this->height; + + $newWidth = $newHeight * $ratio; + + //return $newWidth; + return ['optimalWidth' => $newWidth, 'optimalHeight' => $newHeight]; + } + +## -------------------------------------------------------- + + private function getSizeByFixedWidth($newWidth, $newHeight) + { + // *** If forcing is off... + if ( ! $this->forceStretch) + { + + // *** ...check if actual width is less than target width + if ($this->width < $newWidth) + { + return ['optimalWidth' => $this->width, 'optimalHeight' => $this->height]; + } + } + + $ratio = $this->height / $this->width; + + $newHeight = $newWidth * $ratio; + + //return $newHeight; + return ['optimalWidth' => $newWidth, 'optimalHeight' => $newHeight]; + } + +## -------------------------------------------------------- + + private function getSizeByAuto($newWidth, $newHeight) + # Author: Jarrod Oberto + # Date: 19-08-08 + # Purpose: Depending on the height, choose to resize by 0, 1, or 2 + # Param in: The new height and new width + # Notes: + # + { + // *** If forcing is off... + if ( ! $this->forceStretch) + { + + // *** ...check if actual size is less than target size + if ($this->width < $newWidth && $this->height < $newHeight) + { + return ['optimalWidth' => $this->width, 'optimalHeight' => $this->height]; + } + } + + if ($this->height < $this->width) + // *** Image to be resized is wider (landscape) + { + //$optimalWidth = $newWidth; + //$optimalHeight= $this->getSizeByFixedWidth($newWidth); + + $dimensionsArray = $this->getSizeByFixedWidth($newWidth, $newHeight); + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + } + elseif ($this->height > $this->width) + // *** Image to be resized is taller (portrait) + { + //$optimalWidth = $this->getSizeByFixedHeight($newHeight); + //$optimalHeight= $newHeight; + + $dimensionsArray = $this->getSizeByFixedHeight($newWidth, $newHeight); + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + } + else + // *** Image to be resizerd is a square + { + + if ($newHeight < $newWidth) + { + //$optimalWidth = $newWidth; + //$optimalHeight= $this->getSizeByFixedWidth($newWidth); + $dimensionsArray = $this->getSizeByFixedWidth($newWidth, $newHeight); + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + } + else + { + if ($newHeight > $newWidth) + { + //$optimalWidth = $this->getSizeByFixedHeight($newHeight); + //$optimalHeight= $newHeight; + $dimensionsArray = $this->getSizeByFixedHeight($newWidth, $newHeight); + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + } + else + { + // *** Sqaure being resized to a square + $optimalWidth = $newWidth; + $optimalHeight = $newHeight; + } + } + } + + return ['optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight]; + } + +## -------------------------------------------------------- + + private function getOptimalCrop($newWidth, $newHeight) + # Author: Jarrod Oberto + # Date: 17-11-09 + # Purpose: Get optimal crop dimensions + # Param in: width and height as requested by user (fig 3) + # Param out: Array of optimal width and height (fig 2) + # Reference: + # Notes: The optimal width and height return are not the same as the + # same as the width and height passed in. For example: + # + # + # |-----------------| |------------| |-------| + # | | => |**| |**| => | | + # | | |**| |**| | | + # | | |------------| |-------| + # |-----------------| + # original optimal crop + # size size size + # Fig 1 2 3 + # + # 300 x 250 150 x 125 150 x 100 + # + # The optimal size is the smallest size (that is closest to the crop size) + # while retaining proportion/ratio. + # + # The crop size is the optimal size that has been cropped on one axis to + # make the image the exact size specified by the user. + # + # * represent cropped area + # + { + + // *** If forcing is off... + if ( ! $this->forceStretch) + { + + // *** ...check if actual size is less than target size + if ($this->width < $newWidth && $this->height < $newHeight) + { + return ['optimalWidth' => $this->width, 'optimalHeight' => $this->height]; + } + } + + $heightRatio = $this->height / $newHeight; + $widthRatio = $this->width / $newWidth; + + if ($heightRatio < $widthRatio) + { + $optimalRatio = $heightRatio; + } + else + { + $optimalRatio = $widthRatio; + } + + $optimalHeight = round($this->height / $optimalRatio); + $optimalWidth = round($this->width / $optimalRatio); + + return ['optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight]; + } + +## -------------------------------------------------------- + + private function sharpen() + # Author: Jarrod Oberto + # Date: 08 04 2011 + # Purpose: Sharpen image + # Param in: n/a + # Param out: n/a + # Reference: + # Notes: + # Credit: Incorporates Joe Lencioni (August 6, 2008) code + { + + if (version_compare(PHP_VERSION, '5.1.0') >= 0) + { + + // *** + if ($this->aggresiveSharpening) + { # A more aggressive sharpening solution + + $sharpenMatrix = [[-1, -1, -1], + [-1, 16, -1], + [-1, -1, -1]]; + $divisor = 8; + $offset = 0; + + imageconvolution($this->imageResized, $sharpenMatrix, $divisor, $offset); + } + else # More subtle and personally more desirable + { + $sharpness = $this->findSharp($this->widthOriginal, $this->width); + + $sharpenMatrix = [ + [-1, -2, -1], + [-2, $sharpness + 12, -2], //Lessen the effect of a filter by increasing the value in the center cell + [-1, -2, -1] + ]; + $divisor = $sharpness; // adjusts brightness + $offset = 0; + imageconvolution($this->imageResized, $sharpenMatrix, $divisor, $offset); + } + } + else + { + if ($this->debug) + { + throw new Exception('Sharpening required PHP 5.1.0 or greater.'); + } + } + } + + ## -------------------------------------------------------- + + private function sharpen2($level) + { + $sharpenMatrix = [ + [$level, $level, $level], + [$level, (8 * $level) + 1, $level], //Lessen the effect of a filter by increasing the value in the center cell + [$level, $level, $level] + ]; + + } + +## -------------------------------------------------------- + + private function findSharp($orig, $final) + # Author: Ryan Rud (http://adryrun.com) + # Purpose: Find optimal sharpness + # Param in: n/a + # Param out: n/a + # Reference: + # Notes: + # + { + $final = $final * (750.0 / $orig); + $a = 52; + $b = -0.27810650887573124; + $c = .00047337278106508946; + + $result = $a + $b * $final + $c * $final * $final; + + return max(round($result), 0); + } + +## -------------------------------------------------------- + + private function prepOption($option) + # Author: Jarrod Oberto + # Purpose: Prep option like change the passed in option to lowercase + # Param in: (str/int) $option: eg. 'exact', 'crop'. 0, 4 + # Param out: lowercase string + # Reference: + # Notes: + # + { + if (is_array($option)) + { + if (fix_strtolower($option[0]) == 'crop' && count($option) == 2) + { + return 'crop'; + } + else + { + throw new Exception('Crop resize option array is badly formatted.'); + } + } + else + { + if (strpos($option, 'crop') !== false) + { + return 'crop'; + } + } + + if (is_string($option)) + { + return fix_strtolower($option); + } + + return $option; + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Presets +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + +# +# Preset are pre-defined templates you can apply to your image. +# +# These are inteded to be applied to thumbnail images. +# + + + public function borderPreset($preset) + { + switch ($preset) + { + + case 'simple': + $this->addBorder(7, '#fff'); + $this->addBorder(6, '#f2f1f0'); + $this->addBorder(2, '#fff'); + $this->addBorder(1, '#ccc'); + break; + default: + break; + } + + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Draw border +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function addBorder($thickness = 1, $rgbArray = [255, 255, 255]) + # Author: Jarrod Oberto + # Date: 05-05-11 + # Purpose: Add a border to the image + # Param in: + # Param out: + # Reference: + # Notes: This border is added to the INSIDE of the image + # + { + if ($this->imageResized) + { + + $rgbArray = $this->formatColor($rgbArray); + $r = $rgbArray['r']; + $g = $rgbArray['g']; + $b = $rgbArray['b']; + + + $x1 = 0; + $y1 = 0; + $x2 = ImageSX($this->imageResized) - 1; + $y2 = ImageSY($this->imageResized) - 1; + + $rgbArray = ImageColorAllocate($this->imageResized, $r, $g, $b); + + + for ($i = 0; $i < $thickness; $i++) + { + ImageRectangle($this->imageResized, $x1++, $y1++, $x2--, $y2--, $rgbArray); + } + } + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Gray Scale +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function greyScale() + # Author: Jarrod Oberto + # Date: 07-05-2011 + # Purpose: Make image greyscale + # Param in: n/a + # Param out: + # Reference: + # Notes: + # + { + if ($this->imageResized) + { + imagefilter($this->imageResized, IMG_FILTER_GRAYSCALE); + } + + } + + ## -------------------------------------------------------- + + public function greyScaleEnhanced() + # Author: Jarrod Oberto + # Date: 07-05-2011 + # Purpose: Make image greyscale + # Param in: n/a + # Param out: + # Reference: + # Notes: + # + { + if ($this->imageResized) + { + imagefilter($this->imageResized, IMG_FILTER_GRAYSCALE); + imagefilter($this->imageResized, IMG_FILTER_CONTRAST, -15); + imagefilter($this->imageResized, IMG_FILTER_BRIGHTNESS, 2); + $this->sharpen($this->width); + } + } + + ## -------------------------------------------------------- + + public function greyScaleDramatic() + # Alias of gd_filter_monopin + { + $this->gd_filter_monopin(); + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Black 'n White +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function blackAndWhite() + # Author: Jarrod Oberto + # Date: 07-05-2011 + # Purpose: Make image black and white + # Param in: n/a + # Param out: + # Reference: + # Notes: + # + { + if ($this->imageResized) + { + + imagefilter($this->imageResized, IMG_FILTER_GRAYSCALE); + imagefilter($this->imageResized, IMG_FILTER_CONTRAST, -1000); + } + + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Negative +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function negative() + # Author: Jarrod Oberto + # Date: 07-05-2011 + # Purpose: Make image negative + # Param in: n/a + # Param out: + # Reference: + # Notes: + # + { + if ($this->imageResized) + { + + imagefilter($this->imageResized, IMG_FILTER_NEGATE); + } + + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Sepia +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function sepia() + # Author: Jarrod Oberto + # Date: 07-05-2011 + # Purpose: Make image sepia + # Param in: n/a + # Param out: + # Reference: + # Notes: + # + { + if ($this->imageResized) + { + imagefilter($this->imageResized, IMG_FILTER_GRAYSCALE); + imagefilter($this->imageResized, IMG_FILTER_BRIGHTNESS, -10); + imagefilter($this->imageResized, IMG_FILTER_CONTRAST, -20); + imagefilter($this->imageResized, IMG_FILTER_COLORIZE, 60, 30, -15); + } + } + + ## -------------------------------------------------------- + + public function sepia2() + + { + if ($this->imageResized) + { + + $total = imagecolorstotal($this->imageResized); + for ($i = 0; $i < $total; $i++) + { + $index = imagecolorsforindex($this->imageResized, $i); + $red = ($index["red"] * 0.393 + $index["green"] * 0.769 + $index["blue"] * 0.189) / 1.351; + $green = ($index["red"] * 0.349 + $index["green"] * 0.686 + $index["blue"] * 0.168) / 1.203; + $blue = ($index["red"] * 0.272 + $index["green"] * 0.534 + $index["blue"] * 0.131) / 2.140; + imagecolorset($this->imageResized, $i, $red, $green, $blue); + } + + + } + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Vintage +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function vintage() + # Alias of gd_filter_monopin + { + $this->gd_filter_vintage(); + } + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Presets By Marc Hibbins +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + + /** Apply 'Monopin' preset */ + public function gd_filter_monopin() + { + + if ($this->imageResized) + { + imagefilter($this->imageResized, IMG_FILTER_GRAYSCALE); + imagefilter($this->imageResized, IMG_FILTER_BRIGHTNESS, -15); + imagefilter($this->imageResized, IMG_FILTER_CONTRAST, -15); + $this->imageResized = $this->gd_apply_overlay($this->imageResized, 'vignette', 100); + } + } + + ## -------------------------------------------------------- + + public function gd_filter_vintage() + { + if ($this->imageResized) + { + $this->imageResized = $this->gd_apply_overlay($this->imageResized, 'vignette', 45); + imagefilter($this->imageResized, IMG_FILTER_BRIGHTNESS, 20); + imagefilter($this->imageResized, IMG_FILTER_CONTRAST, -35); + imagefilter($this->imageResized, IMG_FILTER_COLORIZE, 60, -10, 35); + imagefilter($this->imageResized, IMG_FILTER_SMOOTH, 7); + $this->imageResized = $this->gd_apply_overlay($this->imageResized, 'scratch', 10); + } + } + + ## -------------------------------------------------------- + + /** Apply a PNG overlay */ + private function gd_apply_overlay($im, $type, $amount) + # + # Original Author: Marc Hibbins + # License: Attribution-ShareAlike 3.0 + # Purpose: + # Params in: + # Params out: + # Notes: + # + { + $width = imagesx($im); + $height = imagesy($im); + $filter = imagecreatetruecolor($width, $height); + + imagealphablending($filter, false); + imagesavealpha($filter, true); + + $transparent = imagecolorallocatealpha($filter, 255, 255, 255, 127); + imagefilledrectangle($filter, 0, 0, $width, $height, $transparent); + + // *** Resize overlay + $overlay = $this->filterOverlayPath . '/' . $type . '.png'; + $png = imagecreatefrompng($overlay); + imagecopyresampled($filter, $png, 0, 0, 0, 0, $width, $height, imagesx($png), imagesy($png)); + + $comp = imagecreatetruecolor($width, $height); + imagecopy($comp, $im, 0, 0, 0, 0, $width, $height); + imagecopy($comp, $filter, 0, 0, 0, 0, $width, $height); + imagecopymerge($im, $comp, 0, 0, 0, 0, $width, $height, $amount); + + imagedestroy($comp); + + return $im; + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Colorise +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function image_colorize($rgb) + { + imageTrueColorToPalette($this->imageResized, true, 256); + $numColors = imageColorsTotal($this->imageResized); + + for ($x = 0; $x < $numColors; $x++) + { + list($r, $g, $b) = array_values(imageColorsForIndex($this->imageResized, $x)); + + // calculate grayscale in percent + $grayscale = ($r + $g + $b) / 3 / 0xff; + + imageColorSet($this->imageResized, $x, + $grayscale * $rgb[0], + $grayscale * $rgb[1], + $grayscale * $rgb[2] + ); + + } + + return true; + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Reflection +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function addReflection($reflectionHeight = 50, $startingTransparency = 30, $inside = false, $bgColor = '#fff', $stretch = false, $divider = 0) + { + + // *** Convert color + $rgbArray = $this->formatColor($bgColor); + $r = $rgbArray['r']; + $g = $rgbArray['g']; + $b = $rgbArray['b']; + + $im = $this->imageResized; + $li = imagecreatetruecolor($this->width, 1); + + $bgc = imagecolorallocate($li, $r, $g, $b); + imagefilledrectangle($li, 0, 0, $this->width, 1, $bgc); + + $bg = imagecreatetruecolor($this->width, $reflectionHeight); + $wh = imagecolorallocate($im, 255, 255, 255); + + $im = imagerotate($im, -180, $wh); + imagecopyresampled($bg, $im, 0, 0, 0, 0, $this->width, $this->height, $this->width, $this->height); + + $im = $bg; + + $bg = imagecreatetruecolor($this->width, $reflectionHeight); + + for ($x = 0; $x < $this->width; $x++) + { + imagecopy($bg, $im, $x, 0, $this->width - $x - 1, 0, 1, $reflectionHeight); + } + $im = $bg; + + $transaprencyAmount = $this->invertTransparency($startingTransparency, 100); + + + // *** Fade + if ($stretch) + { + $step = 100 / ($reflectionHeight + $startingTransparency); + } + else + { + $step = 100 / $reflectionHeight; + } + for ($i = 0; $i <= $reflectionHeight; $i++) + { + + if ($startingTransparency > 100) + { + $startingTransparency = 100; + } + if ($startingTransparency < 1) + { + $startingTransparency = 1; + } + imagecopymerge($bg, $li, 0, $i, 0, 0, $this->width, 1, $startingTransparency); + $startingTransparency += $step; + } + + // *** Apply fade + imagecopymerge($im, $li, 0, 0, 0, 0, $this->width, $divider, 100); // Divider + + + // *** width, height of reflection. + $x = imagesx($im); + $y = imagesy($im); + + + // *** Determines if the reflection should be displayed inside or outside the image + if ($inside) + { + + // Create new blank image with sizes. + $final = imagecreatetruecolor($this->width, $this->height); + + imagecopymerge($final, $this->imageResized, 0, 0, 0, $reflectionHeight, $this->width, $this->height - $reflectionHeight, 100); + imagecopymerge($final, $im, 0, $this->height - $reflectionHeight, 0, 0, $x, $y, 100); + + } + else + { + + // Create new blank image with sizes. + $final = imagecreatetruecolor($this->width, $this->height + $y); + + imagecopymerge($final, $this->imageResized, 0, 0, 0, 0, $this->width, $this->height, 100); + imagecopymerge($final, $im, 0, $this->height, 0, 0, $x, $y, 100); + } + + $this->imageResized = $final; + + imagedestroy($li); + imagedestroy($im); + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Rotate +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function rotate($value = 90, $bgColor = 'transparent') + # Author: Jarrod Oberto + # Date: 07-05-2011 + # Purpose: Rotate image + # Param in: (mixed) $degrees: (int) number of degress to rotate image + # (str) param "left": rotate left + # (str) param "right": rotate right + # (str) param "upside": upside-down image + # Param out: + # Reference: + # Notes: The default direction of imageRotate() is counter clockwise. + # + { + if ($this->imageResized) + { + + if (is_integer($value)) + { + $degrees = $value; + } + + // *** Convert color + $rgbArray = $this->formatColor($bgColor); + $r = $rgbArray['r']; + $g = $rgbArray['g']; + $b = $rgbArray['b']; + if (isset($rgbArray['a'])) + { + $a = $rgbArray['a']; + } + + if (is_string($value)) + { + + $value = fix_strtolower($value); + + switch ($value) + { + case 'left': + $degrees = 90; + break; + case 'right': + $degrees = 270; + break; + case 'upside': + $degrees = 180; + break; + default: + break; + } + + } + + // *** The default direction of imageRotate() is counter clockwise + // * This makes it clockwise + $degrees = 360 - $degrees; + + // *** Create background color + $bg = ImageColorAllocateAlpha($this->imageResized, $r, $g, $b, $a); + + // *** Fill with background + ImageFill($this->imageResized, 0, 0, $bg); + + // *** Rotate + $this->imageResized = imagerotate($this->imageResized, $degrees, $bg); // Rotate 45 degrees and allocated the transparent colour as the one to make transparent (obviously) + + // Ensure alpha transparency + ImageSaveAlpha($this->imageResized, true); + + } + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Round corners +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function roundCorners($radius = 5, $bgColor = 'transparent') + # Author: Jarrod Oberto + # Date: 19-05-2011 + # Purpose: Create rounded corners on your image + # Param in: (int) radius = the amount of curvature + # (mixed) $bgColor = the corner background color + # Param out: n/a + # Reference: + # Notes: + # + { + + // *** Check if the user wants transparency + $isTransparent = false; + if ( ! is_array($bgColor)) + { + if (fix_strtolower($bgColor) == 'transparent') + { + $isTransparent = true; + } + } + + + // *** If we use transparency, we need to color our curved mask with a unique color + if ($isTransparent) + { + $bgColor = $this->findUnusedGreen(); + } + + // *** Convert color + $rgbArray = $this->formatColor($bgColor); + $r = $rgbArray['r']; + $g = $rgbArray['g']; + $b = $rgbArray['b']; + if (isset($rgbArray['a'])) + { + $a = $rgbArray['a']; + } + + + // *** Create top-left corner mask (square) + $cornerImg = imagecreatetruecolor($radius, $radius); + //$cornerImg = imagecreate($radius, $radius); + + //imagealphablending($cornerImg, true); + //imagesavealpha($cornerImg, true); + + //imagealphablending($this->imageResized, false); + //imagesavealpha($this->imageResized, true); + + // *** Give it a color + $maskColor = imagecolorallocate($cornerImg, 0, 0, 0); + + + // *** Replace the mask color (black) to transparent + imagecolortransparent($cornerImg, $maskColor); + + + // *** Create the image background color + $imagebgColor = imagecolorallocate($cornerImg, $r, $g, $b); + + + // *** Fill the corner area to the user defined color + imagefill($cornerImg, 0, 0, $imagebgColor); + + + imagefilledellipse($cornerImg, $radius, $radius, $radius * 2, $radius * 2, $maskColor); + + + // *** Map to top left corner + imagecopymerge($this->imageResized, $cornerImg, 0, 0, 0, 0, $radius, $radius, 100); #tl + + // *** Map rounded corner to other corners by rotating and applying the mask + $cornerImg = imagerotate($cornerImg, 90, 0); + imagecopymerge($this->imageResized, $cornerImg, 0, $this->height - $radius, 0, 0, $radius, $radius, 100); #bl + + $cornerImg = imagerotate($cornerImg, 90, 0); + imagecopymerge($this->imageResized, $cornerImg, $this->width - $radius, $this->height - $radius, 0, 0, $radius, $radius, 100); #br + + $cornerImg = imagerotate($cornerImg, 90, 0); + imagecopymerge($this->imageResized, $cornerImg, $this->width - $radius, 0, 0, 0, $radius, $radius, 100); #tr + + + // *** If corners are to be transparent, we fill our chromakey color as transparent. + if ($isTransparent) + { + //imagecolortransparent($this->imageResized, $imagebgColor); + $this->imageResized = $this->transparentImage($this->imageResized); + imagesavealpha($this->imageResized, true); + } + + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Shadow +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function addShadow($shadowAngle = 45, $blur = 15, $bgColor = 'transparent') + # + # Author: Jarrod Oberto (Adapted from Pascal Naidon) + # Ref: http://www.les-stooges.org/pascal/webdesign/vignettes/index.php?la=en + # Purpose: Add a drop shadow to your image + # Params in: (int) $angle: the angle of the shadow + # (int) $blur: the blur distance + # (mixed) $bgColor: the color of the background + # Params out: + # Notes: + # + { + // *** A higher number results in a smoother shadow + define('STEPS', $blur * 2); + + // *** Set the shadow distance + $shadowDistance = $blur * 0.25; + + // *** Set blur width and height + $blurWidth = $blurHeight = $blur; + + + if ($shadowAngle == 0) + { + $distWidth = 0; + $distHeight = 0; + } + else + { + $distWidth = $shadowDistance * cos(deg2rad($shadowAngle)); + $distHeight = $shadowDistance * sin(deg2rad($shadowAngle)); + } + + + // *** Convert color + if (fix_strtolower($bgColor) != 'transparent') + { + $rgbArray = $this->formatColor($bgColor); + $r0 = $rgbArray['r']; + $g0 = $rgbArray['g']; + $b0 = $rgbArray['b']; + } + + + $image = $this->imageResized; + $width = $this->width; + $height = $this->height; + + + $newImage = imagecreatetruecolor($width, $height); + imagecopyresampled($newImage, $image, 0, 0, 0, 0, $width, $height, $width, $height); + + + // *** RGB + $rgb = imagecreatetruecolor($width + $blurWidth, $height + $blurHeight); + $colour = imagecolorallocate($rgb, 0, 0, 0); + imagefilledrectangle($rgb, 0, 0, $width + $blurWidth, $height + $blurHeight, $colour); + $colour = imagecolorallocate($rgb, 255, 255, 255); + //imagefilledrectangle($rgb, $blurWidth*0.5-$distWidth, $blurHeight*0.5-$distHeight, $width+$blurWidth*0.5-$distWidth, $height+$blurWidth*0.5-$distHeight, $colour); + imagefilledrectangle($rgb, $blurWidth * 0.5 - $distWidth, $blurHeight * 0.5 - $distHeight, $width + $blurWidth * 0.5 - $distWidth, $height + $blurWidth * 0.5 - $distHeight, $colour); + //imagecopymerge($rgb, $newImage, 1+$blurWidth*0.5-$distWidth, 1+$blurHeight*0.5-$distHeight, 0,0, $width, $height, 100); + imagecopymerge($rgb, $newImage, $blurWidth * 0.5 - $distWidth, $blurHeight * 0.5 - $distHeight, 0, 0, $width + $blurWidth, $height + $blurHeight, 100); + + + // *** Shadow (alpha) + $shadow = imagecreatetruecolor($width + $blurWidth, $height + $blurHeight); + imagealphablending($shadow, false); + $colour = imagecolorallocate($shadow, 0, 0, 0); + imagefilledrectangle($shadow, 0, 0, $width + $blurWidth, $height + $blurHeight, $colour); + + + for ($i = 0; $i <= STEPS; $i++) + { + + $t = ((1.0 * $i) / STEPS); + $intensity = 255 * $t * $t; + + $colour = imagecolorallocate($shadow, $intensity, $intensity, $intensity); + $points = [ + $blurWidth * $t, $blurHeight, // Point 1 (x, y) + $blurWidth, $blurHeight * $t, // Point 2 (x, y) + $width, $blurHeight * $t, // Point 3 (x, y) + $width + $blurWidth * (1 - $t), $blurHeight, // Point 4 (x, y) + $width + $blurWidth * (1 - $t), $height, // Point 5 (x, y) + $width, $height + $blurHeight * (1 - $t), // Point 6 (x, y) + $blurWidth, $height + $blurHeight * (1 - $t), // Point 7 (x, y) + $blurWidth * $t, $height // Point 8 (x, y) + ]; + imagepolygon($shadow, $points, 8, $colour); + } + + for ($i = 0; $i <= STEPS; $i++) + { + + $t = ((1.0 * $i) / STEPS); + $intensity = 255 * $t * $t; + + $colour = imagecolorallocate($shadow, $intensity, $intensity, $intensity); + imagefilledarc($shadow, $blurWidth - 1, $blurHeight - 1, 2 * (1 - $t) * $blurWidth, 2 * (1 - $t) * $blurHeight, 180, 268, $colour, IMG_ARC_PIE); + imagefilledarc($shadow, $width, $blurHeight - 1, 2 * (1 - $t) * $blurWidth, 2 * (1 - $t) * $blurHeight, 270, 358, $colour, IMG_ARC_PIE); + imagefilledarc($shadow, $width, $height, 2 * (1 - $t) * $blurWidth, 2 * (1 - $t) * $blurHeight, 0, 90, $colour, IMG_ARC_PIE); + imagefilledarc($shadow, $blurWidth - 1, $height, 2 * (1 - $t) * $blurWidth, 2 * (1 - $t) * $blurHeight, 90, 180, $colour, IMG_ARC_PIE); + } + + + $colour = imagecolorallocate($shadow, 255, 255, 255); + imagefilledrectangle($shadow, $blurWidth, $blurHeight, $width, $height, $colour); + imagefilledrectangle($shadow, $blurWidth * 0.5 - $distWidth, $blurHeight * 0.5 - $distHeight, $width + $blurWidth * 0.5 - 1 - $distWidth, $height + $blurHeight * 0.5 - 1 - $distHeight, $colour); + + + // *** The magic + imagealphablending($rgb, false); + + for ($theX = 0; $theX < imagesx($rgb); $theX++) + { + for ($theY = 0; $theY < imagesy($rgb); $theY++) + { + + // *** Get the RGB values for every pixel of the RGB image + $colArray = imagecolorat($rgb, $theX, $theY); + $r = ($colArray >> 16) & 0xFF; + $g = ($colArray >> 8) & 0xFF; + $b = $colArray & 0xFF; + + // *** Get the alpha value for every pixel of the shadow image + $colArray = imagecolorat($shadow, $theX, $theY); + $a = $colArray & 0xFF; + $a = 127 - floor($a / 2); + $t = $a / 128.0; + + // *** Create color + if (fix_strtolower($bgColor) == 'transparent') + { + $myColour = imagecolorallocatealpha($rgb, $r, $g, $b, $a); + } + else + { + $myColour = imagecolorallocate($rgb, $r * (1.0 - $t) + $r0 * $t, $g * (1.0 - $t) + $g0 * $t, $b * (1.0 - $t) + $b0 * $t); + } + + // *** Add color to new rgb image + imagesetpixel($rgb, $theX, $theY, $myColour); + } + } + + imagealphablending($rgb, true); + imagesavealpha($rgb, true); + + $this->imageResized = $rgb; + + imagedestroy($image); + imagedestroy($newImage); + imagedestroy($shadow); + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Add Caption Box +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function addCaptionBox($side = 'b', $thickness = 50, $padding = 0, $bgColor = '#000', $transaprencyAmount = 30) + # + # Author: Jarrod Oberto + # Date: 26 May 2011 + # Purpose: Add a caption box + # Params in: (str) $side: the side to add the caption box (t, r, b, or l). + # (int) $thickness: how thick you want the caption box to be. + # (mixed) $bgColor: The color of the caption box. + # (int) $transaprencyAmount: The amount of transparency to be + # applied. + # Params out: n/a + # Notes: + # + { + $side = fix_strtolower($side); + + // *** Convert color + $rgbArray = $this->formatColor($bgColor); + $r = $rgbArray['r']; + $g = $rgbArray['g']; + $b = $rgbArray['b']; + + $positionArray = $this->calculateCaptionBoxPosition($side, $thickness, $padding); + + // *** Store incase we want to use method addTextToCaptionBox() + $this->captionBoxPositionArray = $positionArray; + + + $transaprencyAmount = $this->invertTransparency($transaprencyAmount, 127, false); + $transparent = imagecolorallocatealpha($this->imageResized, $r, $g, $b, $transaprencyAmount); + imagefilledrectangle($this->imageResized, $positionArray['x1'], $positionArray['y1'], $positionArray['x2'], $positionArray['y2'], $transparent); + } + + ## -------------------------------------------------------- + + public function addTextToCaptionBox($text, $fontColor = '#fff', $fontSize = 12, $angle = 0, $font = null) + # + # Author: Jarrod Oberto + # Date: 03 Aug 11 + # Purpose: Simplify adding text to a caption box by automatically + # locating the center of the caption box + # Params in: The usually text paams (less a couple) + # Params out: n/a + # Notes: + # + { + + // *** Get the caption box measurements + if (count($this->captionBoxPositionArray) == 4) + { + $x1 = $this->captionBoxPositionArray['x1']; + $x2 = $this->captionBoxPositionArray['x2']; + $y1 = $this->captionBoxPositionArray['y1']; + $y2 = $this->captionBoxPositionArray['y2']; + } + else + { + if ($this->debug) + { + throw new Exception('No caption box found.'); + } + else + { + return false; + } + } + + + // *** Get text font + $font = $this->getTextFont($font); + + // *** Get text size + $textSizeArray = $this->getTextSize($fontSize, $angle, $font, $text); + $textWidth = $textSizeArray['width']; + $textHeight = $textSizeArray['height']; + + // *** Find the width/height middle points + $boxXMiddle = (($x2 - $x1) / 2); + $boxYMiddle = (($y2 - $y1) / 2); + + // *** Box middle - half the text width/height + $xPos = ($x1 + $boxXMiddle) - ($textWidth / 2); + $yPos = ($y1 + $boxYMiddle) - ($textHeight / 2); + + $pos = $xPos . 'x' . $yPos; + + $this->addText($text, $pos, $padding = 0, $fontColor, $fontSize, $angle, $font); + + } + + ## -------------------------------------------------------- + + private function calculateCaptionBoxPosition($side, $thickness, $padding) + { + $positionArray = []; + + switch ($side) + { + case 't': + $positionArray['x1'] = 0; + $positionArray['y1'] = $padding; + $positionArray['x2'] = $this->width; + $positionArray['y2'] = $thickness + $padding; + break; + case 'r': + $positionArray['x1'] = $this->width - $thickness - $padding; + $positionArray['y1'] = 0; + $positionArray['x2'] = $this->width - $padding; + $positionArray['y2'] = $this->height; + break; + case 'b': + $positionArray['x1'] = 0; + $positionArray['y1'] = $this->height - $thickness - $padding; + $positionArray['x2'] = $this->width; + $positionArray['y2'] = $this->height - $padding; + break; + case 'l': + $positionArray['x1'] = $padding; + $positionArray['y1'] = 0; + $positionArray['x2'] = $thickness + $padding; + $positionArray['y2'] = $this->height; + break; + + default: + break; + } + + return $positionArray; + + } + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Get EXIF Data +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function getExif($debug = false) + # Author: Jarrod Oberto + # Date: 07-05-2011 + # Purpose: Get image EXIF data + # Param in: n/a + # Param out: An associate array of EXIF data + # Reference: + # Notes: + # 23 May 13 : added orientation flag -jco + # + { + + if ( ! $this->debug || ! $debug) + { + $debug = false; + } + + // *** Check all is good - check the EXIF library exists and the file exists, too. + if ( ! $this->testEXIFInstalled()) + { + if ($debug) + { + throw new Exception('The EXIF Library is not installed.'); + } + else + { + return []; + } + } + if ( ! file_exists($this->fileName)) + { + if ($debug) + { + throw new Exception('Image not found.'); + } + else + { + return []; + } + } + if ($this->fileExtension != '.jpg') + { + if ($debug) + { + throw new Exception('Metadata not supported for this image type.'); + } + else + { + return []; + } + } + $exifData = exif_read_data($this->fileName, 'IFD0'); + + // *** Format the apperture value + $ev = $exifData['ApertureValue']; + $apPeicesArray = explode('/', $ev); + if (count($apPeicesArray) == 2) + { + $apertureValue = round($apPeicesArray[0] / $apPeicesArray[1], 2, PHP_ROUND_HALF_DOWN) . ' EV'; + } + else + { + $apertureValue = ''; + } + + // *** Format the focal length + $focalLength = $exifData['FocalLength']; + $flPeicesArray = explode('/', $focalLength); + if (count($flPeicesArray) == 2) + { + $focalLength = $flPeicesArray[0] / $flPeicesArray[1] . '.0 mm'; + } + else + { + $focalLength = ''; + } + + // *** Format fNumber + $fNumber = $exifData['FNumber']; + $fnPeicesArray = explode('/', $fNumber); + if (count($fnPeicesArray) == 2) + { + $fNumber = $fnPeicesArray[0] / $fnPeicesArray[1]; + } + else + { + $fNumber = ''; + } + + // *** Resolve ExposureProgram + if (isset($exifData['ExposureProgram'])) + { + $ep = $exifData['ExposureProgram']; + } + if (isset($ep)) + { + $ep = $this->resolveExposureProgram($ep); + } + + + // *** Resolve MeteringMode + $mm = $exifData['MeteringMode']; + $mm = $this->resolveMeteringMode($mm); + + // *** Resolve Flash + $flash = $exifData['Flash']; + $flash = $this->resolveFlash($flash); + + + if (isset($exifData['Make'])) + { + $exifDataArray['make'] = $exifData['Make']; + } + else + { + $exifDataArray['make'] = ''; + } + + if (isset($exifData['Model'])) + { + $exifDataArray['model'] = $exifData['Model']; + } + else + { + $exifDataArray['model'] = ''; + } + + if (isset($exifData['DateTime'])) + { + $exifDataArray['date'] = $exifData['DateTime']; + } + else + { + $exifDataArray['date'] = ''; + } + + if (isset($exifData['ExposureTime'])) + { + $exifDataArray['exposure time'] = $exifData['ExposureTime'] . ' sec.'; + } + else + { + $exifDataArray['exposure time'] = ''; + } + + if ($apertureValue != '') + { + $exifDataArray['aperture value'] = $apertureValue; + } + else + { + $exifDataArray['aperture value'] = ''; + } + + if (isset($exifData['COMPUTED']['ApertureFNumber'])) + { + $exifDataArray['f-stop'] = $exifData['COMPUTED']['ApertureFNumber']; + } + else + { + $exifDataArray['f-stop'] = ''; + } + + if (isset($exifData['FNumber'])) + { + $exifDataArray['fnumber'] = $exifData['FNumber']; + } + else + { + $exifDataArray['fnumber'] = ''; + } + + if ($fNumber != '') + { + $exifDataArray['fnumber value'] = $fNumber; + } + else + { + $exifDataArray['fnumber value'] = ''; + } + + if (isset($exifData['ISOSpeedRatings'])) + { + $exifDataArray['iso'] = $exifData['ISOSpeedRatings']; + } + else + { + $exifDataArray['iso'] = ''; + } + + if ($focalLength != '') + { + $exifDataArray['focal length'] = $focalLength; + } + else + { + $exifDataArray['focal length'] = ''; + } + + if (isset($ep)) + { + $exifDataArray['exposure program'] = $ep; + } + else + { + $exifDataArray['exposure program'] = ''; + } + + if ($mm != '') + { + $exifDataArray['metering mode'] = $mm; + } + else + { + $exifDataArray['metering mode'] = ''; + } + + if ($flash != '') + { + $exifDataArray['flash status'] = $flash; + } + else + { + $exifDataArray['flash status'] = ''; + } + + if (isset($exifData['Artist'])) + { + $exifDataArray['creator'] = $exifData['Artist']; + } + else + { + $exifDataArray['creator'] = ''; + } + + if (isset($exifData['Copyright'])) + { + $exifDataArray['copyright'] = $exifData['Copyright']; + } + else + { + $exifDataArray['copyright'] = ''; + } + + // *** Orientation + if (isset($exifData['Orientation'])) + { + $exifDataArray['orientation'] = $exifData['Orientation']; + } + else + { + $exifDataArray['orientation'] = ''; + } + + return $exifDataArray; + } + + ## -------------------------------------------------------- + + private function resolveExposureProgram($ep) + { + switch ($ep) + { + case 0: + $ep = ''; + break; + case 1: + $ep = 'manual'; + break; + case 2: + $ep = 'normal program'; + break; + case 3: + $ep = 'aperture priority'; + break; + case 4: + $ep = 'shutter priority'; + break; + case 5: + $ep = 'creative program'; + break; + case 6: + $ep = 'action program'; + break; + case 7: + $ep = 'portrait mode'; + break; + case 8: + $ep = 'landscape mode'; + break; + + default: + break; + } + + return $ep; + } + + ## -------------------------------------------------------- + + private function resolveMeteringMode($mm) + { + switch ($mm) + { + case 0: + $mm = 'unknown'; + break; + case 1: + $mm = 'average'; + break; + case 2: + $mm = 'center weighted average'; + break; + case 3: + $mm = 'spot'; + break; + case 4: + $mm = 'multi spot'; + break; + case 5: + $mm = 'pattern'; + break; + case 6: + $mm = 'partial'; + break; + case 255: + $mm = 'other'; + break; + + default: + break; + } + + return $mm; + } + + ## -------------------------------------------------------- + + private function resolveFlash($flash) + { + switch ($flash) + { + case 0: + $flash = 'flash did not fire'; + break; + case 1: + $flash = 'flash fired'; + break; + case 5: + $flash = 'strobe return light not detected'; + break; + case 7: + $flash = 'strobe return light detected'; + break; + case 9: + $flash = 'flash fired, compulsory flash mode'; + break; + case 13: + $flash = 'flash fired, compulsory flash mode, return light not detected'; + break; + case 15: + $flash = 'flash fired, compulsory flash mode, return light detected'; + break; + case 16: + $flash = 'flash did not fire, compulsory flash mode'; + break; + case 24: + $flash = 'flash did not fire, auto mode'; + break; + case 25: + $flash = 'flash fired, auto mode'; + break; + case 29: + $flash = 'flash fired, auto mode, return light not detected'; + break; + case 31: + $flash = 'flash fired, auto mode, return light detected'; + break; + case 32: + $flash = 'no flash function'; + break; + case 65: + $flash = 'flash fired, red-eye reduction mode'; + break; + case 69: + $flash = 'flash fired, red-eye reduction mode, return light not detected'; + break; + case 71: + $flash = 'flash fired, red-eye reduction mode, return light detected'; + break; + case 73: + $flash = 'flash fired, compulsory flash mode, red-eye reduction mode'; + break; + case 77: + $flash = 'flash fired, compulsory flash mode, red-eye reduction mode, return light not detected'; + break; + case 79: + $flash = 'flash fired, compulsory flash mode, red-eye reduction mode, return light detected'; + break; + case 89: + $flash = 'flash fired, auto mode, red-eye reduction mode'; + break; + case 93: + $flash = 'flash fired, auto mode, return light not detected, red-eye reduction mode'; + break; + case 95: + $flash = 'flash fired, auto mode, return light detected, red-eye reduction mode'; + break; + + default: + break; + } + + return $flash; + + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Get IPTC Data +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Write IPTC Data +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function writeIPTCcaption($value) + # Caption + { + $this->writeIPTC(120, $value); + } + + ## -------------------------------------------------------- + + public function writeIPTCwriter($value) + { + //$this->writeIPTC(65, $value); + } + + ## -------------------------------------------------------- + + private function writeIPTC($dat, $value) + { + + # LIMIT TO JPG + + $caption_block = $this->iptc_maketag(2, $dat, $value); + $image_string = iptcembed($caption_block, $this->fileName); + file_put_contents('iptc.jpg', $image_string); + } + +## -------------------------------------------------------- + + private function iptc_maketag($rec, $dat, $val) + # Author: Thies C. Arntzen + # Purpose: Function to format the new IPTC text + # Param in: $rec: Application record. (We’re working with #2) + # $dat: Index. (120 for caption, 118 for contact. See the IPTC IIM + # specification: + # http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf + # $val: Value/data/text. Make sure this is within the length + # constraints of the IPTC IIM specification + # Ref: http://blog.peterhaza.no/working-with-image-meta-data-in-exif-and-iptc-headers-from-php/ + # http://php.net/manual/en/function.iptcembed.php + # + { + $len = strlen($val); + if ($len < 0x8000) + { + return chr(0x1c) . chr($rec) . chr($dat) . + chr($len >> 8) . + chr($len & 0xff) . + $val; + } + else + { + return chr(0x1c) . chr($rec) . chr($dat) . + chr(0x80) . chr(0x04) . + chr(($len >> 24) & 0xff) . + chr(($len >> 16) & 0xff) . + chr(($len >> 8) & 0xff) . + chr(($len) & 0xff) . + $val; + } + } + + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Write XMP Data +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + //http://xmpphptoolkit.sourceforge.net/ + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Add Text +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function addText($text, $pos = '20x20', $padding = 0, $fontColor = '#fff', $fontSize = 12, $angle = 0, $font = null) + # Author: Jarrod Oberto + # Date: 18-11-09 + # Purpose: Add text to an image + # Param in: + # Param out: + # Reference: http://php.net/manual/en/function.imagettftext.php + # Notes: Make sure you supply the font. + # + { + + // *** Convert color + $rgbArray = $this->formatColor($fontColor); + $r = $rgbArray['r']; + $g = $rgbArray['g']; + $b = $rgbArray['b']; + + // *** Get text font + $font = $this->getTextFont($font); + + // *** Get text size + $textSizeArray = $this->getTextSize($fontSize, $angle, $font, $text); + $textWidth = $textSizeArray['width']; + $textHeight = $textSizeArray['height']; + + // *** Find co-ords to place text + $posArray = $this->calculatePosition($pos, $padding, $textWidth, $textHeight, false); + $x = $posArray['width']; + $y = $posArray['height']; + + $fontColor = imagecolorallocate($this->imageResized, $r, $g, $b); + + // *** Add text + imagettftext($this->imageResized, $fontSize, $angle, $x, $y, $fontColor, $font, $text); + } + + ## -------------------------------------------------------- + + private function getTextFont($font) + { + // *** Font path (shou + $fontPath = dirname(__FILE__) . '/' . $this->fontDir; + + + // *** The below is/may be needed depending on your version (see ref) + putenv('GDFONTPATH=' . realpath('.')); + + // *** Check if the passed in font exsits... + if ($font == null || ! file_exists($font)) + { + + // *** ...If not, default to this font. + $font = $fontPath . '/arimo.ttf'; + + // *** Check our default font exists... + if ( ! file_exists($font)) + { + + // *** If not, return false + if ($this->debug) + { + throw new Exception('Font not found'); + } + else + { + return false; + } + } + } + + return $font; + + } + + ## -------------------------------------------------------- + + private function getTextSize($fontSize, $angle, $font, $text) + { + + // *** Define box (so we can get the width) + $box = @imageTTFBbox($fontSize, $angle, $font, $text); + + // *** Get width of text from dimensions + $textWidth = abs($box[4] - $box[0]); + + // *** Get height of text from dimensions (should also be same as $fontSize) + $textHeight = abs($box[5] - $box[1]); + + return ['height' => $textHeight, 'width' => $textWidth]; + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Add Watermark +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function addWatermark($watermarkImage, $pos, $padding = 0, $opacity = 0) + # Author: Jarrod Oberto + # Date: 18-11-09 + # Purpose: Add watermark image + # Param in: (str) $watermark: The watermark image + # (str) $pos: Could be a pre-determined position such as: + # tl = top left, + # t = top (middle), + # tr = top right, + # l = left, + # m = middle, + # r = right, + # bl = bottom left, + # b = bottom (middle), + # br = bottom right + # Or, it could be a co-ordinate position such as: 50x100 + # + # (int) $padding: If using a pre-determined position you can + # adjust the padding from the edges by passing an amount + # in pixels. If using co-ordinates, this value is ignored. + # Param out: + # Reference: http://www.php.net/manual/en/image.examples-watermark.php + # Notes: Based on example in reference. + # + # + { + + // Load the stamp and the photo to apply the watermark to + $stamp = $this->openImage($watermarkImage); # stamp + $im = $this->imageResized; # photo + + // *** Get stamps width and height + $sx = imagesx($stamp); + $sy = imagesy($stamp); + + // *** Find co-ords to place image + $posArray = $this->calculatePosition($pos, $padding, $sx, $sy); + $x = $posArray['width']; + $y = $posArray['height']; + + // *** Set watermark opacity + if (fix_strtolower(strrchr($watermarkImage, '.')) == '.png') + { + + $opacity = $this->invertTransparency($opacity, 100); + $this->filterOpacity($stamp, $opacity); + } + + // Copy the watermark image onto our photo + imagecopy($im, $stamp, $x, $y, 0, 0, imagesx($stamp), imagesy($stamp)); + + } + + ## -------------------------------------------------------- + + private function calculatePosition($pos, $padding, $assetWidth, $assetHeight, $upperLeft = true) + # + # Author: Jarrod Oberto + # Date: 08-05-11 + # Purpose: Calculate the x, y pixel cordinates of the asset to place + # Params in: (str) $pos: Either something like: "tl", "l", "br" or an + # exact position like: "100x50" + # (int) $padding: The amount of padding from the edge. Only + # used for the predefined $pos. + # (int) $assetWidth: The width of the asset to add to the image + # (int) $assetHeight: The height of the asset to add to the image + # (bol) $upperLeft: if true, the asset will be positioned based + # on the upper left x, y coords. If false, it means you're + # using the lower left as the basepoint and this will + # convert it to the upper left position + # Params out: + # NOTE: this is done from the UPPER left corner!! But will convert lower + # left basepoints to upper left if $upperleft is set to false + # + # + { + $pos = fix_strtolower($pos); + + // *** If co-ords have been entered + if (strstr($pos, 'x')) + { + $pos = str_replace(' ', '', $pos); + + $xyArray = explode('x', $pos); + list($width, $height) = $xyArray; + + } + else + { + + switch ($pos) + { + case 'tl': + $width = 0 + $padding; + $height = 0 + $padding; + break; + + case 't': + $width = ($this->width / 2) - ($assetWidth / 2); + $height = 0 + $padding; + break; + + case 'tr': + $width = $this->width - $assetWidth - $padding; + $height = 0 + $padding; + break; + + case 'l': + $width = 0 + $padding; + $height = ($this->height / 2) - ($assetHeight / 2); + break; + + case 'm': + $width = ($this->width / 2) - ($assetWidth / 2); + $height = ($this->height / 2) - ($assetHeight / 2); + break; + + case 'r': + $width = $this->width - $assetWidth - $padding; + $height = ($this->height / 2) - ($assetHeight / 2); + break; + + case 'bl': + $width = 0 + $padding; + $height = $this->height - $assetHeight - $padding; + break; + + case 'b': + $width = ($this->width / 2) - ($assetWidth / 2); + $height = $this->height - $assetHeight - $padding; + break; + + case 'br': + $width = $this->width - $assetWidth - $padding; + $height = $this->height - $assetHeight - $padding; + break; + + default: + $width = 0; + $height = 0; + break; + } + } + + if ( ! $upperLeft) + { + $height = $height + $assetHeight; + } + + return ['width' => $width, 'height' => $height]; + } + + + ## -------------------------------------------------------- + + private function filterOpacity(&$img, $opacity = 75) + # + # Author: aiden dot mail at freemail dot hu + # Author date: 29-03-08 08:16 + # Date added: 08-05-11 + # Purpose: Change opacity of image + # Params in: $img: Image resource id + # (int) $opacity: the opacity amount: 0-100, 100 being not opaque. + # Params out: (bool) true on success, else false + # Ref: http://www.php.net/manual/en/function.imagefilter.php#82162 + # Notes: png only + # + { + + if ( ! isset($opacity)) + { + return false; + } + + if ($opacity == 100) + { + return true; + } + + $opacity /= 100; + + //get image width and height + $w = imagesx($img); + $h = imagesy($img); + + //turn alpha blending off + imagealphablending($img, false); + + //find the most opaque pixel in the image (the one with the smallest alpha value) + $minalpha = 127; + for ($x = 0; $x < $w; $x++) + { + for ($y = 0; $y < $h; $y++) + { + $alpha = (imagecolorat($img, $x, $y) >> 24) & 0xFF; + if ($alpha < $minalpha) + { + $minalpha = $alpha; + } + } + } + + //loop through image pixels and modify alpha for each + for ($x = 0; $x < $w; $x++) + { + for ($y = 0; $y < $h; $y++) + { + //get current alpha value (represents the TANSPARENCY!) + $colorxy = imagecolorat($img, $x, $y); + $alpha = ($colorxy >> 24) & 0xFF; + //calculate new alpha + if ($minalpha !== 127) + { + $alpha = 127 + 127 * $opacity * ($alpha - 127) / (127 - $minalpha); + } + else + { + $alpha += 127 * $opacity; + } + //get the color index with new alpha + $alphacolorxy = imagecolorallocatealpha($img, ($colorxy >> 16) & 0xFF, ($colorxy >> 8) & 0xFF, $colorxy & 0xFF, $alpha); + //set pixel with the new color + opacity + if ( ! imagesetpixel($img, $x, $y, $alphacolorxy)) + { + + return false; + } + } + } + + return true; + } + +## -------------------------------------------------------- + + private function openImage($file) + # Author: Jarrod Oberto + # Date: 27-02-08 + # Purpose: + # Param in: + # Param out: n/a + # Reference: + # Notes: + # + { + + if ( ! file_exists($file) && ! $this->checkStringStartsWith('http://', $file) && ! $this->checkStringStartsWith('https://', $file) ) + { + if ($this->debug) + { + throw new Exception('Image not found.'); + } + else + { + throw new Exception(); + } + } + + // *** Get extension / image type + $extension = mime_content_type($file); + $extension = fix_strtolower($extension); + $extension = str_replace('image/', '', $extension); + switch ($extension) + { + case 'jpg': + case 'jpeg': + $img = @imagecreatefromjpeg($file); + break; + case 'webp': + $img = @imagecreatefromwebp($file); + break; + case 'gif': + $img = @imagecreatefromgif($file); + break; + case 'png': + $img = @imagecreatefrompng($file); + break; + case 'bmp': + case 'x-ms-bmp': + $img = @$this->imagecreatefrombmp($file); + break; + case 'psd': + case 'vnd.adobe.photoshop': + $img = @$this->imagecreatefrompsd($file); + break; + + + // ... etc + + default: + $img = false; + break; + } + + return $img; + } + +## -------------------------------------------------------- + + public function reset() + # + # Author: Jarrod Oberto + # Date: 30-08-11 + # Purpose: Reset the resource (allow further editing) + # Params in: + # Params out: + # Notes: + # + { + $this->__construct($this->fileName); + } + +## -------------------------------------------------------- + + public function saveImage($savePath, $imageQuality = "100") + # Author: Jarrod Oberto + # Date: 27-02-08 + # Purpose: Saves the image + # Param in: $savePath: Where to save the image including filename: + # $imageQuality: image quality you want the image saved at 0-100 + # Param out: n/a + # Reference: + # Notes: * gif doesn't have a quality parameter + # * jpg has a quality setting 0-100 (100 being the best) + # * webp has a quality setting 0-100 (100 being the best) + # * png has a quality setting 0-9 (0 being the best) + # + # * bmp files have no native support for bmp files. We use a + # third party class to save as bmp. + { + + // *** Perform a check or two. + if (! is_resource($this->imageResized) && ! $this->imageResized instanceof \GdImage) + { + if ($this->debug) + { + throw new Exception('saveImage: This is not a resource.'); + } + else + { + throw new Exception(); + } + } + $fileInfoArray = pathInfo($savePath); + clearstatcache(); + if ( ! is_writable($fileInfoArray['dirname'])) + { + if ($this->debug) + { + throw new Exception('The path is not writable. Please check your permissions.'); + } + else + { + throw new Exception(); + } + } + + // *** Get extension + $extension = strrchr($savePath, '.'); + $extension = fix_strtolower($extension); + + $error = ''; + + switch ($extension) + { + case '.jpg': + case '.jpeg': + $this->checkInterlaceImage($this->isInterlace); + if (imagetypes() & IMG_JPG) + { + imagejpeg($this->imageResized, $savePath, $imageQuality); + } + else + { + $error = 'jpg'; + } + break; + + case '.webp': + if (imagetypes() & IMG_WEBP) + { + imagewebp($this->imageResized, $savePath, $imageQuality); + } + else + { + $error = 'webp'; + } + break; + + case '.gif': + $this->checkInterlaceImage($this->isInterlace); + if (imagetypes() & IMG_GIF) + { + imagegif($this->imageResized, $savePath); + } + else + { + $error = 'gif'; + } + break; + + case '.png': + // *** Scale quality from 0-100 to 0-9 + $scaleQuality = round(($imageQuality / 100) * 9); + + // *** Invert qualit setting as 0 is best, not 9 + $invertScaleQuality = 9 - $scaleQuality; + + $this->checkInterlaceImage($this->isInterlace); + if (imagetypes() & IMG_PNG) + { + imagepng($this->imageResized, $savePath, $invertScaleQuality); + } + else + { + $error = 'png'; + } + break; + + case '.bmp': + file_put_contents($savePath, $this->GD2BMPstring($this->imageResized)); + break; + + + // ... etc + + default: + // *** No extension - No save. + $this->errorArray[] = 'This file type (' . $extension . ') is not supported. File not saved.'; + break; + } + + //imagedestroy($this->imageResized); + + // *** Display error if a file type is not supported. + if ($error != '') + { + $this->errorArray[] = $error . ' support is NOT enabled. File not saved.'; + } + } + +## -------------------------------------------------------- + + public function displayImage($fileType = 'jpg', $imageQuality = "100") + # Author: Jarrod Oberto + # Date: 18-11-09 + # Purpose: Display images directly to the browser + # Param in: The image type you want to display + # Param out: + # Reference: + # Notes: + # + { + + if (! is_resource($this->imageResized) && ! $this->imageResized instanceof \GdImage) + { + if ($this->debug) + { + throw new Exception('saveImage: This is not a resource.'); + } + else + { + throw new Exception(); + } + } + + switch ($fileType) + { + case 'jpg': + case 'jpeg': + header('Content-type: image/jpeg'); + imagejpeg($this->imageResized, '', $imageQuality); + break; + case 'webp': + header('Content-type: image/webp'); + imagewebp($this->imageResized, '', $imageQuality); + break; + case 'gif': + header('Content-type: image/gif'); + imagegif($this->imageResized); + break; + case 'png': + header('Content-type: image/png'); + + // *** Scale quality from 0-100 to 0-9 + $scaleQuality = round(($imageQuality / 100) * 9); + + // *** Invert qualit setting as 0 is best, not 9 + $invertScaleQuality = 9 - $scaleQuality; + + imagepng($this->imageResized, '', $invertScaleQuality); + break; + case 'bmp': + echo 'bmp file format is not supported.'; + break; + + // ... etc + + default: + // *** No extension - No save. + break; + } + + + //imagedestroy($this->imageResized); + } + +## -------------------------------------------------------- + + public function setTransparency($bool) + # Sep 2011 + { + $this->keepTransparency = $bool; + } + +## -------------------------------------------------------- + + public function setFillColor($value) + # Sep 2011 + # Param in: (mixed) $value: (array) Could be an array of RGB + # (str) Could be hex #ffffff or #fff, fff, ffffff + # + # If the keepTransparency is set to false, then no transparency is to be used. + # This is ideal when you want to save as jpg. + # + # this method allows you to set the background color to use instead of + # transparency. + # + { + $colorArray = $this->formatColor($value); + $this->fillColorArray = $colorArray; + } + +## -------------------------------------------------------- + + public function setCropFromTop($value) + # Sep 2011 + { + $this->cropFromTopPercent = $value; + } + +## -------------------------------------------------------- + + public function testGDInstalled() + # Author: Jarrod Oberto + # Date: 27-02-08 + # Purpose: Test to see if GD is installed + # Param in: n/a + # Param out: (bool) True is gd extension loaded otherwise false + # Reference: + # Notes: + # + { + if (extension_loaded('gd') && function_exists('gd_info')) + { + $gdInstalled = true; + } + else + { + $gdInstalled = false; + } + + return $gdInstalled; + } + +## -------------------------------------------------------- + + public function testEXIFInstalled() + # Author: Jarrod Oberto + # Date: 08-05-11 + # Purpose: Test to see if EXIF is installed + # Param in: n/a + # Param out: (bool) True is exif extension loaded otherwise false + # Reference: + # Notes: + # + { + if (extension_loaded('exif')) + { + $exifInstalled = true; + } + else + { + $exifInstalled = false; + } + + return $exifInstalled; + } + +## -------------------------------------------------------- + + public function testIsImage($image) + # Author: Jarrod Oberto + # Date: 27-02-08 + # Purpose: Test if file is an image + # Param in: n/a + # Param out: n/a + # Reference: + # Notes: + # + { + if ($image) + { + $fileIsImage = true; + } + else + { + $fileIsImage = false; + } + + return $fileIsImage; + } + +## -------------------------------------------------------- + + public function testFunct() + # Author: Jarrod Oberto + # Date: 27-02-08 + # Purpose: Test Function + # Param in: n/a + # Param out: n/a + # Reference: + # Notes: + # + { + echo $this->height; + } + +## -------------------------------------------------------- + + public function setForceStretch($value) + # Author: Jarrod Oberto + # Date: 23-12-10 + # Purpose: + # Param in: (bool) $value + # Param out: n/a + # Reference: + # Notes: + # + { + $this->forceStretch = $value; + } + +## -------------------------------------------------------- + + public function setFile($fileName) + # Author: Jarrod Oberto + # Date: 28-02-08 + # Purpose: + # Param in: n/a + # Param out: n/a + # Reference: + # Notes: + # + { + self::__construct($fileName); + } + +## -------------------------------------------------------- + + public function getFileName() + # Author: Jarrod Oberto + # Date: 10-09-08 + # Purpose: + # Param in: n/a + # Param out: n/a + # Reference: + # Notes: + # + { + return $this->fileName; + } + +## -------------------------------------------------------- + + public function getHeight() + { + return $this->height; + } + +## -------------------------------------------------------- + + public function getWidth() + { + return $this->width; + } + +## -------------------------------------------------------- + + public function getOriginalHeight() + { + return $this->heightOriginal; + } + +## -------------------------------------------------------- + + public function getOriginalWidth() + { + return $this->widthOriginal; + } + +## -------------------------------------------------------- + + public function getErrors() + # Author: Jarrod Oberto + # Date: 19-11-09 + # Purpose: Returns the error array + # Param in: n/a + # Param out: Array of errors + # Reference: + # Notes: + # + { + return $this->errorArray; + } + +## -------------------------------------------------------- + + private function checkInterlaceImage($isEnabled) + # jpg will use progressive (they don't use interace) + { + if ($isEnabled) + { + imageinterlace($this->imageResized, $isEnabled); + } + } + +## -------------------------------------------------------- + + protected function formatColor($value) + # Author: Jarrod Oberto + # Date: 09-05-11 + # Purpose: Determine color method passed in and return color as RGB + # Param in: (mixed) $value: (array) Could be an array of RGB + # (str) Could be hex #ffffff or #fff, fff, ffffff + # Param out: + # Reference: + # Notes: + # + { + $rgbArray = []; + + // *** If it's an array it should be R, G, B + if (is_array($value)) + { + + if (key($value) == 0 && count($value) == 3) + { + + $rgbArray['r'] = $value[0]; + $rgbArray['g'] = $value[1]; + $rgbArray['b'] = $value[2]; + + } + else + { + $rgbArray = $value; + } + } + else + { + if (fix_strtolower($value) == 'transparent') + { + + $rgbArray = [ + 'r' => 255, + 'g' => 255, + 'b' => 255, + 'a' => 127 + ]; + + } + else + { + + // *** ...Else it should be hex. Let's make it RGB + $rgbArray = $this->hex2dec($value); + } + } + + return $rgbArray; + } + + ## -------------------------------------------------------- + + function hex2dec($hex) + # Purpose: Convert #hex color to RGB + { + $color = str_replace('#', '', $hex); + + if (strlen($color) == 3) + { + $color = $color . $color; + } + + $rgb = [ + 'r' => hexdec(substr($color, 0, 2)), + 'g' => hexdec(substr($color, 2, 2)), + 'b' => hexdec(substr($color, 4, 2)), + 'a' => 0 + ]; + + return $rgb; + } + + ## -------------------------------------------------------- + + private function createImageColor($colorArray) + { + $r = $colorArray['r']; + $g = $colorArray['g']; + $b = $colorArray['b']; + + return imagecolorallocate($this->imageResized, $r, $g, $b); + } + + ## -------------------------------------------------------- + + private function testColorExists($colorArray) + { + $r = $colorArray['r']; + $g = $colorArray['g']; + $b = $colorArray['b']; + + if (imagecolorexact($this->imageResized, $r, $g, $b) == -1) + { + return false; + } + else + { + return true; + } + } + + ## -------------------------------------------------------- + + private function findUnusedGreen() + # Purpose: We find a green color suitable to use like green-screen effect. + # Therefore, the color must not exist in the image. + { + $green = 255; + + do + { + + $greenChroma = [0, $green, 0]; + $colorArray = $this->formatColor($greenChroma); + $match = $this->testColorExists($colorArray); + $green--; + + } while ($match == false && $green > 0); + + // *** If no match, just bite the bullet and use green value of 255 + if ( ! $match) + { + $greenChroma = [0, $green, 0]; + } + + return $greenChroma; + } + + ## -------------------------------------------------------- + + private function findUnusedBlue() + # Purpose: We find a green color suitable to use like green-screen effect. + # Therefore, the color must not exist in the image. + { + $blue = 255; + + do + { + + $blueChroma = [0, 0, $blue]; + $colorArray = $this->formatColor($blueChroma); + $match = $this->testColorExists($colorArray); + $blue--; + + } while ($match == false && $blue > 0); + + // *** If no match, just bite the bullet and use blue value of 255 + if ( ! $match) + { + $blueChroma = [0, 0, $blue]; + } + + return $blueChroma; + } + + ## -------------------------------------------------------- + + private function invertTransparency($value, $originalMax, $invert = true) + # Purpose: This does two things: + # 1) Convert the range from 0-127 to 0-100 + # 2) Inverts value to 100 is not transparent while 0 is fully + # transparent (like Photoshop) + { + // *** Test max range + if ($value > $originalMax) + { + $value = $originalMax; + } + + // *** Test min range + if ($value < 0) + { + $value = 0; + } + + if ($invert) + { + return $originalMax - (($value / 100) * $originalMax); + } + else + { + return ($value / 100) * $originalMax; + } + } + + ## -------------------------------------------------------- + + private function transparentImage($src) + { + // *** making images with white bg transparent + $r1 = 0; + $g1 = 255; + $b1 = 0; + for ($x = 0; $x < imagesx($src); ++$x) + { + for ($y = 0; $y < imagesy($src); ++$y) + { + $color = imagecolorat($src, $x, $y); + $r = ($color >> 16) & 0xFF; + $g = ($color >> 8) & 0xFF; + $b = $color & 0xFF; + for ($i = 0; $i < 270; $i++) + { + //if ($r . $g . $b == ($r1 + $i) . ($g1 + $i) . ($b1 + $i)) { + if ($r == 0 && $g == 255 && $b == 0) + { + //if ($g == 255) { + $trans_colour = imagecolorallocatealpha($src, 0, 0, 0, 127); + imagefill($src, $x, $y, $trans_colour); + } + } + } + } + + return $src; + } + + ## -------------------------------------------------------- + + function checkStringStartsWith($needle, $haystack) + # Check if a string starts with a specific pattern + { + return (substr($haystack, 0, strlen($needle)) == $needle); + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + BMP SUPPORT (SAVING) - James Heinrich +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + private function GD2BMPstring(&$gd_image) + # Author: James Heinrich + # Purpose: Save file as type bmp + # Param in: The image canvas (passed as ref) + # Param out: + # Reference: + # Notes: This code was stripped out of two external files + # (phpthumb.bmp.php,phpthumb.functions.php) and added below to + # avoid dependancies. + # + { + $imageX = ImageSX($gd_image); + $imageY = ImageSY($gd_image); + + $BMP = ''; + for ($y = ($imageY - 1); $y >= 0; $y--) + { + $thisline = ''; + for ($x = 0; $x < $imageX; $x++) + { + $argb = $this->GetPixelColor($gd_image, $x, $y); + $thisline .= chr($argb['blue']) . chr($argb['green']) . chr($argb['red']); + } + while (strlen($thisline) % 4) + { + $thisline .= "\x00"; + } + $BMP .= $thisline; + } + + $bmpSize = strlen($BMP) + 14 + 40; + // BITMAPFILEHEADER [14 bytes] - http://msdn.microsoft.com/library/en-us/gdi/bitmaps_62uq.asp + $BITMAPFILEHEADER = 'BM'; // WORD bfType; + $BITMAPFILEHEADER .= $this->LittleEndian2String($bmpSize, 4); // DWORD bfSize; + $BITMAPFILEHEADER .= $this->LittleEndian2String(0, 2); // WORD bfReserved1; + $BITMAPFILEHEADER .= $this->LittleEndian2String(0, 2); // WORD bfReserved2; + $BITMAPFILEHEADER .= $this->LittleEndian2String(54, 4); // DWORD bfOffBits; + + // BITMAPINFOHEADER - [40 bytes] http://msdn.microsoft.com/library/en-us/gdi/bitmaps_1rw2.asp + $BITMAPINFOHEADER = $this->LittleEndian2String(40, 4); // DWORD biSize; + $BITMAPINFOHEADER .= $this->LittleEndian2String($imageX, 4); // LONG biWidth; + $BITMAPINFOHEADER .= $this->LittleEndian2String($imageY, 4); // LONG biHeight; + $BITMAPINFOHEADER .= $this->LittleEndian2String(1, 2); // WORD biPlanes; + $BITMAPINFOHEADER .= $this->LittleEndian2String(24, 2); // WORD biBitCount; + $BITMAPINFOHEADER .= $this->LittleEndian2String(0, 4); // DWORD biCompression; + $BITMAPINFOHEADER .= $this->LittleEndian2String(0, 4); // DWORD biSizeImage; + $BITMAPINFOHEADER .= $this->LittleEndian2String(2835, 4); // LONG biXPelsPerMeter; + $BITMAPINFOHEADER .= $this->LittleEndian2String(2835, 4); // LONG biYPelsPerMeter; + $BITMAPINFOHEADER .= $this->LittleEndian2String(0, 4); // DWORD biClrUsed; + $BITMAPINFOHEADER .= $this->LittleEndian2String(0, 4); // DWORD biClrImportant; + + return $BITMAPFILEHEADER . $BITMAPINFOHEADER . $BMP; + } + +## -------------------------------------------------------- + + private function GetPixelColor(&$img, $x, $y) + # Author: James Heinrich + # Purpose: + # Param in: + # Param out: + # Reference: + # Notes: + # + { + if (! is_resource($img) && ! $img instanceof \GdImage) + { + return false; + } + + return @ImageColorsForIndex($img, @ImageColorAt($img, $x, $y)); + } + +## -------------------------------------------------------- + + private function LittleEndian2String($number, $minbytes = 1) + # Author: James Heinrich + # Purpose: BMP SUPPORT (SAVING) + # Param in: + # Param out: + # Reference: + # Notes: + # + { + $intstring = ''; + while ($number > 0) + { + $intstring = $intstring . chr($number & 255); + $number >>= 8; + } + + return str_pad($intstring, $minbytes, "\x00", STR_PAD_RIGHT); + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + BMP SUPPORT (READING) +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + private function ImageCreateFromBMP($filename) + # Author: DHKold + # Date: The 15th of June 2005 + # Version: 2.0B + # Purpose: To create an image from a BMP file. + # Param in: BMP file to open. + # Param out: Return a resource like the other ImageCreateFrom functions + # Reference: http://us3.php.net/manual/en/function.imagecreate.php#53879 + # Bug fix: Author: domelca at terra dot es + # Date: 06 March 2008 + # Fix: Correct 16bit BMP support + # Notes: + # + { + + //Ouverture du fichier en mode binaire + if ( ! $f1 = fopen($filename, "rb")) + { + return false; + } + + //1 : Chargement des ent�tes FICHIER + $FILE = unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset", fread($f1, 14)); + if ($FILE['file_type'] != 19778) + { + return false; + } + + //2 : Chargement des ent�tes BMP + $BMP = unpack('Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel' . + '/Vcompression/Vsize_bitmap/Vhoriz_resolution' . + '/Vvert_resolution/Vcolors_used/Vcolors_important', fread($f1, 40)); + $BMP['colors'] = pow(2, $BMP['bits_per_pixel']); + + if ($BMP['size_bitmap'] == 0) + { + $BMP['size_bitmap'] = $FILE['file_size'] - $FILE['bitmap_offset']; + } + + $BMP['bytes_per_pixel'] = $BMP['bits_per_pixel'] / 8; + $BMP['bytes_per_pixel2'] = ceil($BMP['bytes_per_pixel']); + $BMP['decal'] = ($BMP['width'] * $BMP['bytes_per_pixel'] / 4); + $BMP['decal'] -= floor($BMP['width'] * $BMP['bytes_per_pixel'] / 4); + $BMP['decal'] = 4 - (4 * $BMP['decal']); + + if ($BMP['decal'] == 4) + { + $BMP['decal'] = 0; + } + + //3 : Chargement des couleurs de la palette + $PALETTE = []; + if ($BMP['colors'] < 16777216) + { + $PALETTE = unpack('V' . $BMP['colors'], fread($f1, $BMP['colors'] * 4)); + } + + //4 : Cr�ation de l'image + $IMG = fread($f1, $BMP['size_bitmap']); + $VIDE = chr(0); + + $res = imagecreatetruecolor($BMP['width'], $BMP['height']); + $P = 0; + $Y = $BMP['height'] - 1; + while ($Y >= 0) + { + $X = 0; + while ($X < $BMP['width']) + { + if ($BMP['bits_per_pixel'] == 24) + { + $COLOR = unpack("V", substr($IMG, $P, 3) . $VIDE); + } + elseif ($BMP['bits_per_pixel'] == 16) + { + + /* + * BMP 16bit fix + * ================= + * + * Ref: http://us3.php.net/manual/en/function.imagecreate.php#81604 + * + * Notes: + * "don't work with bmp 16 bits_per_pixel. change pixel + * generator for this." + * + */ + + // *** Original code (don't work) + //$COLOR = unpack("n",substr($IMG,$P,2)); + //$COLOR[1] = $PALETTE[$COLOR[1]+1]; + + $COLOR = unpack("v", substr($IMG, $P, 2)); + $blue = ($COLOR[1] & 0x001f) << 3; + $green = ($COLOR[1] & 0x07e0) >> 3; + $red = ($COLOR[1] & 0xf800) >> 8; + $COLOR[1] = $red * 65536 + $green * 256 + $blue; + + } + elseif ($BMP['bits_per_pixel'] == 8) + { + $COLOR = unpack("n", $VIDE . substr($IMG, $P, 1)); + $COLOR[1] = $PALETTE[ $COLOR[1] + 1 ]; + } + elseif ($BMP['bits_per_pixel'] == 4) + { + $COLOR = unpack("n", $VIDE . substr($IMG, floor($P), 1)); + if (($P * 2) % 2 == 0) + { + $COLOR[1] = ($COLOR[1] >> 4); + } + else + { + $COLOR[1] = ($COLOR[1] & 0x0F); + } + $COLOR[1] = $PALETTE[ $COLOR[1] + 1 ]; + } + elseif ($BMP['bits_per_pixel'] == 1) + { + $COLOR = unpack("n", $VIDE . substr($IMG, floor($P), 1)); + if (($P * 8) % 8 == 0) + { + $COLOR[1] = $COLOR[1] >> 7; + } + elseif (($P * 8) % 8 == 1) + { + $COLOR[1] = ($COLOR[1] & 0x40) >> 6; + } + elseif (($P * 8) % 8 == 2) + { + $COLOR[1] = ($COLOR[1] & 0x20) >> 5; + } + elseif (($P * 8) % 8 == 3) + { + $COLOR[1] = ($COLOR[1] & 0x10) >> 4; + } + elseif (($P * 8) % 8 == 4) + { + $COLOR[1] = ($COLOR[1] & 0x8) >> 3; + } + elseif (($P * 8) % 8 == 5) + { + $COLOR[1] = ($COLOR[1] & 0x4) >> 2; + } + elseif (($P * 8) % 8 == 6) + { + $COLOR[1] = ($COLOR[1] & 0x2) >> 1; + } + elseif (($P * 8) % 8 == 7) + { + $COLOR[1] = ($COLOR[1] & 0x1); + } + $COLOR[1] = $PALETTE[ $COLOR[1] + 1 ]; + } + else + { + return false; + } + + imagesetpixel($res, $X, $Y, $COLOR[1]); + $X++; + $P += $BMP['bytes_per_pixel']; + } + + $Y--; + $P += $BMP['decal']; + } + //Fermeture du fichier + fclose($f1); + + return $res; + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + PSD SUPPORT (READING) +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + private function imagecreatefrompsd($fileName) + # Author: Tim de Koning + # Version: 1.3 + # Purpose: To create an image from a PSD file. + # Param in: PSD file to open. + # Param out: Return a resource like the other ImageCreateFrom functions + # Reference: http://www.kingsquare.nl/phppsdreader + # Notes: + # + { + if (file_exists($this->psdReaderPath)) + { + + + include_once($this->psdReaderPath); + + $psdReader = new PhpPsdReader($fileName); + + if (isset($psdReader->infoArray['error'])) + { + return ''; + } + else + { + return $psdReader->getImage(); + } + } + else + { + return false; + } + } + +## -------------------------------------------------------- + + public function __destruct() + { + if (is_resource($this->imageResized) || $this->imageResized instanceof \GdImage) + { + imagedestroy($this->imageResized); + } + } + +## -------------------------------------------------------- + +} + + +/* + * Example with some API calls (outdated): + * + * + * =============================== + * Compulsary + * =============================== + * + * include("classes/resize_class.php"); + * + * // *** Initialise object + * $magicianObj = new resize('images/cars/large/a.jpg'); + * + * // *** Turn off stretching (optional) + * $magicianObj -> setForceStretch(false); + * + * // *** Resize object + * $magicianObj -> resizeImage(150, 100, 0); + * + * =============================== + * Image options - can run none, one, or all. + * =============================== + * + * // *** Add watermark + * $magicianObj -> addWatermark('stamp.png'); + * + * // *** Add text + * $magicianObj -> addText('testing...'); + * + * =============================== + * Output options - can run one, or the other, or both. + * =============================== + * + * // *** Save image to disk + * $magicianObj -> saveImage('images/cars/large/b.jpg', 100); + * + * // *** Or output to screen (params in can be jpg, gif, png) + * $magicianObj -> displayImage('png'); + * + * =============================== + * Return options - return errors. nice for debuggin. + * =============================== + * + * // *** Return error array + * $errorArray = $magicianObj -> getErrors(); + * + * + * =============================== + * Cleanup options - not really neccessary, but good practice + * =============================== + * + * // *** Free used memory + * $magicianObj -> __destruct(); + */ diff --git a/libraries/filemanager-9.14.2/include/utils.php b/libraries/filemanager-9.14.2/include/utils.php new file mode 100644 index 0000000..198eb41 --- /dev/null +++ b/libraries/filemanager-9.14.2/include/utils.php @@ -0,0 +1,1315 @@ +send(); + exit; + } + } + if (file_exists('lang/' . $lang . '.php')) { + $lang_vars = include 'lang/' . $lang . '.php'; + } else { + $lang_vars = include '../lang/' . $lang . '.php'; + } + + if (!is_array($lang_vars)) { + $lang_vars = []; + } +} + +/** + * @param $path + * @return bool + */ +function checkRelativePathPartial($path) +{ + if (strpos($path, '../') !== false + || strpos($path, './') !== false + || strpos($path, '/..') !== false + || strpos($path, '..\\') !== false + || strpos($path, '\\..') !== false + || strpos($path, '.\\') !== false + || $path === ".." + ) { + return false; + } + return true; +} + +/** + * Check relative path + * + * @param string $path + * + * @return boolean is it correct? + */ +function checkRelativePath($path) +{ + $path_correct = checkRelativePathPartial($path); + if ($path_correct) { + $path_decoded = rawurldecode($path); + $path_correct = checkRelativePathPartial($path_decoded); + } + return $path_correct; +} + +/** + * Check if the given path is an upload dir based on config + * + * @param string $path + * @param array $config + * + * @return boolean is it an upload dir? + */ +function isUploadDir($path, $config) +{ + $upload_dir = $config['current_path']; + $thumbs_dir = $config['thumbs_base_path']; + if (realpath($path) === realpath($upload_dir) || realpath($path) === realpath($thumbs_dir)) { + return true; + } + return false; +} + +/** + * Delete file + * + * @param string $path + * @param string $path_thumb + * @param array $config + * + * @return null + */ +function deleteFile($path, $path_thumb, $config) +{ + if ($config['delete_files']) { + try { + $ftp = ftp_con($config); + } catch (\FtpClient\FtpException $e) { + return; + } + + if ($ftp) { + $ftp->delete("/" . $path); + @$ftp->delete("/" . $path_thumb); + } else { + if (file_exists($path)) { + unlink($path); + } + if (file_exists($path_thumb)) { + unlink($path_thumb); + } + } + + $info = pathinfo($path); + if (!$ftp && $config['relative_image_creation']) { + foreach ($config['relative_path_from_current_pos'] as $k => $path) { + if ($path != "" && $path[strlen($path) - 1] != "/") { + $path .= "/"; + } + + if (file_exists( + $info['dirname'] . "/" . $path . $config['relative_image_creation_name_to_prepend'][$k] . $info['filename'] . $config['relative_image_creation_name_to_append'][$k] . "." . $info['extension'] + )) { + unlink( + $info['dirname'] . "/" . $path . $config['relative_image_creation_name_to_prepend'][$k] . $info['filename'] . $config['relative_image_creation_name_to_append'][$k] . "." . $info['extension'] + ); + } + } + } + + if (!$ftp && $config['fixed_image_creation']) { + foreach ($config['fixed_path_from_filemanager'] as $k => $path) { + if ($path != "" && $path[strlen($path) - 1] != "/") { + $path .= "/"; + } + + $base_dir = $path . substr_replace($info['dirname'] . "/", '', 0, strlen($config['current_path'])); + if (file_exists( + $base_dir . $config['fixed_image_creation_name_to_prepend'][$k] . $info['filename'] . $config['fixed_image_creation_to_append'][$k] . "." . $info['extension'] + )) { + unlink( + $base_dir . $config['fixed_image_creation_name_to_prepend'][$k] . $info['filename'] . $config['fixed_image_creation_to_append'][$k] . "." . $info['extension'] + ); + } + } + } + } +} + +/** + * Delete directory + * + * @param string $dir + * + * @return bool + */ +function deleteDir($dir, $ftp = null, $config = null) +{ + if ($ftp) { + try { + $ftp->rmdir($dir); + return true; + } catch (FtpClient\FtpException $e) { + return null; + } + } else { + if (!file_exists($dir) || isUploadDir($dir, $config)) { + return false; + } + if (!is_dir($dir)) { + return unlink($dir); + } + foreach (scandir($dir) as $item) { + if ($item == '.' || $item == '..') { + continue; + } + if (!deleteDir($dir . DIRECTORY_SEPARATOR . $item)) { + return false; + } + } + } + + return rmdir($dir); +} + +/** + * Make a file copy + * + * @param string $old_path + * @param string $name New file name without extension + * + * @return bool + */ +function duplicate_file($old_path, $name, $ftp = null, $config = null) +{ + $info = pathinfo($old_path); + $ext = ""; + if (isset($info['extension']) && $info['extension']) { + $ext = "." . $info['extension']; + } + $new_path = $info['dirname'] . "/" . $name . $ext; + if ($ftp) { + try { + $tmp = time() . $name . $ext; + $ftp->get($tmp, "/" . $old_path, FTP_BINARY); + $ftp->put("/" . $new_path, $tmp, FTP_BINARY); + unlink($tmp); + return true; + } catch (FtpClient\FtpException $e) { + return null; + } + } else { + if (file_exists($old_path) && is_file($old_path)) { + if (file_exists($new_path) && $old_path == $new_path) { + return false; + } + + return copy($old_path, $new_path); + } + } +} + + +/** + * Rename file + * + * @param string $old_path File to rename + * @param string $name New file name without extension + * @param null|\FtpClient\FtpClient $ftp + * @param null|array $config + * @return bool + */ +function rename_file($old_path, $name, $ftp = null, $config = null) +{ + $name = fix_filename($name, $config); + $info = pathinfo($old_path); + $new_path = $info['dirname'] . "/" . $name . "." . $info['extension']; + if ($ftp) { + try { + return $ftp->rename("/" . $old_path, "/" . $new_path); + } catch (FtpClient\FtpException $e) { + return false; + } + } else { + if (file_exists($old_path) && is_file($old_path)) { + $new_path = $info['dirname'] . "/" . $name . "." . $info['extension']; + if (file_exists($new_path) && $old_path == $new_path) { + return false; + } + + return rename($old_path, $new_path); + } + } +} + +/** + * @param $url + * @return bool + */ +function url_exists($url) +{ + if (!$fp = curl_init($url)) { + return false; + } + return true; +} + +/** + * @return bool|string + */ +function tempdir() +{ + $tempfile = tempnam(sys_get_temp_dir(), ''); + + if (file_exists($tempfile)) { + unlink($tempfile); + } + + mkdir($tempfile); + + if (is_dir($tempfile)) { + return $tempfile; + } +} + + +/** + * Rename directory + * + * @param string $old_path Directory to rename + * @param string $name New directory name + * @param null $ftp + * @param null|array $config + * @return bool + */ +function rename_folder($old_path, $name, $ftp = null, $config = null) +{ + $name = fix_filename($name, $config, true); + $new_path = fix_dirname($old_path) . "/" . $name; + if ($ftp) { + if ($ftp->chdir("/" . $old_path)) { + if (@$ftp->chdir($new_path)) { + return false; + } + return $ftp->rename("/" . $old_path, "/" . $new_path); + } + } else { + if (file_exists($old_path) && is_dir($old_path) && !isUploadDir($old_path, $config)) { + if (file_exists($new_path) && $old_path == $new_path) { + return false; + } + return rename($old_path, $new_path); + } + } +} + +/** + * @param array $config + * @return bool|\FtpClient\FtpClient + */ +function ftp_con($config) +{ + if (isset($config['ftp_host']) && $config['ftp_host']) { + // *** Include the class + include __DIR__ . '/FtpClient.php'; + include __DIR__ . '/FtpException.php'; + include __DIR__ . '/FtpWrapper.php'; + + try { + $ftp = new \FtpClient\FtpClient(); + $ftp->connect($config['ftp_host'], $config['ftp_ssl'], $config['ftp_port']); + $ftp->login($config['ftp_user'], $config['ftp_pass']); + $ftp->pasv(true); + return $ftp; + } catch (FtpClient\FtpException $e) { + echo "Error: "; + echo $e->getMessage(); + echo " to server "; + $tmp = $e->getTrace(); + echo $tmp[0]['args'][0]; + echo "
Please check configurations"; + die(); + } + } + + return false; +} + +/** + * Create new image from existing file + * + * @param string $imgfile Source image file name + * @param string $imgthumb Thumbnail file name + * @param int $newwidth Thumbnail width + * @param int $newheight Optional thumbnail height + * @param string $option Type of resize + * + * @param array $config + * @return bool + */ +function create_img($imgfile, $imgthumb, $newwidth, $newheight = null, $option = "crop", $config = []) +{ + $result = false; + if (isset($config['ftp_host']) && $config['ftp_host']) { + if (url_exists($imgfile)) { + $temp = tempnam('/tmp', 'RF'); + unlink($temp); + $temp .= "." . substr(strrchr($imgfile, '.'), 1); + $handle = fopen($temp, "w"); + fwrite($handle, file_get_contents($imgfile)); + fclose($handle); + $imgfile = $temp; + $save_ftp = $imgthumb; + $imgthumb = $temp; + } + } + + if (file_exists($imgfile) || strpos($imgfile, 'http') === 0) { + if (strpos($imgfile, 'http') === 0 || image_check_memory_usage($imgfile, $newwidth, $newheight)) { + require_once('php_image_magician.php'); + try { + $magicianObj = new imageLib($imgfile); + $magicianObj->resizeImage($newwidth, $newheight, $option); + $magicianObj->saveImage($imgthumb, 80); + } catch (Exception $e) { + return $e->getMessage(); + } + $result = true; + } + } + + if ($result && isset($config['ftp_host']) && $config['ftp_host']) { + $ftp = ftp_con($config); + $ftp->put($save_ftp, $imgthumb, FTP_BINARY); + unlink($imgthumb); + } + + return $result; +} + +/** + * Convert convert size in bytes to human readable + * + * @param int $size + * + * @return string + */ +function makeSize($size) +{ + $units = ['B', 'KB', 'MB', 'GB', 'TB']; + $u = 0; + while ((round($size / 1024) > 0) && ($u < 4)) { + $size = $size / 1024; + $u++; + } + + return (number_format($size, 0) . " " . trans($units[$u])); +} + +/** + * Determine directory size + * + * @param string $path + * @param bool $count_hidden + * @return array + */ +function folder_info($path, $count_hidden = true) +{ + global $config; + $total_size = 0; + $files = scandir($path); + $cleanPath = rtrim($path, '/') . '/'; + $files_count = 0; + $folders_count = 0; + foreach ($files as $t) { + if ($t != "." && $t != "..") { + if ($count_hidden or !(in_array($t, $config['hidden_folders']) or in_array($t, $config['hidden_files']))) { + $currentFile = $cleanPath . $t; + if (is_dir($currentFile)) { + list($size, $tmp, $tmp1) = folder_info($currentFile); + $total_size += $size; + $folders_count++; + } else { + $size = filesize($currentFile); + $total_size += $size; + $files_count++; + } + } + } + } + + return [$total_size, $files_count, $folders_count]; +} + +/** + * Get number of files in a directory + * + * @param string $path + * + * @return int + */ +function filescount($path, $count_hidden = true) +{ + global $config; + $total_count = 0; + $files = scandir($path); + $cleanPath = rtrim($path, '/') . '/'; + + foreach ($files as $t) { + if ($t != "." && $t != "..") { + if ($count_hidden or !(in_array($t, $config['hidden_folders']) or in_array($t, $config['hidden_files']))) { + $currentFile = $cleanPath . $t; + if (is_dir($currentFile)) { + $size = filescount($currentFile); + $total_count += $size; + } else { + $total_count += 1; + } + } + } + } + + return $total_count; +} + +/** + * check if the current folder size plus the added size is over the overall size limite + * + * @param int $sizeAdded + * + * @return bool + */ +function checkresultingsize($sizeAdded) +{ + global $config; + + if ($config['MaxSizeTotal'] !== false && is_int($config['MaxSizeTotal'])) { + list($sizeCurrentFolder, $fileCurrentNum, $foldersCurrentCount) = folder_info($config['current_path'], false); + // overall size over limit + if (($config['MaxSizeTotal'] * 1024 * 1024) < ($sizeCurrentFolder + $sizeAdded)) { + return false; + } + } + return true; +} + +/** + * Create directory for images and/or thumbnails + * + * @param string $path + * @param string $path_thumbs + * + * @return bool + */ +function create_folder($path = null, $path_thumbs = null, $ftp = null, $config = null) +{ + if ($ftp) { + $result_path = $result_thumb = false; + $result_path = $ftp->mkdir($path); + $result_thumb = $ftp->mkdir($path_thumbs); + if (!$result_thumb || !$result_path) { + return false; + } + return true; + } else { + if (file_exists($path) || file_exists($path_thumbs)) { + return false; + } + $oldumask = umask(0); + $permission = 0755; + if (isset($config['folderPermission'])) { + $permission = $config['folderPermission']; + } + if ($path && !file_exists($path)) { + mkdir($path, $permission, true); + } // or even 01777 so you get the sticky bit set + if ($path_thumbs) { + mkdir($path_thumbs, $permission, true) or die("$path_thumbs cannot be found"); + } // or even 01777 so you get the sticky bit set + umask($oldumask); + return true; + } +} + +/** + * Get file extension present in directory + * + * @param string $path + * @param string $ext + */ +function check_files_extensions_on_path($path, $ext) +{ + if (!is_dir($path)) { + $fileinfo = pathinfo($path); + if (!in_array(mb_strtolower($fileinfo['extension']), $ext)) { + unlink($path); + } + } else { + $files = scandir($path); + foreach ($files as $file) { + check_files_extensions_on_path(trim($path, '/') . "/" . $file, $ext); + } + } +} + + +/** + * Check file extension + * + * @param string $extension + * @param array $config + * @return bool + */ +function check_file_extension($extension, $config) +{ + $check = false; + if (!$config['ext_blacklist']) { + if (in_array(mb_strtolower($extension), $config['ext'])) { + $check = true; + } + } else { + if (!in_array(mb_strtolower($extension), $config['ext_blacklist'])) { + $check = true; + } + } + + if ($config['files_without_extension'] && $extension == '') { + $check = true; + } + + return $check; +} + + +/** + * Get file extension present in PHAR file + * + * @param string $phar + * @param array $files + * @param string $basepath + * @param array $config + */ +function check_files_extensions_on_phar($phar, &$files, $basepath, $config) +{ + foreach ($phar as $file) { + if ($file->isFile()) { + if (check_file_extension($file->getExtension())) { + $files[] = $basepath . $file->getFileName(); + } + } else { + if ($file->isDir()) { + $iterator = new DirectoryIterator($file); + check_files_extensions_on_phar($iterator, $files, $basepath . $file->getFileName() . '/', $config); + } + } + } +} + +/** + * Cleanup input + * + * @param string $str + * + * @return string + */ +function fix_get_params($str) +{ + //return strip_tags(preg_replace("/[^a-zA-Z0-9\.\[\]_| -]/", '', $str)); + return htmlentities(strip_tags(stripslashes($str)), ENT_COMPAT, "UTF-8"); +} + +/** + * Check extension + * + * @param string $extension + * @param array $config + * + * @return bool + */ +function check_extension($extension, $config) +{ + $extension = fix_strtolower($extension); + if ((!$config['ext_blacklist'] && !in_array($extension, $config['ext'])) || ($config['ext_blacklist'] && in_array( + $extension, + $config['ext_blacklist'] + ))) { + return false; + } + return true; +} + +/** + * Sanitize filename + * + * @param string $str + * + * @return string + */ +function sanitize($str) +{ + return strip_tags(htmlspecialchars($str)); +} + +/** + * Cleanup filename + * + * @param string $str + * @param array $config + * @param bool $is_folder + * + * @return string + */ +function fix_filename($str, $config, $is_folder = false) +{ + $str = sanitize($str); + if ($config['convert_spaces']) { + $str = str_replace(' ', $config['replace_with'], $str); + } + + if ($config['transliteration']) { + if (!mb_detect_encoding($str, 'UTF-8', true)) { + $str = utf8_encode($str); + } + if (function_exists('transliterator_transliterate')) { + $str = transliterator_transliterate('Any-Latin; Latin-ASCII', $str); + } else { + $str = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $str); + } + + $str = preg_replace("/[^a-zA-Z0-9\.\[\]_| -]/", '', $str); + } + + $str = str_replace(['"', "'", "/", "\\"], "", $str); + $str = strip_tags($str); + + // Empty or incorrectly transliterated filename. + // Here is a point: a good file UNKNOWN_LANGUAGE.jpg could become .jpg in previous code. + // So we add that default 'file' name to fix that issue. + if (!$config['empty_filename'] && strpos($str, '.') === 0 && $is_folder === false) { + $str = 'file' . $str; + } + + return trim($str); +} + +/** + * Cleanup directory name + * + * @param string $str + * + * @return string + */ +function fix_dirname($str) +{ + return str_replace('~', ' ', dirname(str_replace(' ', '~', $str))); +} + +/** + * Correct strtoupper handling + * + * @param string $str + * + * @return string + */ +function fix_strtoupper($str) +{ + if (function_exists('mb_strtoupper')) { + return mb_strtoupper($str); + } else { + return strtoupper($str); + } +} + +/** + * Correct strtolower handling + * + * @param string $str + * + * @return string + */ +function fix_strtolower($str) +{ + if (function_exists('mb_strtolower')) { + return mb_strtolower($str); + } else { + return strtolower($str); + } +} + +/** + * @param string $path + * @param array $config + * @return string + */ +function fix_path($path, $config) +{ + $info = pathinfo($path); + $tmp_path = $info['dirname']; + $str = fix_filename($info['filename'], $config); + if ($tmp_path != "") { + return $tmp_path . DIRECTORY_SEPARATOR . $str; + } + return $str; +} + +/** + * @param string $current_path + * @param $fld + * + * @return bool + */ +function config_loading($current_path, $fld) +{ + if (file_exists($current_path . $fld . ".config")) { + require_once($current_path . $fld . ".config"); + + return true; + } + echo "!!!!" . $parent = fix_dirname($fld); + if ($parent != "." && !empty($parent)) { + config_loading($current_path, $parent); + } + + return false; +} + +/** + * Check if memory is enough to process image + * + * @param string $img + * @param int $max_breedte + * @param int $max_hoogte + * + * @return bool + */ +function image_check_memory_usage($img, $max_breedte, $max_hoogte) +{ + if (file_exists($img)) { + $K64 = 65536; // number of bytes in 64K + $memory_usage = memory_get_usage(); + if (ini_get('memory_limit') > 0) { + $mem = ini_get('memory_limit'); + $memory_limit = 0; + if (strpos($mem, 'M') !== false) { + $memory_limit = abs(intval(str_replace(['M'], '', $mem) * 1024 * 1024)); + } + if (strpos($mem, 'G') !== false) { + $memory_limit = abs(intval(str_replace(['G'], '', $mem) * 1024 * 1024 * 1024)); + } + + if (($image_properties = getimagesize($img)) === false) { + return false; + } + $image_width = $image_properties[0]; + $image_height = $image_properties[1]; + + if ($image_properties[2] == IMAGETYPE_PNG) { + // PHP's getimagesize() doesn't return the number of channels for PNG files + require_once __DIR__ . '/get_png_imageinfo.php'; + if ($png_properties = get_png_imageinfo($img)) { + $image_properties['bits'] = $png_properties['bits']; + $image_properties['channels'] = $png_properties['channels']; + } + } + + $image_bits = 0; + $image_channels = 0; + if (isset($image_properties['bits'])) { + $image_bits = $image_properties['bits']; + $image_channels = $image_properties['channels'] ?? 1; + } + + if ($image_properties[2] == IMAGETYPE_GIF) { + // GIF supports up to 8 bits per pixel + if (empty($image_bits)) { + $image_bits = 8; + } + // GIF uses indexed color which obviates channels + $image_channels = 1; + } + + $image_memory_usage = $K64 + ($image_width * $image_height * ($image_bits * $image_channels / 8) * 2); + $thumb_memory_usage = $K64 + ($max_breedte * $max_hoogte * ($image_bits * $image_channels / 8) * 2); + $memory_needed = abs(intval($memory_usage + $image_memory_usage + $thumb_memory_usage)); + + if ($memory_needed > $memory_limit) { + return false; + } + } + return true; + } + return false; +} + +/** + * Check is string is ended with needle + * + * @param string $haystack + * @param string $needle + * + * @return bool + */ +if (!function_exists('ends_with')) { + function ends_with($haystack, $needle) + { + return $needle === "" || substr($haystack, -strlen($needle)) === $needle; + } +} + +/** + * TODO REFACTOR THIS! + * + * @param $targetPath + * @param $targetFile + * @param $name + * @param $current_path + * @param $config + * relative_image_creation + * relative_path_from_current_pos + * relative_image_creation_name_to_prepend + * relative_image_creation_name_to_append + * relative_image_creation_width + * relative_image_creation_height + * relative_image_creation_option + * fixed_image_creation + * fixed_path_from_filemanager + * fixed_image_creation_name_to_prepend + * fixed_image_creation_to_append + * fixed_image_creation_width + * fixed_image_creation_height + * fixed_image_creation_option + * + * @return bool + */ +function new_thumbnails_creation($targetPath, $targetFile, $name, $current_path, $config) +{ + //create relative thumbs + $all_ok = true; + + $info = pathinfo($name); + $info['filename'] = fix_filename($info['filename'], $config); + if ($config['relative_image_creation']) { + foreach ($config['relative_path_from_current_pos'] as $k => $path) { + if ($path != "" && $path[strlen($path) - 1] != "/") { + $path .= "/"; + } + if (!file_exists($targetPath . $path)) { + create_folder($targetPath . $path, false); + } + if (!ends_with($targetPath, $path)) { + if (!create_img( + $targetFile, + $targetPath . $path . $config['relative_image_creation_name_to_prepend'][$k] . $info['filename'] . $config['relative_image_creation_name_to_append'][$k] . "." . $info['extension'], + $config['relative_image_creation_width'][$k], + $config['relative_image_creation_height'][$k], + $config['relative_image_creation_option'][$k] + )) { + $all_ok = false; + } + } + } + } + + //create fixed thumbs + if ($config['fixed_image_creation']) { + foreach ($config['fixed_path_from_filemanager'] as $k => $path) { + if ($path != "" && $path[strlen($path) - 1] != "/") { + $path .= "/"; + } + $base_dir = $path . substr_replace($targetPath, '', 0, strlen($current_path)); + if (!file_exists($base_dir)) { + create_folder($base_dir, false); + } + if (!create_img( + $targetFile, + $base_dir . $config['fixed_image_creation_name_to_prepend'][$k] . $info['filename'] . $config['fixed_image_creation_to_append'][$k] . "." . $info['extension'], + $config['fixed_image_creation_width'][$k], + $config['fixed_image_creation_height'][$k], + $config['fixed_image_creation_option'][$k] + )) { + $all_ok = false; + } + } + } + + return $all_ok; +} + + +/** + * Get a remote file, using whichever mechanism is enabled + * + * @param string $url + * + * @return bool|mixed|string + */ +function get_file_by_url($url) +{ + if (ini_get('allow_url_fopen')) { + $arrContextOptions = [ + "ssl" => [ + "verify_peer" => false, + "verify_peer_name" => false, + ], + ]; + return file_get_contents($url, false, stream_context_create($arrContextOptions)); + } + if (!function_exists('curl_version')) { + return false; + } + + $ch = curl_init(); + + curl_setopt($ch, CURLOPT_HEADER, 0); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_URL, $url); + + $data = curl_exec($ch); + curl_close($ch); + + return $data; +} + +/** + * test for dir/file writability properly + * + * @param string $dir + * + * @return bool + */ +function is_really_writable($dir) +{ + $dir = rtrim($dir, '/'); + // linux, safe off + if (DIRECTORY_SEPARATOR == '/' && @ini_get("safe_mode") == false) { + return is_writable($dir); + } + + // Windows, safe ON. (have to write a file :S) + if (is_dir($dir)) { + $dir = $dir . '/' . md5(mt_rand(1, 1000) . mt_rand(1, 1000)); + + if (($fp = @fopen($dir, 'ab')) === false) { + return false; + } + + fclose($fp); + @chmod($dir, 0755); + @unlink($dir); + + return true; + } elseif (!is_file($dir) || ($fp = @fopen($dir, 'ab')) === false) { + return false; + } + + fclose($fp); + + return true; +} + +/** + * Check if a function is callable. + * Some servers disable copy,rename etc. + * + * @parm string $name + * + * @return bool + */ +function is_function_callable($name) +{ + if (function_exists($name) === false) { + return false; + } + $disabled = explode(',', ini_get('disable_functions')); + + return !in_array($name, $disabled); +} + +/** + * Recursively copies everything + * + * @param string $source + * @param string $destination + * @param bool $is_rec + */ +function rcopy($source, $destination, $is_rec = false) +{ + if (is_dir($source)) { + if ($is_rec === false) { + $pinfo = pathinfo($source); + $destination = rtrim($destination, '/') . DIRECTORY_SEPARATOR . $pinfo['basename']; + } + if (is_dir($destination) === false) { + mkdir($destination, 0755, true); + } + + $files = scandir($source); + foreach ($files as $file) { + if ($file != "." && $file != "..") { + rcopy( + $source . DIRECTORY_SEPARATOR . $file, + rtrim($destination, '/') . DIRECTORY_SEPARATOR . $file, + true + ); + } + } + } else { + if (file_exists($source)) { + if (is_dir($destination) === true) { + $pinfo = pathinfo($source); + $dest2 = rtrim($destination, '/') . DIRECTORY_SEPARATOR . $pinfo['basename']; + } else { + $dest2 = $destination; + } + + copy($source, $dest2); + } + } +} + + +/** + * Recursively renames everything + * + * I know copy and rename could be done with just one function + * but i split the 2 because sometimes rename fails on windows + * Need more feedback from users and refactor if needed + * + * @param string $source + * @param string $destination + * @param bool $is_rec + */ +function rrename($source, $destination, $is_rec = false) +{ + if (is_dir($source)) { + if ($is_rec === false) { + $pinfo = pathinfo($source); + $destination = rtrim($destination, '/') . DIRECTORY_SEPARATOR . $pinfo['basename']; + } + if (is_dir($destination) === false) { + mkdir($destination, 0755, true); + } + + $files = scandir($source); + foreach ($files as $file) { + if ($file != "." && $file != "..") { + rrename( + $source . DIRECTORY_SEPARATOR . $file, + rtrim($destination, '/') . DIRECTORY_SEPARATOR . $file, + true + ); + } + } + } else { + if (file_exists($source)) { + if (is_dir($destination) === true) { + $pinfo = pathinfo($source); + $dest2 = rtrim($destination, '/') . DIRECTORY_SEPARATOR . $pinfo['basename']; + } else { + $dest2 = $destination; + } + + rename($source, $dest2); + } + } +} + + +/** + * On windows rename leaves folders sometime + * This will clear leftover folders + * After more feedback will merge it with rrename + * + * @param $source + * @return bool + */ +function rrename_after_cleaner($source) +{ + $files = scandir($source); + + foreach ($files as $file) { + if ($file != "." && $file != "..") { + if (is_dir($source . DIRECTORY_SEPARATOR . $file)) { + rrename_after_cleaner($source . DIRECTORY_SEPARATOR . $file); + } else { + unlink($source . DIRECTORY_SEPARATOR . $file); + } + } + } + + return rmdir($source); +} + +/** + * Recursive chmod + * @param string $source + * @param int $mode + * @param string $rec_option + * @param bool $is_rec + */ +function rchmod($source, $mode, $rec_option = "none", $is_rec = false) +{ + if ($rec_option == "none") { + chmod($source, $mode); + } else { + if ($is_rec === false) { + chmod($source, $mode); + } + + $files = scandir($source); + + foreach ($files as $file) { + if ($file != "." && $file != "..") { + if (is_dir($source . DIRECTORY_SEPARATOR . $file)) { + if ($rec_option == "folders" || $rec_option == "both") { + chmod($source . DIRECTORY_SEPARATOR . $file, $mode); + } + rchmod($source . DIRECTORY_SEPARATOR . $file, $mode, $rec_option, true); + } else { + if ($rec_option == "files" || $rec_option == "both") { + chmod($source . DIRECTORY_SEPARATOR . $file, $mode); + } + } + } + } + } +} + +/** + * @param string $input + * @param bool $trace + * @param bool $halt + */ +function debugger($input, $trace = false, $halt = false) +{ + ob_start(); + + echo "
----- DEBUG DUMP -----"; + echo "

";
+    var_dump($input);
+    echo "
"; + + if ($trace) { + if (is_php('5.3.6')) { + $debug = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); + } else { + $debug = debug_backtrace(false); + } + + echo "
-----STACK TRACE-----"; + echo "
";
+        var_dump($debug);
+        echo "
"; + } + + echo ""; + echo "---------------------------
"; + + $ret = ob_get_contents(); + ob_end_clean(); + + echo $ret; + + if ($halt == true) { + exit(); + } +} + +/** + * @param string $version + * + * @return bool + */ +function is_php($version = '5.0.0') +{ + static $phpVer; + $version = (string)$version; + + if (!isset($phpVer[$version])) { + $phpVer[$version] = version_compare(PHP_VERSION, $version) >= 0; + } + + return $phpVer[$version]; +} + +/** + * Return the caller location if set in config.php + * + * @return bool + */ +function AddErrorLocation() +{ + if (defined('DEBUG_ERROR_MESSAGE') && DEBUG_ERROR_MESSAGE) { + $pile = debug_backtrace(); + return " (@" . $pile[0]["file"] . "#" . $pile[0]["line"] . ")"; + } + return ""; +} diff --git a/libraries/filemanager-9.14.2/index.php b/libraries/filemanager-9.14.2/index.php new file mode 100644 index 0000000..c30c28f --- /dev/null +++ b/libraries/filemanager-9.14.2/index.php @@ -0,0 +1,10 @@ +
")},unzip:function(e){var a=jQuery("#sub_folder").val()+jQuery("#fldr_value").val()+e.find("a.link").attr("data-file");show_animation(),y.ajax({type:"POST",url:"ajax_calls.php?action=extract",data:{path:a}}).done(function(e){hide_animation(),""!=e?bootbox.alert(e):window.location.href=jQuery("#refresh").attr("href")+"&"+(new Date).getTime()})},edit_img:function(e){var a=e.attr("data-name"),t=e.attr("data-path");if(1==jQuery("#ftp").val())var r=jQuery("#ftp_base_url").val()+jQuery("#upload_dir").val()+jQuery("#fldr_value").val()+a;else r=jQuery("#base_url").val()+jQuery("#upload_dir").val()+t;var i,n=jQuery("#tui-image-editor");n.attr("data-name",a),n.attr("data-path",r),show_animation(),n.attr("id"),i=r,imageEditor.loadImageFromURL(i,"SampleImage").then(function(e){imageEditor.ui.resizeEditor({imageSize:{oldWidth:e.oldWidth,oldHeight:e.oldHeight,newWidth:e.newWidth,newHeight:e.newHeight}})}).catch(function(e){bootbox.alert("Something went wrong: "+e)}),hide_animation(),n.removeClass("hide")},duplicate:function(a){var t=a.find("h4").text().trim();bootbox.prompt(jQuery("#lang_duplicate").val(),jQuery("#cancel").val(),jQuery("#ok").val(),function(e){null!==e&&(e=Q(e))!=t&&g("duplicate_file",a.attr("data-path"),e,a,"apply_file_duplicate")},t+" - copy")},select:function(e){var a,t=l(e),r=jQuery("#field_id").val();(1==jQuery("#return_relative_url").val()&&(t=(t=t.replace(jQuery("#base_url").val(),"")).replace(jQuery("#cur_dir").val(),"")),a=1==jQuery("#popup").val()?window.opener:window.parent,""!=r)?1==jQuery("#crossdomain").val()?a.postMessage({sender:"responsivefilemanager",url:t,field_id:r},"*"):(jQuery("#"+r,a.document).val(t).trigger("change"),"function"==typeof a.responsive_filemanager_callback&&a.responsive_filemanager_callback(r),j()):apply_any(t)},copy:function(e){u(e,"copy")},cut:function(e){u(e,"cut")},paste:function(){d()},chmod:function(e){!function(e){jQuery("#files_permission_start").parent().parent().remove();var r=e.find(".rename-file-paths"),i=e.closest("figure").attr("data-path"),a=r.attr("data-permissions"),n=r.attr("data-folder");y.ajax({type:"POST",url:"ajax_calls.php?action=chmod",data:{path:i,permissions:a,folder:n}}).done(function(e){bootbox.dialog(e,[{label:jQuery("#cancel").val(),class:"btn"},{label:jQuery("#ok").val(),class:"btn-inverse",callback:function(){var a="-";jQuery("#u_4").is(":checked")?a+="r":a+="-",jQuery("#u_2").is(":checked")?a+="w":a+="-",jQuery("#u_1").is(":checked")?a+="x":a+="-",jQuery("#g_4").is(":checked")?a+="r":a+="-",jQuery("#g_2").is(":checked")?a+="w":a+="-",jQuery("#g_1").is(":checked")?a+="x":a+="-",jQuery("#a_4").is(":checked")?a+="r":a+="-",jQuery("#a_2").is(":checked")?a+="w":a+="-",jQuery("#a_1").is(":checked")?a+="x":a+="-";var e=jQuery("#chmod_form #chmod_value").val();if(""!=e&&void 0!==e){var t=jQuery("#chmod_form input[name=apply_recursive]:checked").val();""!=t&&void 0!==t||(t="none"),y.ajax({type:"POST",url:"execute.php?action=chmod",data:{path:i,new_mode:e,is_recursive:t,folder:n}}).done(function(e){""!=e?bootbox.alert(e):r.attr("data-permissions",a)})}}}],{header:jQuery("#lang_file_permission").val()}),setTimeout(function(){o(!1)},100)})}(e)},edit_text_file:function(e){!function(a){jQuery("#textfile_edit_area").parent().parent().remove();var t=a.closest("figure").attr("data-path");y.ajax({type:"POST",url:"ajax_calls.php?action=get_file&sub_action=edit&preview_mode=text",data:{path:t}}).done(function(e){bootbox.dialog(e,[{label:jQuery("#cancel").val(),class:"btn"},{label:jQuery("#ok").val(),class:"btn-inverse",callback:function(){var e=jQuery("#textfile_edit_area").val();window.editor&&"function"==typeof window.editor.getData&&(e=window.editor.getData()),y.ajax({type:"POST",url:"execute.php?action=save_text_file",data:{path:t,new_content:e}}).done(function(e){""!=e&&bootbox.alert(e)})}}],{header:a.find(".name_download").val()})})}(e)}},makeContextMenu:function(){var r=this;y.contextMenu({selector:"figure:not(.back-directory), .list-view2 figure:not(.back-directory)",autoHide:!0,build:function(t){t.addClass("selected");var e={callback:function(e,a){r.contextActions[e](t)},items:{}};return(t.find(".img-precontainer-mini .filetype").hasClass("png")||t.find(".img-precontainer-mini .filetype").hasClass("jpg")||t.find(".img-precontainer-mini .filetype").hasClass("jpeg"))&&a&&(e.items.edit_img={name:jQuery("#lang_edit_image").val(),icon:"edit_img",disabled:!1}),t.hasClass("directory")&&0!=jQuery("#type_param").val()&&(e.items.select={name:jQuery("#lang_select").val(),icon:"",disabled:!1}),e.items.copy_url={name:jQuery("#lang_show_url").val(),icon:"url",disabled:!1},(t.find(".img-precontainer-mini .filetype").hasClass("zip")||t.find(".img-precontainer-mini .filetype").hasClass("tar")||t.find(".img-precontainer-mini .filetype").hasClass("gz"))&&1==jQuery("#extract_files").val()&&(e.items.unzip={name:jQuery("#lang_extract").val(),icon:"extract",disabled:!1}),t.find(".img-precontainer-mini .filetype").hasClass("edit-text-file-allowed")&&(e.items.edit_text_file={name:jQuery("#lang_edit_file").val(),icon:"edit",disabled:!1}),t.hasClass("directory")||1!=jQuery("#duplicate").val()||(e.items.duplicate={name:jQuery("#lang_duplicate").val(),icon:"duplicate",disabled:!1}),t.hasClass("directory")||1!=jQuery("#copy_cut_files_allowed").val()?t.hasClass("directory")&&1==jQuery("#copy_cut_dirs_allowed").val()&&(e.items.copy={name:jQuery("#lang_copy").val(),icon:"copy",disabled:!1},e.items.cut={name:jQuery("#lang_cut").val(),icon:"cut",disabled:!1}):(e.items.copy={name:jQuery("#lang_copy").val(),icon:"copy",disabled:!1},e.items.cut={name:jQuery("#lang_cut").val(),icon:"cut",disabled:!1}),0==jQuery("#clipboard").val()||t.hasClass("directory")||(e.items.paste={name:jQuery("#lang_paste_here").val(),icon:"clipboard-apply",disabled:!1}),t.hasClass("directory")||1!=jQuery("#chmod_files_allowed").val()?t.hasClass("directory")&&1==jQuery("#chmod_dirs_allowed").val()&&(e.items.chmod={name:jQuery("#lang_file_permission").val(),icon:"key",disabled:!1}):e.items.chmod={name:jQuery("#lang_file_permission").val(),icon:"key",disabled:!1},e.items.sep="----",e.items.info={type:"html",html:""+jQuery("#lang_file_info").val()+""},e.items.name={name:t.attr("data-name"),icon:"label",disabled:!0},"img"==t.attr("data-type")&&(e.items.dimension={name:t.find(".img-dimension").html(),icon:"dimension",disabled:!0}),"true"!==jQuery("#show_folder_size").val()&&"true"!==jQuery("#show_folder_size").val()||(t.hasClass("directory")?e.items.size={name:t.find(".file-size").html()+" - "+t.find(".nfiles").val()+" "+jQuery("#lang_files").val()+" - "+t.find(".nfolders").val()+" "+jQuery("#lang_folders").val(),icon:"size",disabled:!0}:e.items.size={name:t.find(".file-size").html(),icon:"size",disabled:!0}),e.items.date={name:t.find(".file-date").html(),icon:"date",disabled:!0},e},events:{hide:function(){jQuery("figure").removeClass("selected")}}}),jQuery(document).on("contextmenu",function(e){if(!jQuery(e.target).is("figure"))return!1})},updateMultipleSelectionButtons:function(){0 div > div.fileupload-buttonbar > div.text-center > button").click()},200)}),jQuery("#fileupload").bind("fileuploadsubmit",function(e,a){a.formData={fldr:jQuery("#sub_folder").val()+jQuery("#fldr_value").val()+(a.files[0].relativePath||a.files[0].webkitRelativePath||"")}}),jQuery("#fileupload").addClass("fileupload-processing"),y.ajax({url:jQuery("#fileupload").fileupload("option","url"),dataType:"json",context:jQuery("#fileupload")[0]}).always(function(){jQuery(this).removeClass("fileupload-processing")}),jQuery(".upload-btn").on("click",function(){jQuery(".uploader").show(200)}),jQuery(".close-uploader").on("click",function(){jQuery(".uploader").hide(200),setTimeout(function(){window.location.href=jQuery("#refresh").attr("href")+"&"+(new Date).getTime()},420)})},uploadURL:function(){jQuery("#uploadURL").on("click",function(e){e.preventDefault();var a=jQuery("#url").val(),t=jQuery("#fldr_value").val();show_animation(),y.ajax({type:"POST",url:"upload.php",data:{fldr:t,url:a}}).done(function(e){hide_animation(),jQuery("#url").val("")}).fail(function(e){bootbox.alert(jQuery("#lang_error_upload").val()),hide_animation(),jQuery("#url").val("")})})},makeSort:function(r){jQuery("input[name=radio-sort]").on("click",function(){var e=jQuery(this).attr("data-item"),a=jQuery("#"+e),t=jQuery(".filters label");c=0,y(".selection:checkbox").removeAttr("checked"),s.updateMultipleSelectionButtons(),t.removeClass("btn-inverse"),t.find("i").removeClass("icon-white"),jQuery("#filter-input").val(""),a.addClass("btn-inverse"),a.find("i").addClass("icon-white"),"ff-item-type-all"==e?(r?jQuery(".grid li").show(300):window.location.href=jQuery("#current_url").val()+"&sort_by="+jQuery("#sort_by").val()+"&descending="+(i?1:0),"undefined"!=typeof Storage&&localStorage.setItem("sort","")):jQuery(this).is(":checked")&&(jQuery(".grid li").not("."+e).hide(300),jQuery(".grid li."+e).show(300),"undefined"!=typeof Storage&&localStorage.setItem("sort",e)),b()});var i=jQuery("#descending").val();jQuery(".sorter").on("click",function(){var e=jQuery(this);i=jQuery("#sort_by").val()!==e.attr("data-sort")||0==i,r?(y.ajax({url:"ajax_calls.php?action=sort&sort_by="+e.attr("data-sort")+"&descending="+(i?1:0)}),_(i,"."+e.attr("data-sort")),jQuery(" a.sorter").removeClass("descending").removeClass("ascending"),i?jQuery(".sort-"+e.attr("data-sort")).addClass("descending"):jQuery(".sort-"+e.attr("data-sort")).addClass("ascending"),jQuery("#sort_by").val(e.attr("data-sort")),jQuery("#descending").val(i?1:0),b()):window.location.href=jQuery("#current_url").val()+"&sort_by="+e.attr("data-sort")+"&descending="+(i?1:0)})}};function o(e){var n=[];if(n.user=0,n.group=0,void(n.all=0)!==e&&1==e){var a=jQuery("#chmod_form #chmod_value").val();n.user=a.substr(0,1),n.group=a.substr(1,1),n.all=a.substr(2,1),y.each(n,function(e){(""==n[e]||0==y.isNumeric(n[e])||parseInt(n[e])<0||7]+(>|$)/g,""),y.trim(e)):null}function g(e,a,t,r,i){null!==t&&(t=Q(t),y.ajax({type:"POST",url:"execute.php?action="+e,data:{path:a,name:t.replace("/","")}}).done(function(e){return""!=e?(bootbox.alert(e),!1):(""!=i&&window[i](r,t),!0)}))}function _(e,t){var a=jQuery("li.dir","ul.grid").filter(":visible"),r=jQuery("li.file","ul.grid").filter(":visible");c=0,y(".selection:checkbox").removeAttr("checked"),s.updateMultipleSelectionButtons();var i=[],n=[],l=[],o=[];a.each(function(){var e=jQuery(this),a=e.find(t).val();if(y.isNumeric(a))for(a=parseFloat(a);void 0!==i[a]&&i[a];)a=parseFloat(parseFloat(a)+parseFloat(.001));else a=a+"a"+e.find("h4 a").attr("data-file");i[a]=e.html(),n.push(a)}),r.each(function(){var e=jQuery(this),a=e.find(t).val();if(y.isNumeric(a))for(a=parseFloat(a);void 0!==l[a]&&l[a];)a=parseFloat(parseFloat(a)+parseFloat(.001));else a=a+"a"+e.find("h4 a").attr("data-file");l[a]=e.html(),o.push(a)}),y.isNumeric(n[0])?n.sort(function(e,a){return parseFloat(e)-parseFloat(a)}):n.sort(),y.isNumeric(o[0])?o.sort(function(e,a){return parseFloat(e)-parseFloat(a)}):o.sort(),e&&(n.reverse(),o.reverse()),a.each(function(e){jQuery(this).html(i[n[e]])}),r.each(function(e){jQuery(this).html(l[o[e]]),jQuery(this).attr("data-name",jQuery(this).children().attr("data-name"))})}function b(){i.update()}jQuery(document).ready(function(){if(s.makeContextMenu(),"undefined"!=typeof Storage&&1!=jQuery("#type_param").val()&&3!=jQuery("#type_param").val()){var e=localStorage.getItem("sort");if(e){var a=jQuery("#"+e);a.addClass("btn-inverse"),a.find("i").addClass("icon-white"),jQuery(".grid li").not("."+e).hide(300),jQuery(".grid li."+e).show(300)}}if(jQuery(".ff-container").on("click",".checkmark",function(e){e.stopPropagation(),jQuery(this).parent().find("input").is(":checked")?c--:c++,s.updateMultipleSelectionButtons()}),jQuery("#full-img").on("click",function(){jQuery("#previewLightbox").lightbox("hide")}),jQuery("body").on("click",function(){jQuery(".tip-right").tooltip("hide")}),s.bindGridEvents(),parseInt(jQuery("#file_number").val())>parseInt(jQuery("#file_number_limit_js").val()))var t=!1;else t=!0;s.makeSort(t),s.makeFilters(t),s.uploadURL(),jQuery("#info").on("click",function(){bootbox.alert('

responsive filemanager

RESPONSIVE filemanager v.9.14.0
responsivefilemanager.com


Copyright © Tecrail - Alberto Peripolli. All rights reserved.


License
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial 3.0 Unported License.

')}),jQuery("#change_lang_btn").on("click",function(){y.ajax({type:"POST",url:"ajax_calls.php?action=get_lang",data:{}}).done(function(e){bootbox.dialog(e,[{label:jQuery("#cancel").val(),class:"btn"},{label:jQuery("#ok").val(),class:"btn-inverse",callback:function(){var a=jQuery("#new_lang_select").val();y.ajax({type:"POST",url:"ajax_calls.php?action=change_lang",data:{choosen_lang:a}}).done(function(e){""!=e?bootbox.alert(e):setTimeout(function(){window.location.href=jQuery("#refresh").attr("href").replace(/lang=[\w]*&/i,"lang="+a+"&")+"&"+(new Date).getTime()},100)})}}],{header:jQuery("#lang_lang_change").val()})})}),s.makeUploader(),jQuery("body").on("keypress",function(e){var a=String.fromCharCode(e.which);if("'"==a||'"'==a||"\\"==a||"/"==a)return!1}),jQuery("ul.grid li figcaption").on("click",'a[data-toggle="lightbox"]',function(){!function(e){show_animation();var a=new Image;a.src=e,jQuery(a).on("load",function(){hide_animation()})}(decodeURIComponent(jQuery(this).attr("data-url")))}),jQuery(".create-file-btn").on("click",function(){jQuery("#textfile_create_area").parent().parent().remove(),y.ajax({type:"GET",url:"ajax_calls.php?action=new_file_form"}).done(function(e){bootbox.dialog(e,[{label:jQuery("#cancel").val(),class:"btn"},{label:jQuery("#ok").val(),class:"btn-inverse",callback:function(){var e=jQuery("#create_text_file_name").val()+jQuery("#create_text_file_extension").val(),a=jQuery("#textfile_create_area").val();if(null!==e){e=Q(e);var t=jQuery("#sub_folder").val()+jQuery("#fldr_value").val();y.ajax({type:"POST",url:"execute.php?action=create_file",data:{path:t,name:e,new_content:a}}).done(function(e){""!=e&&bootbox.alert(e,function(){setTimeout(function(){window.location.href=jQuery("#refresh").attr("href")+"&"+(new Date).getTime()},500)})})}}}],{header:jQuery("#lang_new_file").val()})})}),jQuery(".new-folder").on("click",function(){bootbox.prompt(jQuery("#insert_folder_name").val(),jQuery("#cancel").val(),jQuery("#ok").val(),function(e){if(null!==e){e=Q(e).replace(".","");var a=jQuery("#sub_folder").val()+jQuery("#fldr_value").val();y.ajax({type:"POST",url:"execute.php?action=create_folder",data:{path:a,name:e}}).done(function(e){e?bootbox.alert(jQuery("#rename_existing_folder").val()):setTimeout(function(){window.location.href=jQuery("#refresh").attr("href")+"&"+(new Date).getTime()},300)})}})}),jQuery(".view-controller button").on("click",function(){var e=jQuery(this);jQuery(".view-controller button").removeClass("btn-inverse"),jQuery(".view-controller i").removeClass("icon-white"),e.addClass("btn-inverse"),e.find("i").addClass("icon-white"),y.ajax({url:"ajax_calls.php?action=view&type="+e.attr("data-value")}).done(function(e){""!=e&&bootbox.alert(e)}),void 0!==jQuery("ul.grid")[0]&&jQuery("ul.grid")[0]&&(jQuery("ul.grid")[0].className=jQuery("ul.grid")[0].className.replace(/\blist-view.*?\b/g,"")),void 0!==jQuery(".sorter-container")[0]&&jQuery(".sorter-container")[0]&&(jQuery(".sorter-container")[0].className=jQuery(".sorter-container")[0].className.replace(/\blist-view.*?\b/g,""));var a=e.attr("data-value");jQuery("#view").val(a),jQuery("ul.grid").addClass("list-view"+a),jQuery(".sorter-container").addClass("list-view"+a),1<=e.attr("data-value")?p(14):(jQuery("ul.grid li").css("width",126),jQuery("ul.grid figure").css("width",122)),b()}),n.touch?(jQuery("#help").show(),jQuery(".box:not(.no-effect)").swipe({swipeLeft:v,swipeRight:v,threshold:30})):(jQuery(".tip").tooltip({placement:"bottom"}),jQuery(".tip-top").tooltip({placement:"top"}),jQuery(".tip-left").tooltip({placement:"left"}),jQuery(".tip-right").tooltip({placement:"right"}),jQuery("body").addClass("no-touch")),jQuery(".paste-here-btn").on("click",function(){0==jQuery(this).hasClass("disabled")&&d()}),jQuery(".clear-clipboard-btn").on("click",function(){0==jQuery(this).hasClass("disabled")&&bootbox.confirm(jQuery("#lang_clear_clipboard_confirm").val(),jQuery("#cancel").val(),jQuery("#ok").val(),function(e){1==e&&y.ajax({type:"POST",url:"ajax_calls.php?action=clear_clipboard",data:{}}).done(function(e){""!=e?bootbox.alert(e):jQuery("#clipboard").val("0"),f(!1)})})});var u=function(a){var t=[];return jQuery(".selection:checkbox:checked:visible").each(function(){var e=jQuery(this).val();a&&(e=jQuery(this).closest("figure").attr("data-path")),t.push(e)}),t};if(jQuery(".multiple-action-btn").on("click",function(){var e=u();window[jQuery(this).attr("data-function")](e,jQuery("#field_id").val())}),jQuery(".multiple-deselect-btn").on("click",function(){y(".selection:checkbox").removeAttr("checked"),jQuery("#multiple-selection").hide(300)}),jQuery(".multiple-select-btn").on("click",function(){y(".selection:checkbox:visible").prop("checked",!0)}),jQuery(".multiple-delete-btn").on("click",function(){if(0!=jQuery(".selection:checkbox:checked:visible").length){var e=jQuery(this);bootbox.confirm(e.attr("data-confirm"),jQuery("#cancel").val(),jQuery("#ok").val(),function(e){if(1==e){var a=u(!0);r="delete_files",i=a,o=l=n="",null!==name&&(name=Q(name),y.ajax({type:"POST",url:"execute.php?action="+r,data:{path:i[0],paths:i,names:n}}).done(function(e){return""!=e?(bootbox.alert(e),!1):(""!=o&&window[o](l,name),!0)}));var t=jQuery("#files_number");t.text(parseInt(t.text())-a.length),jQuery(".selection:checkbox:checked:visible").each(function(){jQuery(this).closest("li").remove()}),jQuery("#multiple-selection").hide(300)}var r,i,n,l,o})}}),!n.csstransforms){var r=jQuery("figure");r.on("mouseover",function(){0==jQuery("#view").val()&&!1===jQuery("#main-item-container").hasClass("no-effect-slide")&&jQuery(this).find(".box:not(.no-effect)").animate({top:"-26px"},{queue:!1,duration:300})}),r.on("mouseout",function(){0==jQuery("#view").val()&&jQuery(this).find(".box:not(.no-effect)").animate({top:"0px"},{queue:!1,duration:300})})}jQuery(window).resize(function(){p(28)}),p(14),1==jQuery("#clipboard").val()?f(!0):f(!1),jQuery("li.dir, li.file").draggable({distance:20,cursor:"move",helper:function(){jQuery(this).find("figure").find(".box").css("top","0px");var e=jQuery(this).clone().css("z-index",1e3).find(".box").css("box-shadow","none").css("-webkit-box-shadow","none").parent().parent();return jQuery(this).addClass("selected"),e},start:function(e,a){jQuery(a.helper).addClass("ui-draggable-helper"),0==jQuery("#view").val()&&jQuery("#main-item-container").addClass("no-effect-slide")},stop:function(){jQuery(this).removeClass("selected"),0==jQuery("#view").val()&&jQuery("#main-item-container").removeClass("no-effect-slide")}}),jQuery("li.dir,li.back").droppable({accept:"ul.grid li",activeClass:"ui-state-highlight",hoverClass:"ui-state-hover",drop:function(e,a){!function(t,r){t.hasClass("directory")?t.find(".rename-folder"):t.find(".rename-file");var e=t.closest("figure").attr("data-path");t.parent().hide(100),y.ajax({type:"POST",url:"ajax_calls.php?action=copy_cut",data:{path:e,sub_action:"cut"}}).done(function(e){var a;""!=e?bootbox.alert(e):(a=void 0!==r?r.hasClass("back-directory")?r.find(".path").val():r.closest("figure").attr("data-path"):jQuery("#sub_folder").val()+jQuery("#fldr_value").val(),y.ajax({type:"POST",url:"execute.php?action=paste_clipboard",data:{path:a}}).done(function(e){""!=e?(bootbox.alert(e),t.parent().show(100)):(jQuery("#clipboard").val("0"),f(!1),t.parent().remove())}))}).error(function(){t.parent().show(100)})}(a.draggable.find("figure"),jQuery(this).find("figure"))}}),jQuery(document).on("keyup","#chmod_form #chmod_value",function(){o(!0)}),jQuery(document).on("change","#chmod_form input",function(){o(!1)}),jQuery(document).on("focusout","#chmod_form #chmod_value",function(){var e=jQuery("#chmod_form #chmod_value");null==e.val().match(/^[0-7]{3}$/)&&(e.val(e.attr("data-def-value")),o(!0))}),i=new LazyLoad,new Clipboard(".btn")}),encodeURL=function(e){for(var a=e.split("/"),t=3;t '):-1'+d+" ":-1'+d+" "):i+=''+d+" "}1==jQuery("#crossdomain").val()?t.postMessage({sender:"responsivefilemanager",url:u,field_id:null,html:i},"*"):parent.tinymce.majorVersion<4?(parent.tinymce.activeEditor.execCommand("mceInsertContent",!1,i),parent.tinymce.activeEditor.windowManager.close(parent.tinymce.activeEditor.windowManager.params.mce_window_id)):(parent.tinymce.activeEditor.insertContent(i),parent.tinymce.activeEditor.windowManager.close())}},apply_link=function(e,a){var t=h(),r=jQuery("#callback").val();Array.isArray(e)||(e=new Array(e));var i=m(e),n=JSON.stringify(i);(1==i.length&&(n=i[0]),""!=a)?1==jQuery("#crossdomain").val()?t.postMessage({sender:"responsivefilemanager",url:i[0],field_id:a},"*"):(jQuery("#"+a,t.document).val(n).trigger("change"),0==r?"function"==typeof t.responsive_filemanager_callback&&t.responsive_filemanager_callback(a):"function"==typeof t[r]&&t[r](a),j()):apply_any(i[0])},apply_img=function(e,a){var t=h(),r=jQuery("#callback").val();Array.isArray(e)||(e=new Array(e));var i=m(e),n=JSON.stringify(i);if(1==i.length&&(n=i[0]),""!=a){if(1==jQuery("#crossdomain").val())t.postMessage({sender:"responsivefilemanager",url:i[0],field_id:a},"*");else jQuery("#"+a,t.document).val(n).trigger("change"),0==r?"function"==typeof t.responsive_filemanager_callback&&t.responsive_filemanager_callback(a):"function"==typeof t[r]&&t[r](a),j()}else{if(jQuery("#add_time_to_img").val())var l=i[0]+"?"+(new Date).getTime();else l=i[0];apply_any(l)}},apply_video=function(e,a){var t=h(),r=jQuery("#callback").val();Array.isArray(e)||(e=new Array(e));var i=m(e),n=JSON.stringify(i);(1==i.length&&(n=i[0]),""!=a)?1==jQuery("#crossdomain").val()?t.postMessage({sender:"responsivefilemanager",url:i[0],field_id:a},"*"):(jQuery("#"+a,t.document).val(n).trigger("change"),0==r?"function"==typeof t.responsive_filemanager_callback&&t.responsive_filemanager_callback(a):"function"==typeof t[r]&&t[r](a),j()):apply_any(i[0])},apply_none=function(e,a,t){t.parent().find("form a")[1].click(),jQuery(".tip-right").tooltip("hide")},apply_any=function(e){if(1==jQuery("#crossdomain").val())window.parent.postMessage({sender:"responsivefilemanager",url:e,field_id:null},"*");else if("ckeditor"===jQuery("#editor").val()){var a=(t=new RegExp("(?:[?&]|&)"+"CKEditorFuncNum"+"=([^&]+)","i"),(r=window.location.search.match(t))&&1"+t.html()+"");var r=t.next();apply_file_rename(r.find("figure"),a);var i=r.find(".download-form"),n="form"+(new Date).getTime();i.attr("id",n),i.find(".tip-right").first().attr("onclick","jQuery('#"+n+"').submit();")},apply_file_rename=function(e,a){var t;e.attr("data-name",a),e.parent().attr("data-name",a),e.find("h4").text(a);var r=e.find("a.link"),i=(t=r.attr("data-file")).substring(t.lastIndexOf("/")+1),n=t.substring(t.lastIndexOf(".")+1);n=n?"."+n:"",r.each(function(){jQuery(this).attr("data-file",encodeURIComponent(a+n))}),e.find("img").each(function(){if(e=jQuery(this).attr("src"))jQuery(this).attr("src",e.replace(i,a+n)+"?time="+(new Date).getTime());else{var e=jQuery(this).attr("data-src");jQuery(this).attr("data-src",e.replace(i,a+n)+"?time="+(new Date).getTime())}jQuery(this).attr("alt",a+" thumbnails")});var l=e.find("a.preview");void 0!==(t=l.attr("data-url"))&&t&&l.attr("data-url",t.replace(encodeURIComponent(i),encodeURIComponent(a+n))),e.parent().attr("data-name",a+n),e.attr("data-name",a+n),e.find(".name_download").val(a+n);var o=e.attr("data-path").replace(i,a+n);e.attr("data-path",o)},apply_folder_rename=function(e,a){e.attr("data-name",a),e.find("figure").attr("data-name",a);var t=e.find("h4").find("a").text();e.find("h4 > a").text(a);var r=e.find(".folder-link"),i=r.attr("href"),n=jQuery("#fldr_value").val(),l=i.replace("fldr="+n+encodeURIComponent(t),"fldr="+n+encodeURIComponent(a));r.each(function(){jQuery(this).attr("href",l)});var o=e.attr("data-path"),u=o.lastIndexOf("/"),c=o.substr(0,u+1)+a;e.attr("data-path",c)},show_animation=function(){jQuery("#loading_container").css("display","block"),jQuery("#loading").css("opacity",".7")},hide_animation=function(){jQuery("#loading_container").fadeOut()}}(jQuery,Modernizr,image_editor),function(){if("function"==typeof window.CustomEvent)return;function e(e,a){a=a||{bubbles:!1,cancelable:!1,detail:void 0};var t=document.createEvent("CustomEvent");return t.initCustomEvent(e,a.bubbles,a.cancelable,a.detail),t}e.prototype=window.Event.prototype,window.CustomEvent=e}(); \ No newline at end of file diff --git a/libraries/filemanager-9.14.2/js/jquery.fileupload-angular.js b/libraries/filemanager-9.14.2/js/jquery.fileupload-angular.js new file mode 100644 index 0000000..185907d --- /dev/null +++ b/libraries/filemanager-9.14.2/js/jquery.fileupload-angular.js @@ -0,0 +1,438 @@ +/* + * jQuery File Upload AngularJS Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + */ + +/* jshint nomen:false */ +/* global define, angular, require */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + 'angular', + './jquery.fileupload-image', + './jquery.fileupload-audio', + './jquery.fileupload-video', + './jquery.fileupload-validate' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('angular'), + require('./jquery.fileupload-image'), + require('./jquery.fileupload-audio'), + require('./jquery.fileupload-video'), + require('./jquery.fileupload-validate') + ); + } else { + factory(); + } +}(function () { + 'use strict'; + + angular.module('blueimp.fileupload', []) + + // The fileUpload service provides configuration options + // for the fileUpload directive and default handlers for + // File Upload events: + .provider('fileUpload', function () { + var scopeEvalAsync = function (expression) { + var scope = angular.element(this) + .fileupload('option', 'scope'); + // Schedule a new $digest cycle if not already inside of one + // and evaluate the given expression: + scope.$evalAsync(expression); + }, + addFileMethods = function (scope, data) { + var files = data.files, + file = files[0]; + angular.forEach(files, function (file, index) { + file._index = index; + file.$state = function () { + return data.state(); + }; + file.$processing = function () { + return data.processing(); + }; + file.$progress = function () { + return data.progress(); + }; + file.$response = function () { + return data.response(); + }; + }); + file.$submit = function () { + if (!file.error) { + return data.submit(); + } + }; + file.$cancel = function () { + return data.abort(); + }; + }, + $config; + $config = this.defaults = { + handleResponse: function (e, data) { + var files = data.result && data.result.files; + if (files) { + data.scope.replace(data.files, files); + } else if (data.errorThrown || + data.textStatus === 'error') { + data.files[0].error = data.errorThrown || + data.textStatus; + } + }, + add: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var scope = data.scope, + filesCopy = []; + angular.forEach(data.files, function (file) { + filesCopy.push(file); + }); + scope.$parent.$applyAsync(function () { + addFileMethods(scope, data); + var method = scope.option('prependFiles') ? + 'unshift' : 'push'; + Array.prototype[method].apply(scope.queue, data.files); + }); + data.process(function () { + return scope.process(data); + }).always(function () { + scope.$parent.$applyAsync(function () { + addFileMethods(scope, data); + scope.replace(filesCopy, data.files); + }); + }).then(function () { + if ((scope.option('autoUpload') || + data.autoUpload) && + data.autoUpload !== false) { + data.submit(); + } + }); + }, + done: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var that = this; + data.scope.$apply(function () { + data.handleResponse.call(that, e, data); + }); + }, + fail: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var that = this, + scope = data.scope; + if (data.errorThrown === 'abort') { + scope.clear(data.files); + return; + } + scope.$apply(function () { + data.handleResponse.call(that, e, data); + }); + }, + stop: scopeEvalAsync, + processstart: scopeEvalAsync, + processstop: scopeEvalAsync, + getNumberOfFiles: function () { + var scope = this.scope; + return scope.queue.length - scope.processing(); + }, + dataType: 'json', + autoUpload: false + }; + this.$get = [ + function () { + return { + defaults: $config + }; + } + ]; + }) + + // Format byte numbers to readable presentations: + .provider('formatFileSizeFilter', function () { + var $config = { + // Byte units following the IEC format + // http://en.wikipedia.org/wiki/Kilobyte + units: [ + {size: 1000000000, suffix: ' GB'}, + {size: 1000000, suffix: ' MB'}, + {size: 1000, suffix: ' KB'} + ] + }; + this.defaults = $config; + this.$get = function () { + return function (bytes) { + if (!angular.isNumber(bytes)) { + return ''; + } + var unit = true, + i = 0, + prefix, + suffix; + while (unit) { + unit = $config.units[i]; + prefix = unit.prefix || ''; + suffix = unit.suffix || ''; + if (i === $config.units.length - 1 || bytes >= unit.size) { + return prefix + (bytes / unit.size).toFixed(2) + suffix; + } + i += 1; + } + }; + }; + }) + + // The FileUploadController initializes the fileupload widget and + // provides scope methods to control the File Upload functionality: + .controller('FileUploadController', [ + '$scope', '$element', '$attrs', '$window', 'fileUpload','$q', + function ($scope, $element, $attrs, $window, fileUpload, $q) { + var uploadMethods = { + progress: function () { + return $element.fileupload('progress'); + }, + active: function () { + return $element.fileupload('active'); + }, + option: function (option, data) { + if (arguments.length === 1) { + return $element.fileupload('option', option); + } + $element.fileupload('option', option, data); + }, + add: function (data) { + return $element.fileupload('add', data); + }, + send: function (data) { + return $element.fileupload('send', data); + }, + process: function (data) { + return $element.fileupload('process', data); + }, + processing: function (data) { + return $element.fileupload('processing', data); + } + }; + $scope.disabled = !$window.jQuery.support.fileInput; + $scope.queue = $scope.queue || []; + $scope.clear = function (files) { + var queue = this.queue, + i = queue.length, + file = files, + length = 1; + if (angular.isArray(files)) { + file = files[0]; + length = files.length; + } + while (i) { + i -= 1; + if (queue[i] === file) { + return queue.splice(i, length); + } + } + }; + $scope.replace = function (oldFiles, newFiles) { + var queue = this.queue, + file = oldFiles[0], + i, + j; + for (i = 0; i < queue.length; i += 1) { + if (queue[i] === file) { + for (j = 0; j < newFiles.length; j += 1) { + queue[i + j] = newFiles[j]; + } + return; + } + } + }; + $scope.applyOnQueue = function (method) { + var list = this.queue.slice(0), + i, + file, + promises = []; + for (i = 0; i < list.length; i += 1) { + file = list[i]; + if (file[method]) { + promises.push(file[method]()); + } + } + return $q.all(promises); + }; + $scope.submit = function () { + return this.applyOnQueue('$submit'); + }; + $scope.cancel = function () { + return this.applyOnQueue('$cancel'); + }; + // Add upload methods to the scope: + angular.extend($scope, uploadMethods); + // The fileupload widget will initialize with + // the options provided via "data-"-parameters, + // as well as those given via options object: + $element.fileupload(angular.extend( + {scope: $scope}, + fileUpload.defaults + )).on('fileuploadadd', function (e, data) { + data.scope = $scope; + }).on('fileuploadfail', function (e, data) { + if (data.errorThrown === 'abort') { + return; + } + if (data.dataType && + data.dataType.indexOf('json') === data.dataType.length - 4) { + try { + data.result = angular.fromJson(data.jqXHR.responseText); + } catch (ignore) {} + } + }).on([ + 'fileuploadadd', + 'fileuploadsubmit', + 'fileuploadsend', + 'fileuploaddone', + 'fileuploadfail', + 'fileuploadalways', + 'fileuploadprogress', + 'fileuploadprogressall', + 'fileuploadstart', + 'fileuploadstop', + 'fileuploadchange', + 'fileuploadpaste', + 'fileuploaddrop', + 'fileuploaddragover', + 'fileuploadchunkbeforesend', + 'fileuploadchunksend', + 'fileuploadchunkdone', + 'fileuploadchunkfail', + 'fileuploadchunkalways', + 'fileuploadprocessstart', + 'fileuploadprocess', + 'fileuploadprocessdone', + 'fileuploadprocessfail', + 'fileuploadprocessalways', + 'fileuploadprocessstop' + ].join(' '), function (e, data) { + $scope.$parent.$applyAsync(function () { + if ($scope.$emit(e.type, data).defaultPrevented) { + e.preventDefault(); + } + }); + }).on('remove', function () { + // Remove upload methods from the scope, + // when the widget is removed: + var method; + for (method in uploadMethods) { + if (uploadMethods.hasOwnProperty(method)) { + delete $scope[method]; + } + } + }); + // Observe option changes: + $scope.$watch( + $attrs.fileUpload, + function (newOptions) { + if (newOptions) { + $element.fileupload('option', newOptions); + } + } + ); + } + ]) + + // Provide File Upload progress feedback: + .controller('FileUploadProgressController', [ + '$scope', '$attrs', '$parse', + function ($scope, $attrs, $parse) { + var fn = $parse($attrs.fileUploadProgress), + update = function () { + var progress = fn($scope); + if (!progress || !progress.total) { + return; + } + $scope.num = Math.floor( + progress.loaded / progress.total * 100 + ); + }; + update(); + $scope.$watch( + $attrs.fileUploadProgress + '.loaded', + function (newValue, oldValue) { + if (newValue !== oldValue) { + update(); + } + } + ); + } + ]) + + // Display File Upload previews: + .controller('FileUploadPreviewController', [ + '$scope', '$element', '$attrs', + function ($scope, $element, $attrs) { + $scope.$watch( + $attrs.fileUploadPreview + '.preview', + function (preview) { + $element.empty(); + if (preview) { + $element.append(preview); + } + } + ); + } + ]) + + .directive('fileUpload', function () { + return { + controller: 'FileUploadController', + scope: true + }; + }) + + .directive('fileUploadProgress', function () { + return { + controller: 'FileUploadProgressController', + scope: true + }; + }) + + .directive('fileUploadPreview', function () { + return { + controller: 'FileUploadPreviewController' + }; + }) + + // Enhance the HTML5 download attribute to + // allow drag&drop of files to the desktop: + .directive('download', function () { + return function (scope, elm) { + elm.on('dragstart', function (e) { + try { + e.originalEvent.dataTransfer.setData( + 'DownloadURL', + [ + 'application/octet-stream', + elm.prop('download'), + elm.prop('href') + ].join(':') + ); + } catch (ignore) {} + }); + }; + }); + +})); diff --git a/libraries/filemanager-9.14.2/js/jquery.fileupload-audio.js b/libraries/filemanager-9.14.2/js/jquery.fileupload-audio.js new file mode 100644 index 0000000..a253776 --- /dev/null +++ b/libraries/filemanager-9.14.2/js/jquery.fileupload-audio.js @@ -0,0 +1,113 @@ +/* + * jQuery File Upload Audio Preview Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + */ + +/* jshint nomen:false */ +/* global define, require, window, document */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + 'load-image', + './jquery.fileupload-process' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('blueimp-load-image/js/load-image'), + require('./jquery.fileupload-process') + ); + } else { + // Browser globals: + factory( + window.jQuery, + window.loadImage + ); + } +}(function ($, loadImage) { + 'use strict'; + + // Prepend to the default processQueue: + $.blueimp.fileupload.prototype.options.processQueue.unshift( + { + action: 'loadAudio', + // Use the action as prefix for the "@" options: + prefix: true, + fileTypes: '@', + maxFileSize: '@', + disabled: '@disableAudioPreview' + }, + { + action: 'setAudio', + name: '@audioPreviewName', + disabled: '@disableAudioPreview' + } + ); + + // The File Upload Audio Preview plugin extends the fileupload widget + // with audio preview functionality: + $.widget('blueimp.fileupload', $.blueimp.fileupload, { + + options: { + // The regular expression for the types of audio files to load, + // matched against the file type: + loadAudioFileTypes: /^audio\/.*$/ + }, + + _audioElement: document.createElement('audio'), + + processActions: { + + // Loads the audio file given via data.files and data.index + // as audio element if the browser supports playing it. + // Accepts the options fileTypes (regular expression) + // and maxFileSize (integer) to limit the files to load: + loadAudio: function (data, options) { + if (options.disabled) { + return data; + } + var file = data.files[data.index], + url, + audio; + if (this._audioElement.canPlayType && + this._audioElement.canPlayType(file.type) && + ($.type(options.maxFileSize) !== 'number' || + file.size <= options.maxFileSize) && + (!options.fileTypes || + options.fileTypes.test(file.type))) { + url = loadImage.createObjectURL(file); + if (url) { + audio = this._audioElement.cloneNode(false); + audio.src = url; + audio.controls = true; + data.audio = audio; + return data; + } + } + return data; + }, + + // Sets the audio element as a property of the file object: + setAudio: function (data, options) { + if (data.audio && !options.disabled) { + data.files[data.index][options.name || 'preview'] = data.audio; + } + return data; + } + + } + + }); + +})); diff --git a/libraries/filemanager-9.14.2/js/jquery.fileupload-image.js b/libraries/filemanager-9.14.2/js/jquery.fileupload-image.js new file mode 100644 index 0000000..65fc6d7 --- /dev/null +++ b/libraries/filemanager-9.14.2/js/jquery.fileupload-image.js @@ -0,0 +1,326 @@ +/* + * jQuery File Upload Image Preview & Resize Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + */ + +/* jshint nomen:false */ +/* global define, require, window, Blob */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + 'load-image', + 'load-image-meta', + 'load-image-scale', + 'load-image-exif', + 'canvas-to-blob', + './jquery.fileupload-process' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('blueimp-load-image/js/load-image'), + require('blueimp-load-image/js/load-image-meta'), + require('blueimp-load-image/js/load-image-scale'), + require('blueimp-load-image/js/load-image-exif'), + require('blueimp-canvas-to-blob'), + require('./jquery.fileupload-process') + ); + } else { + // Browser globals: + factory( + window.jQuery, + window.loadImage + ); + } +}(function ($, loadImage) { + 'use strict'; + + // Prepend to the default processQueue: + $.blueimp.fileupload.prototype.options.processQueue.unshift( + { + action: 'loadImageMetaData', + disableImageHead: '@', + disableExif: '@', + disableExifThumbnail: '@', + disableExifSub: '@', + disableExifGps: '@', + disabled: '@disableImageMetaDataLoad' + }, + { + action: 'loadImage', + // Use the action as prefix for the "@" options: + prefix: true, + fileTypes: '@', + maxFileSize: '@', + noRevoke: '@', + disabled: '@disableImageLoad' + }, + { + action: 'resizeImage', + // Use "image" as prefix for the "@" options: + prefix: 'image', + maxWidth: '@', + maxHeight: '@', + minWidth: '@', + minHeight: '@', + crop: '@', + orientation: '@', + forceResize: '@', + disabled: '@disableImageResize' + }, + { + action: 'saveImage', + quality: '@imageQuality', + type: '@imageType', + disabled: '@disableImageResize' + }, + { + action: 'saveImageMetaData', + disabled: '@disableImageMetaDataSave' + }, + { + action: 'resizeImage', + // Use "preview" as prefix for the "@" options: + prefix: 'preview', + maxWidth: '@', + maxHeight: '@', + minWidth: '@', + minHeight: '@', + crop: '@', + orientation: '@', + thumbnail: '@', + canvas: '@', + disabled: '@disableImagePreview' + }, + { + action: 'setImage', + name: '@imagePreviewName', + disabled: '@disableImagePreview' + }, + { + action: 'deleteImageReferences', + disabled: '@disableImageReferencesDeletion' + } + ); + + // The File Upload Resize plugin extends the fileupload widget + // with image resize functionality: + $.widget('blueimp.fileupload', $.blueimp.fileupload, { + + options: { + // The regular expression for the types of images to load: + // matched against the file type: + loadImageFileTypes: /^image\/(gif|jpeg|png|svg\+xml)$/, + // The maximum file size of images to load: + loadImageMaxFileSize: 10000000, // 10MB + // The maximum width of resized images: + imageMaxWidth: 1920, + // The maximum height of resized images: + imageMaxHeight: 1080, + // Defines the image orientation (1-8) or takes the orientation + // value from Exif data if set to true: + imageOrientation: false, + // Define if resized images should be cropped or only scaled: + imageCrop: false, + // Disable the resize image functionality by default: + disableImageResize: true, + // The maximum width of the preview images: + previewMaxWidth: 80, + // The maximum height of the preview images: + previewMaxHeight: 80, + // Defines the preview orientation (1-8) or takes the orientation + // value from Exif data if set to true: + previewOrientation: true, + // Create the preview using the Exif data thumbnail: + previewThumbnail: true, + // Define if preview images should be cropped or only scaled: + previewCrop: false, + // Define if preview images should be resized as canvas elements: + previewCanvas: true + }, + + processActions: { + + // Loads the image given via data.files and data.index + // as img element, if the browser supports the File API. + // Accepts the options fileTypes (regular expression) + // and maxFileSize (integer) to limit the files to load: + loadImage: function (data, options) { + if (options.disabled) { + return data; + } + var that = this, + file = data.files[data.index], + dfd = $.Deferred(); + if (($.type(options.maxFileSize) === 'number' && + file.size > options.maxFileSize) || + (options.fileTypes && + !options.fileTypes.test(file.type)) || + !loadImage( + file, + function (img) { + if (img.src) { + data.img = img; + } + dfd.resolveWith(that, [data]); + }, + options + )) { + return data; + } + return dfd.promise(); + }, + + // Resizes the image given as data.canvas or data.img + // and updates data.canvas or data.img with the resized image. + // Also stores the resized image as preview property. + // Accepts the options maxWidth, maxHeight, minWidth, + // minHeight, canvas and crop: + resizeImage: function (data, options) { + if (options.disabled || !(data.canvas || data.img)) { + return data; + } + options = $.extend({canvas: true}, options); + var that = this, + dfd = $.Deferred(), + img = (options.canvas && data.canvas) || data.img, + resolve = function (newImg) { + if (newImg && (newImg.width !== img.width || + newImg.height !== img.height || + options.forceResize)) { + data[newImg.getContext ? 'canvas' : 'img'] = newImg; + } + data.preview = newImg; + dfd.resolveWith(that, [data]); + }, + thumbnail; + if (data.exif) { + if (options.orientation === true) { + options.orientation = data.exif.get('Orientation'); + } + if (options.thumbnail) { + thumbnail = data.exif.get('Thumbnail'); + if (thumbnail) { + loadImage(thumbnail, resolve, options); + return dfd.promise(); + } + } + // Prevent orienting the same image twice: + if (data.orientation) { + delete options.orientation; + } else { + data.orientation = options.orientation; + } + } + if (img) { + resolve(loadImage.scale(img, options)); + return dfd.promise(); + } + return data; + }, + + // Saves the processed image given as data.canvas + // inplace at data.index of data.files: + saveImage: function (data, options) { + if (!data.canvas || options.disabled) { + return data; + } + var that = this, + file = data.files[data.index], + dfd = $.Deferred(); + if (data.canvas.toBlob) { + data.canvas.toBlob( + function (blob) { + if (!blob.name) { + if (file.type === blob.type) { + blob.name = file.name; + } else if (file.name) { + blob.name = file.name.replace( + /\.\w+$/, + '.' + blob.type.substr(6) + ); + } + } + // Don't restore invalid meta data: + if (file.type !== blob.type) { + delete data.imageHead; + } + // Store the created blob at the position + // of the original file in the files list: + data.files[data.index] = blob; + dfd.resolveWith(that, [data]); + }, + options.type || file.type, + options.quality + ); + } else { + return data; + } + return dfd.promise(); + }, + + loadImageMetaData: function (data, options) { + if (options.disabled) { + return data; + } + var that = this, + dfd = $.Deferred(); + loadImage.parseMetaData(data.files[data.index], function (result) { + $.extend(data, result); + dfd.resolveWith(that, [data]); + }, options); + return dfd.promise(); + }, + + saveImageMetaData: function (data, options) { + if (!(data.imageHead && data.canvas && + data.canvas.toBlob && !options.disabled)) { + return data; + } + var file = data.files[data.index], + blob = new Blob([ + data.imageHead, + // Resized images always have a head size of 20 bytes, + // including the JPEG marker and a minimal JFIF header: + this._blobSlice.call(file, 20) + ], {type: file.type}); + blob.name = file.name; + data.files[data.index] = blob; + return data; + }, + + // Sets the resized version of the image as a property of the + // file object, must be called after "saveImage": + setImage: function (data, options) { + if (data.preview && !options.disabled) { + data.files[data.index][options.name || 'preview'] = data.preview; + } + return data; + }, + + deleteImageReferences: function (data, options) { + if (!options.disabled) { + delete data.img; + delete data.canvas; + delete data.preview; + delete data.imageHead; + } + return data; + } + + } + + }); + +})); diff --git a/libraries/filemanager-9.14.2/js/jquery.fileupload-jquery-ui.js b/libraries/filemanager-9.14.2/js/jquery.fileupload-jquery-ui.js new file mode 100644 index 0000000..7b136b3 --- /dev/null +++ b/libraries/filemanager-9.14.2/js/jquery.fileupload-jquery-ui.js @@ -0,0 +1,161 @@ +/* + * jQuery File Upload jQuery UI Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + */ + +/* jshint nomen:false */ +/* global define, require, window */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + './jquery.fileupload-ui' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('./jquery.fileupload-ui') + ); + } else { + // Browser globals: + factory(window.jQuery); + } +}(function ($) { + 'use strict'; + + $.widget('blueimp.fileupload', $.blueimp.fileupload, { + + options: { + processdone: function (e, data) { + data.context.find('.start').button('enable'); + }, + progress: function (e, data) { + if (data.context) { + data.context.find('.progress').progressbar( + 'option', + 'value', + parseInt(data.loaded / data.total * 100, 10) + ); + } + }, + progressall: function (e, data) { + var $this = $(this); + $this.find('.fileupload-progress') + .find('.progress').progressbar( + 'option', + 'value', + parseInt(data.loaded / data.total * 100, 10) + ).end() + .find('.progress-extended').each(function () { + $(this).html( + ($this.data('blueimp-fileupload') || + $this.data('fileupload')) + ._renderExtendedProgress(data) + ); + }); + } + }, + + _renderUpload: function (func, files) { + var node = this._super(func, files), + showIconText = $(window).width() > 480; + node.find('.progress').empty().progressbar(); + node.find('.start').button({ + icons: {primary: 'ui-icon-circle-arrow-e'}, + text: showIconText + }); + node.find('.cancel').button({ + icons: {primary: 'ui-icon-cancel'}, + text: showIconText + }); + if (node.hasClass('fade')) { + node.hide(); + } + return node; + }, + + _renderDownload: function (func, files) { + var node = this._super(func, files), + showIconText = $(window).width() > 480; + node.find('.delete').button({ + icons: {primary: 'ui-icon-trash'}, + text: showIconText + }); + if (node.hasClass('fade')) { + node.hide(); + } + return node; + }, + + _startHandler: function (e) { + $(e.currentTarget).button('disable'); + this._super(e); + }, + + _transition: function (node) { + var deferred = $.Deferred(); + if (node.hasClass('fade')) { + node.fadeToggle( + this.options.transitionDuration, + this.options.transitionEasing, + function () { + deferred.resolveWith(node); + } + ); + } else { + deferred.resolveWith(node); + } + return deferred; + }, + + _create: function () { + this._super(); + this.element + .find('.fileupload-buttonbar') + .find('.fileinput-button').each(function () { + var input = $(this).find('input:file').detach(); + $(this) + .button({icons: {primary: 'ui-icon-plusthick'}}) + .append(input); + }) + .end().find('.start') + .button({icons: {primary: 'ui-icon-circle-arrow-e'}}) + .end().find('.cancel') + .button({icons: {primary: 'ui-icon-cancel'}}) + .end().find('.delete') + .button({icons: {primary: 'ui-icon-trash'}}) + .end().find('.progress').progressbar(); + }, + + _destroy: function () { + this.element + .find('.fileupload-buttonbar') + .find('.fileinput-button').each(function () { + var input = $(this).find('input:file').detach(); + $(this) + .button('destroy') + .append(input); + }) + .end().find('.start') + .button('destroy') + .end().find('.cancel') + .button('destroy') + .end().find('.delete') + .button('destroy') + .end().find('.progress').progressbar('destroy'); + this._super(); + } + + }); + +})); diff --git a/libraries/filemanager-9.14.2/js/jquery.fileupload-process.js b/libraries/filemanager-9.14.2/js/jquery.fileupload-process.js new file mode 100644 index 0000000..638f0d2 --- /dev/null +++ b/libraries/filemanager-9.14.2/js/jquery.fileupload-process.js @@ -0,0 +1,178 @@ +/* + * jQuery File Upload Processing Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2012, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + */ + +/* jshint nomen:false */ +/* global define, require, window */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + './jquery.fileupload' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('./jquery.fileupload') + ); + } else { + // Browser globals: + factory( + window.jQuery + ); + } +}(function ($) { + 'use strict'; + + var originalAdd = $.blueimp.fileupload.prototype.options.add; + + // The File Upload Processing plugin extends the fileupload widget + // with file processing functionality: + $.widget('blueimp.fileupload', $.blueimp.fileupload, { + + options: { + // The list of processing actions: + processQueue: [ + /* + { + action: 'log', + type: 'debug' + } + */ + ], + add: function (e, data) { + var $this = $(this); + data.process(function () { + return $this.fileupload('process', data); + }); + originalAdd.call(this, e, data); + } + }, + + processActions: { + /* + log: function (data, options) { + console[options.type]( + 'Processing "' + data.files[data.index].name + '"' + ); + } + */ + }, + + _processFile: function (data, originalData) { + var that = this, + dfd = $.Deferred().resolveWith(that, [data]), + chain = dfd.promise(); + this._trigger('process', null, data); + $.each(data.processQueue, function (i, settings) { + var func = function (data) { + if (originalData.errorThrown) { + return $.Deferred() + .rejectWith(that, [originalData]).promise(); + } + return that.processActions[settings.action].call( + that, + data, + settings + ); + }; + chain = chain.then(func, settings.always && func); + }); + chain + .done(function () { + that._trigger('processdone', null, data); + that._trigger('processalways', null, data); + }) + .fail(function () { + that._trigger('processfail', null, data); + that._trigger('processalways', null, data); + }); + return chain; + }, + + // Replaces the settings of each processQueue item that + // are strings starting with an "@", using the remaining + // substring as key for the option map, + // e.g. "@autoUpload" is replaced with options.autoUpload: + _transformProcessQueue: function (options) { + var processQueue = []; + $.each(options.processQueue, function () { + var settings = {}, + action = this.action, + prefix = this.prefix === true ? action : this.prefix; + $.each(this, function (key, value) { + if ($.type(value) === 'string' && + value.charAt(0) === '@') { + settings[key] = options[ + value.slice(1) || (prefix ? prefix + + key.charAt(0).toUpperCase() + key.slice(1) : key) + ]; + } else { + settings[key] = value; + } + + }); + processQueue.push(settings); + }); + options.processQueue = processQueue; + }, + + // Returns the number of files currently in the processsing queue: + processing: function () { + return this._processing; + }, + + // Processes the files given as files property of the data parameter, + // returns a Promise object that allows to bind callbacks: + process: function (data) { + var that = this, + options = $.extend({}, this.options, data); + if (options.processQueue && options.processQueue.length) { + this._transformProcessQueue(options); + if (this._processing === 0) { + this._trigger('processstart'); + } + $.each(data.files, function (index) { + var opts = index ? $.extend({}, options) : options, + func = function () { + if (data.errorThrown) { + return $.Deferred() + .rejectWith(that, [data]).promise(); + } + return that._processFile(opts, data); + }; + opts.index = index; + that._processing += 1; + that._processingQueue = that._processingQueue.then(func, func) + .always(function () { + that._processing -= 1; + if (that._processing === 0) { + that._trigger('processstop'); + } + }); + }); + } + return this._processingQueue; + }, + + _create: function () { + this._super(); + this._processing = 0; + this._processingQueue = $.Deferred().resolveWith(this) + .promise(); + } + + }); + +})); diff --git a/libraries/filemanager-9.14.2/js/jquery.fileupload-ui.js b/libraries/filemanager-9.14.2/js/jquery.fileupload-ui.js new file mode 100644 index 0000000..5058084 --- /dev/null +++ b/libraries/filemanager-9.14.2/js/jquery.fileupload-ui.js @@ -0,0 +1,714 @@ +/* + * jQuery File Upload User Interface Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2010, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + */ + +/* jshint nomen:false */ +/* global define, require, window */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + 'blueimp-tmpl', + './jquery.fileupload-image', + './jquery.fileupload-audio', + './jquery.fileupload-video', + './jquery.fileupload-validate' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('blueimp-tmpl'), + require('./jquery.fileupload-image'), + require('./jquery.fileupload-audio'), + require('./jquery.fileupload-video'), + require('./jquery.fileupload-validate') + ); + } else { + // Browser globals: + factory( + window.jQuery, + window.tmpl + ); + } +}(function ($, tmpl) { + 'use strict'; + + $.blueimp.fileupload.prototype._specialOptions.push( + 'filesContainer', + 'uploadTemplateId', + 'downloadTemplateId' + ); + + // The UI version extends the file upload widget + // and adds complete user interface interaction: + $.widget('blueimp.fileupload', $.blueimp.fileupload, { + + options: { + // By default, files added to the widget are uploaded as soon + // as the user clicks on the start buttons. To enable automatic + // uploads, set the following option to true: + autoUpload: false, + // The ID of the upload template: + uploadTemplateId: 'template-upload', + // The ID of the download template: + downloadTemplateId: 'template-download', + // The container for the list of files. If undefined, it is set to + // an element with class "files" inside of the widget element: + filesContainer: undefined, + // By default, files are appended to the files container. + // Set the following option to true, to prepend files instead: + prependFiles: false, + // The expected data type of the upload response, sets the dataType + // option of the $.ajax upload requests: + dataType: 'json', + + // Error and info messages: + messages: { + unknownError: 'Unknown error' + }, + + // Function returning the current number of files, + // used by the maxNumberOfFiles validation: + getNumberOfFiles: function () { + return this.filesContainer.children() + .not('.processing').length; + }, + + // Callback to retrieve the list of files from the server response: + getFilesFromResponse: function (data) { + if (data.result && $.isArray(data.result.files)) { + return data.result.files; + } + return []; + }, + + // The add callback is invoked as soon as files are added to the fileupload + // widget (via file input selection, drag & drop or add API call). + // See the basic file upload widget for more information: + add: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var $this = $(this), + that = $this.data('blueimp-fileupload') || + $this.data('fileupload'), + options = that.options; + data.context = that._renderUpload(data.files) + .data('data', data) + .addClass('processing'); + options.filesContainer[ + options.prependFiles ? 'prepend' : 'append' + ](data.context); + that._forceReflow(data.context); + that._transition(data.context); + data.process(function () { + return $this.fileupload('process', data); + }).always(function () { + data.context.each(function (index) { + $(this).find('.size').text( + that._formatFileSize(data.files[index].size) + ); + }).removeClass('processing'); + that._renderPreviews(data); + }).done(function () { + data.context.find('.start').prop('disabled', false); + if ((that._trigger('added', e, data) !== false) && + (options.autoUpload || data.autoUpload) && + data.autoUpload !== false) { + data.submit(); + } + }).fail(function () { + if (data.files.error) { + data.context.each(function (index) { + var error = data.files[index].error; + if (error) { + $(this).find('.error').text(error); + } + }); + } + }); + }, + // Callback for the start of each file upload request: + send: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var that = $(this).data('blueimp-fileupload') || + $(this).data('fileupload'); + if (data.context && data.dataType && + data.dataType.substr(0, 6) === 'iframe') { + // Iframe Transport does not support progress events. + // In lack of an indeterminate progress bar, we set + // the progress to 100%, showing the full animated bar: + data.context + .find('.progress').addClass( + !$.support.transition && 'progress-animated' + ) + .attr('aria-valuenow', 100) + .children().first().css( + 'width', + '100%' + ); + } + return that._trigger('sent', e, data); + }, + // Callback for successful uploads: + done: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var that = $(this).data('blueimp-fileupload') || + $(this).data('fileupload'), + getFilesFromResponse = data.getFilesFromResponse || + that.options.getFilesFromResponse, + files = getFilesFromResponse(data), + template, + deferred; + if (data.context) { + data.context.each(function (index) { + var file = files[index] || + {error: 'Empty file upload result'}; + deferred = that._addFinishedDeferreds(); + that._transition($(this)).done( + function () { + var node = $(this); + template = that._renderDownload([file]) + .replaceAll(node); + that._forceReflow(template); + that._transition(template).done( + function () { + data.context = $(this); + that._trigger('completed', e, data); + that._trigger('finished', e, data); + deferred.resolve(); + } + ); + } + ); + }); + } else { + template = that._renderDownload(files)[ + that.options.prependFiles ? 'prependTo' : 'appendTo' + ](that.options.filesContainer); + that._forceReflow(template); + deferred = that._addFinishedDeferreds(); + that._transition(template).done( + function () { + data.context = $(this); + that._trigger('completed', e, data); + that._trigger('finished', e, data); + deferred.resolve(); + } + ); + } + }, + // Callback for failed (abort or error) uploads: + fail: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var that = $(this).data('blueimp-fileupload') || + $(this).data('fileupload'), + template, + deferred; + if (data.context) { + data.context.each(function (index) { + if (data.errorThrown !== 'abort') { + var file = data.files[index]; + file.error = file.error || data.errorThrown || + data.i18n('unknownError'); + deferred = that._addFinishedDeferreds(); + that._transition($(this)).done( + function () { + var node = $(this); + template = that._renderDownload([file]) + .replaceAll(node); + that._forceReflow(template); + that._transition(template).done( + function () { + data.context = $(this); + that._trigger('failed', e, data); + that._trigger('finished', e, data); + deferred.resolve(); + } + ); + } + ); + } else { + deferred = that._addFinishedDeferreds(); + that._transition($(this)).done( + function () { + $(this).remove(); + that._trigger('failed', e, data); + that._trigger('finished', e, data); + deferred.resolve(); + } + ); + } + }); + } else if (data.errorThrown !== 'abort') { + data.context = that._renderUpload(data.files)[ + that.options.prependFiles ? 'prependTo' : 'appendTo' + ](that.options.filesContainer) + .data('data', data); + that._forceReflow(data.context); + deferred = that._addFinishedDeferreds(); + that._transition(data.context).done( + function () { + data.context = $(this); + that._trigger('failed', e, data); + that._trigger('finished', e, data); + deferred.resolve(); + } + ); + } else { + that._trigger('failed', e, data); + that._trigger('finished', e, data); + that._addFinishedDeferreds().resolve(); + } + }, + // Callback for upload progress events: + progress: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var progress = Math.floor(data.loaded / data.total * 100); + if (data.context) { + data.context.each(function () { + $(this).find('.progress') + .attr('aria-valuenow', progress) + .children().first().css( + 'width', + progress + '%' + ); + }); + } + }, + // Callback for global upload progress events: + progressall: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var $this = $(this), + progress = Math.floor(data.loaded / data.total * 100), + globalProgressNode = $this.find('.fileupload-progress'), + extendedProgressNode = globalProgressNode + .find('.progress-extended'); + if (extendedProgressNode.length) { + extendedProgressNode.html( + ($this.data('blueimp-fileupload') || $this.data('fileupload')) + ._renderExtendedProgress(data) + ); + } + globalProgressNode + .find('.progress') + .attr('aria-valuenow', progress) + .children().first().css( + 'width', + progress + '%' + ); + }, + // Callback for uploads start, equivalent to the global ajaxStart event: + start: function (e) { + if (e.isDefaultPrevented()) { + return false; + } + var that = $(this).data('blueimp-fileupload') || + $(this).data('fileupload'); + that._resetFinishedDeferreds(); + that._transition($(this).find('.fileupload-progress')).done( + function () { + that._trigger('started', e); + } + ); + }, + // Callback for uploads stop, equivalent to the global ajaxStop event: + stop: function (e) { + if (e.isDefaultPrevented()) { + return false; + } + var that = $(this).data('blueimp-fileupload') || + $(this).data('fileupload'), + deferred = that._addFinishedDeferreds(); + $.when.apply($, that._getFinishedDeferreds()) + .done(function () { + that._trigger('stopped', e); + }); + that._transition($(this).find('.fileupload-progress')).done( + function () { + $(this).find('.progress') + .attr('aria-valuenow', '0') + .children().first().css('width', '0%'); + $(this).find('.progress-extended').html(' '); + deferred.resolve(); + } + ); + }, + processstart: function (e) { + if (e.isDefaultPrevented()) { + return false; + } + $(this).addClass('fileupload-processing'); + }, + processstop: function (e) { + if (e.isDefaultPrevented()) { + return false; + } + $(this).removeClass('fileupload-processing'); + }, + // Callback for file deletion: + destroy: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var that = $(this).data('blueimp-fileupload') || + $(this).data('fileupload'), + removeNode = function () { + that._transition(data.context).done( + function () { + $(this).remove(); + that._trigger('destroyed', e, data); + } + ); + }; + if (data.url) { + data.dataType = data.dataType || that.options.dataType; + $.ajax(data).done(removeNode).fail(function () { + that._trigger('destroyfailed', e, data); + }); + } else { + removeNode(); + } + } + }, + + _resetFinishedDeferreds: function () { + this._finishedUploads = []; + }, + + _addFinishedDeferreds: function (deferred) { + if (!deferred) { + deferred = $.Deferred(); + } + this._finishedUploads.push(deferred); + return deferred; + }, + + _getFinishedDeferreds: function () { + return this._finishedUploads; + }, + + // Link handler, that allows to download files + // by drag & drop of the links to the desktop: + _enableDragToDesktop: function () { + var link = $(this), + url = link.prop('href'), + name = link.prop('download'), + type = 'application/octet-stream'; + link.bind('dragstart', function (e) { + try { + e.originalEvent.dataTransfer.setData( + 'DownloadURL', + [type, name, url].join(':') + ); + } catch (ignore) {} + }); + }, + + _formatFileSize: function (bytes) { + if (typeof bytes !== 'number') { + return ''; + } + if (bytes >= 1000000000) { + return (bytes / 1000000000).toFixed(2) + ' GB'; + } + if (bytes >= 1000000) { + return (bytes / 1000000).toFixed(2) + ' MB'; + } + return (bytes / 1000).toFixed(2) + ' KB'; + }, + + _formatBitrate: function (bits) { + if (typeof bits !== 'number') { + return ''; + } + if (bits >= 1000000000) { + return (bits / 1000000000).toFixed(2) + ' Gbit/s'; + } + if (bits >= 1000000) { + return (bits / 1000000).toFixed(2) + ' Mbit/s'; + } + if (bits >= 1000) { + return (bits / 1000).toFixed(2) + ' kbit/s'; + } + return bits.toFixed(2) + ' bit/s'; + }, + + _formatTime: function (seconds) { + var date = new Date(seconds * 1000), + days = Math.floor(seconds / 86400); + days = days ? days + 'd ' : ''; + return days + + ('0' + date.getUTCHours()).slice(-2) + ':' + + ('0' + date.getUTCMinutes()).slice(-2) + ':' + + ('0' + date.getUTCSeconds()).slice(-2); + }, + + _formatPercentage: function (floatValue) { + return (floatValue * 100).toFixed(2) + ' %'; + }, + + _renderExtendedProgress: function (data) { + return this._formatBitrate(data.bitrate) + ' | ' + + this._formatTime( + (data.total - data.loaded) * 8 / data.bitrate + ) + ' | ' + + this._formatPercentage( + data.loaded / data.total + ) + ' | ' + + this._formatFileSize(data.loaded) + ' / ' + + this._formatFileSize(data.total); + }, + + _renderTemplate: function (func, files) { + if (!func) { + return $(); + } + var result = func({ + files: files, + formatFileSize: this._formatFileSize, + options: this.options + }); + if (result instanceof $) { + return result; + } + return $(this.options.templatesContainer).html(result).children(); + }, + + _renderPreviews: function (data) { + data.context.find('.preview').each(function (index, elm) { + $(elm).append(data.files[index].preview); + }); + }, + + _renderUpload: function (files) { + return this._renderTemplate( + this.options.uploadTemplate, + files + ); + }, + + _renderDownload: function (files) { + return this._renderTemplate( + this.options.downloadTemplate, + files + ).find('a[download]').each(this._enableDragToDesktop).end(); + }, + + _startHandler: function (e) { + e.preventDefault(); + var button = $(e.currentTarget), + template = button.closest('.template-upload'), + data = template.data('data'); + button.prop('disabled', true); + if (data && data.submit) { + data.submit(); + } + }, + + _cancelHandler: function (e) { + e.preventDefault(); + var template = $(e.currentTarget) + .closest('.template-upload,.template-download'), + data = template.data('data') || {}; + data.context = data.context || template; + if (data.abort) { + data.abort(); + } else { + data.errorThrown = 'abort'; + this._trigger('fail', e, data); + } + }, + + _deleteHandler: function (e) { + e.preventDefault(); + var button = $(e.currentTarget); + this._trigger('destroy', e, $.extend({ + context: button.closest('.template-download'), + type: 'DELETE' + }, button.data())); + }, + + _forceReflow: function (node) { + return $.support.transition && node.length && + node[0].offsetWidth; + }, + + _transition: function (node) { + var dfd = $.Deferred(); + if ($.support.transition && node.hasClass('fade') && node.is(':visible')) { + node.bind( + $.support.transition.end, + function (e) { + // Make sure we don't respond to other transitions events + // in the container element, e.g. from button elements: + if (e.target === node[0]) { + node.unbind($.support.transition.end); + dfd.resolveWith(node); + } + } + ).toggleClass('in'); + } else { + node.toggleClass('in'); + dfd.resolveWith(node); + } + return dfd; + }, + + _initButtonBarEventHandlers: function () { + var fileUploadButtonBar = this.element.find('.fileupload-buttonbar'), + filesList = this.options.filesContainer; + this._on(fileUploadButtonBar.find('.start'), { + click: function (e) { + e.preventDefault(); + filesList.find('.start').click(); + } + }); + this._on(fileUploadButtonBar.find('.cancel'), { + click: function (e) { + e.preventDefault(); + filesList.find('.cancel').click(); + } + }); + this._on(fileUploadButtonBar.find('.delete'), { + click: function (e) { + e.preventDefault(); + filesList.find('.toggle:checked') + .closest('.template-download') + .find('.delete').click(); + fileUploadButtonBar.find('.toggle') + .prop('checked', false); + } + }); + this._on(fileUploadButtonBar.find('.toggle'), { + change: function (e) { + filesList.find('.toggle').prop( + 'checked', + $(e.currentTarget).is(':checked') + ); + } + }); + }, + + _destroyButtonBarEventHandlers: function () { + this._off( + this.element.find('.fileupload-buttonbar') + .find('.start, .cancel, .delete'), + 'click' + ); + this._off( + this.element.find('.fileupload-buttonbar .toggle'), + 'change.' + ); + }, + + _initEventHandlers: function () { + this._super(); + this._on(this.options.filesContainer, { + 'click .start': this._startHandler, + 'click .cancel': this._cancelHandler, + 'click .delete': this._deleteHandler + }); + this._initButtonBarEventHandlers(); + }, + + _destroyEventHandlers: function () { + this._destroyButtonBarEventHandlers(); + this._off(this.options.filesContainer, 'click'); + this._super(); + }, + + _enableFileInputButton: function () { + this.element.find('.fileinput-button input') + .prop('disabled', false) + .parent().removeClass('disabled'); + }, + + _disableFileInputButton: function () { + this.element.find('.fileinput-button input') + .prop('disabled', true) + .parent().addClass('disabled'); + }, + + _initTemplates: function () { + var options = this.options; + options.templatesContainer = this.document[0].createElement( + options.filesContainer.prop('nodeName') + ); + if (tmpl) { + if (options.uploadTemplateId) { + options.uploadTemplate = tmpl(options.uploadTemplateId); + } + if (options.downloadTemplateId) { + options.downloadTemplate = tmpl(options.downloadTemplateId); + } + } + }, + + _initFilesContainer: function () { + var options = this.options; + if (options.filesContainer === undefined) { + options.filesContainer = this.element.find('.files'); + } else if (!(options.filesContainer instanceof $)) { + options.filesContainer = $(options.filesContainer); + } + }, + + _initSpecialOptions: function () { + this._super(); + this._initFilesContainer(); + this._initTemplates(); + }, + + _create: function () { + this._super(); + this._resetFinishedDeferreds(); + if (!$.support.fileInput) { + this._disableFileInputButton(); + } + }, + + enable: function () { + var wasDisabled = false; + if (this.options.disabled) { + wasDisabled = true; + } + this._super(); + if (wasDisabled) { + this.element.find('input, button').prop('disabled', false); + this._enableFileInputButton(); + } + }, + + disable: function () { + if (!this.options.disabled) { + this.element.find('input, button').prop('disabled', true); + this._disableFileInputButton(); + } + this._super(); + } + + }); + +})); diff --git a/libraries/filemanager-9.14.2/js/jquery.fileupload-validate.js b/libraries/filemanager-9.14.2/js/jquery.fileupload-validate.js new file mode 100644 index 0000000..eebeb37 --- /dev/null +++ b/libraries/filemanager-9.14.2/js/jquery.fileupload-validate.js @@ -0,0 +1,125 @@ +/* + * jQuery File Upload Validation Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + */ + +/* global define, require, window */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + './jquery.fileupload-process' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('./jquery.fileupload-process') + ); + } else { + // Browser globals: + factory( + window.jQuery + ); + } +}(function ($) { + 'use strict'; + + // Append to the default processQueue: + $.blueimp.fileupload.prototype.options.processQueue.push( + { + action: 'validate', + // Always trigger this action, + // even if the previous action was rejected: + always: true, + // Options taken from the global options map: + acceptFileTypes: '@', + maxFileSize: '@', + minFileSize: '@', + maxNumberOfFiles: '@', + disabled: '@disableValidation' + } + ); + + // The File Upload Validation plugin extends the fileupload widget + // with file validation functionality: + $.widget('blueimp.fileupload', $.blueimp.fileupload, { + + options: { + /* + // The regular expression for allowed file types, matches + // against either file type or file name: + acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i, + // The maximum allowed file size in bytes: + maxFileSize: 10000000, // 10 MB + // The minimum allowed file size in bytes: + minFileSize: undefined, // No minimal file size + // The limit of files to be uploaded: + maxNumberOfFiles: 10, + */ + + // Function returning the current number of files, + // has to be overriden for maxNumberOfFiles validation: + getNumberOfFiles: $.noop, + + // Error and info messages: + messages: { + maxNumberOfFiles: 'Maximum number of files exceeded', + acceptFileTypes: 'File type not allowed', + maxFileSize: 'File is too large', + minFileSize: 'File is too small' + } + }, + + processActions: { + + validate: function (data, options) { + if (options.disabled) { + return data; + } + var dfd = $.Deferred(), + settings = this.options, + file = data.files[data.index], + fileSize; + if (options.minFileSize || options.maxFileSize) { + fileSize = file.size; + } + if ($.type(options.maxNumberOfFiles) === 'number' && + (settings.getNumberOfFiles() || 0) + data.files.length > + options.maxNumberOfFiles) { + file.error = settings.i18n('maxNumberOfFiles'); + } else if (options.acceptFileTypes && + !(options.acceptFileTypes.test(file.type) || + options.acceptFileTypes.test(file.name))) { + file.error = settings.i18n('acceptFileTypes'); + } else if (fileSize > options.maxFileSize) { + file.error = settings.i18n('maxFileSize'); + } else if ($.type(fileSize) === 'number' && + fileSize < options.minFileSize) { + file.error = settings.i18n('minFileSize'); + } else { + delete file.error; + } + if (file.error || data.files.error) { + data.files.error = true; + dfd.rejectWith(this, [data]); + } else { + dfd.resolveWith(this, [data]); + } + return dfd.promise(); + } + + } + + }); + +})); diff --git a/libraries/filemanager-9.14.2/js/jquery.fileupload-video.js b/libraries/filemanager-9.14.2/js/jquery.fileupload-video.js new file mode 100644 index 0000000..aedcec2 --- /dev/null +++ b/libraries/filemanager-9.14.2/js/jquery.fileupload-video.js @@ -0,0 +1,113 @@ +/* + * jQuery File Upload Video Preview Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + */ + +/* jshint nomen:false */ +/* global define, require, window, document */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + 'load-image', + './jquery.fileupload-process' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('blueimp-load-image/js/load-image'), + require('./jquery.fileupload-process') + ); + } else { + // Browser globals: + factory( + window.jQuery, + window.loadImage + ); + } +}(function ($, loadImage) { + 'use strict'; + + // Prepend to the default processQueue: + $.blueimp.fileupload.prototype.options.processQueue.unshift( + { + action: 'loadVideo', + // Use the action as prefix for the "@" options: + prefix: true, + fileTypes: '@', + maxFileSize: '@', + disabled: '@disableVideoPreview' + }, + { + action: 'setVideo', + name: '@videoPreviewName', + disabled: '@disableVideoPreview' + } + ); + + // The File Upload Video Preview plugin extends the fileupload widget + // with video preview functionality: + $.widget('blueimp.fileupload', $.blueimp.fileupload, { + + options: { + // The regular expression for the types of video files to load, + // matched against the file type: + loadVideoFileTypes: /^video\/.*$/ + }, + + _videoElement: document.createElement('video'), + + processActions: { + + // Loads the video file given via data.files and data.index + // as video element if the browser supports playing it. + // Accepts the options fileTypes (regular expression) + // and maxFileSize (integer) to limit the files to load: + loadVideo: function (data, options) { + if (options.disabled) { + return data; + } + var file = data.files[data.index], + url, + video; + if (this._videoElement.canPlayType && + this._videoElement.canPlayType(file.type) && + ($.type(options.maxFileSize) !== 'number' || + file.size <= options.maxFileSize) && + (!options.fileTypes || + options.fileTypes.test(file.type))) { + url = loadImage.createObjectURL(file); + if (url) { + video = this._videoElement.cloneNode(false); + video.src = url; + video.controls = true; + data.video = video; + return data; + } + } + return data; + }, + + // Sets the video element as a property of the file object: + setVideo: function (data, options) { + if (data.video && !options.disabled) { + data.files[data.index][options.name || 'preview'] = data.video; + } + return data; + } + + } + + }); + +})); diff --git a/libraries/filemanager-9.14.2/js/jquery.fileupload.js b/libraries/filemanager-9.14.2/js/jquery.fileupload.js new file mode 100644 index 0000000..700f901 --- /dev/null +++ b/libraries/filemanager-9.14.2/js/jquery.fileupload.js @@ -0,0 +1,1502 @@ +/* + * jQuery File Upload Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2010, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + */ + +/* jshint nomen:false */ +/* global define, require, window, document, location, Blob, FormData */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + 'jquery-ui/ui/widget' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('./vendor/jquery.ui.widget') + ); + } else { + // Browser globals: + factory(window.jQuery); + } +}(function ($) { + 'use strict'; + + // Detect file input support, based on + // http://viljamis.com/blog/2012/file-upload-support-on-mobile/ + $.support.fileInput = !(new RegExp( + // Handle devices which give false positives for the feature detection: + '(Android (1\\.[0156]|2\\.[01]))' + + '|(Windows Phone (OS 7|8\\.0))|(XBLWP)|(ZuneWP)|(WPDesktop)' + + '|(w(eb)?OSBrowser)|(webOS)' + + '|(Kindle/(1\\.0|2\\.[05]|3\\.0))' + ).test(window.navigator.userAgent) || + // Feature detection for all other devices: + $('').prop('disabled')); + + // The FileReader API is not actually used, but works as feature detection, + // as some Safari versions (5?) support XHR file uploads via the FormData API, + // but not non-multipart XHR file uploads. + // window.XMLHttpRequestUpload is not available on IE10, so we check for + // window.ProgressEvent instead to detect XHR2 file upload capability: + $.support.xhrFileUpload = !!(window.ProgressEvent && window.FileReader); + $.support.xhrFormDataFileUpload = !!window.FormData; + + // Detect support for Blob slicing (required for chunked uploads): + $.support.blobSlice = window.Blob && (Blob.prototype.slice || + Blob.prototype.webkitSlice || Blob.prototype.mozSlice); + + // Helper function to create drag handlers for dragover/dragenter/dragleave: + function getDragHandler(type) { + var isDragOver = type === 'dragover'; + return function (e) { + e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer; + var dataTransfer = e.dataTransfer; + if (dataTransfer && $.inArray('Files', dataTransfer.types) !== -1 && + this._trigger( + type, + $.Event(type, {delegatedEvent: e}) + ) !== false) { + e.preventDefault(); + if (isDragOver) { + dataTransfer.dropEffect = 'copy'; + } + } + }; + } + + // The fileupload widget listens for change events on file input fields defined + // via fileInput setting and paste or drop events of the given dropZone. + // In addition to the default jQuery Widget methods, the fileupload widget + // exposes the "add" and "send" methods, to add or directly send files using + // the fileupload API. + // By default, files added via file input selection, paste, drag & drop or + // "add" method are uploaded immediately, but it is possible to override + // the "add" callback option to queue file uploads. + $.widget('blueimp.fileupload', { + + options: { + // The drop target element(s), by the default the complete document. + // Set to null to disable drag & drop support: + dropZone: $(document), + // The paste target element(s), by the default undefined. + // Set to a DOM node or jQuery object to enable file pasting: + pasteZone: undefined, + // The file input field(s), that are listened to for change events. + // If undefined, it is set to the file input fields inside + // of the widget element on plugin initialization. + // Set to null to disable the change listener. + fileInput: undefined, + // By default, the file input field is replaced with a clone after + // each input field change event. This is required for iframe transport + // queues and allows change events to be fired for the same file + // selection, but can be disabled by setting the following option to false: + replaceFileInput: true, + // The parameter name for the file form data (the request argument name). + // If undefined or empty, the name property of the file input field is + // used, or "files[]" if the file input name property is also empty, + // can be a string or an array of strings: + paramName: undefined, + // By default, each file of a selection is uploaded using an individual + // request for XHR type uploads. Set to false to upload file + // selections in one request each: + singleFileUploads: true, + // To limit the number of files uploaded with one XHR request, + // set the following option to an integer greater than 0: + limitMultiFileUploads: undefined, + // The following option limits the number of files uploaded with one + // XHR request to keep the request size under or equal to the defined + // limit in bytes: + limitMultiFileUploadSize: undefined, + // Multipart file uploads add a number of bytes to each uploaded file, + // therefore the following option adds an overhead for each file used + // in the limitMultiFileUploadSize configuration: + limitMultiFileUploadSizeOverhead: 512, + // Set the following option to true to issue all file upload requests + // in a sequential order: + sequentialUploads: false, + // To limit the number of concurrent uploads, + // set the following option to an integer greater than 0: + limitConcurrentUploads: undefined, + // Set the following option to true to force iframe transport uploads: + forceIframeTransport: false, + // Set the following option to the location of a redirect url on the + // origin server, for cross-domain iframe transport uploads: + redirect: undefined, + // The parameter name for the redirect url, sent as part of the form + // data and set to 'redirect' if this option is empty: + redirectParamName: undefined, + // Set the following option to the location of a postMessage window, + // to enable postMessage transport uploads: + postMessage: undefined, + // By default, XHR file uploads are sent as multipart/form-data. + // The iframe transport is always using multipart/form-data. + // Set to false to enable non-multipart XHR uploads: + multipart: true, + // To upload large files in smaller chunks, set the following option + // to a preferred maximum chunk size. If set to 0, null or undefined, + // or the browser does not support the required Blob API, files will + // be uploaded as a whole. + maxChunkSize: undefined, + // When a non-multipart upload or a chunked multipart upload has been + // aborted, this option can be used to resume the upload by setting + // it to the size of the already uploaded bytes. This option is most + // useful when modifying the options object inside of the "add" or + // "send" callbacks, as the options are cloned for each file upload. + uploadedBytes: undefined, + // By default, failed (abort or error) file uploads are removed from the + // global progress calculation. Set the following option to false to + // prevent recalculating the global progress data: + recalculateProgress: true, + // Interval in milliseconds to calculate and trigger progress events: + progressInterval: 100, + // Interval in milliseconds to calculate progress bitrate: + bitrateInterval: 500, + // By default, uploads are started automatically when adding files: + autoUpload: true, + + // Error and info messages: + messages: { + uploadedBytes: 'Uploaded bytes exceed file size' + }, + + // Translation function, gets the message key to be translated + // and an object with context specific data as arguments: + i18n: function (message, context) { + message = this.messages[message] || message.toString(); + if (context) { + $.each(context, function (key, value) { + message = message.replace('{' + key + '}', value); + }); + } + return message; + }, + + // Additional form data to be sent along with the file uploads can be set + // using this option, which accepts an array of objects with name and + // value properties, a function returning such an array, a FormData + // object (for XHR file uploads), or a simple object. + // The form of the first fileInput is given as parameter to the function: + formData: function (form) { + return form.serializeArray(); + }, + + // The add callback is invoked as soon as files are added to the fileupload + // widget (via file input selection, drag & drop, paste or add API call). + // If the singleFileUploads option is enabled, this callback will be + // called once for each file in the selection for XHR file uploads, else + // once for each file selection. + // + // The upload starts when the submit method is invoked on the data parameter. + // The data object contains a files property holding the added files + // and allows you to override plugin options as well as define ajax settings. + // + // Listeners for this callback can also be bound the following way: + // .bind('fileuploadadd', func); + // + // data.submit() returns a Promise object and allows to attach additional + // handlers using jQuery's Deferred callbacks: + // data.submit().done(func).fail(func).always(func); + add: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + if (data.autoUpload || (data.autoUpload !== false && + $(this).fileupload('option', 'autoUpload'))) { + data.process().done(function () { + data.submit(); + }); + } + }, + + // Other callbacks: + + // Callback for the submit event of each file upload: + // submit: function (e, data) {}, // .bind('fileuploadsubmit', func); + + // Callback for the start of each file upload request: + // send: function (e, data) {}, // .bind('fileuploadsend', func); + + // Callback for successful uploads: + // done: function (e, data) {}, // .bind('fileuploaddone', func); + + // Callback for failed (abort or error) uploads: + // fail: function (e, data) {}, // .bind('fileuploadfail', func); + + // Callback for completed (success, abort or error) requests: + // always: function (e, data) {}, // .bind('fileuploadalways', func); + + // Callback for upload progress events: + // progress: function (e, data) {}, // .bind('fileuploadprogress', func); + + // Callback for global upload progress events: + // progressall: function (e, data) {}, // .bind('fileuploadprogressall', func); + + // Callback for uploads start, equivalent to the global ajaxStart event: + // start: function (e) {}, // .bind('fileuploadstart', func); + + // Callback for uploads stop, equivalent to the global ajaxStop event: + // stop: function (e) {}, // .bind('fileuploadstop', func); + + // Callback for change events of the fileInput(s): + // change: function (e, data) {}, // .bind('fileuploadchange', func); + + // Callback for paste events to the pasteZone(s): + // paste: function (e, data) {}, // .bind('fileuploadpaste', func); + + // Callback for drop events of the dropZone(s): + // drop: function (e, data) {}, // .bind('fileuploaddrop', func); + + // Callback for dragover events of the dropZone(s): + // dragover: function (e) {}, // .bind('fileuploaddragover', func); + + // Callback before the start of each chunk upload request (before form data initialization): + // chunkbeforesend: function (e, data) {}, // .bind('fileuploadchunkbeforesend', func); + + // Callback for the start of each chunk upload request: + // chunksend: function (e, data) {}, // .bind('fileuploadchunksend', func); + + // Callback for successful chunk uploads: + // chunkdone: function (e, data) {}, // .bind('fileuploadchunkdone', func); + + // Callback for failed (abort or error) chunk uploads: + // chunkfail: function (e, data) {}, // .bind('fileuploadchunkfail', func); + + // Callback for completed (success, abort or error) chunk upload requests: + // chunkalways: function (e, data) {}, // .bind('fileuploadchunkalways', func); + + // The plugin options are used as settings object for the ajax calls. + // The following are jQuery ajax settings required for the file uploads: + processData: false, + contentType: false, + cache: false, + timeout: 0 + }, + + // A list of options that require reinitializing event listeners and/or + // special initialization code: + _specialOptions: [ + 'fileInput', + 'dropZone', + 'pasteZone', + 'multipart', + 'forceIframeTransport' + ], + + _blobSlice: $.support.blobSlice && function () { + var slice = this.slice || this.webkitSlice || this.mozSlice; + return slice.apply(this, arguments); + }, + + _BitrateTimer: function () { + this.timestamp = ((Date.now) ? Date.now() : (new Date()).getTime()); + this.loaded = 0; + this.bitrate = 0; + this.getBitrate = function (now, loaded, interval) { + var timeDiff = now - this.timestamp; + if (!this.bitrate || !interval || timeDiff > interval) { + this.bitrate = (loaded - this.loaded) * (1000 / timeDiff) * 8; + this.loaded = loaded; + this.timestamp = now; + } + return this.bitrate; + }; + }, + + _isXHRUpload: function (options) { + return !options.forceIframeTransport && + ((!options.multipart && $.support.xhrFileUpload) || + $.support.xhrFormDataFileUpload); + }, + + _getFormData: function (options) { + var formData; + if ($.type(options.formData) === 'function') { + return options.formData(options.form); + } + if ($.isArray(options.formData)) { + return options.formData; + } + if ($.type(options.formData) === 'object') { + formData = []; + $.each(options.formData, function (name, value) { + formData.push({name: name, value: value}); + }); + return formData; + } + return []; + }, + + _getTotal: function (files) { + var total = 0; + $.each(files, function (index, file) { + total += file.size || 1; + }); + return total; + }, + + _initProgressObject: function (obj) { + var progress = { + loaded: 0, + total: 0, + bitrate: 0 + }; + if (obj._progress) { + $.extend(obj._progress, progress); + } else { + obj._progress = progress; + } + }, + + _initResponseObject: function (obj) { + var prop; + if (obj._response) { + for (prop in obj._response) { + if (obj._response.hasOwnProperty(prop)) { + delete obj._response[prop]; + } + } + } else { + obj._response = {}; + } + }, + + _onProgress: function (e, data) { + if (e.lengthComputable) { + var now = ((Date.now) ? Date.now() : (new Date()).getTime()), + loaded; + if (data._time && data.progressInterval && + (now - data._time < data.progressInterval) && + e.loaded !== e.total) { + return; + } + data._time = now; + loaded = Math.floor( + e.loaded / e.total * (data.chunkSize || data._progress.total) + ) + (data.uploadedBytes || 0); + // Add the difference from the previously loaded state + // to the global loaded counter: + this._progress.loaded += (loaded - data._progress.loaded); + this._progress.bitrate = this._bitrateTimer.getBitrate( + now, + this._progress.loaded, + data.bitrateInterval + ); + data._progress.loaded = data.loaded = loaded; + data._progress.bitrate = data.bitrate = data._bitrateTimer.getBitrate( + now, + loaded, + data.bitrateInterval + ); + // Trigger a custom progress event with a total data property set + // to the file size(s) of the current upload and a loaded data + // property calculated accordingly: + this._trigger( + 'progress', + $.Event('progress', {delegatedEvent: e}), + data + ); + // Trigger a global progress event for all current file uploads, + // including ajax calls queued for sequential file uploads: + this._trigger( + 'progressall', + $.Event('progressall', {delegatedEvent: e}), + this._progress + ); + } + }, + + _initProgressListener: function (options) { + var that = this, + xhr = options.xhr ? options.xhr() : $.ajaxSettings.xhr(); + // Accesss to the native XHR object is required to add event listeners + // for the upload progress event: + if (xhr.upload) { + $(xhr.upload).bind('progress', function (e) { + var oe = e.originalEvent; + // Make sure the progress event properties get copied over: + e.lengthComputable = oe.lengthComputable; + e.loaded = oe.loaded; + e.total = oe.total; + that._onProgress(e, options); + }); + options.xhr = function () { + return xhr; + }; + } + }, + + _deinitProgressListener: function (options) { + var xhr = options.xhr ? options.xhr() : $.ajaxSettings.xhr(); + if (xhr.upload) { + $(xhr.upload).unbind('progress'); + } + }, + + _isInstanceOf: function (type, obj) { + // Cross-frame instanceof check + return Object.prototype.toString.call(obj) === '[object ' + type + ']'; + }, + + _initXHRData: function (options) { + var that = this, + formData, + file = options.files[0], + // Ignore non-multipart setting if not supported: + multipart = options.multipart || !$.support.xhrFileUpload, + paramName = $.type(options.paramName) === 'array' ? + options.paramName[0] : options.paramName; + options.headers = $.extend({}, options.headers); + if (options.contentRange) { + options.headers['Content-Range'] = options.contentRange; + } + if (!multipart || options.blob || !this._isInstanceOf('File', file)) { + options.headers['Content-Disposition'] = 'attachment; filename="' + + encodeURI(file.uploadName || file.name) + '"'; + } + if (!multipart) { + options.contentType = file.type || 'application/octet-stream'; + options.data = options.blob || file; + } else if ($.support.xhrFormDataFileUpload) { + if (options.postMessage) { + // window.postMessage does not allow sending FormData + // objects, so we just add the File/Blob objects to + // the formData array and let the postMessage window + // create the FormData object out of this array: + formData = this._getFormData(options); + if (options.blob) { + formData.push({ + name: paramName, + value: options.blob + }); + } else { + $.each(options.files, function (index, file) { + formData.push({ + name: ($.type(options.paramName) === 'array' && + options.paramName[index]) || paramName, + value: file + }); + }); + } + } else { + if (that._isInstanceOf('FormData', options.formData)) { + formData = options.formData; + } else { + formData = new FormData(); + $.each(this._getFormData(options), function (index, field) { + formData.append(field.name, field.value); + }); + } + if (options.blob) { + formData.append( + paramName, + options.blob, + file.uploadName || file.name + ); + } else { + $.each(options.files, function (index, file) { + // This check allows the tests to run with + // dummy objects: + if (that._isInstanceOf('File', file) || + that._isInstanceOf('Blob', file)) { + formData.append( + ($.type(options.paramName) === 'array' && + options.paramName[index]) || paramName, + file, + file.uploadName || file.name + ); + } + }); + } + } + options.data = formData; + } + // Blob reference is not needed anymore, free memory: + options.blob = null; + }, + + _initIframeSettings: function (options) { + var targetHost = $('').prop('href', options.url).prop('host'); + // Setting the dataType to iframe enables the iframe transport: + options.dataType = 'iframe ' + (options.dataType || ''); + // The iframe transport accepts a serialized array as form data: + options.formData = this._getFormData(options); + // Add redirect url to form data on cross-domain uploads: + if (options.redirect && targetHost && targetHost !== location.host) { + options.formData.push({ + name: options.redirectParamName || 'redirect', + value: options.redirect + }); + } + }, + + _initDataSettings: function (options) { + if (this._isXHRUpload(options)) { + if (!this._chunkedUpload(options, true)) { + if (!options.data) { + this._initXHRData(options); + } + this._initProgressListener(options); + } + if (options.postMessage) { + // Setting the dataType to postmessage enables the + // postMessage transport: + options.dataType = 'postmessage ' + (options.dataType || ''); + } + } else { + this._initIframeSettings(options); + } + }, + + _getParamName: function (options) { + var fileInput = $(options.fileInput), + paramName = options.paramName; + if (!paramName) { + paramName = []; + fileInput.each(function () { + var input = $(this), + name = input.prop('name') || 'files[]', + i = (input.prop('files') || [1]).length; + while (i) { + paramName.push(name); + i -= 1; + } + }); + if (!paramName.length) { + paramName = [fileInput.prop('name') || 'files[]']; + } + } else if (!$.isArray(paramName)) { + paramName = [paramName]; + } + return paramName; + }, + + _initFormSettings: function (options) { + // Retrieve missing options from the input field and the + // associated form, if available: + if (!options.form || !options.form.length) { + options.form = $(options.fileInput.prop('form')); + // If the given file input doesn't have an associated form, + // use the default widget file input's form: + if (!options.form.length) { + options.form = $(this.options.fileInput.prop('form')); + } + } + options.paramName = this._getParamName(options); + if (!options.url) { + options.url = options.form.prop('action') || location.href; + } + // The HTTP request method must be "POST" or "PUT": + options.type = (options.type || + ($.type(options.form.prop('method')) === 'string' && + options.form.prop('method')) || '' + ).toUpperCase(); + if (options.type !== 'POST' && options.type !== 'PUT' && + options.type !== 'PATCH') { + options.type = 'POST'; + } + if (!options.formAcceptCharset) { + options.formAcceptCharset = options.form.attr('accept-charset'); + } + }, + + _getAJAXSettings: function (data) { + var options = $.extend({}, this.options, data); + this._initFormSettings(options); + this._initDataSettings(options); + return options; + }, + + // jQuery 1.6 doesn't provide .state(), + // while jQuery 1.8+ removed .isRejected() and .isResolved(): + _getDeferredState: function (deferred) { + if (deferred.state) { + return deferred.state(); + } + if (deferred.isResolved()) { + return 'resolved'; + } + if (deferred.isRejected()) { + return 'rejected'; + } + return 'pending'; + }, + + // Maps jqXHR callbacks to the equivalent + // methods of the given Promise object: + _enhancePromise: function (promise) { + promise.success = promise.done; + promise.error = promise.fail; + promise.complete = promise.always; + return promise; + }, + + // Creates and returns a Promise object enhanced with + // the jqXHR methods abort, success, error and complete: + _getXHRPromise: function (resolveOrReject, context, args) { + var dfd = $.Deferred(), + promise = dfd.promise(); + context = context || this.options.context || promise; + if (resolveOrReject === true) { + dfd.resolveWith(context, args); + } else if (resolveOrReject === false) { + dfd.rejectWith(context, args); + } + promise.abort = dfd.promise; + return this._enhancePromise(promise); + }, + + // Adds convenience methods to the data callback argument: + _addConvenienceMethods: function (e, data) { + var that = this, + getPromise = function (args) { + return $.Deferred().resolveWith(that, args).promise(); + }; + data.process = function (resolveFunc, rejectFunc) { + if (resolveFunc || rejectFunc) { + data._processQueue = this._processQueue = + (this._processQueue || getPromise([this])).then( + function () { + if (data.errorThrown) { + return $.Deferred() + .rejectWith(that, [data]).promise(); + } + return getPromise(arguments); + } + ).then(resolveFunc, rejectFunc); + } + return this._processQueue || getPromise([this]); + }; + data.submit = function () { + if (this.state() !== 'pending') { + data.jqXHR = this.jqXHR = + (that._trigger( + 'submit', + $.Event('submit', {delegatedEvent: e}), + this + ) !== false) && that._onSend(e, this); + } + return this.jqXHR || that._getXHRPromise(); + }; + data.abort = function () { + if (this.jqXHR) { + return this.jqXHR.abort(); + } + this.errorThrown = 'abort'; + that._trigger('fail', null, this); + return that._getXHRPromise(false); + }; + data.state = function () { + if (this.jqXHR) { + return that._getDeferredState(this.jqXHR); + } + if (this._processQueue) { + return that._getDeferredState(this._processQueue); + } + }; + data.processing = function () { + return !this.jqXHR && this._processQueue && that + ._getDeferredState(this._processQueue) === 'pending'; + }; + data.progress = function () { + return this._progress; + }; + data.response = function () { + return this._response; + }; + }, + + // Parses the Range header from the server response + // and returns the uploaded bytes: + _getUploadedBytes: function (jqXHR) { + var range = jqXHR.getResponseHeader('Range'), + parts = range && range.split('-'), + upperBytesPos = parts && parts.length > 1 && + parseInt(parts[1], 10); + return upperBytesPos && upperBytesPos + 1; + }, + + // Uploads a file in multiple, sequential requests + // by splitting the file up in multiple blob chunks. + // If the second parameter is true, only tests if the file + // should be uploaded in chunks, but does not invoke any + // upload requests: + _chunkedUpload: function (options, testOnly) { + options.uploadedBytes = options.uploadedBytes || 0; + var that = this, + file = options.files[0], + fs = file.size, + ub = options.uploadedBytes, + mcs = options.maxChunkSize || fs, + slice = this._blobSlice, + dfd = $.Deferred(), + promise = dfd.promise(), + jqXHR, + upload; + if (!(this._isXHRUpload(options) && slice && (ub || ($.type(mcs) === 'function' ? mcs(options) : mcs) < fs)) || + options.data) { + return false; + } + if (testOnly) { + return true; + } + if (ub >= fs) { + file.error = options.i18n('uploadedBytes'); + return this._getXHRPromise( + false, + options.context, + [null, 'error', file.error] + ); + } + // The chunk upload method: + upload = function () { + // Clone the options object for each chunk upload: + var o = $.extend({}, options), + currentLoaded = o._progress.loaded; + o.blob = slice.call( + file, + ub, + ub + ($.type(mcs) === 'function' ? mcs(o) : mcs), + file.type + ); + // Store the current chunk size, as the blob itself + // will be dereferenced after data processing: + o.chunkSize = o.blob.size; + // Expose the chunk bytes position range: + o.contentRange = 'bytes ' + ub + '-' + + (ub + o.chunkSize - 1) + '/' + fs; + // Trigger chunkbeforesend to allow form data to be updated for this chunk + that._trigger('chunkbeforesend', null, o); + // Process the upload data (the blob and potential form data): + that._initXHRData(o); + // Add progress listeners for this chunk upload: + that._initProgressListener(o); + jqXHR = ((that._trigger('chunksend', null, o) !== false && $.ajax(o)) || + that._getXHRPromise(false, o.context)) + .done(function (result, textStatus, jqXHR) { + ub = that._getUploadedBytes(jqXHR) || + (ub + o.chunkSize); + // Create a progress event if no final progress event + // with loaded equaling total has been triggered + // for this chunk: + if (currentLoaded + o.chunkSize - o._progress.loaded) { + that._onProgress($.Event('progress', { + lengthComputable: true, + loaded: ub - o.uploadedBytes, + total: ub - o.uploadedBytes + }), o); + } + options.uploadedBytes = o.uploadedBytes = ub; + o.result = result; + o.textStatus = textStatus; + o.jqXHR = jqXHR; + that._trigger('chunkdone', null, o); + that._trigger('chunkalways', null, o); + if (ub < fs) { + // File upload not yet complete, + // continue with the next chunk: + upload(); + } else { + dfd.resolveWith( + o.context, + [result, textStatus, jqXHR] + ); + } + }) + .fail(function (jqXHR, textStatus, errorThrown) { + o.jqXHR = jqXHR; + o.textStatus = textStatus; + o.errorThrown = errorThrown; + that._trigger('chunkfail', null, o); + that._trigger('chunkalways', null, o); + dfd.rejectWith( + o.context, + [jqXHR, textStatus, errorThrown] + ); + }) + .always(function () { + that._deinitProgressListener(o); + }); + }; + this._enhancePromise(promise); + promise.abort = function () { + return jqXHR.abort(); + }; + upload(); + return promise; + }, + + _beforeSend: function (e, data) { + if (this._active === 0) { + // the start callback is triggered when an upload starts + // and no other uploads are currently running, + // equivalent to the global ajaxStart event: + this._trigger('start'); + // Set timer for global bitrate progress calculation: + this._bitrateTimer = new this._BitrateTimer(); + // Reset the global progress values: + this._progress.loaded = this._progress.total = 0; + this._progress.bitrate = 0; + } + // Make sure the container objects for the .response() and + // .progress() methods on the data object are available + // and reset to their initial state: + this._initResponseObject(data); + this._initProgressObject(data); + data._progress.loaded = data.loaded = data.uploadedBytes || 0; + data._progress.total = data.total = this._getTotal(data.files) || 1; + data._progress.bitrate = data.bitrate = 0; + this._active += 1; + // Initialize the global progress values: + this._progress.loaded += data.loaded; + this._progress.total += data.total; + }, + + _onDone: function (result, textStatus, jqXHR, options) { + var total = options._progress.total, + response = options._response; + if (options._progress.loaded < total) { + // Create a progress event if no final progress event + // with loaded equaling total has been triggered: + this._onProgress($.Event('progress', { + lengthComputable: true, + loaded: total, + total: total + }), options); + } + response.result = options.result = result; + response.textStatus = options.textStatus = textStatus; + response.jqXHR = options.jqXHR = jqXHR; + this._trigger('done', null, options); + }, + + _onFail: function (jqXHR, textStatus, errorThrown, options) { + var response = options._response; + if (options.recalculateProgress) { + // Remove the failed (error or abort) file upload from + // the global progress calculation: + this._progress.loaded -= options._progress.loaded; + this._progress.total -= options._progress.total; + } + response.jqXHR = options.jqXHR = jqXHR; + response.textStatus = options.textStatus = textStatus; + response.errorThrown = options.errorThrown = errorThrown; + this._trigger('fail', null, options); + }, + + _onAlways: function (jqXHRorResult, textStatus, jqXHRorError, options) { + // jqXHRorResult, textStatus and jqXHRorError are added to the + // options object via done and fail callbacks + this._trigger('always', null, options); + }, + + _onSend: function (e, data) { + if (!data.submit) { + this._addConvenienceMethods(e, data); + } + var that = this, + jqXHR, + aborted, + slot, + pipe, + options = that._getAJAXSettings(data), + send = function () { + that._sending += 1; + // Set timer for bitrate progress calculation: + options._bitrateTimer = new that._BitrateTimer(); + jqXHR = jqXHR || ( + ((aborted || that._trigger( + 'send', + $.Event('send', {delegatedEvent: e}), + options + ) === false) && + that._getXHRPromise(false, options.context, aborted)) || + that._chunkedUpload(options) || $.ajax(options) + ).done(function (result, textStatus, jqXHR) { + that._onDone(result, textStatus, jqXHR, options); + }).fail(function (jqXHR, textStatus, errorThrown) { + that._onFail(jqXHR, textStatus, errorThrown, options); + }).always(function (jqXHRorResult, textStatus, jqXHRorError) { + that._deinitProgressListener(options); + that._onAlways( + jqXHRorResult, + textStatus, + jqXHRorError, + options + ); + that._sending -= 1; + that._active -= 1; + if (options.limitConcurrentUploads && + options.limitConcurrentUploads > that._sending) { + // Start the next queued upload, + // that has not been aborted: + var nextSlot = that._slots.shift(); + while (nextSlot) { + if (that._getDeferredState(nextSlot) === 'pending') { + nextSlot.resolve(); + break; + } + nextSlot = that._slots.shift(); + } + } + if (that._active === 0) { + // The stop callback is triggered when all uploads have + // been completed, equivalent to the global ajaxStop event: + that._trigger('stop'); + } + }); + return jqXHR; + }; + this._beforeSend(e, options); + if (this.options.sequentialUploads || + (this.options.limitConcurrentUploads && + this.options.limitConcurrentUploads <= this._sending)) { + if (this.options.limitConcurrentUploads > 1) { + slot = $.Deferred(); + this._slots.push(slot); + pipe = slot.then(send); + } else { + this._sequence = this._sequence.then(send, send); + pipe = this._sequence; + } + // Return the piped Promise object, enhanced with an abort method, + // which is delegated to the jqXHR object of the current upload, + // and jqXHR callbacks mapped to the equivalent Promise methods: + pipe.abort = function () { + aborted = [undefined, 'abort', 'abort']; + if (!jqXHR) { + if (slot) { + slot.rejectWith(options.context, aborted); + } + return send(); + } + return jqXHR.abort(); + }; + return this._enhancePromise(pipe); + } + return send(); + }, + + _onAdd: function (e, data) { + var that = this, + result = true, + options = $.extend({}, this.options, data), + files = data.files, + filesLength = files.length, + limit = options.limitMultiFileUploads, + limitSize = options.limitMultiFileUploadSize, + overhead = options.limitMultiFileUploadSizeOverhead, + batchSize = 0, + paramName = this._getParamName(options), + paramNameSet, + paramNameSlice, + fileSet, + i, + j = 0; + if (!filesLength) { + return false; + } + if (limitSize && files[0].size === undefined) { + limitSize = undefined; + } + if (!(options.singleFileUploads || limit || limitSize) || + !this._isXHRUpload(options)) { + fileSet = [files]; + paramNameSet = [paramName]; + } else if (!(options.singleFileUploads || limitSize) && limit) { + fileSet = []; + paramNameSet = []; + for (i = 0; i < filesLength; i += limit) { + fileSet.push(files.slice(i, i + limit)); + paramNameSlice = paramName.slice(i, i + limit); + if (!paramNameSlice.length) { + paramNameSlice = paramName; + } + paramNameSet.push(paramNameSlice); + } + } else if (!options.singleFileUploads && limitSize) { + fileSet = []; + paramNameSet = []; + for (i = 0; i < filesLength; i = i + 1) { + batchSize += files[i].size + overhead; + if (i + 1 === filesLength || + ((batchSize + files[i + 1].size + overhead) > limitSize) || + (limit && i + 1 - j >= limit)) { + fileSet.push(files.slice(j, i + 1)); + paramNameSlice = paramName.slice(j, i + 1); + if (!paramNameSlice.length) { + paramNameSlice = paramName; + } + paramNameSet.push(paramNameSlice); + j = i + 1; + batchSize = 0; + } + } + } else { + paramNameSet = paramName; + } + data.originalFiles = files; + $.each(fileSet || files, function (index, element) { + var newData = $.extend({}, data); + newData.files = fileSet ? element : [element]; + newData.paramName = paramNameSet[index]; + that._initResponseObject(newData); + that._initProgressObject(newData); + that._addConvenienceMethods(e, newData); + result = that._trigger( + 'add', + $.Event('add', {delegatedEvent: e}), + newData + ); + return result; + }); + return result; + }, + + _replaceFileInput: function (data) { + var input = data.fileInput, + inputClone = input.clone(true), + restoreFocus = input.is(document.activeElement); + // Add a reference for the new cloned file input to the data argument: + data.fileInputClone = inputClone; + $('
').append(inputClone)[0].reset(); + // Detaching allows to insert the fileInput on another form + // without loosing the file input value: + input.after(inputClone).detach(); + // If the fileInput had focus before it was detached, + // restore focus to the inputClone. + if (restoreFocus) { + inputClone.focus(); + } + // Avoid memory leaks with the detached file input: + $.cleanData(input.unbind('remove')); + // Replace the original file input element in the fileInput + // elements set with the clone, which has been copied including + // event handlers: + this.options.fileInput = this.options.fileInput.map(function (i, el) { + if (el === input[0]) { + return inputClone[0]; + } + return el; + }); + // If the widget has been initialized on the file input itself, + // override this.element with the file input clone: + if (input[0] === this.element[0]) { + this.element = inputClone; + } + }, + + _handleFileTreeEntry: function (entry, path) { + var that = this, + dfd = $.Deferred(), + entries = [], + dirReader, + errorHandler = function (e) { + if (e && !e.entry) { + e.entry = entry; + } + // Since $.when returns immediately if one + // Deferred is rejected, we use resolve instead. + // This allows valid files and invalid items + // to be returned together in one set: + dfd.resolve([e]); + }, + successHandler = function (entries) { + that._handleFileTreeEntries( + entries, + path + entry.name + '/' + ).done(function (files) { + dfd.resolve(files); + }).fail(errorHandler); + }, + readEntries = function () { + dirReader.readEntries(function (results) { + if (!results.length) { + successHandler(entries); + } else { + entries = entries.concat(results); + readEntries(); + } + }, errorHandler); + }; + path = path || ''; + if (entry.isFile) { + if (entry._file) { + // Workaround for Chrome bug #149735 + entry._file.relativePath = path; + dfd.resolve(entry._file); + } else { + entry.file(function (file) { + file.relativePath = path; + dfd.resolve(file); + }, errorHandler); + } + } else if (entry.isDirectory) { + dirReader = entry.createReader(); + readEntries(); + } else { + // Return an empty list for file system items + // other than files or directories: + dfd.resolve([]); + } + return dfd.promise(); + }, + + _handleFileTreeEntries: function (entries, path) { + var that = this; + return $.when.apply( + $, + $.map(entries, function (entry) { + return that._handleFileTreeEntry(entry, path); + }) + ).then(function () { + return Array.prototype.concat.apply( + [], + arguments + ); + }); + }, + + _getDroppedFiles: function (dataTransfer) { + dataTransfer = dataTransfer || {}; + var items = dataTransfer.items; + if (items && items.length && (items[0].webkitGetAsEntry || + items[0].getAsEntry)) { + return this._handleFileTreeEntries( + $.map(items, function (item) { + var entry; + if (item.webkitGetAsEntry) { + entry = item.webkitGetAsEntry(); + if (entry) { + // Workaround for Chrome bug #149735: + entry._file = item.getAsFile(); + } + return entry; + } + return item.getAsEntry(); + }) + ); + } + return $.Deferred().resolve( + $.makeArray(dataTransfer.files) + ).promise(); + }, + + _getSingleFileInputFiles: function (fileInput) { + fileInput = $(fileInput); + var entries = fileInput.prop('webkitEntries') || + fileInput.prop('entries'), + files, + value; + if (entries && entries.length) { + return this._handleFileTreeEntries(entries); + } + files = $.makeArray(fileInput.prop('files')); + if (!files.length) { + value = fileInput.prop('value'); + if (!value) { + return $.Deferred().resolve([]).promise(); + } + // If the files property is not available, the browser does not + // support the File API and we add a pseudo File object with + // the input value as name with path information removed: + files = [{name: value.replace(/^.*\\/, '')}]; + } else if (files[0].name === undefined && files[0].fileName) { + // File normalization for Safari 4 and Firefox 3: + $.each(files, function (index, file) { + file.name = file.fileName; + file.size = file.fileSize; + }); + } + return $.Deferred().resolve(files).promise(); + }, + + _getFileInputFiles: function (fileInput) { + if (!(fileInput instanceof $) || fileInput.length === 1) { + return this._getSingleFileInputFiles(fileInput); + } + return $.when.apply( + $, + $.map(fileInput, this._getSingleFileInputFiles) + ).then(function () { + return Array.prototype.concat.apply( + [], + arguments + ); + }); + }, + + _onChange: function (e) { + var that = this, + data = { + fileInput: $(e.target), + form: $(e.target.form) + }; + this._getFileInputFiles(data.fileInput).always(function (files) { + data.files = files; + if (that.options.replaceFileInput) { + that._replaceFileInput(data); + } + if (that._trigger( + 'change', + $.Event('change', {delegatedEvent: e}), + data + ) !== false) { + that._onAdd(e, data); + } + }); + }, + + _onPaste: function (e) { + var items = e.originalEvent && e.originalEvent.clipboardData && + e.originalEvent.clipboardData.items, + data = {files: []}; + if (items && items.length) { + $.each(items, function (index, item) { + var file = item.getAsFile && item.getAsFile(); + if (file) { + data.files.push(file); + } + }); + if (this._trigger( + 'paste', + $.Event('paste', {delegatedEvent: e}), + data + ) !== false) { + this._onAdd(e, data); + } + } + }, + + _onDrop: function (e) { + e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer; + var that = this, + dataTransfer = e.dataTransfer, + data = {}; + if (dataTransfer && dataTransfer.files && dataTransfer.files.length) { + e.preventDefault(); + this._getDroppedFiles(dataTransfer).always(function (files) { + data.files = files; + if (that._trigger( + 'drop', + $.Event('drop', {delegatedEvent: e}), + data + ) !== false) { + that._onAdd(e, data); + } + }); + } + }, + + _onDragOver: getDragHandler('dragover'), + + _onDragEnter: getDragHandler('dragenter'), + + _onDragLeave: getDragHandler('dragleave'), + + _initEventHandlers: function () { + if (this._isXHRUpload(this.options)) { + this._on(this.options.dropZone, { + dragover: this._onDragOver, + drop: this._onDrop, + // event.preventDefault() on dragenter is required for IE10+: + dragenter: this._onDragEnter, + // dragleave is not required, but added for completeness: + dragleave: this._onDragLeave + }); + this._on(this.options.pasteZone, { + paste: this._onPaste + }); + } + if ($.support.fileInput) { + this._on(this.options.fileInput, { + change: this._onChange + }); + } + }, + + _destroyEventHandlers: function () { + this._off(this.options.dropZone, 'dragenter dragleave dragover drop'); + this._off(this.options.pasteZone, 'paste'); + this._off(this.options.fileInput, 'change'); + }, + + _destroy: function () { + this._destroyEventHandlers(); + }, + + _setOption: function (key, value) { + var reinit = $.inArray(key, this._specialOptions) !== -1; + if (reinit) { + this._destroyEventHandlers(); + } + this._super(key, value); + if (reinit) { + this._initSpecialOptions(); + this._initEventHandlers(); + } + }, + + _initSpecialOptions: function () { + var options = this.options; + if (options.fileInput === undefined) { + options.fileInput = this.element.is('input[type="file"]') ? + this.element : this.element.find('input[type="file"]'); + } else if (!(options.fileInput instanceof $)) { + options.fileInput = $(options.fileInput); + } + if (!(options.dropZone instanceof $)) { + options.dropZone = $(options.dropZone); + } + if (!(options.pasteZone instanceof $)) { + options.pasteZone = $(options.pasteZone); + } + }, + + _getRegExp: function (str) { + var parts = str.split('/'), + modifiers = parts.pop(); + parts.shift(); + return new RegExp(parts.join('/'), modifiers); + }, + + _isRegExpOption: function (key, value) { + return key !== 'url' && $.type(value) === 'string' && + /^\/.*\/[igm]{0,3}$/.test(value); + }, + + _initDataAttributes: function () { + var that = this, + options = this.options, + data = this.element.data(); + // Initialize options set via HTML5 data-attributes: + $.each( + this.element[0].attributes, + function (index, attr) { + var key = attr.name.toLowerCase(), + value; + if (/^data-/.test(key)) { + // Convert hyphen-ated key to camelCase: + key = key.slice(5).replace(/-[a-z]/g, function (str) { + return str.charAt(1).toUpperCase(); + }); + value = data[key]; + if (that._isRegExpOption(key, value)) { + value = that._getRegExp(value); + } + options[key] = value; + } + } + ); + }, + + _create: function () { + this._initDataAttributes(); + this._initSpecialOptions(); + this._slots = []; + this._sequence = this._getXHRPromise(true); + this._sending = this._active = 0; + this._initProgressObject(this); + this._initEventHandlers(); + }, + + // This method is exposed to the widget API and allows to query + // the number of active uploads: + active: function () { + return this._active; + }, + + // This method is exposed to the widget API and allows to query + // the widget upload progress. + // It returns an object with loaded, total and bitrate properties + // for the running uploads: + progress: function () { + return this._progress; + }, + + // This method is exposed to the widget API and allows adding files + // using the fileupload API. The data parameter accepts an object which + // must have a files property and can contain additional options: + // .fileupload('add', {files: filesList}); + add: function (data) { + var that = this; + if (!data || this.options.disabled) { + return; + } + if (data.fileInput && !data.files) { + this._getFileInputFiles(data.fileInput).always(function (files) { + data.files = files; + that._onAdd(null, data); + }); + } else { + data.files = $.makeArray(data.files); + this._onAdd(null, data); + } + }, + + // This method is exposed to the widget API and allows sending files + // using the fileupload API. The data parameter accepts an object which + // must have a files or fileInput property and can contain additional options: + // .fileupload('send', {files: filesList}); + // The method returns a Promise object for the file upload call. + send: function (data) { + if (data && !this.options.disabled) { + if (data.fileInput && !data.files) { + var that = this, + dfd = $.Deferred(), + promise = dfd.promise(), + jqXHR, + aborted; + promise.abort = function () { + aborted = true; + if (jqXHR) { + return jqXHR.abort(); + } + dfd.reject(null, 'abort', 'abort'); + return promise; + }; + this._getFileInputFiles(data.fileInput).always( + function (files) { + if (aborted) { + return; + } + if (!files.length) { + dfd.reject(); + return; + } + data.files = files; + jqXHR = that._onSend(null, data); + jqXHR.then( + function (result, textStatus, jqXHR) { + dfd.resolve(result, textStatus, jqXHR); + }, + function (jqXHR, textStatus, errorThrown) { + dfd.reject(jqXHR, textStatus, errorThrown); + } + ); + } + ); + return this._enhancePromise(promise); + } + data.files = $.makeArray(data.files); + if (data.files.length) { + return this._onSend(null, data); + } + } + return this._getXHRPromise(false, data && data.context); + } + + }); + +})); diff --git a/libraries/filemanager-9.14.2/js/jquery.iframe-transport.js b/libraries/filemanager-9.14.2/js/jquery.iframe-transport.js new file mode 100644 index 0000000..8d25c46 --- /dev/null +++ b/libraries/filemanager-9.14.2/js/jquery.iframe-transport.js @@ -0,0 +1,224 @@ +/* + * jQuery Iframe Transport Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2011, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + */ + +/* global define, require, window, document, JSON */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define(['jquery'], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory(require('jquery')); + } else { + // Browser globals: + factory(window.jQuery); + } +}(function ($) { + 'use strict'; + + // Helper variable to create unique names for the transport iframes: + var counter = 0, + jsonAPI = $, + jsonParse = 'parseJSON'; + + if ('JSON' in window && 'parse' in JSON) { + jsonAPI = JSON; + jsonParse = 'parse'; + } + + // The iframe transport accepts four additional options: + // options.fileInput: a jQuery collection of file input fields + // options.paramName: the parameter name for the file form data, + // overrides the name property of the file input field(s), + // can be a string or an array of strings. + // options.formData: an array of objects with name and value properties, + // equivalent to the return data of .serializeArray(), e.g.: + // [{name: 'a', value: 1}, {name: 'b', value: 2}] + // options.initialIframeSrc: the URL of the initial iframe src, + // by default set to "javascript:false;" + $.ajaxTransport('iframe', function (options) { + if (options.async) { + // javascript:false as initial iframe src + // prevents warning popups on HTTPS in IE6: + /*jshint scripturl: true */ + var initialIframeSrc = options.initialIframeSrc || 'javascript:false;', + /*jshint scripturl: false */ + form, + iframe, + addParamChar; + return { + send: function (_, completeCallback) { + form = $('
'); + form.attr('accept-charset', options.formAcceptCharset); + addParamChar = /\?/.test(options.url) ? '&' : '?'; + // XDomainRequest only supports GET and POST: + if (options.type === 'DELETE') { + options.url = options.url + addParamChar + '_method=DELETE'; + options.type = 'POST'; + } else if (options.type === 'PUT') { + options.url = options.url + addParamChar + '_method=PUT'; + options.type = 'POST'; + } else if (options.type === 'PATCH') { + options.url = options.url + addParamChar + '_method=PATCH'; + options.type = 'POST'; + } + // IE versions below IE8 cannot set the name property of + // elements that have already been added to the DOM, + // so we set the name along with the iframe HTML markup: + counter += 1; + iframe = $( + '' + ).bind('load', function () { + var fileInputClones, + paramNames = $.isArray(options.paramName) ? + options.paramName : [options.paramName]; + iframe + .unbind('load') + .bind('load', function () { + var response; + // Wrap in a try/catch block to catch exceptions thrown + // when trying to access cross-domain iframe contents: + try { + response = iframe.contents(); + // Google Chrome and Firefox do not throw an + // exception when calling iframe.contents() on + // cross-domain requests, so we unify the response: + if (!response.length || !response[0].firstChild) { + throw new Error(); + } + } catch (e) { + response = undefined; + } + // The complete callback returns the + // iframe content document as response object: + completeCallback( + 200, + 'success', + {'iframe': response} + ); + // Fix for IE endless progress bar activity bug + // (happens on form submits to iframe targets): + $('') + .appendTo(form); + window.setTimeout(function () { + // Removing the form in a setTimeout call + // allows Chrome's developer tools to display + // the response result + form.remove(); + }, 0); + }); + form + .prop('target', iframe.prop('name')) + .prop('action', options.url) + .prop('method', options.type); + if (options.formData) { + $.each(options.formData, function (index, field) { + $('') + .prop('name', field.name) + .val(field.value) + .appendTo(form); + }); + } + if (options.fileInput && options.fileInput.length && + options.type === 'POST') { + fileInputClones = options.fileInput.clone(); + // Insert a clone for each file input field: + options.fileInput.after(function (index) { + return fileInputClones[index]; + }); + if (options.paramName) { + options.fileInput.each(function (index) { + $(this).prop( + 'name', + paramNames[index] || options.paramName + ); + }); + } + // Appending the file input fields to the hidden form + // removes them from their original location: + form + .append(options.fileInput) + .prop('enctype', 'multipart/form-data') + // enctype must be set as encoding for IE: + .prop('encoding', 'multipart/form-data'); + // Remove the HTML5 form attribute from the input(s): + options.fileInput.removeAttr('form'); + } + form.submit(); + // Insert the file input fields at their original location + // by replacing the clones with the originals: + if (fileInputClones && fileInputClones.length) { + options.fileInput.each(function (index, input) { + var clone = $(fileInputClones[index]); + // Restore the original name and form properties: + $(input) + .prop('name', clone.prop('name')) + .attr('form', clone.attr('form')); + clone.replaceWith(input); + }); + } + }); + form.append(iframe).appendTo(document.body); + }, + abort: function () { + if (iframe) { + // javascript:false as iframe src aborts the request + // and prevents warning popups on HTTPS in IE6. + // concat is used to avoid the "Script URL" JSLint error: + iframe + .unbind('load') + .prop('src', initialIframeSrc); + } + if (form) { + form.remove(); + } + } + }; + } + }); + + // The iframe transport returns the iframe content document as response. + // The following adds converters from iframe to text, json, html, xml + // and script. + // Please note that the Content-Type for JSON responses has to be text/plain + // or text/html, if the browser doesn't include application/json in the + // Accept header, else IE will show a download dialog. + // The Content-Type for XML responses on the other hand has to be always + // application/xml or text/xml, so IE properly parses the XML response. + // See also + // https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#content-type-negotiation + $.ajaxSetup({ + converters: { + 'iframe text': function (iframe) { + return iframe && $(iframe[0].body).text(); + }, + 'iframe json': function (iframe) { + return iframe && jsonAPI[jsonParse]($(iframe[0].body).text()); + }, + 'iframe html': function (iframe) { + return iframe && $(iframe[0].body).html(); + }, + 'iframe xml': function (iframe) { + var xmlDoc = iframe && iframe[0]; + return xmlDoc && $.isXMLDoc(xmlDoc) ? xmlDoc : + $.parseXML((xmlDoc.XMLDocument && xmlDoc.XMLDocument.xml) || + $(xmlDoc.body).html()); + }, + 'iframe script': function (iframe) { + return iframe && $.globalEval($(iframe[0].body).text()); + } + } + }); + +})); diff --git a/libraries/filemanager-9.14.2/js/modernizr.custom.js b/libraries/filemanager-9.14.2/js/modernizr.custom.js new file mode 100644 index 0000000..2ec5cd3 --- /dev/null +++ b/libraries/filemanager-9.14.2/js/modernizr.custom.js @@ -0,0 +1,4 @@ +/* Modernizr 2.7.1 (Custom Build) | MIT & BSD + * Build: http://modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-flexboxlegacy-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-canvas-canvastext-draganddrop-hashchange-history-audio-video-indexeddb-input-inputtypes-localstorage-postmessage-sessionstorage-websockets-websqldatabase-webworkers-shiv-cssclasses-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-load + */ +;window.Modernizr=function(a,b,c){function B(a){j.cssText=a}function C(a,b){return B(n.join(a+";")+(b||""))}function D(a,b){return typeof a===b}function E(a,b){return!!~(""+a).indexOf(b)}function F(a,b){for(var d in a){var e=a[d];if(!E(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function G(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:D(f,"function")?f.bind(d||b):f}return!1}function H(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+p.join(d+" ")+d).split(" ");return D(b,"string")||D(b,"undefined")?F(e,b):(e=(a+" "+q.join(d+" ")+d).split(" "),G(e,b,c))}function I(){e.input=function(c){for(var d=0,e=c.length;d',a,""].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},y=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;return f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=D(e[d],"function"),D(e[d],"undefined")||(e[d]=c),e.removeAttribute(d))),e=null,f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),z={}.hasOwnProperty,A;!D(z,"undefined")&&!D(z.call,"undefined")?A=function(a,b){return z.call(a,b)}:A=function(a,b){return b in a&&D(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=v.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(v.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(v.call(arguments)))};return e}),r.flexbox=function(){return H("flexWrap")},r.flexboxlegacy=function(){return H("boxDirection")},r.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},r.canvastext=function(){return!!e.canvas&&!!D(b.createElement("canvas").getContext("2d").fillText,"function")},r.postmessage=function(){return!!a.postMessage},r.websqldatabase=function(){return!!a.openDatabase},r.indexedDB=function(){return!!H("indexedDB",a)},r.hashchange=function(){return y("hashchange",a)&&(b.documentMode===c||b.documentMode>7)},r.history=function(){return!!a.history&&!!history.pushState},r.draganddrop=function(){var a=b.createElement("div");return"draggable"in a||"ondragstart"in a&&"ondrop"in a},r.websockets=function(){return"WebSocket"in a||"MozWebSocket"in a},r.rgba=function(){return B("background-color:rgba(150,255,150,.5)"),E(j.backgroundColor,"rgba")},r.hsla=function(){return B("background-color:hsla(120,40%,100%,.5)"),E(j.backgroundColor,"rgba")||E(j.backgroundColor,"hsla")},r.multiplebgs=function(){return B("background:url(https://),url(https://),red url(https://)"),/(url\s*\(.*?){3}/.test(j.background)},r.backgroundsize=function(){return H("backgroundSize")},r.borderimage=function(){return H("borderImage")},r.borderradius=function(){return H("borderRadius")},r.boxshadow=function(){return H("boxShadow")},r.textshadow=function(){return b.createElement("div").style.textShadow===""},r.opacity=function(){return C("opacity:.55"),/^0.55$/.test(j.opacity)},r.cssanimations=function(){return H("animationName")},r.csscolumns=function(){return H("columnCount")},r.cssgradients=function(){var a="background-image:",b="gradient(linear,left top,right bottom,from(#9f9),to(white));",c="linear-gradient(left top,#9f9, white);";return B((a+"-webkit- ".split(" ").join(b+a)+n.join(c+a)).slice(0,-a.length)),E(j.backgroundImage,"gradient")},r.cssreflections=function(){return H("boxReflect")},r.csstransforms=function(){return!!H("transform")},r.csstransforms3d=function(){var a=!!H("perspective");return a&&"webkitPerspective"in g.style&&x("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(b,c){a=b.offsetLeft===9&&b.offsetHeight===3}),a},r.csstransitions=function(){return H("transition")},r.fontface=function(){var a;return x('@font-face {font-family:"font";src:url("https://")}',function(c,d){var e=b.getElementById("smodernizr"),f=e.sheet||e.styleSheet,g=f?f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"":"";a=/src/i.test(g)&&g.indexOf(d.split(" ")[0])===0}),a},r.generatedcontent=function(){var a;return x(["#",h,"{font:0/0 a}#",h,':after{content:"',l,'";visibility:hidden;font:3px/1 a}'].join(""),function(b){a=b.offsetHeight>=3}),a},r.video=function(){var a=b.createElement("video"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),c.h264=a.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,"")}catch(d){}return c},r.audio=function(){var a=b.createElement("audio"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),c.mp3=a.canPlayType("audio/mpeg;").replace(/^no$/,""),c.wav=a.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),c.m4a=(a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;")).replace(/^no$/,"")}catch(d){}return c},r.localstorage=function(){try{return localStorage.setItem(h,h),localStorage.removeItem(h),!0}catch(a){return!1}},r.sessionstorage=function(){try{return sessionStorage.setItem(h,h),sessionStorage.removeItem(h),!0}catch(a){return!1}},r.webworkers=function(){return!!a.Worker},r.applicationcache=function(){return!!a.applicationCache};for(var J in r)A(r,J)&&(w=J.toLowerCase(),e[w]=r[J](),u.push((e[w]?"":"no-")+w));return e.input||I(),e.addTest=function(a,b){if(typeof a=="object")for(var d in a)A(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},B(""),i=k=null,function(a,b){function l(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function m(){var a=s.elements;return typeof a=="string"?a.split(" "):a}function n(a){var b=j[a[h]];return b||(b={},i++,a[h]=i,j[i]=b),b}function o(a,c,d){c||(c=b);if(k)return c.createElement(a);d||(d=n(c));var g;return d.cache[a]?g=d.cache[a].cloneNode():f.test(a)?g=(d.cache[a]=d.createElem(a)).cloneNode():g=d.createElem(a),g.canHaveChildren&&!e.test(a)&&!g.tagUrn?d.frag.appendChild(g):g}function p(a,c){a||(a=b);if(k)return a.createDocumentFragment();c=c||n(a);var d=c.frag.cloneNode(),e=0,f=m(),g=f.length;for(;e",g="hidden"in a,k=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){g=!0,k=!0}})();var s={elements:d.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:c,shivCSS:d.shivCSS!==!1,supportsUnknownElements:k,shivMethods:d.shivMethods!==!1,type:"default",shivDocument:r,createElement:o,createDocumentFragment:p};a.html5=s,r(b)}(this,b),e._version=d,e._prefixes=n,e._domPrefixes=q,e._cssomPrefixes=p,e.hasEvent=y,e.testProp=function(a){return F([a])},e.testAllProps=H,e.testStyles=x,g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+u.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f=n-r?"bottom":null!=s&&o<=s&&"top"),this.affixed!==t&&(this.affixed=t,this.unpin="bottom"==t?i.top-o:null,this.$element.removeClass(c).addClass("affix"+(t?"-"+t:"")))}};var n=e.fn.affix;e.fn.affix=function(n){return this.each(function(){var o=e(this),i=o.data("affix"),a="object"==typeof n&&n;i||o.data("affix",i=new t(this,a)),"string"==typeof n&&i[n]()})},e.fn.affix.Constructor=t,e.fn.affix.defaults={offset:0},e.fn.affix.noConflict=function(){return e.fn.affix=n,this},e(window).on("load",function(){e('[data-spy="affix"]').each(function(){var t=e(this),n=t.data();n.offset=n.offset||{},n.offsetBottom&&(n.offset.bottom=n.offsetBottom),n.offsetTop&&(n.offset.top=n.offsetTop),t.affix(n)})})}(window.jQuery),!function(e){"use strict";function t(){e(".dropdown-backdrop").remove(),e(o).each(function(){n(e(this)).removeClass("open")})}function n(t){var n,o=t.attr("data-target");return o||(o=t.attr("href"),o=o&&/#/.test(o)&&o.replace(/.*(?=#[^\s]*$)/,"")),n=o&&e(o),n&&n.length||(n=t.parent()),n}var o="[data-toggle=dropdown]",i=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};i.prototype={constructor:i,toggle:function(o){var i,a,r=e(this);if(!r.is(".disabled, :disabled"))return i=n(r),a=i.hasClass("open"),t(),a||("ontouchstart"in document.documentElement&&e('