From 9f1a0a42d599b05db40488311ecfa49a13d9deaa Mon Sep 17 00:00:00 2001 From: "Dro1d.Ru" Date: Thu, 2 Jun 2016 17:42:43 +0500 Subject: [PATCH] init --- .gitignore | 7 + 403.html | 29 + 404.html | 29 + README | 4 + assets/css/bootstrap-datetimepicker.min.css | 5 + assets/css/bootstrap-theme.min.css | 5 + assets/css/bootstrap.min.css | 5 + assets/css/bxslider.css | 209 + assets/css/cropper.css | 40 + assets/css/index.php | 64 + assets/css/lightbox.css | 216 + assets/css/zira.css | 152 + assets/fonts/Lobster.ttf | Bin 0 -> 429716 bytes assets/fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes assets/fonts/glyphicons-halflings-regular.svg | 288 ++ assets/fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes assets/images/blank.png | Bin 0 -> 169 bytes assets/images/bx_controls.png | Bin 0 -> 2931 bytes assets/images/bx_loader.gif | Bin 0 -> 8581 bytes assets/images/close.png | Bin 0 -> 280 bytes assets/images/drag.png | Bin 0 -> 1063 bytes assets/images/emoji/png/1f600.png | Bin 0 -> 914 bytes assets/images/emoji/png/1f601.png | Bin 0 -> 835 bytes assets/images/emoji/png/1f602.png | Bin 0 -> 1181 bytes assets/images/emoji/png/1f603.png | Bin 0 -> 593 bytes assets/images/emoji/png/1f604.png | Bin 0 -> 683 bytes assets/images/emoji/png/1f605.png | Bin 0 -> 870 bytes assets/images/emoji/png/1f606.png | Bin 0 -> 891 bytes assets/images/emoji/png/1f607.png | Bin 0 -> 1114 bytes assets/images/emoji/png/1f608.png | Bin 0 -> 1040 bytes assets/images/emoji/png/1f609.png | Bin 0 -> 765 bytes assets/images/emoji/png/1f60a.png | Bin 0 -> 796 bytes assets/images/emoji/png/1f60b.png | Bin 0 -> 925 bytes assets/images/emoji/png/1f60c.png | Bin 0 -> 768 bytes assets/images/emoji/png/1f60d.png | Bin 0 -> 961 bytes assets/images/emoji/png/1f60e.png | Bin 0 -> 794 bytes assets/images/emoji/png/1f60f.png | Bin 0 -> 773 bytes assets/images/emoji/png/1f610.png | Bin 0 -> 494 bytes assets/images/emoji/png/1f611.png | Bin 0 -> 579 bytes assets/images/emoji/png/1f612.png | Bin 0 -> 765 bytes assets/images/emoji/png/1f613.png | Bin 0 -> 798 bytes assets/images/emoji/png/1f614.png | Bin 0 -> 697 bytes assets/images/emoji/png/1f615.png | Bin 0 -> 880 bytes assets/images/emoji/png/1f616.png | Bin 0 -> 879 bytes assets/images/emoji/png/1f617.png | Bin 0 -> 714 bytes assets/images/emoji/png/1f618.png | Bin 0 -> 943 bytes assets/images/emoji/png/1f619.png | Bin 0 -> 623 bytes assets/images/emoji/png/1f61a.png | Bin 0 -> 835 bytes assets/images/emoji/png/1f61b.png | Bin 0 -> 747 bytes assets/images/emoji/png/1f61c.png | Bin 0 -> 1040 bytes assets/images/emoji/png/1f61d.png | Bin 0 -> 846 bytes assets/images/emoji/png/1f61e.png | Bin 0 -> 649 bytes assets/images/emoji/png/1f61f.png | Bin 0 -> 701 bytes assets/images/emoji/png/1f620.png | Bin 0 -> 792 bytes assets/images/emoji/png/1f621.png | Bin 0 -> 795 bytes assets/images/emoji/png/1f622.png | Bin 0 -> 1208 bytes assets/images/emoji/png/1f623.png | Bin 0 -> 841 bytes assets/images/emoji/png/1f624.png | Bin 0 -> 1438 bytes assets/images/emoji/png/1f625.png | Bin 0 -> 826 bytes assets/images/emoji/png/1f626.png | Bin 0 -> 616 bytes assets/images/emoji/png/1f627.png | Bin 0 -> 794 bytes assets/images/emoji/png/1f628.png | Bin 0 -> 1049 bytes assets/images/emoji/png/1f629.png | Bin 0 -> 844 bytes assets/images/emoji/png/1f62a.png | Bin 0 -> 1135 bytes assets/images/emoji/png/1f62b.png | Bin 0 -> 1143 bytes assets/images/emoji/png/1f62c.png | Bin 0 -> 764 bytes assets/images/emoji/png/1f62d.png | Bin 0 -> 1173 bytes assets/images/emoji/png/1f62e.png | Bin 0 -> 618 bytes assets/images/emoji/png/1f62f.png | Bin 0 -> 694 bytes assets/images/emoji/png/1f630.png | Bin 0 -> 946 bytes assets/images/emoji/png/1f631.png | Bin 0 -> 1337 bytes assets/images/emoji/png/1f632.png | Bin 0 -> 1054 bytes assets/images/emoji/png/1f633.png | Bin 0 -> 1093 bytes assets/images/emoji/png/1f634.png | Bin 0 -> 1037 bytes assets/images/emoji/png/1f635.png | Bin 0 -> 725 bytes assets/images/emoji/png/1f636.png | Bin 0 -> 473 bytes assets/images/emoji/png/1f637.png | Bin 0 -> 1065 bytes assets/images/emoji/png/1f638.png | Bin 0 -> 1432 bytes assets/images/emoji/png/1f639.png | Bin 0 -> 1617 bytes assets/images/emoji/png/1f640.png | Bin 0 -> 1201 bytes assets/images/emoji/png/1f641.png | Bin 0 -> 562 bytes assets/images/emoji/png/1f642.png | Bin 0 -> 583 bytes assets/images/emoji/png/1f643.png | Bin 0 -> 587 bytes assets/images/emoji/png/1f644.png | Bin 0 -> 671 bytes assets/images/emoji/png/1f910.png | Bin 0 -> 1019 bytes assets/images/emoji/png/1f911.png | Bin 0 -> 938 bytes assets/images/emoji/png/1f912.png | Bin 0 -> 1286 bytes assets/images/emoji/png/1f913.png | Bin 0 -> 917 bytes assets/images/emoji/png/1f914.png | Bin 0 -> 1359 bytes assets/images/emoji/png/1f915.png | Bin 0 -> 1151 bytes assets/images/emoji/png/1f916.png | Bin 0 -> 1187 bytes assets/images/emoji/png/1f917.png | Bin 0 -> 1289 bytes assets/images/emoji/svg/1f600.svg | 1 + assets/images/emoji/svg/1f601.svg | 1 + assets/images/emoji/svg/1f602.svg | 1 + assets/images/emoji/svg/1f603.svg | 1 + assets/images/emoji/svg/1f604.svg | 1 + assets/images/emoji/svg/1f605.svg | 1 + assets/images/emoji/svg/1f606.svg | 1 + assets/images/emoji/svg/1f607.svg | 1 + assets/images/emoji/svg/1f608.svg | 1 + assets/images/emoji/svg/1f609.svg | 1 + assets/images/emoji/svg/1f60a.svg | 1 + assets/images/emoji/svg/1f60b.svg | 2 + assets/images/emoji/svg/1f60c.svg | 1 + assets/images/emoji/svg/1f60d.svg | 1 + assets/images/emoji/svg/1f60e.svg | 2 + assets/images/emoji/svg/1f60f.svg | 1 + assets/images/emoji/svg/1f610.svg | 1 + assets/images/emoji/svg/1f611.svg | 1 + assets/images/emoji/svg/1f612.svg | 1 + assets/images/emoji/svg/1f613.svg | 1 + assets/images/emoji/svg/1f614.svg | 1 + assets/images/emoji/svg/1f615.svg | 1 + assets/images/emoji/svg/1f616.svg | 1 + assets/images/emoji/svg/1f617.svg | 1 + assets/images/emoji/svg/1f618.svg | 1 + assets/images/emoji/svg/1f619.svg | 1 + assets/images/emoji/svg/1f61a.svg | 1 + assets/images/emoji/svg/1f61b.svg | 1 + assets/images/emoji/svg/1f61c.svg | 1 + assets/images/emoji/svg/1f61d.svg | 1 + assets/images/emoji/svg/1f61e.svg | 1 + assets/images/emoji/svg/1f61f.svg | 1 + assets/images/emoji/svg/1f620.svg | 1 + assets/images/emoji/svg/1f621.svg | 1 + assets/images/emoji/svg/1f622.svg | 1 + assets/images/emoji/svg/1f623.svg | 1 + assets/images/emoji/svg/1f624.svg | 1 + assets/images/emoji/svg/1f625.svg | 1 + assets/images/emoji/svg/1f626.svg | 1 + assets/images/emoji/svg/1f627.svg | 1 + assets/images/emoji/svg/1f628.svg | 1 + assets/images/emoji/svg/1f629.svg | 1 + assets/images/emoji/svg/1f62a.svg | 1 + assets/images/emoji/svg/1f62b.svg | 1 + assets/images/emoji/svg/1f62c.svg | 1 + assets/images/emoji/svg/1f62d.svg | 1 + assets/images/emoji/svg/1f62e.svg | 1 + assets/images/emoji/svg/1f62f.svg | 1 + assets/images/emoji/svg/1f630.svg | 1 + assets/images/emoji/svg/1f631.svg | 2 + assets/images/emoji/svg/1f632.svg | 1 + assets/images/emoji/svg/1f633.svg | 1 + assets/images/emoji/svg/1f634.svg | 1 + assets/images/emoji/svg/1f635.svg | 1 + assets/images/emoji/svg/1f636.svg | 1 + assets/images/emoji/svg/1f637.svg | 1 + assets/images/emoji/svg/1f638.svg | 1 + assets/images/emoji/svg/1f639.svg | 1 + assets/images/emoji/svg/1f640.svg | 1 + assets/images/emoji/svg/1f641.svg | 1 + assets/images/emoji/svg/1f642.svg | 1 + assets/images/emoji/svg/1f643.svg | 1 + assets/images/emoji/svg/1f644.svg | 1 + assets/images/emoji/svg/1f910.svg | 1 + assets/images/emoji/svg/1f911.svg | 1 + assets/images/emoji/svg/1f912.svg | 1 + assets/images/emoji/svg/1f913.svg | 1 + assets/images/emoji/svg/1f914.svg | 2 + assets/images/emoji/svg/1f915.svg | 2 + assets/images/emoji/svg/1f916.svg | 1 + assets/images/emoji/svg/1f917.svg | 1 + assets/images/loader.gif | Bin 0 -> 743 bytes assets/images/loading.gif | Bin 0 -> 8476 bytes assets/images/next.png | Bin 0 -> 1350 bytes assets/images/noimage.jpg | Bin 0 -> 3313 bytes assets/images/nophoto.jpg | Bin 0 -> 3003 bytes assets/images/prev.png | Bin 0 -> 1360 bytes assets/images/zira.png | Bin 0 -> 6194 bytes assets/js/autocomplete.js | 171 + assets/js/bootstrap-datetimepicker.min.js | 9 + assets/js/bootstrap.min.js | 7 + assets/js/bxslider.min.js | 10 + assets/js/cropper.js | 424 ++ assets/js/dash.js | 249 ++ assets/js/dash/blocks.js | 43 + assets/js/dash/cache.js | 30 + assets/js/dash/comments.js | 75 + assets/js/dash/console.js | 221 + assets/js/dash/contacts.js | 13 + assets/js/dash/cron.js | 12 + assets/js/dash/editor.js | 162 + assets/js/dash/files.js | 206 + assets/js/dash/groups.js | 85 + assets/js/dash/html.js | 12 + assets/js/dash/image.js | 301 ++ assets/js/dash/languages.js | 75 + assets/js/dash/logs.js | 35 + assets/js/dash/mailing.js | 80 + assets/js/dash/menu.js | 239 ++ assets/js/dash/meta.js | 13 + assets/js/dash/modules.js | 61 + assets/js/dash/options.js | 16 + assets/js/dash/recordhtml.js | 42 + assets/js/dash/recordimages.js | 32 + assets/js/dash/records.js | 356 ++ assets/js/dash/recordslides.js | 32 + assets/js/dash/recordtext.js | 48 + assets/js/dash/selector.js | 54 + assets/js/dash/system.js | 41 + assets/js/dash/text.js | 12 + assets/js/dash/themes.js | 29 + assets/js/dash/translates.js | 19 + assets/js/dash/user.js | 75 + assets/js/dash/users.js | 121 + assets/js/dash/web.js | 81 + assets/js/dash/widgets.js | 221 + assets/js/desk-window.js | 2943 +++++++++++++ assets/js/desk-wrapper.js | 685 +++ assets/js/desk.js | 745 ++++ assets/js/highlight/LICENSE | 24 + assets/js/highlight/highlight.pack.js | 2 + assets/js/highlight/styles/agate.css | 108 + assets/js/highlight/styles/androidstudio.css | 66 + assets/js/highlight/styles/arduino-light.css | 88 + assets/js/highlight/styles/arta.css | 73 + assets/js/highlight/styles/ascetic.css | 45 + .../js/highlight/styles/atelier-cave-dark.css | 83 + .../highlight/styles/atelier-cave-light.css | 85 + .../js/highlight/styles/atelier-dune-dark.css | 69 + .../highlight/styles/atelier-dune-light.css | 69 + .../highlight/styles/atelier-estuary-dark.css | 84 + .../styles/atelier-estuary-light.css | 84 + .../highlight/styles/atelier-forest-dark.css | 69 + .../highlight/styles/atelier-forest-light.css | 69 + .../highlight/styles/atelier-heath-dark.css | 69 + .../highlight/styles/atelier-heath-light.css | 69 + .../styles/atelier-lakeside-dark.css | 69 + .../styles/atelier-lakeside-light.css | 69 + .../highlight/styles/atelier-plateau-dark.css | 84 + .../styles/atelier-plateau-light.css | 84 + .../highlight/styles/atelier-savanna-dark.css | 84 + .../styles/atelier-savanna-light.css | 84 + .../highlight/styles/atelier-seaside-dark.css | 69 + .../styles/atelier-seaside-light.css | 69 + .../styles/atelier-sulphurpool-dark.css | 69 + .../styles/atelier-sulphurpool-light.css | 69 + assets/js/highlight/styles/brown-paper.css | 64 + assets/js/highlight/styles/brown-papersq.png | Bin 0 -> 18198 bytes assets/js/highlight/styles/codepen-embed.css | 60 + assets/js/highlight/styles/color-brewer.css | 71 + assets/js/highlight/styles/dark.css | 63 + assets/js/highlight/styles/darkula.css | 74 + assets/js/highlight/styles/default.css | 99 + assets/js/highlight/styles/docco.css | 97 + assets/js/highlight/styles/dracula.css | 76 + assets/js/highlight/styles/far.css | 71 + assets/js/highlight/styles/foundation.css | 88 + assets/js/highlight/styles/github-gist.css | 71 + assets/js/highlight/styles/github.css | 99 + assets/js/highlight/styles/googlecode.css | 89 + assets/js/highlight/styles/grayscale.css | 101 + assets/js/highlight/styles/gruvbox-dark.css | 108 + assets/js/highlight/styles/gruvbox-light.css | 108 + assets/js/highlight/styles/hopscotch.css | 83 + assets/js/highlight/styles/hybrid.css | 102 + assets/js/highlight/styles/idea.css | 97 + assets/js/highlight/styles/ir-black.css | 73 + assets/js/highlight/styles/kimbie.dark.css | 74 + assets/js/highlight/styles/kimbie.light.css | 74 + assets/js/highlight/styles/magula.css | 70 + assets/js/highlight/styles/mono-blue.css | 59 + .../js/highlight/styles/monokai-sublime.css | 83 + assets/js/highlight/styles/monokai.css | 70 + assets/js/highlight/styles/obsidian.css | 88 + assets/js/highlight/styles/paraiso-dark.css | 72 + assets/js/highlight/styles/paraiso-light.css | 72 + assets/js/highlight/styles/pojoaque.css | 83 + assets/js/highlight/styles/pojoaque.jpg | Bin 0 -> 1186 bytes assets/js/highlight/styles/qtcreator_dark.css | 83 + .../js/highlight/styles/qtcreator_light.css | 83 + assets/js/highlight/styles/railscasts.css | 106 + assets/js/highlight/styles/rainbow.css | 85 + assets/js/highlight/styles/school-book.css | 72 + assets/js/highlight/styles/school-book.png | Bin 0 -> 486 bytes assets/js/highlight/styles/solarized-dark.css | 84 + .../js/highlight/styles/solarized-light.css | 84 + assets/js/highlight/styles/sunburst.css | 102 + .../highlight/styles/tomorrow-night-blue.css | 75 + .../styles/tomorrow-night-bright.css | 74 + .../styles/tomorrow-night-eighties.css | 74 + assets/js/highlight/styles/tomorrow-night.css | 75 + assets/js/highlight/styles/tomorrow.css | 72 + assets/js/highlight/styles/vs.css | 68 + assets/js/highlight/styles/xcode.css | 93 + assets/js/highlight/styles/xt256.css | 92 + assets/js/highlight/styles/zenburn.css | 80 + assets/js/html5shiv.min.js | 4 + assets/js/index.php | 64 + assets/js/jquery.min.js | 5 + assets/js/lightbox.min.js | 12 + assets/js/md5.js | 184 + assets/js/moment-locale-ru.js | 163 + assets/js/moment.min.js | 7 + assets/js/parse.js | 176 + assets/js/respond.min.js | 5 + assets/js/tinymce/index.php | 369 ++ assets/js/tinymce/langs/readme.md | 3 + assets/js/tinymce/langs/ru.js | 219 + assets/js/tinymce/license.txt | 504 +++ .../js/tinymce/plugins/advlist/plugin.min.js | 1 + .../js/tinymce/plugins/anchor/plugin.min.js | 1 + .../js/tinymce/plugins/autolink/plugin.min.js | 1 + .../tinymce/plugins/autoresize/plugin.min.js | 1 + .../js/tinymce/plugins/autosave/plugin.min.js | 1 + .../js/tinymce/plugins/bbcode/plugin.min.js | 1 + .../js/tinymce/plugins/charmap/plugin.min.js | 1 + assets/js/tinymce/plugins/code/plugin.min.js | 1 + .../tinymce/plugins/codesample/css/prism.css | 138 + .../tinymce/plugins/codesample/plugin.min.js | 1 + .../tinymce/plugins/colorpicker/plugin.min.js | 1 + .../tinymce/plugins/contextmenu/plugin.min.js | 1 + .../plugins/directionality/plugin.min.js | 1 + .../plugins/emoticons/img/smiley-cool.gif | Bin 0 -> 354 bytes .../plugins/emoticons/img/smiley-cry.gif | Bin 0 -> 329 bytes .../emoticons/img/smiley-embarassed.gif | Bin 0 -> 331 bytes .../emoticons/img/smiley-foot-in-mouth.gif | Bin 0 -> 342 bytes .../plugins/emoticons/img/smiley-frown.gif | Bin 0 -> 340 bytes .../plugins/emoticons/img/smiley-innocent.gif | Bin 0 -> 336 bytes .../plugins/emoticons/img/smiley-kiss.gif | Bin 0 -> 338 bytes .../plugins/emoticons/img/smiley-laughing.gif | Bin 0 -> 343 bytes .../emoticons/img/smiley-money-mouth.gif | Bin 0 -> 321 bytes .../plugins/emoticons/img/smiley-sealed.gif | Bin 0 -> 323 bytes .../plugins/emoticons/img/smiley-smile.gif | Bin 0 -> 344 bytes .../emoticons/img/smiley-surprised.gif | Bin 0 -> 338 bytes .../emoticons/img/smiley-tongue-out.gif | Bin 0 -> 328 bytes .../emoticons/img/smiley-undecided.gif | Bin 0 -> 337 bytes .../plugins/emoticons/img/smiley-wink.gif | Bin 0 -> 350 bytes .../plugins/emoticons/img/smiley-yell.gif | Bin 0 -> 336 bytes .../tinymce/plugins/emoticons/plugin.min.js | 1 + assets/js/tinymce/plugins/example/dialog.html | 8 + .../js/tinymce/plugins/example/plugin.min.js | 1 + .../plugins/example_dependency/plugin.min.js | 1 + .../js/tinymce/plugins/fullpage/plugin.min.js | 1 + .../tinymce/plugins/fullscreen/plugin.min.js | 1 + assets/js/tinymce/plugins/hr/plugin.min.js | 1 + assets/js/tinymce/plugins/image/plugin.min.js | 1 + .../tinymce/plugins/imagetools/plugin.min.js | 1 + .../tinymce/plugins/importcss/plugin.min.js | 1 + .../plugins/insertdatetime/plugin.min.js | 1 + assets/js/tinymce/plugins/layer/plugin.min.js | 1 + .../plugins/legacyoutput/plugin.min.js | 1 + assets/js/tinymce/plugins/link/plugin.min.js | 1 + assets/js/tinymce/plugins/lists/plugin.min.js | 1 + .../js/tinymce/plugins/media/moxieplayer.swf | Bin 0 -> 20017 bytes assets/js/tinymce/plugins/media/plugin.min.js | 1 + .../tinymce/plugins/nonbreaking/plugin.min.js | 1 + .../tinymce/plugins/noneditable/plugin.min.js | 1 + .../tinymce/plugins/pagebreak/plugin.min.js | 1 + assets/js/tinymce/plugins/paste/plugin.min.js | 1 + .../js/tinymce/plugins/preview/plugin.min.js | 1 + assets/js/tinymce/plugins/print/plugin.min.js | 1 + assets/js/tinymce/plugins/save/plugin.min.js | 1 + .../plugins/searchreplace/plugin.min.js | 1 + .../plugins/spellchecker/plugin.min.js | 1 + .../js/tinymce/plugins/tabfocus/plugin.min.js | 1 + assets/js/tinymce/plugins/table/plugin.min.js | 2 + .../js/tinymce/plugins/template/plugin.min.js | 1 + .../tinymce/plugins/textcolor/plugin.min.js | 1 + .../tinymce/plugins/textpattern/plugin.min.js | 1 + .../plugins/visualblocks/css/visualblocks.css | 135 + .../plugins/visualblocks/plugin.min.js | 1 + .../tinymce/plugins/visualchars/plugin.min.js | 1 + .../tinymce/plugins/wordcount/plugin.min.js | 1 + .../skins/lightgray/content.inline.min.css | 154 + .../tinymce/skins/lightgray/content.min.css | 1 + .../skins/lightgray/fonts/tinymce-small.eot | Bin 0 -> 9492 bytes .../skins/lightgray/fonts/tinymce-small.svg | 63 + .../skins/lightgray/fonts/tinymce-small.ttf | Bin 0 -> 9304 bytes .../skins/lightgray/fonts/tinymce-small.woff | Bin 0 -> 9380 bytes .../tinymce/skins/lightgray/fonts/tinymce.eot | Bin 0 -> 14308 bytes .../tinymce/skins/lightgray/fonts/tinymce.svg | 98 + .../tinymce/skins/lightgray/fonts/tinymce.ttf | Bin 0 -> 14144 bytes .../skins/lightgray/fonts/tinymce.woff | Bin 0 -> 14220 bytes .../js/tinymce/skins/lightgray/img/anchor.gif | Bin 0 -> 53 bytes .../js/tinymce/skins/lightgray/img/loader.gif | Bin 0 -> 2608 bytes .../js/tinymce/skins/lightgray/img/object.gif | Bin 0 -> 152 bytes .../js/tinymce/skins/lightgray/img/trans.gif | Bin 0 -> 43 bytes .../tinymce/skins/lightgray/skin.ie7.min.css | 1 + .../js/tinymce/skins/lightgray/skin.min.css | 1 + assets/js/tinymce/themes/modern/theme.min.js | 1 + assets/js/tinymce/tinymce.gzip.js | 1 + assets/js/tinymce/tinymce.min.js | 13 + assets/js/upload.inc.js | 142 + assets/js/upload.js | 89 + assets/js/zira.js | 781 ++++ config.src.php | 0 const.php | 57 + dash/controller.php | 54 + dash/controllers/comments.php | 48 + dash/controllers/files.php | 164 + dash/controllers/groups.php | 64 + dash/controllers/image.php | 122 + dash/controllers/index.php | 231 ++ dash/controllers/languages.php | 87 + dash/controllers/menu.php | 43 + dash/controllers/records.php | 166 + dash/controllers/system.php | 137 + dash/controllers/users.php | 55 + dash/controllers/widgets.php | 72 + dash/dash.php | 766 ++++ dash/forms/block.php | 66 + dash/forms/category.php | 95 + dash/forms/categorymeta.php | 54 + dash/forms/categorysettings.php | 54 + dash/forms/commentsettings.php | 58 + dash/forms/contacts.php | 143 + dash/forms/home.php | 77 + dash/forms/mailing.php | 52 + dash/forms/mailsettings.php | 74 + dash/forms/menuitem.php | 85 + dash/forms/meta.php | 102 + dash/forms/options.php | 122 + dash/forms/permissions.php | 66 + dash/forms/record.php | 111 + dash/forms/recordmeta.php | 53 + dash/forms/recordsettings.php | 56 + dash/forms/upload.php | 65 + dash/forms/user.php | 140 + dash/forms/usersettings.php | 63 + dash/forms/widget.php | 100 + dash/models/block.php | 56 + dash/models/blockhtml.php | 14 + dash/models/blocks.php | 79 + dash/models/blocktext.php | 35 + dash/models/cache.php | 89 + dash/models/category.php | 78 + dash/models/categorymeta.php | 46 + dash/models/categorysettings.php | 47 + dash/models/comments.php | 147 + dash/models/commentsettings.php | 61 + dash/models/console.php | 253 ++ dash/models/contacts.php | 71 + dash/models/files.php | 484 +++ dash/models/groups.php | 131 + dash/models/home.php | 62 + dash/models/html.php | 47 + dash/models/image.php | 388 ++ dash/models/languages.php | 212 + dash/models/logs.php | 77 + dash/models/mailing.php | 142 + dash/models/mailsettings.php | 68 + dash/models/menu.php | 136 + dash/models/menuitem.php | 51 + dash/models/meta.php | 72 + dash/models/model.php | 26 + dash/models/modules.php | 137 + dash/models/options.php | 69 + dash/models/permissions.php | 43 + dash/models/record.php | 69 + dash/models/recordhtml.php | 13 + dash/models/recordimages.php | 83 + dash/models/recordmeta.php | 49 + dash/models/records.php | 399 ++ dash/models/recordsettings.php | 61 + dash/models/recordslides.php | 83 + dash/models/recordtext.php | 123 + dash/models/selector.php | 15 + dash/models/system.php | 80 + dash/models/text.php | 45 + dash/models/themes.php | 45 + dash/models/translates.php | 78 + dash/models/user.php | 78 + dash/models/users.php | 113 + dash/models/usersettings.php | 64 + dash/models/widget.php | 71 + dash/models/widgets.php | 249 ++ dash/widgets/button.php | 28 + dash/widgets/panel.php | 31 + dash/windows/block.php | 59 + dash/windows/blockhtml.php | 20 + dash/windows/blocks.php | 120 + dash/windows/blocktext.php | 46 + dash/windows/cache.php | 108 + dash/windows/category.php | 74 + dash/windows/categorymeta.php | 63 + dash/windows/categorysettings.php | 67 + dash/windows/comments.php | 173 + dash/windows/commentsettings.php | 55 + dash/windows/console.php | 72 + dash/windows/contacts.php | 49 + dash/windows/cron.php | 37 + dash/windows/editor.php | 147 + dash/windows/files.php | 308 ++ dash/windows/groups.php | 112 + dash/windows/home.php | 51 + dash/windows/html.php | 69 + dash/windows/image.php | 157 + dash/windows/languages.php | 131 + dash/windows/logs.php | 106 + dash/windows/mailing.php | 86 + dash/windows/mailsettings.php | 47 + dash/windows/menu.php | 249 ++ dash/windows/menuitem.php | 69 + dash/windows/meta.php | 51 + dash/windows/modules.php | 171 + dash/windows/options.php | 52 + dash/windows/permissions.php | 66 + dash/windows/record.php | 91 + dash/windows/recordhtml.php | 31 + dash/windows/recordimages.php | 103 + dash/windows/recordmeta.php | 63 + dash/windows/records.php | 405 ++ dash/windows/recordsettings.php | 53 + dash/windows/recordslides.php | 103 + dash/windows/recordtext.php | 98 + dash/windows/selector.php | 42 + dash/windows/system.php | 169 + dash/windows/text.php | 65 + dash/windows/themes.php | 103 + dash/windows/translates.php | 150 + dash/windows/user.php | 107 + dash/windows/users.php | 229 ++ dash/windows/usersettings.php | 52 + dash/windows/web.php | 63 + dash/windows/widget.php | 81 + dash/windows/widgets.php | 224 + dash/windows/window.php | 843 ++++ favicon.ico | Bin 0 -> 1150 bytes htaccess.txt | 33 + index.php | 53 + install/check/index.php | 2 + install/configuration.php | 80 + install/credentials.php | 16 + install/default.php | 50 + install/environment.php | 143 + install/forms/configuration.php | 77 + install/forms/credentials.php | 64 + install/index.php | 204 + install/layout.php | 55 + install/license.php | 22 + install/operate.php | 362 ++ install/process.php | 135 + key.pub | 6 + languages/en/dash.js.php | 5 + languages/en/dash.php | 14 + languages/en/en.js.php | 5 + languages/en/en.php | 7 + languages/en/zira.php | 5 + languages/ru/dash.js.php | 28 + languages/ru/dash.php | 354 ++ languages/ru/install.php | 120 + languages/ru/oauth.php | 26 + languages/ru/ru.js.php | 19 + languages/ru/ru.php | 130 + languages/ru/zira.php | 121 + oauth/controllers/login.php | 220 + .../Authentication/AccessToken.php | 160 + .../Authentication/AccessTokenMetadata.php | 390 ++ .../Authentication/OAuth2Client.php | 292 ++ .../FacebookAuthenticationException.php | 33 + .../FacebookAuthorizationException.php | 33 + .../Exceptions/FacebookClientException.php | 33 + .../Exceptions/FacebookOtherException.php | 33 + .../Exceptions/FacebookResponseException.php | 208 + .../Exceptions/FacebookSDKException.php | 33 + .../Exceptions/FacebookServerException.php | 33 + .../Exceptions/FacebookThrottleException.php | 33 + oauth/facebook-sdk-v5/Facebook.php | 589 +++ oauth/facebook-sdk-v5/FacebookApp.php | 101 + .../facebook-sdk-v5/FacebookBatchRequest.php | 303 ++ .../facebook-sdk-v5/FacebookBatchResponse.php | 154 + oauth/facebook-sdk-v5/FacebookClient.php | 250 ++ oauth/facebook-sdk-v5/FacebookRequest.php | 536 +++ oauth/facebook-sdk-v5/FacebookResponse.php | 410 ++ .../FileUpload/FacebookFile.php | 135 + .../FileUpload/FacebookVideo.php | 33 + .../facebook-sdk-v5/FileUpload/Mimetypes.php | 987 +++++ .../facebook-sdk-v5/GraphNodes/Collection.php | 242 ++ .../GraphNodes/GraphAchievement.php | 113 + .../facebook-sdk-v5/GraphNodes/GraphAlbum.php | 183 + .../GraphNodes/GraphApplication.php | 43 + .../GraphNodes/GraphCoverPhoto.php | 72 + .../facebook-sdk-v5/GraphNodes/GraphEdge.php | 260 ++ .../facebook-sdk-v5/GraphNodes/GraphEvent.php | 242 ++ .../facebook-sdk-v5/GraphNodes/GraphGroup.php | 171 + .../facebook-sdk-v5/GraphNodes/GraphList.php | 36 + .../GraphNodes/GraphLocation.php | 102 + .../facebook-sdk-v5/GraphNodes/GraphNode.php | 185 + .../GraphNodes/GraphNodeFactory.php | 392 ++ .../GraphNodes/GraphObject.php | 36 + .../GraphNodes/GraphObjectFactory.php | 86 + .../facebook-sdk-v5/GraphNodes/GraphPage.php | 125 + .../GraphNodes/GraphPicture.php | 72 + .../GraphNodes/GraphSessionInfo.php | 102 + .../facebook-sdk-v5/GraphNodes/GraphUser.php | 162 + .../Helpers/FacebookCanvasHelper.php | 52 + .../Helpers/FacebookJavaScriptHelper.php | 42 + .../Helpers/FacebookPageTabHelper.php | 95 + .../Helpers/FacebookRedirectLoginHelper.php | 360 ++ .../FacebookSignedRequestFromInputHelper.php | 166 + .../facebook-sdk-v5/Http/GraphRawResponse.php | 137 + .../Http/RequestBodyInterface.php | 39 + .../Http/RequestBodyMultipart.php | 170 + .../Http/RequestBodyUrlEncoded.php | 55 + .../HttpClients/FacebookCurl.php | 129 + .../HttpClients/FacebookCurlHttpClient.php | 210 + .../HttpClients/FacebookGuzzleHttpClient.php | 97 + .../FacebookHttpClientInterface.php | 47 + .../HttpClients/FacebookStream.php | 80 + .../HttpClients/FacebookStreamHttpClient.php | 94 + .../certs/DigiCertHighAssuranceEVRootCA.pem | 23 + .../FacebookMemoryPersistentDataHandler.php | 53 + .../FacebookSessionPersistentDataHandler.php | 76 + .../PersistentDataInterface.php | 49 + .../McryptPseudoRandomStringGenerator.php | 68 + .../OpenSslPseudoRandomStringGenerator.php | 67 + .../PseudoRandomStringGeneratorInterface.php | 45 + .../PseudoRandomStringGeneratorTrait.php | 58 + .../UrandomPseudoRandomStringGenerator.php | 89 + oauth/facebook-sdk-v5/SignedRequest.php | 332 ++ .../Url/FacebookUrlDetectionHandler.php | 163 + .../Url/FacebookUrlManipulator.php | 167 + .../Url/UrlDetectionInterface.php | 39 + oauth/facebook-sdk-v5/autoload.php | 79 + oauth/forms/settings.php | 71 + oauth/install/fbuser.php | 48 + oauth/install/vkuser.php | 48 + oauth/models/fbuser.php | 35 + oauth/models/oauth.php | 84 + oauth/models/settings.php | 62 + oauth/models/vkuser.php | 35 + oauth/module.meta | 5 + oauth/oauth.php | 161 + oauth/widgets/buttons.php | 69 + oauth/widgets/fbcomments.php | 37 + oauth/widgets/fbpage.php | 35 + oauth/widgets/vkcomments.php | 35 + oauth/widgets/vkgroup.php | 35 + oauth/windows/settings.php | 48 + robots.src.txt | 4 + themes/bulaksu/assets/css/editor.css | 72 + themes/bulaksu/assets/css/main.css | 1445 +++++++ themes/bulaksu/assets/images/bg-alt.jpg | Bin 0 -> 71851 bytes themes/bulaksu/assets/images/bg.jpg | Bin 0 -> 85276 bytes themes/bulaksu/assets/images/gradient.jpg | Bin 0 -> 776 bytes themes/bulaksu/assets/images/rss.png | Bin 0 -> 597 bytes .../bulaksu/assets/images/share-buttons.jpg | Bin 0 -> 2687 bytes themes/bulaksu/assets/images/up.png | Bin 0 -> 3861 bytes themes/bulaksu/assets/images/zira-loader.gif | Bin 0 -> 743 bytes themes/bulaksu/error.php | 8 + themes/bulaksu/layout-left.php | 42 + themes/bulaksu/layout-right.php | 42 + themes/bulaksu/layout-wide.php | 37 + themes/bulaksu/layout.php | 47 + themes/bulaksu/page.php | 49 + themes/bulaksu/screenshot.jpg | Bin 0 -> 30995 bytes themes/bulaksu/theme.meta | 4 + themes/bulaksu/zira/comments.php | 72 + themes/bulaksu/zira/contact.php | 44 + themes/bulaksu/zira/gallery.php | 10 + themes/bulaksu/zira/google-map.php | 44 + themes/bulaksu/zira/home.php | 50 + themes/bulaksu/zira/list.php | 44 + themes/bulaksu/zira/map.php | 20 + themes/bulaksu/zira/search-results.php | 34 + themes/bulaksu/zira/search.php | 11 + themes/bulaksu/zira/slider.php | 9 + themes/bulaksu/zira/user/conversations.php | 122 + themes/bulaksu/zira/user/menu.php | 27 + themes/bulaksu/zira/user/messages.php | 71 + themes/bulaksu/zira/user/profile.php | 73 + themes/bulaksu/zira/widgets/block.php | 6 + themes/bulaksu/zira/widgets/category.php | 49 + themes/bulaksu/zira/widgets/childmenu.php | 28 + themes/bulaksu/zira/widgets/discussed.php | 42 + themes/bulaksu/zira/widgets/footermenu.php | 29 + themes/bulaksu/zira/widgets/languages.php | 15 + themes/bulaksu/zira/widgets/logo.php | 13 + themes/bulaksu/zira/widgets/rated.php | 42 + themes/bulaksu/zira/widgets/share.php | 9 + themes/bulaksu/zira/widgets/topmenu.php | 38 + themes/bulaksu/zira/xml/rss.php | 33 + themes/bulaksu/zira/xml/sitemap-index.php | 9 + themes/bulaksu/zira/xml/sitemap.php | 12 + themes/bulaksu/zira/yandex-map.php | 53 + themes/default/assets/css/desk.css | 790 ++++ themes/default/assets/css/editor.css | 72 + themes/default/assets/css/main.css | 1497 +++++++ .../default/assets/fonts/Roboto-Regular.ttf | Bin 0 -> 162876 bytes .../default/assets/images/dash-memo-stick.png | Bin 0 -> 60927 bytes themes/default/assets/images/dash-pattern.png | Bin 0 -> 385 bytes .../default/assets/images/dash-wallpaper.png | Bin 0 -> 26139 bytes .../images/dash-window-buttons-slice.png | Bin 0 -> 4196 bytes .../assets/images/dash-window-loader.gif | Bin 0 -> 743 bytes themes/default/assets/images/gradient.jpg | Bin 0 -> 782 bytes themes/default/assets/images/rss.png | Bin 0 -> 597 bytes .../default/assets/images/share-buttons.jpg | Bin 0 -> 2687 bytes themes/default/assets/images/up.png | Bin 0 -> 3861 bytes themes/default/assets/images/zira-loader.gif | Bin 0 -> 743 bytes themes/default/dash/button.php | 1 + themes/default/dash/layout.php | 15 + themes/default/dash/page.php | 38 + themes/default/dash/panel.php | 73 + themes/default/error.php | 8 + themes/default/layout-left.php | 46 + themes/default/layout-right.php | 46 + themes/default/layout-wide.php | 41 + themes/default/layout.php | 51 + themes/default/oauth/fb-comments.php | 7 + themes/default/oauth/fb-login.php | 34 + themes/default/oauth/fb-page.php | 10 + themes/default/oauth/vk-comments.php | 12 + themes/default/oauth/vk-group.php | 22 + themes/default/oauth/vk-login.php | 29 + themes/default/oauth/vk-response.php | 4 + themes/default/page.php | 49 + themes/default/screenshot.jpg | Bin 0 -> 22044 bytes themes/default/theme.meta | 4 + themes/default/zira/comments.php | 72 + themes/default/zira/contact.php | 44 + themes/default/zira/gallery.php | 10 + themes/default/zira/google-map.php | 44 + themes/default/zira/home.php | 50 + themes/default/zira/list.php | 44 + themes/default/zira/map.php | 20 + themes/default/zira/search-results.php | 34 + themes/default/zira/search.php | 11 + themes/default/zira/slider.php | 9 + themes/default/zira/user/conversations.php | 122 + themes/default/zira/user/menu.php | 27 + themes/default/zira/user/messages.php | 71 + themes/default/zira/user/profile.php | 73 + themes/default/zira/widgets/block.php | 6 + themes/default/zira/widgets/category.php | 49 + themes/default/zira/widgets/childmenu.php | 28 + themes/default/zira/widgets/discussed.php | 42 + themes/default/zira/widgets/footermenu.php | 29 + themes/default/zira/widgets/languages.php | 15 + themes/default/zira/widgets/logo.php | 13 + themes/default/zira/widgets/rated.php | 42 + themes/default/zira/widgets/share.php | 9 + themes/default/zira/widgets/topmenu.php | 38 + themes/default/zira/xml/rss.php | 33 + themes/default/zira/xml/sitemap-index.php | 9 + themes/default/zira/xml/sitemap.php | 12 + themes/default/zira/yandex-map.php | 53 + zira.php | 10 + zira/assets.php | 233 ++ zira/cache.php | 88 + zira/category.php | 178 + zira/collection.php | 12 + zira/content/category.php | 159 + zira/content/index.php | 212 + zira/content/page.php | 138 + zira/content/parse.php | 30 + zira/controller.php | 19 + zira/controllers/comments.php | 113 + zira/controllers/contact.php | 111 + zira/controllers/cron.php | 51 + zira/controllers/index.php | 86 + zira/controllers/poll.php | 111 + zira/controllers/records.php | 32 + zira/controllers/search.php | 68 + zira/controllers/user.php | 1024 +++++ zira/controllers/xml.php | 119 + zira/cookie.php | 39 + zira/cron.php | 12 + zira/cron/cleaner.php | 18 + zira/datetime.php | 36 + zira/db/implement/collection.php | 210 + zira/db/implement/db.php | 98 + zira/db/implement/field.php | 68 + zira/db/implement/orm.php | 124 + zira/db/implement/table.php | 63 + zira/db/loader.php | 35 + zira/db/mysql.collection.php | 12 + zira/db/mysql.db.php | 12 + zira/db/mysql.field.php | 12 + zira/db/mysql.orm.php | 12 + zira/db/mysql.table.php | 12 + zira/db/mysql/collection.php | 421 ++ zira/db/mysql/db.php | 94 + zira/db/mysql/field.php | 113 + zira/db/mysql/orm.php | 149 + zira/db/mysql/table.php | 138 + zira/db/sqlite.collection.php | 12 + zira/db/sqlite.db.php | 12 + zira/db/sqlite.field.php | 12 + zira/db/sqlite.orm.php | 12 + zira/db/sqlite.table.php | 12 + zira/db/sqlite/collection.php | 428 ++ zira/db/sqlite/db.php | 88 + zira/db/sqlite/field.php | 93 + zira/db/sqlite/orm.php | 149 + zira/db/sqlite/table.php | 143 + zira/file.php | 86 + zira/form.php | 75 + zira/form/factory.php | 709 ++++ zira/form/form.php | 310 ++ zira/form/validator.php | 454 ++ zira/forms/comment.php | 84 + zira/forms/contact.php | 57 + zira/forms/search.php | 134 + zira/forms/user/avatar.php | 120 + zira/forms/user/compose.php | 148 + zira/forms/user/confirm.php | 69 + zira/forms/user/conversation.php | 54 + zira/forms/user/edit.php | 91 + zira/forms/user/email.php | 72 + zira/forms/user/login.php | 93 + zira/forms/user/message.php | 59 + zira/forms/user/name.php | 59 + zira/forms/user/nophoto.php | 51 + zira/forms/user/password.php | 64 + zira/forms/user/photo.php | 67 + zira/forms/user/pwd.php | 58 + zira/forms/user/recover.php | 57 + zira/forms/user/register.php | 64 + zira/forms/user/send.php | 58 + zira/helper.php | 128 + zira/hook.php | 26 + zira/image.php | 262 ++ zira/install/blacklist.php | 47 + zira/install/block.php | 47 + zira/install/captcha.php | 37 + zira/install/category.php | 60 + zira/install/comment.php | 56 + zira/install/commentlike.php | 48 + zira/install/conversation.php | 50 + zira/install/draft.php | 49 + zira/install/group.php | 60 + zira/install/image.php | 47 + zira/install/like.php | 47 + zira/install/menu.php | 52 + zira/install/message.php | 47 + zira/install/option.php | 34 + zira/install/permission.php | 142 + zira/install/record.php | 63 + zira/install/search.php | 47 + zira/install/slide.php | 47 + zira/install/translate.php | 35 + zira/install/user.php | 63 + zira/install/widget.php | 124 + zira/locale.php | 255 ++ zira/log.php | 78 + zira/mail.php | 65 + zira/menu.php | 275 ++ zira/models/blacklist.php | 36 + zira/models/block.php | 37 + zira/models/captcha.php | 57 + zira/models/category.php | 67 + zira/models/comment.php | 167 + zira/models/commentlike.php | 32 + zira/models/conversation.php | 88 + zira/models/draft.php | 46 + zira/models/group.php | 77 + zira/models/image.php | 34 + zira/models/like.php | 32 + zira/models/menu.php | 45 + zira/models/message.php | 64 + zira/models/option.php | 70 + zira/models/permission.php | 46 + zira/models/record.php | 88 + zira/models/search.php | 180 + zira/models/slide.php | 34 + zira/models/translate.php | 34 + zira/models/user.php | 224 + zira/models/widget.php | 61 + zira/orm.php | 12 + zira/page.php | 335 ++ zira/pagination.php | 228 + zira/permission.php | 75 + zira/phpmailer/phpmailer.php | 3664 +++++++++++++++++ zira/phpmailer/smtp.php | 1110 +++++ zira/request.php | 117 + zira/response.php | 122 + zira/router.php | 215 + zira/session.php | 43 + zira/tpl.php | 87 + zira/user.php | 811 ++++ zira/view.php | 824 ++++ zira/widget.php | 109 + zira/widgets.php | 170 + zira/widgets/block.php | 109 + zira/widgets/category.php | 97 + zira/widgets/childmenu.php | 49 + zira/widgets/discussed.php | 110 + zira/widgets/footermenu.php | 37 + zira/widgets/languages.php | 25 + zira/widgets/logo.php | 36 + zira/widgets/previous.php | 60 + zira/widgets/rated.php | 110 + zira/widgets/share.php | 27 + zira/widgets/topmenu.php | 38 + zira/widgets/usermenu.php | 102 + zira/zira.php | 254 ++ 890 files changed, 74414 insertions(+) create mode 100644 .gitignore create mode 100644 403.html create mode 100644 404.html create mode 100644 README create mode 100644 assets/css/bootstrap-datetimepicker.min.css create mode 100644 assets/css/bootstrap-theme.min.css create mode 100644 assets/css/bootstrap.min.css create mode 100644 assets/css/bxslider.css create mode 100644 assets/css/cropper.css create mode 100644 assets/css/index.php create mode 100644 assets/css/lightbox.css create mode 100644 assets/css/zira.css create mode 100644 assets/fonts/Lobster.ttf create mode 100644 assets/fonts/glyphicons-halflings-regular.eot create mode 100644 assets/fonts/glyphicons-halflings-regular.svg create mode 100644 assets/fonts/glyphicons-halflings-regular.ttf create mode 100644 assets/fonts/glyphicons-halflings-regular.woff create mode 100644 assets/fonts/glyphicons-halflings-regular.woff2 create mode 100644 assets/images/blank.png create mode 100644 assets/images/bx_controls.png create mode 100644 assets/images/bx_loader.gif create mode 100644 assets/images/close.png create mode 100644 assets/images/drag.png create mode 100644 assets/images/emoji/png/1f600.png create mode 100644 assets/images/emoji/png/1f601.png create mode 100644 assets/images/emoji/png/1f602.png create mode 100644 assets/images/emoji/png/1f603.png create mode 100644 assets/images/emoji/png/1f604.png create mode 100644 assets/images/emoji/png/1f605.png create mode 100644 assets/images/emoji/png/1f606.png create mode 100644 assets/images/emoji/png/1f607.png create mode 100644 assets/images/emoji/png/1f608.png create mode 100644 assets/images/emoji/png/1f609.png create mode 100644 assets/images/emoji/png/1f60a.png create mode 100644 assets/images/emoji/png/1f60b.png create mode 100644 assets/images/emoji/png/1f60c.png create mode 100644 assets/images/emoji/png/1f60d.png create mode 100644 assets/images/emoji/png/1f60e.png create mode 100644 assets/images/emoji/png/1f60f.png create mode 100644 assets/images/emoji/png/1f610.png create mode 100644 assets/images/emoji/png/1f611.png create mode 100644 assets/images/emoji/png/1f612.png create mode 100644 assets/images/emoji/png/1f613.png create mode 100644 assets/images/emoji/png/1f614.png create mode 100644 assets/images/emoji/png/1f615.png create mode 100644 assets/images/emoji/png/1f616.png create mode 100644 assets/images/emoji/png/1f617.png create mode 100644 assets/images/emoji/png/1f618.png create mode 100644 assets/images/emoji/png/1f619.png create mode 100644 assets/images/emoji/png/1f61a.png create mode 100644 assets/images/emoji/png/1f61b.png create mode 100644 assets/images/emoji/png/1f61c.png create mode 100644 assets/images/emoji/png/1f61d.png create mode 100644 assets/images/emoji/png/1f61e.png create mode 100644 assets/images/emoji/png/1f61f.png create mode 100644 assets/images/emoji/png/1f620.png create mode 100644 assets/images/emoji/png/1f621.png create mode 100644 assets/images/emoji/png/1f622.png create mode 100644 assets/images/emoji/png/1f623.png create mode 100644 assets/images/emoji/png/1f624.png create mode 100644 assets/images/emoji/png/1f625.png create mode 100644 assets/images/emoji/png/1f626.png create mode 100644 assets/images/emoji/png/1f627.png create mode 100644 assets/images/emoji/png/1f628.png create mode 100644 assets/images/emoji/png/1f629.png create mode 100644 assets/images/emoji/png/1f62a.png create mode 100644 assets/images/emoji/png/1f62b.png create mode 100644 assets/images/emoji/png/1f62c.png create mode 100644 assets/images/emoji/png/1f62d.png create mode 100644 assets/images/emoji/png/1f62e.png create mode 100644 assets/images/emoji/png/1f62f.png create mode 100644 assets/images/emoji/png/1f630.png create mode 100644 assets/images/emoji/png/1f631.png create mode 100644 assets/images/emoji/png/1f632.png create mode 100644 assets/images/emoji/png/1f633.png create mode 100644 assets/images/emoji/png/1f634.png create mode 100644 assets/images/emoji/png/1f635.png create mode 100644 assets/images/emoji/png/1f636.png create mode 100644 assets/images/emoji/png/1f637.png create mode 100644 assets/images/emoji/png/1f638.png create mode 100644 assets/images/emoji/png/1f639.png create mode 100644 assets/images/emoji/png/1f640.png create mode 100644 assets/images/emoji/png/1f641.png create mode 100644 assets/images/emoji/png/1f642.png create mode 100644 assets/images/emoji/png/1f643.png create mode 100644 assets/images/emoji/png/1f644.png create mode 100644 assets/images/emoji/png/1f910.png create mode 100644 assets/images/emoji/png/1f911.png create mode 100644 assets/images/emoji/png/1f912.png create mode 100644 assets/images/emoji/png/1f913.png create mode 100644 assets/images/emoji/png/1f914.png create mode 100644 assets/images/emoji/png/1f915.png create mode 100644 assets/images/emoji/png/1f916.png create mode 100644 assets/images/emoji/png/1f917.png create mode 100755 assets/images/emoji/svg/1f600.svg create mode 100755 assets/images/emoji/svg/1f601.svg create mode 100755 assets/images/emoji/svg/1f602.svg create mode 100755 assets/images/emoji/svg/1f603.svg create mode 100755 assets/images/emoji/svg/1f604.svg create mode 100755 assets/images/emoji/svg/1f605.svg create mode 100755 assets/images/emoji/svg/1f606.svg create mode 100755 assets/images/emoji/svg/1f607.svg create mode 100755 assets/images/emoji/svg/1f608.svg create mode 100755 assets/images/emoji/svg/1f609.svg create mode 100755 assets/images/emoji/svg/1f60a.svg create mode 100755 assets/images/emoji/svg/1f60b.svg create mode 100755 assets/images/emoji/svg/1f60c.svg create mode 100755 assets/images/emoji/svg/1f60d.svg create mode 100755 assets/images/emoji/svg/1f60e.svg create mode 100755 assets/images/emoji/svg/1f60f.svg create mode 100755 assets/images/emoji/svg/1f610.svg create mode 100755 assets/images/emoji/svg/1f611.svg create mode 100755 assets/images/emoji/svg/1f612.svg create mode 100755 assets/images/emoji/svg/1f613.svg create mode 100755 assets/images/emoji/svg/1f614.svg create mode 100755 assets/images/emoji/svg/1f615.svg create mode 100755 assets/images/emoji/svg/1f616.svg create mode 100755 assets/images/emoji/svg/1f617.svg create mode 100755 assets/images/emoji/svg/1f618.svg create mode 100755 assets/images/emoji/svg/1f619.svg create mode 100755 assets/images/emoji/svg/1f61a.svg create mode 100755 assets/images/emoji/svg/1f61b.svg create mode 100755 assets/images/emoji/svg/1f61c.svg create mode 100755 assets/images/emoji/svg/1f61d.svg create mode 100755 assets/images/emoji/svg/1f61e.svg create mode 100755 assets/images/emoji/svg/1f61f.svg create mode 100755 assets/images/emoji/svg/1f620.svg create mode 100755 assets/images/emoji/svg/1f621.svg create mode 100755 assets/images/emoji/svg/1f622.svg create mode 100755 assets/images/emoji/svg/1f623.svg create mode 100755 assets/images/emoji/svg/1f624.svg create mode 100755 assets/images/emoji/svg/1f625.svg create mode 100755 assets/images/emoji/svg/1f626.svg create mode 100755 assets/images/emoji/svg/1f627.svg create mode 100755 assets/images/emoji/svg/1f628.svg create mode 100755 assets/images/emoji/svg/1f629.svg create mode 100755 assets/images/emoji/svg/1f62a.svg create mode 100755 assets/images/emoji/svg/1f62b.svg create mode 100755 assets/images/emoji/svg/1f62c.svg create mode 100755 assets/images/emoji/svg/1f62d.svg create mode 100755 assets/images/emoji/svg/1f62e.svg create mode 100755 assets/images/emoji/svg/1f62f.svg create mode 100755 assets/images/emoji/svg/1f630.svg create mode 100755 assets/images/emoji/svg/1f631.svg create mode 100755 assets/images/emoji/svg/1f632.svg create mode 100755 assets/images/emoji/svg/1f633.svg create mode 100755 assets/images/emoji/svg/1f634.svg create mode 100755 assets/images/emoji/svg/1f635.svg create mode 100755 assets/images/emoji/svg/1f636.svg create mode 100755 assets/images/emoji/svg/1f637.svg create mode 100755 assets/images/emoji/svg/1f638.svg create mode 100755 assets/images/emoji/svg/1f639.svg create mode 100755 assets/images/emoji/svg/1f640.svg create mode 100755 assets/images/emoji/svg/1f641.svg create mode 100755 assets/images/emoji/svg/1f642.svg create mode 100755 assets/images/emoji/svg/1f643.svg create mode 100755 assets/images/emoji/svg/1f644.svg create mode 100755 assets/images/emoji/svg/1f910.svg create mode 100755 assets/images/emoji/svg/1f911.svg create mode 100755 assets/images/emoji/svg/1f912.svg create mode 100755 assets/images/emoji/svg/1f913.svg create mode 100755 assets/images/emoji/svg/1f914.svg create mode 100755 assets/images/emoji/svg/1f915.svg create mode 100755 assets/images/emoji/svg/1f916.svg create mode 100755 assets/images/emoji/svg/1f917.svg create mode 100644 assets/images/loader.gif create mode 100644 assets/images/loading.gif create mode 100644 assets/images/next.png create mode 100644 assets/images/noimage.jpg create mode 100644 assets/images/nophoto.jpg create mode 100644 assets/images/prev.png create mode 100644 assets/images/zira.png create mode 100644 assets/js/autocomplete.js create mode 100644 assets/js/bootstrap-datetimepicker.min.js create mode 100644 assets/js/bootstrap.min.js create mode 100644 assets/js/bxslider.min.js create mode 100644 assets/js/cropper.js create mode 100644 assets/js/dash.js create mode 100644 assets/js/dash/blocks.js create mode 100644 assets/js/dash/cache.js create mode 100644 assets/js/dash/comments.js create mode 100644 assets/js/dash/console.js create mode 100644 assets/js/dash/contacts.js create mode 100644 assets/js/dash/cron.js create mode 100644 assets/js/dash/editor.js create mode 100644 assets/js/dash/files.js create mode 100644 assets/js/dash/groups.js create mode 100644 assets/js/dash/html.js create mode 100644 assets/js/dash/image.js create mode 100644 assets/js/dash/languages.js create mode 100644 assets/js/dash/logs.js create mode 100644 assets/js/dash/mailing.js create mode 100644 assets/js/dash/menu.js create mode 100644 assets/js/dash/meta.js create mode 100644 assets/js/dash/modules.js create mode 100644 assets/js/dash/options.js create mode 100644 assets/js/dash/recordhtml.js create mode 100644 assets/js/dash/recordimages.js create mode 100644 assets/js/dash/records.js create mode 100644 assets/js/dash/recordslides.js create mode 100644 assets/js/dash/recordtext.js create mode 100644 assets/js/dash/selector.js create mode 100644 assets/js/dash/system.js create mode 100644 assets/js/dash/text.js create mode 100644 assets/js/dash/themes.js create mode 100644 assets/js/dash/translates.js create mode 100644 assets/js/dash/user.js create mode 100644 assets/js/dash/users.js create mode 100644 assets/js/dash/web.js create mode 100644 assets/js/dash/widgets.js create mode 100644 assets/js/desk-window.js create mode 100644 assets/js/desk-wrapper.js create mode 100644 assets/js/desk.js create mode 100644 assets/js/highlight/LICENSE create mode 100644 assets/js/highlight/highlight.pack.js create mode 100644 assets/js/highlight/styles/agate.css create mode 100644 assets/js/highlight/styles/androidstudio.css create mode 100644 assets/js/highlight/styles/arduino-light.css create mode 100644 assets/js/highlight/styles/arta.css create mode 100644 assets/js/highlight/styles/ascetic.css create mode 100644 assets/js/highlight/styles/atelier-cave-dark.css create mode 100644 assets/js/highlight/styles/atelier-cave-light.css create mode 100644 assets/js/highlight/styles/atelier-dune-dark.css create mode 100644 assets/js/highlight/styles/atelier-dune-light.css create mode 100644 assets/js/highlight/styles/atelier-estuary-dark.css create mode 100644 assets/js/highlight/styles/atelier-estuary-light.css create mode 100644 assets/js/highlight/styles/atelier-forest-dark.css create mode 100644 assets/js/highlight/styles/atelier-forest-light.css create mode 100644 assets/js/highlight/styles/atelier-heath-dark.css create mode 100644 assets/js/highlight/styles/atelier-heath-light.css create mode 100644 assets/js/highlight/styles/atelier-lakeside-dark.css create mode 100644 assets/js/highlight/styles/atelier-lakeside-light.css create mode 100644 assets/js/highlight/styles/atelier-plateau-dark.css create mode 100644 assets/js/highlight/styles/atelier-plateau-light.css create mode 100644 assets/js/highlight/styles/atelier-savanna-dark.css create mode 100644 assets/js/highlight/styles/atelier-savanna-light.css create mode 100644 assets/js/highlight/styles/atelier-seaside-dark.css create mode 100644 assets/js/highlight/styles/atelier-seaside-light.css create mode 100644 assets/js/highlight/styles/atelier-sulphurpool-dark.css create mode 100644 assets/js/highlight/styles/atelier-sulphurpool-light.css create mode 100644 assets/js/highlight/styles/brown-paper.css create mode 100644 assets/js/highlight/styles/brown-papersq.png create mode 100644 assets/js/highlight/styles/codepen-embed.css create mode 100644 assets/js/highlight/styles/color-brewer.css create mode 100644 assets/js/highlight/styles/dark.css create mode 100644 assets/js/highlight/styles/darkula.css create mode 100644 assets/js/highlight/styles/default.css create mode 100644 assets/js/highlight/styles/docco.css create mode 100644 assets/js/highlight/styles/dracula.css create mode 100644 assets/js/highlight/styles/far.css create mode 100644 assets/js/highlight/styles/foundation.css create mode 100644 assets/js/highlight/styles/github-gist.css create mode 100644 assets/js/highlight/styles/github.css create mode 100644 assets/js/highlight/styles/googlecode.css create mode 100644 assets/js/highlight/styles/grayscale.css create mode 100644 assets/js/highlight/styles/gruvbox-dark.css create mode 100644 assets/js/highlight/styles/gruvbox-light.css create mode 100644 assets/js/highlight/styles/hopscotch.css create mode 100644 assets/js/highlight/styles/hybrid.css create mode 100644 assets/js/highlight/styles/idea.css create mode 100644 assets/js/highlight/styles/ir-black.css create mode 100644 assets/js/highlight/styles/kimbie.dark.css create mode 100644 assets/js/highlight/styles/kimbie.light.css create mode 100644 assets/js/highlight/styles/magula.css create mode 100644 assets/js/highlight/styles/mono-blue.css create mode 100644 assets/js/highlight/styles/monokai-sublime.css create mode 100644 assets/js/highlight/styles/monokai.css create mode 100644 assets/js/highlight/styles/obsidian.css create mode 100644 assets/js/highlight/styles/paraiso-dark.css create mode 100644 assets/js/highlight/styles/paraiso-light.css create mode 100644 assets/js/highlight/styles/pojoaque.css create mode 100644 assets/js/highlight/styles/pojoaque.jpg create mode 100644 assets/js/highlight/styles/qtcreator_dark.css create mode 100644 assets/js/highlight/styles/qtcreator_light.css create mode 100644 assets/js/highlight/styles/railscasts.css create mode 100644 assets/js/highlight/styles/rainbow.css create mode 100644 assets/js/highlight/styles/school-book.css create mode 100644 assets/js/highlight/styles/school-book.png create mode 100644 assets/js/highlight/styles/solarized-dark.css create mode 100644 assets/js/highlight/styles/solarized-light.css create mode 100644 assets/js/highlight/styles/sunburst.css create mode 100644 assets/js/highlight/styles/tomorrow-night-blue.css create mode 100644 assets/js/highlight/styles/tomorrow-night-bright.css create mode 100644 assets/js/highlight/styles/tomorrow-night-eighties.css create mode 100644 assets/js/highlight/styles/tomorrow-night.css create mode 100644 assets/js/highlight/styles/tomorrow.css create mode 100644 assets/js/highlight/styles/vs.css create mode 100644 assets/js/highlight/styles/xcode.css create mode 100644 assets/js/highlight/styles/xt256.css create mode 100644 assets/js/highlight/styles/zenburn.css create mode 100644 assets/js/html5shiv.min.js create mode 100644 assets/js/index.php create mode 100644 assets/js/jquery.min.js create mode 100644 assets/js/lightbox.min.js create mode 100644 assets/js/md5.js create mode 100644 assets/js/moment-locale-ru.js create mode 100644 assets/js/moment.min.js create mode 100644 assets/js/parse.js create mode 100644 assets/js/respond.min.js create mode 100644 assets/js/tinymce/index.php create mode 100644 assets/js/tinymce/langs/readme.md create mode 100644 assets/js/tinymce/langs/ru.js create mode 100644 assets/js/tinymce/license.txt create mode 100644 assets/js/tinymce/plugins/advlist/plugin.min.js create mode 100644 assets/js/tinymce/plugins/anchor/plugin.min.js create mode 100644 assets/js/tinymce/plugins/autolink/plugin.min.js create mode 100644 assets/js/tinymce/plugins/autoresize/plugin.min.js create mode 100644 assets/js/tinymce/plugins/autosave/plugin.min.js create mode 100644 assets/js/tinymce/plugins/bbcode/plugin.min.js create mode 100644 assets/js/tinymce/plugins/charmap/plugin.min.js create mode 100644 assets/js/tinymce/plugins/code/plugin.min.js create mode 100644 assets/js/tinymce/plugins/codesample/css/prism.css create mode 100644 assets/js/tinymce/plugins/codesample/plugin.min.js create mode 100644 assets/js/tinymce/plugins/colorpicker/plugin.min.js create mode 100644 assets/js/tinymce/plugins/contextmenu/plugin.min.js create mode 100644 assets/js/tinymce/plugins/directionality/plugin.min.js create mode 100644 assets/js/tinymce/plugins/emoticons/img/smiley-cool.gif create mode 100644 assets/js/tinymce/plugins/emoticons/img/smiley-cry.gif create mode 100644 assets/js/tinymce/plugins/emoticons/img/smiley-embarassed.gif create mode 100644 assets/js/tinymce/plugins/emoticons/img/smiley-foot-in-mouth.gif create mode 100644 assets/js/tinymce/plugins/emoticons/img/smiley-frown.gif create mode 100644 assets/js/tinymce/plugins/emoticons/img/smiley-innocent.gif create mode 100644 assets/js/tinymce/plugins/emoticons/img/smiley-kiss.gif create mode 100644 assets/js/tinymce/plugins/emoticons/img/smiley-laughing.gif create mode 100644 assets/js/tinymce/plugins/emoticons/img/smiley-money-mouth.gif create mode 100644 assets/js/tinymce/plugins/emoticons/img/smiley-sealed.gif create mode 100644 assets/js/tinymce/plugins/emoticons/img/smiley-smile.gif create mode 100644 assets/js/tinymce/plugins/emoticons/img/smiley-surprised.gif create mode 100644 assets/js/tinymce/plugins/emoticons/img/smiley-tongue-out.gif create mode 100644 assets/js/tinymce/plugins/emoticons/img/smiley-undecided.gif create mode 100644 assets/js/tinymce/plugins/emoticons/img/smiley-wink.gif create mode 100644 assets/js/tinymce/plugins/emoticons/img/smiley-yell.gif create mode 100644 assets/js/tinymce/plugins/emoticons/plugin.min.js create mode 100644 assets/js/tinymce/plugins/example/dialog.html create mode 100644 assets/js/tinymce/plugins/example/plugin.min.js create mode 100644 assets/js/tinymce/plugins/example_dependency/plugin.min.js create mode 100644 assets/js/tinymce/plugins/fullpage/plugin.min.js create mode 100644 assets/js/tinymce/plugins/fullscreen/plugin.min.js create mode 100644 assets/js/tinymce/plugins/hr/plugin.min.js create mode 100644 assets/js/tinymce/plugins/image/plugin.min.js create mode 100644 assets/js/tinymce/plugins/imagetools/plugin.min.js create mode 100644 assets/js/tinymce/plugins/importcss/plugin.min.js create mode 100644 assets/js/tinymce/plugins/insertdatetime/plugin.min.js create mode 100644 assets/js/tinymce/plugins/layer/plugin.min.js create mode 100644 assets/js/tinymce/plugins/legacyoutput/plugin.min.js create mode 100644 assets/js/tinymce/plugins/link/plugin.min.js create mode 100644 assets/js/tinymce/plugins/lists/plugin.min.js create mode 100644 assets/js/tinymce/plugins/media/moxieplayer.swf create mode 100644 assets/js/tinymce/plugins/media/plugin.min.js create mode 100644 assets/js/tinymce/plugins/nonbreaking/plugin.min.js create mode 100644 assets/js/tinymce/plugins/noneditable/plugin.min.js create mode 100644 assets/js/tinymce/plugins/pagebreak/plugin.min.js create mode 100644 assets/js/tinymce/plugins/paste/plugin.min.js create mode 100644 assets/js/tinymce/plugins/preview/plugin.min.js create mode 100644 assets/js/tinymce/plugins/print/plugin.min.js create mode 100644 assets/js/tinymce/plugins/save/plugin.min.js create mode 100644 assets/js/tinymce/plugins/searchreplace/plugin.min.js create mode 100644 assets/js/tinymce/plugins/spellchecker/plugin.min.js create mode 100644 assets/js/tinymce/plugins/tabfocus/plugin.min.js create mode 100644 assets/js/tinymce/plugins/table/plugin.min.js create mode 100644 assets/js/tinymce/plugins/template/plugin.min.js create mode 100644 assets/js/tinymce/plugins/textcolor/plugin.min.js create mode 100644 assets/js/tinymce/plugins/textpattern/plugin.min.js create mode 100644 assets/js/tinymce/plugins/visualblocks/css/visualblocks.css create mode 100644 assets/js/tinymce/plugins/visualblocks/plugin.min.js create mode 100644 assets/js/tinymce/plugins/visualchars/plugin.min.js create mode 100644 assets/js/tinymce/plugins/wordcount/plugin.min.js create mode 100644 assets/js/tinymce/skins/lightgray/content.inline.min.css create mode 100644 assets/js/tinymce/skins/lightgray/content.min.css create mode 100644 assets/js/tinymce/skins/lightgray/fonts/tinymce-small.eot create mode 100644 assets/js/tinymce/skins/lightgray/fonts/tinymce-small.svg create mode 100644 assets/js/tinymce/skins/lightgray/fonts/tinymce-small.ttf create mode 100644 assets/js/tinymce/skins/lightgray/fonts/tinymce-small.woff create mode 100644 assets/js/tinymce/skins/lightgray/fonts/tinymce.eot create mode 100644 assets/js/tinymce/skins/lightgray/fonts/tinymce.svg create mode 100644 assets/js/tinymce/skins/lightgray/fonts/tinymce.ttf create mode 100644 assets/js/tinymce/skins/lightgray/fonts/tinymce.woff create mode 100644 assets/js/tinymce/skins/lightgray/img/anchor.gif create mode 100644 assets/js/tinymce/skins/lightgray/img/loader.gif create mode 100644 assets/js/tinymce/skins/lightgray/img/object.gif create mode 100644 assets/js/tinymce/skins/lightgray/img/trans.gif create mode 100644 assets/js/tinymce/skins/lightgray/skin.ie7.min.css create mode 100644 assets/js/tinymce/skins/lightgray/skin.min.css create mode 100644 assets/js/tinymce/themes/modern/theme.min.js create mode 100644 assets/js/tinymce/tinymce.gzip.js create mode 100644 assets/js/tinymce/tinymce.min.js create mode 100755 assets/js/upload.inc.js create mode 100755 assets/js/upload.js create mode 100644 assets/js/zira.js create mode 100644 config.src.php create mode 100644 const.php create mode 100644 dash/controller.php create mode 100644 dash/controllers/comments.php create mode 100644 dash/controllers/files.php create mode 100644 dash/controllers/groups.php create mode 100644 dash/controllers/image.php create mode 100644 dash/controllers/index.php create mode 100644 dash/controllers/languages.php create mode 100644 dash/controllers/menu.php create mode 100644 dash/controllers/records.php create mode 100644 dash/controllers/system.php create mode 100644 dash/controllers/users.php create mode 100644 dash/controllers/widgets.php create mode 100644 dash/dash.php create mode 100644 dash/forms/block.php create mode 100644 dash/forms/category.php create mode 100644 dash/forms/categorymeta.php create mode 100644 dash/forms/categorysettings.php create mode 100644 dash/forms/commentsettings.php create mode 100644 dash/forms/contacts.php create mode 100644 dash/forms/home.php create mode 100644 dash/forms/mailing.php create mode 100644 dash/forms/mailsettings.php create mode 100644 dash/forms/menuitem.php create mode 100644 dash/forms/meta.php create mode 100644 dash/forms/options.php create mode 100644 dash/forms/permissions.php create mode 100644 dash/forms/record.php create mode 100644 dash/forms/recordmeta.php create mode 100644 dash/forms/recordsettings.php create mode 100644 dash/forms/upload.php create mode 100644 dash/forms/user.php create mode 100644 dash/forms/usersettings.php create mode 100644 dash/forms/widget.php create mode 100644 dash/models/block.php create mode 100644 dash/models/blockhtml.php create mode 100644 dash/models/blocks.php create mode 100644 dash/models/blocktext.php create mode 100644 dash/models/cache.php create mode 100644 dash/models/category.php create mode 100644 dash/models/categorymeta.php create mode 100644 dash/models/categorysettings.php create mode 100644 dash/models/comments.php create mode 100644 dash/models/commentsettings.php create mode 100644 dash/models/console.php create mode 100644 dash/models/contacts.php create mode 100644 dash/models/files.php create mode 100644 dash/models/groups.php create mode 100644 dash/models/home.php create mode 100644 dash/models/html.php create mode 100644 dash/models/image.php create mode 100644 dash/models/languages.php create mode 100644 dash/models/logs.php create mode 100644 dash/models/mailing.php create mode 100644 dash/models/mailsettings.php create mode 100644 dash/models/menu.php create mode 100644 dash/models/menuitem.php create mode 100644 dash/models/meta.php create mode 100644 dash/models/model.php create mode 100644 dash/models/modules.php create mode 100644 dash/models/options.php create mode 100644 dash/models/permissions.php create mode 100644 dash/models/record.php create mode 100644 dash/models/recordhtml.php create mode 100644 dash/models/recordimages.php create mode 100644 dash/models/recordmeta.php create mode 100644 dash/models/records.php create mode 100644 dash/models/recordsettings.php create mode 100644 dash/models/recordslides.php create mode 100644 dash/models/recordtext.php create mode 100644 dash/models/selector.php create mode 100644 dash/models/system.php create mode 100644 dash/models/text.php create mode 100644 dash/models/themes.php create mode 100644 dash/models/translates.php create mode 100644 dash/models/user.php create mode 100644 dash/models/users.php create mode 100644 dash/models/usersettings.php create mode 100644 dash/models/widget.php create mode 100644 dash/models/widgets.php create mode 100644 dash/widgets/button.php create mode 100644 dash/widgets/panel.php create mode 100644 dash/windows/block.php create mode 100644 dash/windows/blockhtml.php create mode 100644 dash/windows/blocks.php create mode 100644 dash/windows/blocktext.php create mode 100644 dash/windows/cache.php create mode 100644 dash/windows/category.php create mode 100644 dash/windows/categorymeta.php create mode 100644 dash/windows/categorysettings.php create mode 100644 dash/windows/comments.php create mode 100644 dash/windows/commentsettings.php create mode 100644 dash/windows/console.php create mode 100644 dash/windows/contacts.php create mode 100644 dash/windows/cron.php create mode 100644 dash/windows/editor.php create mode 100644 dash/windows/files.php create mode 100644 dash/windows/groups.php create mode 100644 dash/windows/home.php create mode 100644 dash/windows/html.php create mode 100644 dash/windows/image.php create mode 100644 dash/windows/languages.php create mode 100644 dash/windows/logs.php create mode 100644 dash/windows/mailing.php create mode 100644 dash/windows/mailsettings.php create mode 100644 dash/windows/menu.php create mode 100644 dash/windows/menuitem.php create mode 100644 dash/windows/meta.php create mode 100644 dash/windows/modules.php create mode 100644 dash/windows/options.php create mode 100644 dash/windows/permissions.php create mode 100644 dash/windows/record.php create mode 100644 dash/windows/recordhtml.php create mode 100644 dash/windows/recordimages.php create mode 100644 dash/windows/recordmeta.php create mode 100644 dash/windows/records.php create mode 100644 dash/windows/recordsettings.php create mode 100644 dash/windows/recordslides.php create mode 100644 dash/windows/recordtext.php create mode 100644 dash/windows/selector.php create mode 100644 dash/windows/system.php create mode 100644 dash/windows/text.php create mode 100644 dash/windows/themes.php create mode 100644 dash/windows/translates.php create mode 100644 dash/windows/user.php create mode 100644 dash/windows/users.php create mode 100644 dash/windows/usersettings.php create mode 100644 dash/windows/web.php create mode 100644 dash/windows/widget.php create mode 100644 dash/windows/widgets.php create mode 100644 dash/windows/window.php create mode 100644 favicon.ico create mode 100644 htaccess.txt create mode 100644 index.php create mode 100644 install/check/index.php create mode 100644 install/configuration.php create mode 100644 install/credentials.php create mode 100644 install/default.php create mode 100644 install/environment.php create mode 100644 install/forms/configuration.php create mode 100644 install/forms/credentials.php create mode 100644 install/index.php create mode 100644 install/layout.php create mode 100644 install/license.php create mode 100644 install/operate.php create mode 100644 install/process.php create mode 100644 key.pub create mode 100644 languages/en/dash.js.php create mode 100644 languages/en/dash.php create mode 100644 languages/en/en.js.php create mode 100644 languages/en/en.php create mode 100644 languages/en/zira.php create mode 100644 languages/ru/dash.js.php create mode 100644 languages/ru/dash.php create mode 100644 languages/ru/install.php create mode 100644 languages/ru/oauth.php create mode 100644 languages/ru/ru.js.php create mode 100644 languages/ru/ru.php create mode 100644 languages/ru/zira.php create mode 100644 oauth/controllers/login.php create mode 100644 oauth/facebook-sdk-v5/Authentication/AccessToken.php create mode 100644 oauth/facebook-sdk-v5/Authentication/AccessTokenMetadata.php create mode 100644 oauth/facebook-sdk-v5/Authentication/OAuth2Client.php create mode 100644 oauth/facebook-sdk-v5/Exceptions/FacebookAuthenticationException.php create mode 100644 oauth/facebook-sdk-v5/Exceptions/FacebookAuthorizationException.php create mode 100644 oauth/facebook-sdk-v5/Exceptions/FacebookClientException.php create mode 100644 oauth/facebook-sdk-v5/Exceptions/FacebookOtherException.php create mode 100644 oauth/facebook-sdk-v5/Exceptions/FacebookResponseException.php create mode 100644 oauth/facebook-sdk-v5/Exceptions/FacebookSDKException.php create mode 100644 oauth/facebook-sdk-v5/Exceptions/FacebookServerException.php create mode 100644 oauth/facebook-sdk-v5/Exceptions/FacebookThrottleException.php create mode 100644 oauth/facebook-sdk-v5/Facebook.php create mode 100644 oauth/facebook-sdk-v5/FacebookApp.php create mode 100644 oauth/facebook-sdk-v5/FacebookBatchRequest.php create mode 100644 oauth/facebook-sdk-v5/FacebookBatchResponse.php create mode 100644 oauth/facebook-sdk-v5/FacebookClient.php create mode 100644 oauth/facebook-sdk-v5/FacebookRequest.php create mode 100644 oauth/facebook-sdk-v5/FacebookResponse.php create mode 100644 oauth/facebook-sdk-v5/FileUpload/FacebookFile.php create mode 100644 oauth/facebook-sdk-v5/FileUpload/FacebookVideo.php create mode 100644 oauth/facebook-sdk-v5/FileUpload/Mimetypes.php create mode 100644 oauth/facebook-sdk-v5/GraphNodes/Collection.php create mode 100644 oauth/facebook-sdk-v5/GraphNodes/GraphAchievement.php create mode 100644 oauth/facebook-sdk-v5/GraphNodes/GraphAlbum.php create mode 100644 oauth/facebook-sdk-v5/GraphNodes/GraphApplication.php create mode 100644 oauth/facebook-sdk-v5/GraphNodes/GraphCoverPhoto.php create mode 100644 oauth/facebook-sdk-v5/GraphNodes/GraphEdge.php create mode 100644 oauth/facebook-sdk-v5/GraphNodes/GraphEvent.php create mode 100644 oauth/facebook-sdk-v5/GraphNodes/GraphGroup.php create mode 100644 oauth/facebook-sdk-v5/GraphNodes/GraphList.php create mode 100644 oauth/facebook-sdk-v5/GraphNodes/GraphLocation.php create mode 100644 oauth/facebook-sdk-v5/GraphNodes/GraphNode.php create mode 100644 oauth/facebook-sdk-v5/GraphNodes/GraphNodeFactory.php create mode 100644 oauth/facebook-sdk-v5/GraphNodes/GraphObject.php create mode 100644 oauth/facebook-sdk-v5/GraphNodes/GraphObjectFactory.php create mode 100644 oauth/facebook-sdk-v5/GraphNodes/GraphPage.php create mode 100644 oauth/facebook-sdk-v5/GraphNodes/GraphPicture.php create mode 100644 oauth/facebook-sdk-v5/GraphNodes/GraphSessionInfo.php create mode 100644 oauth/facebook-sdk-v5/GraphNodes/GraphUser.php create mode 100644 oauth/facebook-sdk-v5/Helpers/FacebookCanvasHelper.php create mode 100644 oauth/facebook-sdk-v5/Helpers/FacebookJavaScriptHelper.php create mode 100644 oauth/facebook-sdk-v5/Helpers/FacebookPageTabHelper.php create mode 100644 oauth/facebook-sdk-v5/Helpers/FacebookRedirectLoginHelper.php create mode 100644 oauth/facebook-sdk-v5/Helpers/FacebookSignedRequestFromInputHelper.php create mode 100644 oauth/facebook-sdk-v5/Http/GraphRawResponse.php create mode 100644 oauth/facebook-sdk-v5/Http/RequestBodyInterface.php create mode 100644 oauth/facebook-sdk-v5/Http/RequestBodyMultipart.php create mode 100644 oauth/facebook-sdk-v5/Http/RequestBodyUrlEncoded.php create mode 100644 oauth/facebook-sdk-v5/HttpClients/FacebookCurl.php create mode 100644 oauth/facebook-sdk-v5/HttpClients/FacebookCurlHttpClient.php create mode 100644 oauth/facebook-sdk-v5/HttpClients/FacebookGuzzleHttpClient.php create mode 100644 oauth/facebook-sdk-v5/HttpClients/FacebookHttpClientInterface.php create mode 100644 oauth/facebook-sdk-v5/HttpClients/FacebookStream.php create mode 100644 oauth/facebook-sdk-v5/HttpClients/FacebookStreamHttpClient.php create mode 100644 oauth/facebook-sdk-v5/HttpClients/certs/DigiCertHighAssuranceEVRootCA.pem create mode 100644 oauth/facebook-sdk-v5/PersistentData/FacebookMemoryPersistentDataHandler.php create mode 100644 oauth/facebook-sdk-v5/PersistentData/FacebookSessionPersistentDataHandler.php create mode 100644 oauth/facebook-sdk-v5/PersistentData/PersistentDataInterface.php create mode 100644 oauth/facebook-sdk-v5/PseudoRandomString/McryptPseudoRandomStringGenerator.php create mode 100644 oauth/facebook-sdk-v5/PseudoRandomString/OpenSslPseudoRandomStringGenerator.php create mode 100644 oauth/facebook-sdk-v5/PseudoRandomString/PseudoRandomStringGeneratorInterface.php create mode 100644 oauth/facebook-sdk-v5/PseudoRandomString/PseudoRandomStringGeneratorTrait.php create mode 100644 oauth/facebook-sdk-v5/PseudoRandomString/UrandomPseudoRandomStringGenerator.php create mode 100644 oauth/facebook-sdk-v5/SignedRequest.php create mode 100644 oauth/facebook-sdk-v5/Url/FacebookUrlDetectionHandler.php create mode 100644 oauth/facebook-sdk-v5/Url/FacebookUrlManipulator.php create mode 100644 oauth/facebook-sdk-v5/Url/UrlDetectionInterface.php create mode 100644 oauth/facebook-sdk-v5/autoload.php create mode 100644 oauth/forms/settings.php create mode 100644 oauth/install/fbuser.php create mode 100644 oauth/install/vkuser.php create mode 100644 oauth/models/fbuser.php create mode 100644 oauth/models/oauth.php create mode 100644 oauth/models/settings.php create mode 100644 oauth/models/vkuser.php create mode 100644 oauth/module.meta create mode 100644 oauth/oauth.php create mode 100644 oauth/widgets/buttons.php create mode 100644 oauth/widgets/fbcomments.php create mode 100644 oauth/widgets/fbpage.php create mode 100644 oauth/widgets/vkcomments.php create mode 100644 oauth/widgets/vkgroup.php create mode 100644 oauth/windows/settings.php create mode 100644 robots.src.txt create mode 100644 themes/bulaksu/assets/css/editor.css create mode 100644 themes/bulaksu/assets/css/main.css create mode 100644 themes/bulaksu/assets/images/bg-alt.jpg create mode 100644 themes/bulaksu/assets/images/bg.jpg create mode 100644 themes/bulaksu/assets/images/gradient.jpg create mode 100644 themes/bulaksu/assets/images/rss.png create mode 100644 themes/bulaksu/assets/images/share-buttons.jpg create mode 100644 themes/bulaksu/assets/images/up.png create mode 100644 themes/bulaksu/assets/images/zira-loader.gif create mode 100644 themes/bulaksu/error.php create mode 100644 themes/bulaksu/layout-left.php create mode 100644 themes/bulaksu/layout-right.php create mode 100644 themes/bulaksu/layout-wide.php create mode 100644 themes/bulaksu/layout.php create mode 100644 themes/bulaksu/page.php create mode 100644 themes/bulaksu/screenshot.jpg create mode 100644 themes/bulaksu/theme.meta create mode 100644 themes/bulaksu/zira/comments.php create mode 100644 themes/bulaksu/zira/contact.php create mode 100644 themes/bulaksu/zira/gallery.php create mode 100644 themes/bulaksu/zira/google-map.php create mode 100644 themes/bulaksu/zira/home.php create mode 100644 themes/bulaksu/zira/list.php create mode 100644 themes/bulaksu/zira/map.php create mode 100644 themes/bulaksu/zira/search-results.php create mode 100644 themes/bulaksu/zira/search.php create mode 100644 themes/bulaksu/zira/slider.php create mode 100644 themes/bulaksu/zira/user/conversations.php create mode 100644 themes/bulaksu/zira/user/menu.php create mode 100644 themes/bulaksu/zira/user/messages.php create mode 100644 themes/bulaksu/zira/user/profile.php create mode 100644 themes/bulaksu/zira/widgets/block.php create mode 100644 themes/bulaksu/zira/widgets/category.php create mode 100644 themes/bulaksu/zira/widgets/childmenu.php create mode 100644 themes/bulaksu/zira/widgets/discussed.php create mode 100644 themes/bulaksu/zira/widgets/footermenu.php create mode 100644 themes/bulaksu/zira/widgets/languages.php create mode 100644 themes/bulaksu/zira/widgets/logo.php create mode 100644 themes/bulaksu/zira/widgets/rated.php create mode 100644 themes/bulaksu/zira/widgets/share.php create mode 100644 themes/bulaksu/zira/widgets/topmenu.php create mode 100644 themes/bulaksu/zira/xml/rss.php create mode 100644 themes/bulaksu/zira/xml/sitemap-index.php create mode 100644 themes/bulaksu/zira/xml/sitemap.php create mode 100644 themes/bulaksu/zira/yandex-map.php create mode 100644 themes/default/assets/css/desk.css create mode 100644 themes/default/assets/css/editor.css create mode 100644 themes/default/assets/css/main.css create mode 100644 themes/default/assets/fonts/Roboto-Regular.ttf create mode 100644 themes/default/assets/images/dash-memo-stick.png create mode 100644 themes/default/assets/images/dash-pattern.png create mode 100644 themes/default/assets/images/dash-wallpaper.png create mode 100644 themes/default/assets/images/dash-window-buttons-slice.png create mode 100644 themes/default/assets/images/dash-window-loader.gif create mode 100644 themes/default/assets/images/gradient.jpg create mode 100644 themes/default/assets/images/rss.png create mode 100644 themes/default/assets/images/share-buttons.jpg create mode 100644 themes/default/assets/images/up.png create mode 100644 themes/default/assets/images/zira-loader.gif create mode 100644 themes/default/dash/button.php create mode 100644 themes/default/dash/layout.php create mode 100644 themes/default/dash/page.php create mode 100644 themes/default/dash/panel.php create mode 100644 themes/default/error.php create mode 100644 themes/default/layout-left.php create mode 100644 themes/default/layout-right.php create mode 100644 themes/default/layout-wide.php create mode 100644 themes/default/layout.php create mode 100644 themes/default/oauth/fb-comments.php create mode 100644 themes/default/oauth/fb-login.php create mode 100644 themes/default/oauth/fb-page.php create mode 100644 themes/default/oauth/vk-comments.php create mode 100644 themes/default/oauth/vk-group.php create mode 100644 themes/default/oauth/vk-login.php create mode 100644 themes/default/oauth/vk-response.php create mode 100644 themes/default/page.php create mode 100644 themes/default/screenshot.jpg create mode 100644 themes/default/theme.meta create mode 100644 themes/default/zira/comments.php create mode 100644 themes/default/zira/contact.php create mode 100644 themes/default/zira/gallery.php create mode 100644 themes/default/zira/google-map.php create mode 100644 themes/default/zira/home.php create mode 100644 themes/default/zira/list.php create mode 100644 themes/default/zira/map.php create mode 100644 themes/default/zira/search-results.php create mode 100644 themes/default/zira/search.php create mode 100644 themes/default/zira/slider.php create mode 100644 themes/default/zira/user/conversations.php create mode 100644 themes/default/zira/user/menu.php create mode 100644 themes/default/zira/user/messages.php create mode 100644 themes/default/zira/user/profile.php create mode 100644 themes/default/zira/widgets/block.php create mode 100644 themes/default/zira/widgets/category.php create mode 100644 themes/default/zira/widgets/childmenu.php create mode 100644 themes/default/zira/widgets/discussed.php create mode 100644 themes/default/zira/widgets/footermenu.php create mode 100644 themes/default/zira/widgets/languages.php create mode 100644 themes/default/zira/widgets/logo.php create mode 100644 themes/default/zira/widgets/rated.php create mode 100644 themes/default/zira/widgets/share.php create mode 100644 themes/default/zira/widgets/topmenu.php create mode 100644 themes/default/zira/xml/rss.php create mode 100644 themes/default/zira/xml/sitemap-index.php create mode 100644 themes/default/zira/xml/sitemap.php create mode 100644 themes/default/zira/yandex-map.php create mode 100644 zira.php create mode 100644 zira/assets.php create mode 100644 zira/cache.php create mode 100644 zira/category.php create mode 100644 zira/collection.php create mode 100644 zira/content/category.php create mode 100644 zira/content/index.php create mode 100644 zira/content/page.php create mode 100644 zira/content/parse.php create mode 100644 zira/controller.php create mode 100644 zira/controllers/comments.php create mode 100644 zira/controllers/contact.php create mode 100644 zira/controllers/cron.php create mode 100644 zira/controllers/index.php create mode 100644 zira/controllers/poll.php create mode 100644 zira/controllers/records.php create mode 100644 zira/controllers/search.php create mode 100644 zira/controllers/user.php create mode 100644 zira/controllers/xml.php create mode 100644 zira/cookie.php create mode 100644 zira/cron.php create mode 100644 zira/cron/cleaner.php create mode 100644 zira/datetime.php create mode 100644 zira/db/implement/collection.php create mode 100644 zira/db/implement/db.php create mode 100644 zira/db/implement/field.php create mode 100644 zira/db/implement/orm.php create mode 100644 zira/db/implement/table.php create mode 100644 zira/db/loader.php create mode 100644 zira/db/mysql.collection.php create mode 100644 zira/db/mysql.db.php create mode 100644 zira/db/mysql.field.php create mode 100644 zira/db/mysql.orm.php create mode 100644 zira/db/mysql.table.php create mode 100644 zira/db/mysql/collection.php create mode 100644 zira/db/mysql/db.php create mode 100644 zira/db/mysql/field.php create mode 100644 zira/db/mysql/orm.php create mode 100644 zira/db/mysql/table.php create mode 100644 zira/db/sqlite.collection.php create mode 100644 zira/db/sqlite.db.php create mode 100644 zira/db/sqlite.field.php create mode 100644 zira/db/sqlite.orm.php create mode 100644 zira/db/sqlite.table.php create mode 100644 zira/db/sqlite/collection.php create mode 100644 zira/db/sqlite/db.php create mode 100644 zira/db/sqlite/field.php create mode 100644 zira/db/sqlite/orm.php create mode 100644 zira/db/sqlite/table.php create mode 100644 zira/file.php create mode 100644 zira/form.php create mode 100644 zira/form/factory.php create mode 100644 zira/form/form.php create mode 100644 zira/form/validator.php create mode 100644 zira/forms/comment.php create mode 100644 zira/forms/contact.php create mode 100644 zira/forms/search.php create mode 100644 zira/forms/user/avatar.php create mode 100644 zira/forms/user/compose.php create mode 100644 zira/forms/user/confirm.php create mode 100644 zira/forms/user/conversation.php create mode 100644 zira/forms/user/edit.php create mode 100644 zira/forms/user/email.php create mode 100644 zira/forms/user/login.php create mode 100644 zira/forms/user/message.php create mode 100644 zira/forms/user/name.php create mode 100644 zira/forms/user/nophoto.php create mode 100644 zira/forms/user/password.php create mode 100644 zira/forms/user/photo.php create mode 100644 zira/forms/user/pwd.php create mode 100644 zira/forms/user/recover.php create mode 100644 zira/forms/user/register.php create mode 100644 zira/forms/user/send.php create mode 100644 zira/helper.php create mode 100644 zira/hook.php create mode 100644 zira/image.php create mode 100644 zira/install/blacklist.php create mode 100644 zira/install/block.php create mode 100644 zira/install/captcha.php create mode 100644 zira/install/category.php create mode 100644 zira/install/comment.php create mode 100644 zira/install/commentlike.php create mode 100644 zira/install/conversation.php create mode 100644 zira/install/draft.php create mode 100644 zira/install/group.php create mode 100644 zira/install/image.php create mode 100644 zira/install/like.php create mode 100644 zira/install/menu.php create mode 100644 zira/install/message.php create mode 100644 zira/install/option.php create mode 100644 zira/install/permission.php create mode 100644 zira/install/record.php create mode 100644 zira/install/search.php create mode 100644 zira/install/slide.php create mode 100644 zira/install/translate.php create mode 100644 zira/install/user.php create mode 100644 zira/install/widget.php create mode 100644 zira/locale.php create mode 100644 zira/log.php create mode 100644 zira/mail.php create mode 100644 zira/menu.php create mode 100644 zira/models/blacklist.php create mode 100644 zira/models/block.php create mode 100644 zira/models/captcha.php create mode 100644 zira/models/category.php create mode 100644 zira/models/comment.php create mode 100644 zira/models/commentlike.php create mode 100644 zira/models/conversation.php create mode 100644 zira/models/draft.php create mode 100644 zira/models/group.php create mode 100644 zira/models/image.php create mode 100644 zira/models/like.php create mode 100644 zira/models/menu.php create mode 100644 zira/models/message.php create mode 100644 zira/models/option.php create mode 100644 zira/models/permission.php create mode 100644 zira/models/record.php create mode 100644 zira/models/search.php create mode 100644 zira/models/slide.php create mode 100644 zira/models/translate.php create mode 100644 zira/models/user.php create mode 100644 zira/models/widget.php create mode 100644 zira/orm.php create mode 100644 zira/page.php create mode 100644 zira/pagination.php create mode 100644 zira/permission.php create mode 100644 zira/phpmailer/phpmailer.php create mode 100644 zira/phpmailer/smtp.php create mode 100644 zira/request.php create mode 100644 zira/response.php create mode 100644 zira/router.php create mode 100644 zira/session.php create mode 100644 zira/tpl.php create mode 100644 zira/user.php create mode 100644 zira/view.php create mode 100644 zira/widget.php create mode 100644 zira/widgets.php create mode 100644 zira/widgets/block.php create mode 100644 zira/widgets/category.php create mode 100644 zira/widgets/childmenu.php create mode 100644 zira/widgets/discussed.php create mode 100644 zira/widgets/footermenu.php create mode 100644 zira/widgets/languages.php create mode 100644 zira/widgets/logo.php create mode 100644 zira/widgets/previous.php create mode 100644 zira/widgets/rated.php create mode 100644 zira/widgets/share.php create mode 100644 zira/widgets/topmenu.php create mode 100644 zira/widgets/usermenu.php create mode 100644 zira/zira.php diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a351bd0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +cache/ +log/ +uploads/ +.idea/ +config.php +robots.txt +.htaccess diff --git a/403.html b/403.html new file mode 100644 index 0000000..cce6d55 --- /dev/null +++ b/403.html @@ -0,0 +1,29 @@ + + + + + +403. Forbidden + + + +

403 Forbidden

+

Sorry, access to requested page is restricted.

+Zira CMS + + \ No newline at end of file diff --git a/404.html b/404.html new file mode 100644 index 0000000..e1e9d0f --- /dev/null +++ b/404.html @@ -0,0 +1,29 @@ + + + + + +404. Page not found + + + +

404 Page not found

+

Sorry, requested page not found on this server.

+Zira CMS + + \ No newline at end of file diff --git a/README b/README new file mode 100644 index 0000000..8310aeb --- /dev/null +++ b/README @@ -0,0 +1,4 @@ +Zira CMS is a free content management software with unique windows-based backend. +Zira CMS requires PHP 5.5+, MySQL 5 or SQLite 3. + +Visit http://dro1d.ru for more details. \ No newline at end of file diff --git a/assets/css/bootstrap-datetimepicker.min.css b/assets/css/bootstrap-datetimepicker.min.css new file mode 100644 index 0000000..63c2a3a --- /dev/null +++ b/assets/css/bootstrap-datetimepicker.min.css @@ -0,0 +1,5 @@ +/*! + * Datetimepicker for Bootstrap 3 + * version : 4.17.37 + * https://github.com/Eonasdan/bootstrap-datetimepicker/ + */.bootstrap-datetimepicker-widget{list-style:none}.bootstrap-datetimepicker-widget.dropdown-menu{margin:2px 0;padding:4px;width:19em}@media (min-width:768px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}@media (min-width:992px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}@media (min-width:1200px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}.bootstrap-datetimepicker-widget.dropdown-menu:before,.bootstrap-datetimepicker-widget.dropdown-menu:after{content:'';display:inline-block;position:absolute}.bootstrap-datetimepicker-widget.dropdown-menu.bottom:before{border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);top:-7px;left:7px}.bootstrap-datetimepicker-widget.dropdown-menu.bottom:after{border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid white;top:-6px;left:8px}.bootstrap-datetimepicker-widget.dropdown-menu.top:before{border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #ccc;border-top-color:rgba(0,0,0,0.2);bottom:-7px;left:6px}.bootstrap-datetimepicker-widget.dropdown-menu.top:after{border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid white;bottom:-6px;left:7px}.bootstrap-datetimepicker-widget.dropdown-menu.pull-right:before{left:auto;right:6px}.bootstrap-datetimepicker-widget.dropdown-menu.pull-right:after{left:auto;right:7px}.bootstrap-datetimepicker-widget .list-unstyled{margin:0}.bootstrap-datetimepicker-widget a[data-action]{padding:6px 0}.bootstrap-datetimepicker-widget a[data-action]:active{box-shadow:none}.bootstrap-datetimepicker-widget .timepicker-hour,.bootstrap-datetimepicker-widget .timepicker-minute,.bootstrap-datetimepicker-widget .timepicker-second{width:54px;font-weight:bold;font-size:1.2em;margin:0}.bootstrap-datetimepicker-widget button[data-action]{padding:6px}.bootstrap-datetimepicker-widget .btn[data-action="incrementHours"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Increment Hours"}.bootstrap-datetimepicker-widget .btn[data-action="incrementMinutes"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Increment Minutes"}.bootstrap-datetimepicker-widget .btn[data-action="decrementHours"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Decrement Hours"}.bootstrap-datetimepicker-widget .btn[data-action="decrementMinutes"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Decrement Minutes"}.bootstrap-datetimepicker-widget .btn[data-action="showHours"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Show Hours"}.bootstrap-datetimepicker-widget .btn[data-action="showMinutes"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Show Minutes"}.bootstrap-datetimepicker-widget .btn[data-action="togglePeriod"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Toggle AM/PM"}.bootstrap-datetimepicker-widget .btn[data-action="clear"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Clear the picker"}.bootstrap-datetimepicker-widget .btn[data-action="today"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Set the date to today"}.bootstrap-datetimepicker-widget .picker-switch{text-align:center}.bootstrap-datetimepicker-widget .picker-switch::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Toggle Date and Time Screens"}.bootstrap-datetimepicker-widget .picker-switch td{padding:0;margin:0;height:auto;width:auto;line-height:inherit}.bootstrap-datetimepicker-widget .picker-switch td span{line-height:2.5;height:2.5em;width:100%}.bootstrap-datetimepicker-widget table{width:100%;margin:0}.bootstrap-datetimepicker-widget table td,.bootstrap-datetimepicker-widget table th{text-align:center;border-radius:4px}.bootstrap-datetimepicker-widget table th{height:20px;line-height:20px;width:20px}.bootstrap-datetimepicker-widget table th.picker-switch{width:145px}.bootstrap-datetimepicker-widget table th.disabled,.bootstrap-datetimepicker-widget table th.disabled:hover{background:none;color:#777;cursor:not-allowed}.bootstrap-datetimepicker-widget table th.prev::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Previous Month"}.bootstrap-datetimepicker-widget table th.next::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Next Month"}.bootstrap-datetimepicker-widget table thead tr:first-child th{cursor:pointer}.bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#eee}.bootstrap-datetimepicker-widget table td{height:54px;line-height:54px;width:54px}.bootstrap-datetimepicker-widget table td.cw{font-size:.8em;height:20px;line-height:20px;color:#777}.bootstrap-datetimepicker-widget table td.day{height:20px;line-height:20px;width:20px}.bootstrap-datetimepicker-widget table td.day:hover,.bootstrap-datetimepicker-widget table td.hour:hover,.bootstrap-datetimepicker-widget table td.minute:hover,.bootstrap-datetimepicker-widget table td.second:hover{background:#eee;cursor:pointer}.bootstrap-datetimepicker-widget table td.old,.bootstrap-datetimepicker-widget table td.new{color:#777}.bootstrap-datetimepicker-widget table td.today{position:relative}.bootstrap-datetimepicker-widget table td.today:before{content:'';display:inline-block;border:solid transparent;border-width:0 0 7px 7px;border-bottom-color:#337ab7;border-top-color:rgba(0,0,0,0.2);position:absolute;bottom:4px;right:4px}.bootstrap-datetimepicker-widget table td.active,.bootstrap-datetimepicker-widget table td.active:hover{background-color:#337ab7;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.bootstrap-datetimepicker-widget table td.active.today:before{border-bottom-color:#fff}.bootstrap-datetimepicker-widget table td.disabled,.bootstrap-datetimepicker-widget table td.disabled:hover{background:none;color:#777;cursor:not-allowed}.bootstrap-datetimepicker-widget table td span{display:inline-block;width:54px;height:54px;line-height:54px;margin:2px 1.5px;cursor:pointer;border-radius:4px}.bootstrap-datetimepicker-widget table td span:hover{background:#eee}.bootstrap-datetimepicker-widget table td span.active{background-color:#337ab7;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.bootstrap-datetimepicker-widget table td span.old{color:#777}.bootstrap-datetimepicker-widget table td span.disabled,.bootstrap-datetimepicker-widget table td span.disabled:hover{background:none;color:#777;cursor:not-allowed}.bootstrap-datetimepicker-widget.usetwentyfour td.hour{height:27px;line-height:27px}.bootstrap-datetimepicker-widget.wider{width:21em}.bootstrap-datetimepicker-widget .datepicker-decades .decade{line-height:1.8em !important}.input-group.date .input-group-addon{cursor:pointer}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0} \ No newline at end of file diff --git a/assets/css/bootstrap-theme.min.css b/assets/css/bootstrap-theme.min.css new file mode 100644 index 0000000..61358b1 --- /dev/null +++ b/assets/css/bootstrap-theme.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} \ No newline at end of file diff --git a/assets/css/bootstrap.min.css b/assets/css/bootstrap.min.css new file mode 100644 index 0000000..d65c66b --- /dev/null +++ b/assets/css/bootstrap.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.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}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.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>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.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;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.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{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:3;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.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:#eee}.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:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.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}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.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:3px 8px;color:#fff;text-align:center;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-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.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;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.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{content:"";border-width:10px}.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;content:" ";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;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.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:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/assets/css/bxslider.css b/assets/css/bxslider.css new file mode 100644 index 0000000..9370c90 --- /dev/null +++ b/assets/css/bxslider.css @@ -0,0 +1,209 @@ +/** + * BxSlider v4.1.2 - Fully loaded, responsive content slider + * http://bxslider.com + * + * Written by: Steven Wanderski, 2014 + * http://stevenwanderski.com + * (while drinking Belgian ales and listening to jazz) + * + * CEO and founder of bxCreative, LTD + * http://bxcreative.com + */ + + +/** RESET AND LAYOUT +===================================*/ + +.bx-wrapper { + position: relative; + margin: 0 auto 60px; + padding: 0; + *zoom: 1; +} + +.bx-wrapper img { + max-width: 100%; + display: block; +} + +/** THEME +===================================*/ + +.bx-wrapper .bx-viewport { + box-shadow: 0 0 2px #ccc; + border: 1px solid #fff; + /*left: -5px;*/ + left: 0px; + background: #fafafa; + + /*fix other elements on the page moving (on Chrome)*/ + -webkit-transform: translatez(0); + -moz-transform: translatez(0); + -ms-transform: translatez(0); + -o-transform: translatez(0); + transform: translatez(0); +} + +.bx-wrapper .bx-viewport .image { + border: none; + box-shadow: none; + border-radius: 0; +} + +.bx-wrapper .bx-pager, +.bx-wrapper .bx-controls-auto { + position: absolute; + bottom: -30px; + width: 100%; +} + +/* LOADER */ + +.bx-wrapper .bx-loading { + min-height: 50px; + background: url(../images/bx_loader.gif) center center no-repeat #fff; + height: 100%; + width: 100%; + position: absolute; + top: 0; + left: 0; + z-index: 20; +} + +/* PAGER */ + +.bx-wrapper .bx-pager { + text-align: center; + font-size: .85em; + font-family: Arial; + font-weight: bold; + color: #666; + padding-top: 20px; +} + +.bx-wrapper .bx-pager .bx-pager-item, +.bx-wrapper .bx-controls-auto .bx-controls-auto-item { + display: inline-block; + *zoom: 1; + *display: inline; +} + +.bx-wrapper .bx-pager.bx-default-pager a { + background: #666; + text-indent: -9999px; + display: block; + width: 10px; + height: 10px; + margin: 0 5px; + outline: 0; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; +} + +.bx-wrapper .bx-pager.bx-default-pager a:hover, +.bx-wrapper .bx-pager.bx-default-pager a.active { + background: #000; +} + +/* DIRECTION CONTROLS (NEXT / PREV) */ + +.bx-wrapper .bx-prev { + left: 10px; + background: url(../images/bx_controls.png) no-repeat 0 -32px; +} + +.bx-wrapper .bx-next { + right: 10px; + background: url(../images/bx_controls.png) no-repeat -43px -32px; +} + +.bx-wrapper .bx-prev:hover { + background-position: 0 0; +} + +.bx-wrapper .bx-next:hover { + background-position: -43px 0; +} + +.bx-wrapper .bx-controls-direction a { + position: absolute; + top: 50%; + margin-top: -16px; + outline: 0; + width: 32px; + height: 32px; + text-indent: -9999px; + z-index: 99; +} + +.bx-wrapper .bx-controls-direction a.disabled { + display: none; +} + +/* AUTO CONTROLS (START / STOP) */ + +.bx-wrapper .bx-controls-auto { + text-align: center; +} + +.bx-wrapper .bx-controls-auto .bx-start { + display: block; + text-indent: -9999px; + width: 10px; + height: 11px; + outline: 0; + background: url(../images/bx_controls.png) -86px -11px no-repeat; + margin: 0 3px; +} + +.bx-wrapper .bx-controls-auto .bx-start:hover, +.bx-wrapper .bx-controls-auto .bx-start.active { + background-position: -86px 0; +} + +.bx-wrapper .bx-controls-auto .bx-stop { + display: block; + text-indent: -9999px; + width: 9px; + height: 11px; + outline: 0; + background: url(../images/bx_controls.png) -86px -44px no-repeat; + margin: 0 3px; +} + +.bx-wrapper .bx-controls-auto .bx-stop:hover, +.bx-wrapper .bx-controls-auto .bx-stop.active { + background-position: -86px -33px; +} + +/* PAGER WITH AUTO-CONTROLS HYBRID LAYOUT */ + +.bx-wrapper .bx-controls.bx-has-controls-auto.bx-has-pager .bx-pager { + text-align: left; + width: 80%; +} + +.bx-wrapper .bx-controls.bx-has-controls-auto.bx-has-pager .bx-controls-auto { + right: 0; + width: 35px; +} + +/* IMAGE CAPTIONS */ + +.bx-wrapper .bx-caption { + position: absolute; + bottom: 0; + left: 0; + background: #666\9; + background: rgba(80, 80, 80, 0.75); + width: 100%; +} + +.bx-wrapper .bx-caption span { + color: #fff; + font-family: Arial; + display: block; + font-size: .85em; + padding: 10px; +} diff --git a/assets/css/cropper.css b/assets/css/cropper.css new file mode 100644 index 0000000..41d83ba --- /dev/null +++ b/assets/css/cropper.css @@ -0,0 +1,40 @@ +.image-cropper { + position: relative; +} +.image-cropper img { + margin: 0; + padding: 0; + border: none; + position: absolute; + top: 0px; + left: 0px; + z-index: 9; +} +.image-cropper .image-cropper-selector { + position: absolute; + border: 1px solid #2aabd2; + background-color: rgba(15, 194, 248, 0.4); + z-index: 10; +} +.image-cropper .image-cropper-selector .image-cropper-resizer { + position: absolute; + border: 1px solid #9acfea; + background-color: #2aabd2; + cursor: nwse-resize; +} +.image-cropper .image-cropper-preview { + position: absolute; + background-color: #cccccc; + overflow: hidden; +} +.image-cropper-preview-custom { + overflow: hidden; +} +.image-cropper .image-cropper-preview img, +.image-cropper-preview-custom img { + position: absolute; + border: none; +} +body.image-cropper-resizing { + cursor: nwse-resize; +} \ No newline at end of file diff --git a/assets/css/index.php b/assets/css/index.php new file mode 100644 index 0000000..b052b3f --- /dev/null +++ b/assets/css/index.php @@ -0,0 +1,64 @@ +1; +$assets_root = '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . ASSETS_ROOT; +$path = $assets_root . DIRECTORY_SEPARATOR . ASSETS_CACHE_FILE; +$gz_path = $assets_root . DIRECTORY_SEPARATOR . ASSETS_GZIP_CACHE_FILE; + +if (!file_exists($path)) exit('File not found'); +if (!is_readable($path)) exit('File is not readable'); + +header_remove('X-Powered-By'); +header_remove('Pragma'); +header_remove('Set-Cookie'); +header("Content-Type: text/css; charset=utf-8"); +header('Cache-Control: public'); +header("Expires: ".date('r',time()+3600*24)); + +if (!empty($etag)) header('ETag: '.$etag); +if (empty($etag) || !isset($_SERVER['HTTP_IF_NONE_MATCH']) || $etag!=$_SERVER['HTTP_IF_NONE_MATCH']) { + header('HTTP/1.1 200 OK'); + + $accept_encoding = ''; + if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) && preg_match( '/\b(x-gzip|gzip)\b/', strtolower($_SERVER['HTTP_ACCEPT_ENCODING']), $match)) { + $accept_encoding = $match[1]; + } + if (empty($accept_encoding) && defined('FORCE_GZIP_ASSETS') && FORCE_GZIP_ASSETS) $accept_encoding = 'gzip'; + if ($gzip && function_exists('gzencode') && !@ini_get('zlib.output_compression') && !empty($accept_encoding)) { + header("Vary: Accept-Encoding"); + header("Content-Encoding: " . $accept_encoding); + + if (file_exists($gz_path) && is_readable($gz_path) && filesize($gz_path)>0 && filemtime($gz_path)==filemtime($path)) { + $output = file_get_contents($gz_path); + } else { + $output = file_get_contents($path); + $output = gzencode($output, 9, FORCE_GZIP); + + if (is_writable($assets_root) && ($f=fopen($gz_path,'wb'))!==false) { + fwrite($f, $output); + fclose($f); + touch($gz_path, filemtime($path)); + } + } + } else { + $output = file_get_contents($path); + } + + echo $output; +} else { + header('HTTP/1.1 304 Not Modified'); +} \ No newline at end of file diff --git a/assets/css/lightbox.css b/assets/css/lightbox.css new file mode 100644 index 0000000..678c140 --- /dev/null +++ b/assets/css/lightbox.css @@ -0,0 +1,216 @@ +/* Preload images */ +body:after { + content: url(../images/close.png) url(../images/loading.gif) url(../images/prev.png) url(../images/next.png); + display: none; +} + +.lightboxOverlay { + position: absolute; + top: 0; + left: 0; + z-index: 9999; + background-color: black; + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80); + opacity: 0.8; + display: none; +} + +.lightbox { + position: absolute; + left: 0; + width: 100%; + z-index: 10000; + text-align: center; + line-height: 0; + font-weight: normal; +} + +.lightbox .lb-image { + display: block; + height: auto; + max-width: inherit; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + -ms-border-radius: 3px; + -o-border-radius: 3px; + border-radius: 3px; +} + +.lightbox a img { + border: none; +} + +.lb-outerContainer { + position: relative; + background-color: white; + *zoom: 1; + width: 250px; + height: 250px; + margin: 0 auto; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} + +.lb-outerContainer:after { + content: ""; + display: table; + clear: both; +} + +.lb-container { + padding: 4px; +} + +.lb-loader { + position: absolute; + top: 43%; + left: 0; + height: 25%; + width: 100%; + text-align: center; + line-height: 0; +} + +.lb-cancel { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + background: url(../images/loading.gif) no-repeat; +} + +.lb-nav { + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; + z-index: 10; +} + +.lb-container > .nav { + left: 0; +} + +.lb-nav a { + outline: none; + background-image: url('data:image/gif;base64,R0lGODlhAQABAPAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='); +} + +.lb-prev, .lb-next { + height: 100%; + cursor: pointer; + display: block; +} + +.lb-nav a.lb-prev { + width: 34%; + left: 0; + float: left; + background: url(../images/prev.png) left 48% no-repeat; + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + opacity: 0; + -webkit-transition: opacity 0.6s; + -moz-transition: opacity 0.6s; + -o-transition: opacity 0.6s; + transition: opacity 0.6s; +} + +.lb-nav a.lb-prev:hover { + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; +} + +.lb-nav a.lb-next { + width: 64%; + right: 0; + float: right; + background: url(../images/next.png) right 48% no-repeat; + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + opacity: 0; + -webkit-transition: opacity 0.6s; + -moz-transition: opacity 0.6s; + -o-transition: opacity 0.6s; + transition: opacity 0.6s; +} + +.lb-nav a.lb-next:hover { + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; +} + +.lb-dataContainer { + margin: 0 auto; + padding-top: 5px; + *zoom: 1; + width: 100%; + -moz-border-radius-bottomleft: 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomright: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; +} + +.lb-dataContainer:after { + content: ""; + display: table; + clear: both; +} + +.lb-data { + padding: 0 4px; + color: #ccc; +} + +.lb-data .lb-details { + width: 85%; + float: left; + text-align: left; + line-height: 1.1em; +} + +.lb-data .lb-caption { + font-size: 13px; + font-weight: bold; + line-height: 1em; +} + +.lb-data .lb-number { + display: block; + clear: left; + padding-bottom: 1em; + font-size: 12px; + color: #999999; +} + +.lightbox .lb-closeContainer { + position: absolute; + top: -30px; + right: 10px; +} +.lightbox .lb-close { + display: block; + float: right; + width: 30px; + height: 30px; + background: url(../images/close.png) top right no-repeat; + text-align: right; + outline: none; + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=70); + opacity: 0.7; + -webkit-transition: opacity 0.2s; + -moz-transition: opacity 0.2s; + -o-transition: opacity 0.2s; + transition: opacity 0.2s; + cursor: pointer; +} + +.lb-data .lb-close:hover { + cursor: pointer; + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; +} diff --git a/assets/css/zira.css b/assets/css/zira.css new file mode 100644 index 0000000..47ac59b --- /dev/null +++ b/assets/css/zira.css @@ -0,0 +1,152 @@ +html, body { + width: 100%; +} +select.form-control { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + padding: 6px; + background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%); + background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%); + background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0)); + background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); + filter:progid:DXImageTransform.Microsoft.gradient(enabled=false); + background-repeat:repeat-x; +} +select.form-control option { + padding: 5px 20px; +} +.form-panel { + margin: 20px 0px; +} +.form-alert { + margin-top: 20px; +} +.captcha-image-wrapper { + margin-bottom: 10px; +} +.captcha-image-wrapper img { + border: 1px solid #CCC; + border-radius: 4px; +} +.form-file-button { + position: relative; + overflow: hidden; +} +.form-file-button input[type=file] { + position: absolute; + top: 0; + right: 0; + min-width: 100%; + min-height: 100%; + filter: alpha(opacity=0); + opacity: 0; + display: block; + cursor: pointer; +} +.form-file-button-text { + padding: 0px 10px; +} +.form-horizontal .checkbox-float { + padding-top: 4px; +} +.modal-error { + color: #591053; +} +.modal-success { + color: #073954; +} +.error-page { + margin-top: 40px; +} +.error-page h1 { + display: inline-block; +} +span.required { + color: red; +} +.form-field-error { + box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.075) inset, 0px 0px 8px rgba(233, 139, 102, 0.6); +} +dl.user-info { + display: block; + overflow: hidden; +} +dl.user-info dt { + float: left; + margin-right: 10px; +} +img.user-photo { + width: 25px; + height: 25px; + border: none; +} +img.user-photo-mid { + width: 50px; + height: 50px; + border: none; +} +img.user-photo-big { + width: 100px; + height: 100px; + border: none; +} +.clear { + clear: both; +} +.zira-autocomplete-wnd { + position: absolute; + list-style-type: none; + margin: 0px; + padding: 0px; + background-color: #FFFFFF; + border: 1px solid #CCCCCC; + border-radius: 4px; + box-shadow: 0px 0px 4px #CCCCCC; + overflow: hidden; +} +.zira-autocomplete-wnd li { + margin: 0px; + padding: 0px; +} +.zira-autocomplete-wnd li a:link, +.zira-autocomplete-wnd li a:visited { + display: block; + min-width: 200px; + font-size: 14px; + color: #333; + margin: 0px; + padding: 4px 14px; + border-top: 1px solid #efefef; + text-decoration: none; +} +.zira-autocomplete-wnd li:first-child a { + border-top: none; +} +.zira-autocomplete-wnd li a:hover, +.zira-autocomplete-wnd li a.active { + color: #000; + background-color: #efefef; + text-decoration: none; +} +.form-group .zira_form_compose_remove_recipient_input { + display: none; + position: absolute; + right: 24px; + top: 8px; +} +.form-group-added .zira_form_compose_remove_recipient_input { + display: block; +} +.emoji { + vertical-align: middle; +} +.image { + max-width: 100%; + height: auto; +} +.external-image { + max-width: 100%; + height: auto; +} \ No newline at end of file diff --git a/assets/fonts/Lobster.ttf b/assets/fonts/Lobster.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5e848bb34c0a2ba39c8471700ceaba689f0f4ff3 GIT binary patch literal 429716 zcmeFad3;pW89#iMJ4^P=WRl4`nI*GlvQ3i7o*`sU2#|!303itk2>ZSZ2q-8hxGyM* zii%5>y5QEj+uB8KZ7o(y-Rf4YwbojTFnPb{&P*1T+Wvm;=kvaQG{d=b=G=4dJ?A;k z{ygVGC?Q0HgGAyRYU}EEC0$}7gr*b1k{YH=?x?=R@F^j@kdWAq8ak%cWUpwNOo$fe zV{0aNRBSwl2W;*XJO`27=hF^GP=B9%j{0BlVdM*ZDETWsjC@J{ zh5AW+82Jt#N=}i}s0Z*6ia$meiyFQHYaSJP_L{nU^81Udor8d`(;L^=`m zT3UyCJ#9d}k+z`TN++S-MyH@YmA0eaK>-WeMW>_QO?yzEL1&;ollG!MoA#mJPy10H zpmR|lr1MapPv@h)fG$9Nh%Q2XFX*<PC3)ylUx3DcZUeB(_@kVwd zjvw;d3FU|Ry*S>_Kf&?OJV2<#Bo&TPQWTCcQVfo9Qap}YDFN#>`X}mJ^V50Lz#mzh_V1>A<80@#V9LKR-&vzS&OnB zWdq7qlx-*%qHIUmiE|({4MVPaq#|Fg9PHl6((HqBzi>?1$t%%d*XNe@Y|uD z3S6s0&q(xq6QhsB*hWW!`-aA&A!!&*Ebc4%+i^u4`l*M1i!0to&4T+U<9sICaerdP z_#<(J7gtzuMJ}#LMN1@}5{>7?0CKVT9fz@M(4xg`6HwP-wu!^1 z&@&c2tI*Sgp5-``fS4<>XTI+e2oMy@2t4td3~CX7~YeaQHa675BP(_yoC!Y$p$bzJG|BK8))h0bGuu zpAt{@;c2a81zCx^dvIqb+AV^K z=Qn^v55_PX&+bE+gEEM+07cAeA-)%(EJj(1ek<_35@i+2T9kFT!+LygK-oO}5-99A zDC{^W>^LawI4JBmDC{^W>^LawI4JBm#y5mfF2T4T#EM6ef#ILwR|>}1jyZfqF2!>$ zLy!G<{x!q1$aR3nK|JSfw4Hx82F&3E=5PXYI6>y345BPRS%?yx!wHQ41jc^?<3Az8 zYc0Ol;W_K^y#Zwt%4R%k3!b$V^=&8@qHIUmfwB|jB9vVyM}|*eJ|{3AG5R&QYBNUv z{~c~fkOn##u3IpkJ-`VQu*Cul%_n^*b5Q02;)D2JfU*!}5z1neCBU_1GM?lEuky(% zl(i`9uuALky#ZwtuHB6LZ2|6V#qVt>7ou!O*@1IA@qH1>E|eoE50X}TE566CH^Z|m zfYynBvzF&yWff-N9l@U!q!Od@;^|%)m(G9P`Oie*j?NLttssqLBkr~dZJTj-0m&Vx z3us;gyi5i(%K^=DKvO`n9FQyrB+CKGazL^iSX>SWmIH$2fM7WwmAfLJ*oRt|`j16t+8g*D3uO@2JGZUdm};M&!kXYG8T&5y}4l;yzX6}UdU zhO2RHa2@lcJBho9I|xl_lqZhohbO?($MZwM3&VWy zOx|}czIXmnoXv^OZb<<~)B`u_ffx0_iF)8fJt(Oj_)rggs0S=Mfy?#4fqLLTJ=VV- zYhRDGuLrd1fxGos?|Q6vJyxn7Yh91EuE#pp17GX0MxD^qZU+V53yOXKfO$1YhD*Fd8zASKYD8c7$V{35_?E8uV)VDJDa;7Rf#<~b8MN6CEo zI0F!2XgQAGF98#0VBKe;%m+q_K3|D8aH5&O)%oCi6u-Q3n-llZRM9U*+xfi_-q2)F7yjp&$c!Id99?zZuNQKYcj^FQ#nZVxM1)NvH+7Q}t3dw}l zM=*~o$rQ2?qa}Ev4@V~oK@Sg(DRLcs+pspJ^j3NZ0V^>|1?~gu5BFM(KFjctI0WY`X><)Y=o_rDNyYOM;YH|(6bOawpeu$4k z9+R*;gLZBwjT~p^+GIPoL|~0<=ZbF*%!wG&A}m)GR(!M%!!y+2+R+08OV*HP`PeQW zXUtzUFqh1ck3;ft*^-3|2FM!uc#(X(X0^ELuzb8%KElI;@dn3u=C^>SI5T=wVuTV# zpv0)uIQM2sC?I99PFg|hvw?4`-(eEq4m~6g0-z=j>##4=xlfTzO3SvhsH_%&GFN;I}$G^gV~rh-}maB}wcFJPnXU zn*sNT1@4%^hXl-pXR2MUy^7jIxh6bRStziY;iF>U8SlyGf+L2vO8pi336DmwiU3W%OqFT%M(`(?8JwQ!{v{ckz@ z-~-97mGLhQk?|N#NzuTw_-xF~MxBT5nbMRe{-?{R4Cl%1}Q+UvDEqrH?R(UwK zQTWctWD2htMk+=QE0q@ES2HaZZ4^EJr9drQC0mSGW`MZ+}PB2M$)6g~>$A6#*=xvZ&1cwPf zZHwFj586n}4!H$>w2_ueP@f{aX=7%36@E3-t3?}yZw-CL$i%9Ok&9;u>CsN%8N@jW z_@V_>7^&ccVx$X0BZZd_BZYrYzBi~s39qRtR^T`aRX#3`GQLq&CunL0)^aPk0(|`u zs-$_ena-l?=!NtEJq-MMoIX!~Nq@(T%*6^>7wc!M*ad7KyMf)#?q|o~?TX}Cyoz`8 zIeZP@#c$xZ^GEP(G2VaSdp|vi zl-`TuF?rRspb-Pfq7R^DFBQ^rAN?VY`{_eC9;6TAcpu;w#L0){Gh&tp>7zIbc_rri zgs9UeaXdQG_c{F9Pls_lNPi^G%d7gdTnpdtZ*rfnGRA;?b(sq^CPtvM`|yP z)P5q@BET_#7sNKA8`V<5m-f2VzIq(8^;KKeS2!TEiI+N~q2^%Q>Xhu9MRe?0EYF>!`ICZBnH+?luKGk=iJ z{82t5An>VN3(oS-qAtAS&|!luU&<|i#ZlmzfYKLoi{RZdl;{iMcj(*)^11g$&V4PP zlc`zuo_`65jmQrPa*6*Dzk}xkA!?5zOj?I0Jx-oO6y*&%nXW<08fbQ*7Vpp_efO%Vb7oVrFJxSR3H% zV2!MaHM17h$|kWkHknOfQ&~IfV4Z9lIM{U7&3f1jHj~X_y=*q?WBqJ^&0%xl!Jo(G zvjuDjF^5%vpYY=*Bc{>~5W zKsMt%u+^On-T%Kr5BLZy1h2>hAF_Z`3rhsCFMNblqhvCQ@OW3inyLm5p8$QK7M#2R zc3czmyGf)CeL4_%tEGeJYewHn+@TshYvjIlBfW!t+ersveqTaEO2kzTnoaW&X`6uS z`=Be$rr7PO8D zpon%d4bh&ZWHDV%my?U>D$vg^Icjz(=;I=ApWXCEXz~mild!LdY(r4kL`%^oY!FT^ zfgF@T)rauxJMc*-capmi6SxN-Bjn5d@L4_p`nSNweFXgb7 zBX{AxiSm8*PtYgnQ}jpl$Mk9X40P=0pas1^U!*V5pJ494q_5Cd>1*^?fWU9* z8-T#?>09(|`UiS~{*k@|SiDa^fL8ty{g{42Kc#=Bp8+Oc(7)0z>EGyA^zZa*`VaaI zAOz;Z7~_Bx1%A}Y>rBC0&Vjt0{DCsbcaoY2A)*HQ7zw>zoP;SSG6IaUj1h7MMg3dMLHwoT z7i!E#lq^y-0D+f@?{odJrRQors|~kc+X!cu!1j{Zg_sX4Np=8(ihxEaY_S;NbsXqh z1D-9SdWpb)J-d}8vqSKcq{=v#0Ub|pq+nzq3z0kpl}qyA`6+Y}NN}q&c~CQH8R1$}$W&ue?P2@L zqhy$_MION>8U=sR->HV(PM#otVDGY<*&XaK+e^FITkMbQ1p9!!M_165>`n3y@T&FH zLOa+y>}qx!dz+ThGHPH;$dAdh<*r-NN3d*O5=yX11G_(+ZiF z#?f_bC)>rIBu|l_!K?Oj@(W~L{F=N@enZ|QzsC&UCLfSLk&nPTBk09!EnCf2(9KlM zR>Dq|h@^Y~eV&DfM=5X$tK|kntH@Tm6*IgFGka=h>WryIgVAiX8S{)~##-YF<3{79#@mdCjdvOEG2U-{#Q3Bs$z(K{O*T`Gsnayu z%*;x2oLOs5G^d&kX1BS~+;5&|{rNX9eDmvXe*2w-%mVQj13b!x{Hi90F1I(5I4uUdR2_L)wP^s6_ej+~K)cT|z!1ACW%|HxB0o-X6A`>JENR$A$Zz z`Te0uw7kFY{UJi${r3Gm@3HrN?-${d``#yny!Xj_AH4Ur=<&`~@2z=v@V$rLJ0^a; z`{uiEy!$G?7oa@^mEA>G(lYjA_7r;-**rf6g+2vp6I|yB@SR_fmqE2Z2dxHa z_7(7|5Tz{>2;Fcf6UM;w@NyjNnIU}EzS|6K-Nyb|m;p8bVa@SFMj z>@;uXFY>4O)$r6@!yn_Zyq90gZ{(?bAu^V3;zqulTj9ys&A0MP_%?nia+&VrPx1nO zF~6K&&p+e;;8*Ym_*MKtWNm#7UVM~a$$!B2@~8Pe{tW+w|D7MJV-@$*vKjr`8_wkqc zt^B9__x$JlZRAn?fq%zO@K^X-{1-f%Z{}a}Q~VA78b8i|&Hu(v^EdhH{CE6UJdf|> z*CG4rD;|KXxJXDgNY6Mj%r0kFu*LLqb``r4(&ZWUG<%Lc&t8DEyoqgP??BTRR)dw= z{wJ+udHX+U^*?F#KWX(pY4ty8_5W{aCCqWCiOS7tD3?S98@7zZ_#=J!_H?Dhh~#m@ zm1Xjw&_bKVtW4A;=@VnA#cV4otYY4Rq(oh;lxQielDJMOw-%$3S)}gMZ+~}hKYxTN zPPNe9T$j7loUSj@yS>h)xur|j7qoV_7IayCexLOQkJXl)ZL@mR&>h<&W}UjBw6X%$ zN~~J1tt`lyQf?lYRx-W0wslsef1s_le#+@p!TugN6>5gRW`~p##;zw;znM`|$Dto1 z=ZPV`olrQWn~)WujZ~uxmy|kp8l-fBE|yu$IV?B_1N+&{v^;QJlagI-HkW%+Q$6B4 zJB9vUBJS_r2s~r1$WBeot}vU+vQtvB%W(fqq)d8RF&CbJOj7Hgz+nW@<&jjaQm=@O zX3D4trcx_av*TizLP5GDxJrmy(UfV(NKZ>mN!9~w30h6)FFszG;ZE=-c)1D1tFow2 zxFx}aV)1!>76lgIZ@+1|u9ZgM@YBqfz0YU9FzMP!fq&v~Jo8QO>zHPQH}FsXC0!l3 zT$Ec*-4fVAw~BJhsZ+w=LP^H(+ln^8Y5`g2k9Scn^_6G=lvb)ByrJc2&XjIHg0fKf zI9aNsL;*+5Vj@Yb8?baV5`{trXg+O9^PA7=ry%fx&Kl`1HTC%88tQBO`MD08Aw5g0 zQYN{fOQ~Xc81TNL93EZ(U=bF?X0M_}0?lGs5YITiyaiRvCoZIMh+f-m_*KQlKd*u6 zlVX{)NAJ+ZExhyX?E?pvl$9^oGuf1#9^J6%j#>5Vrse9LWoDaSZ_O>uceR#TmJKvt zJge!y`H%(czzGVKs zE~-!^l$xo=n&6o_u^=`wLa9`#Q;nv0jZNpC)>Iz@)FhGr}$akRZsol>%eyxzZkf0XZfTjfA!(U z7hp+EpsWM8C3JXAAdT%9dtY89X^RS(-Ddz$BPmf`Hsy+Ow+(!HUtnqO)ldH6YpU4w zBJJE+(e}izaofPYz%zm24&cv&(8bp&4e-5O=1(p!V1#=;4ntyGB+^G1$Dal|F2)p5Rr* zD!XEhHg}39BO^26v67j#?Gb9~Y%Z5ib;cO2?qrQ2BU5{2LjkvQwdLE zygx=o5vw3%eu9RA870VU6gY1e;|eoW)~Pi)Ofj*pV!@GW8?tKW1_IIgv}{*)MpR-% zYLge-DRp|SXZgw{xWAqLlzzxWB;Vjq6G#OQBEGtqU`oxXg2*)-kV^2GRCX)9(M*4O z+ihsawbjGl(u*;+1d`xK&X-7jA#h$cIkFfC)_Mk?q!))-W0+MQ5PUNDL$JtlaZf!$ z^s|)Wu_^u}+|JR6ksy8tMm#zc>~PZ4hprB^1>lDjeilaD!=FjZlu>|FKJoZn3V63= zjsxDqIq8<*xxvWNKooXsYJOUN47$=3CBUeVdAYWVdkYMpo>*mq8B$4SfPku!iVAZW zeR;#7*>+FY=9{oF?b?A{O;+iYp`EurmEYIZT$CA=QRph@>!{05i_P#PPTBL+;>&5& zXD?jV*0BB9@|OD^e&q1Jp$f%a9s8es`_HS&mUR_Qz5JOIe_da(q$5wv*Nws70H1aQ zsd!jTXnM1@^U1EE3lH=L zo|FQ!)u!r_lko8me?0s#|0x*rWOAur>j2$MrV3t5m5Mm5vlQas*`OT-rSLAVmZeY*R2ExN zl}f;Sl!Zf87?rbPX;gw-#mW@>_{LOE>)hh}!J(z4Ma!$z(X@PE^R~_XWg1(VBdfxd zT;{N}+YH5y^N9mq6SWO{qMCRqymis?jm_8QlNybSi9y!cj1r8qul{kAQs2Ka8cA(l|t)F+{ zf$4^hnLQ2JnbotZ(u-V~%JK$VbVgpaC1>`eJY&s*hOV96o&Q<-ZOjs{X_V#6@NvX zW2rw$1McjB5OCRzY9wkX5$h&lyfh+RQt*061SS+qK$HS}z{=@>rc(kg{`)T3P$?cW zB;@3p70MJhQ~?>`>_q~KLU9O@zNFI2@<0z&s*3vbLKHwGa1%@RU({H*vPA9fx@}9V zTCMjb=QS3jWZ+5?@Tr1K_jl$A ze4<>L200iBC`b(!D%AnCl#)UTKtS4200w!DRLT1RjsgJ~(gRr`5Q~z+f^3&5Gexh7 zi%^jYTA`MCUPuK8;)K*BS$9&Z>}Ut3X@lWj4j=)vlXXpxvU4bDRl7N}^H<&UV3 zL5foOswf{rY=R-N!}V+0bLzvNo6A;WL`cqD|(QG)G$X z1xq@URMsOO>0K38cjrWBin}7Ky1OKm-;pcOMJ6^fsGD_chY)6Bsva8Tu z=gr8<&`h)>xr_<(ANlqw*54n4Ny45ET_{c)vK z;u(}OM>Mo0p*rP3H4=MYh1^&g#)F{h)CiCY=?5x-gBDy!u%uu=#DHb(D%7RtF^kKR zn9l75tg^|s9lY+ct&2J{ zqT*vUvH7Je({Cv5t}-VkCngGIfbii{!(RjMV-Z310W;iwN2Ob@09!?JqLB0GBQu7u z`Bq}R*l4fJ);Co< zCg!ElO^w@@&+*u%bj~VhyJUVjz~Eo-SZ8+c!VL}m_it}yzWG=57xwi`b4`4Dd1-Hr z#aZ9WueLYVRA-voI;S}r+cS$>Koe=hC;69<$N7lYZ}vy#Kzf50a2Ar@A{iFOEV!c* z#KD!wfe4vh07-~QWL@Gv=_sohiImj%ONw0%Q>H!(UmYpL?G#?;uCnmwG!l)M?^ z@(_#Pm_}JGTG@&-2WGcAvbZpX&lngzw;{lk!Qq4k0N+Gl^I5h5yX%Yroti$zSZIW? z;0YTGG7M|TYlycj1?-Tu1Pzc#;6X$rCUee^F3fnBLdc|M3BDmoC8@xpg$bbynGh6a z#LfBaZ@H%)7Du-GqmKfOAATs`yAK4u26ks2tepLiMqxoHP}>T=mIY7^}Cm5n2hLN8B@9QKKh8}-}!;|4~nU%^^x9q_RyB456jMqzr z6HCd@SQa+3ae}$bm0aYpPPLkR_QVORZko|?QEz@uOaI*dmYm%tUtLq3&vYzo4~4Nu z`esHyw9l-<89KGulH#ehH*J|!Xm46rQ?sPEv%PE1+J@Fm3#LzYHXWN)ifg4wD_YnmThO_7$#RS+s?T?Di^$2C3v*ul9@mo3|o<#O2~ z;lYBj7?R3WU@Nk=f!{XpWZ5q$8k6)sJs;)KL0?bUP-9S7xKQilC6e7f{CQ8yoP~=# zLyzy7TCwb=AHTJJ$+2B6=JJk#Wu>(pl5cfQ+jK)=WBbe;V{V4&roJc*kBE;pOm4`( z`RbnguHQD(>+0OnUbTKp$31 zSHAA(+O}(UE}N1)p}Mhk(NM(&s|K6gDVg55!1b=iv?#qcx^?@#y@&3qSbX&Z&kYXj z?Qx~#*1Dq#*@ICLEvt4{dYq9OeJt=Al&>AuD=vi%T!>tVReo)e7b3f|OhP0&MVPf= zf162I8I-|VLsrrXK_3uwM(S2~D34bkA`7q`~K#E17npm!aH;tPPwr!tSHqhYEL^=C9eC{dBY6mv!)CmxP zIc8n;iW_IRCbT{9_>(iTdaQwGa{78_xvMU$U>|20m0JSe{_CwN`QBKyvwKSI({KNE ztunXBskgf0GCYRDS+x%3=C|)0h}N9UP%KaB-F8z~v?UqHmNI-o`aR&(L0)b-ngJ}2 zh3W(49-dv8UjoC&HYjE67TvO-IRb7(u>O#9sZmW;DyQ&M$~+=}gqygr9Kro{0o{YHm?L8MnpvntuC3j_s%B_jCf_|P{Zzx^O~K$8SAQZW_7ltM_2bODa+rwbL*UnXmfdPYMI4lY*@OZtf;TS z1^4}z;Jw5?{EpO!bt)y>{82_=X{j*d!fFe0n~`b2ptb~^bi%TO@DQq;@G^uI+w*pk z72DL2n+UNZ_Rz@=KkDEB^XJ;z~VI>b(jeNwLTvODf+SaoE% zPh%_ZT(;-PyoN2kMR69NJ-IqVYfg=iG31#`7xzsrF(&%@S~kAgNM|j$a;B?z!?Szp z?>zd@omVWX%&Zw|a@Kj%wU!9Gx5AK|V@~Yc|MYL)9cozHnY&~F6GXQ1@P`T~VB-U& z16x7eaD5h!@v2*do(_~2Hg8B(m#JGQ>?649KToghkzR$usV*qpM|{~1hbv1^y1+K! zBbVJ=LEZ`0JA!V2hQKqMUG<#6s&7gvD;G_#%}sVsUN&*ni&wNqL`E!F;~Tu}p67?= z-m+=BFV)quaO?ioiVJEqz@P6fa<=X~`m;BNhOX{)*KU7&t&BijL-o5i0D-b6FWq@< z+uG0Hd}`0+!cy7ii1&@W&A&p7p^?n@$5?niYk>(WmsVXI}G*4B`~ERLdIMb?kl+F_jJov3ce=Z_~jxlr^Ak5Oj=5kPNN2> zy@0g?d5ao?ci2L?IjtlchktHGbc^&&(G_1M<&>6 z%bWH!c2Tz}@Wx$=ZszR2eY1>Fi8-w$^PjzDhB`tW6>Ds%FO5#p1QyGQl-j9C3T|EP(xNzA*`hcl`>*!B#lt3BGilFQkJM%>W4tZzgf_96y1;u zfFCqn0l$3VkNxj2D-=#!EE|T>?Ql9=Hiyk&je_n&kqR{`Rv~0nVMQhgp#+Q2f@HBf zA_T%*OT@cCrXXVQtl8I@W^Fvs*RpAPp1XNo+2p>YglbEs*Q(Q5@-rIdr_WcH9GpG# zss$y5{k!jecG2|9<`l{yu3Ej;m>k+ zWw%bqGo+*^+KWv_pFL^Y7W&epj;7tuu3Po%N3I$wfoeJ-yV09&%8Yh;OVX<*mJaT{ zc7#KzCw=gaB1ouIz}4>*5yEqw$ff|F z2H-OhlM%7dv}BD&IFU^Vb(#_9?T(ylst-nglw6J zIf%E!1!ENQ$VY$5;}t&o6q2IXad@9V0%wg9`TdSdt^*@2YWHQ7FW7tQ55&*{Pb!v| zynFXq1Cj?ri3K=)2xIY+nf^#28?wiE0U!whRwmOvGH83{@qzU7IRJaUlZ6nI{+Nog zf;?MRdTL^VLO9FDkG7nS;g&(+i7;bWXaqIx*}D(OP!3O}J@87(lx>f0ZC*LaZmRCB z%&f1lM<*CF(&MsS?%t}@M+pOq7z z7%io`eCZCKIWD1i?i6`lhEFJ_02a+;&>t<-W2{Ue)Z+Reilxh{1l9|S6cU>ukCzOO z6ag&8Md+DykM@$)VxgZkljg>{l43`e#iZA%&a;NRN|o=W1tVV4aZa<4CI`*zoGX2C z%7m85%@Yd@$4~!MXV$dLDbr`#GTqjiL2E&kCC2PD$E4?(V=W1X&x4|uo4N-V&g+?I zJH3LL%BSS|FW<8@Kd&h^AwI>PpImt9)mM}Y4!{+mIDT}1DB2XCLtL)%M?k`F=l!^jBX0sG%JMLqL_4HGRG!CSGa3>T zMEb-TC?%T@21QT`fWt`^7gfQd=&z0NIc88%_=J zn@MnMXr^9I*IEJmoH;+%pC3p3n9u#|J23_>9W zBT6G_4!ss0pk#LhHARI$kfaamnMwLIs(2>wP~gMA{P}rWxNl!Z>dq~msjK$f(v{cX z{^y5^Qzs? zYubyqt<3h%Ovhqo+nAaU&Snwnu1H2BB)pCQwzcqoD7d6RU=?0(ssfhENn z#$8@hg(r=DnrY{XPO)1~*rF$-`+-+e$r68D(3OHnY(x2|I5nW31eZpCn8}Yw)sTW= zfOnR!ICn2ustOHmDw#UDwYt)3aae=~cZSa+1mo~Z1nse)(*vi*#G}TFR+y)Q@&3h= z+^NOWDz^OMs>$OpapQxld>N(fMTpeJo=d!%b%%w+!(KbIwcOoSZW*ywNAc4)Yh88j zz^snUXnWCwtbZqEkwrNCwzLGfC@p05qiWz}m^|G8GR%A7#RgeQ$OHf{g)^Jda6*7W z!Fs@?WedY`p5E|VDOm5wMM5o(YOJ?u9l3TG_3%{7Zs>98a0X$?BgiSk6jm2_?}(oi zRIUss8Awa?jxw{oT5ro~t92r!rDkx=U`^+>KU+KJ)|FM+twZIFbE1p8DohJ|if7f> ztW|C8ZB^E~%}3^T?CL9&K6f_=8z8;6sAf{8uhmn#Va@v82m9vTx23_`chS_^b<+zP zs}04I@@6cw*Ut8pEEt&G*FSGb#nej&OPwu?f;b4-^&H~9cCz_VBY3!gosdvz;%tzm zh3(h^Srm;r{$&m)+pi;Cg{+d(1I}|U=;n{dz3s%FWj3Vi6HOvgVFED=2#vQ_!Tn&b z;*`x!@iGB(^3=xAo0`?wT2@ z$e2h~s%H0=bj`^VVphZ741c9efxLE*B7Z@eQh0$HAhuvA@ufl2NT_K&3J7I6qHoPI z8&mXgv3OaGBbdR20FW;s76$fMsVY0my#;AdFAz<7^Ovt?{CeizzP!}5wcE=UTyfuX z^DKqwCpFqbAI!uysF(eLXJUWy!rV2yI=N@n#dQU9b5|~^-MMy7gF{lDYO7x9d4b-= zA3D_*_)Xvy!7H#%Tfi&QN!4R1$xt9igiuUSk4Cs4n7K6Ow;WUyDnU9yDyv>6bV5_e zr#~uTlJp5k@M0OJD{dP{#W0Mt^uhh7f2vqt{Ly`3n1pgz|6BaIo*HOGt}PC{9( z1LCrZCcK6t4f5!PG>7JyX-G@f3Tck9Ti|0j%l1se$P>7AY2f%4y8ZgIf!+PZ{=kuE z@uG6Vj{M06wIOu4+dgLPfJde@gdgtn`wX z&K~7MH20Fgs@-foC+8aCX$w1kYWr!Z{m3nZ@LGg1;=P@Z!eu6f`LY$~kRt~VG_sc^ zC=yUWLeWLe72PAjl>eaLNI=C$id|D3uBkyct6BJISfZTqKFWtpv_N=YnJ=6WACz?# zJ^Q6`PH|Rkp)pFIoaNFQ94V2e>e*H7>C;uNA#YY~sVg!nRd2~oOn0P2Wz`N;Dy~#W zk=odFtJ#wlm1NFNw6|7TPhKqXNKIU-&E!dsPBgg_?bGT!g5UftpyQqJv#LmW(6CE{ z%%NSN5!vv;-f@CRG;~I-aL|ai5{6I1q&tSh^LRNtZlWfY1q*XmpoKm_AJu;l*#1F4 zr}}d3w zm;+8A@{TQeBIOkMj~cB=u%ve6T6h!Kmd$}@X3~eE<@l2d4d?yS+DvQtPXTj8u)FT&x?R`yHt?YE;9_sW;H&{`R0p`2QI+O$a%FLG*; z=x@nCUa?Y1@L>G0;SZ4yvsa45j_`>zIw&e*4OGcINS2C(c7Z5ZFoH6+RVBy9(2a+> zp`iz+U<3rMMU5*Zr9xV&f^CddSd3gn)-Bk%TekW{ye0Ucf78`FrmILya*Dem7XU$G zm84V&-Dmv0M=$Vu&exZ7w@5&hX>+814{U9CRjVt#`2a$;Rp+wVB1Dp3tU?It5!b44 z3T7btK;|wo)zM&fN+{+7GL-ga)Hby?)}&2e5S3EVJkwV+r!^5+ZCmWf3sbKBOL^@k2!y>enj zcHGj_jT%#YcV=OOoxU28mZB-?UAJXpUb#P0srS@^CfV>;!(a0n#Q}H=b4j+}2@VPd z3Y@G1st6yIuxc=SV82j;kl|K___-j%1ej{!)MXK@DJm@Xf$QtWhILeL)7&|k`3_TD zagX1kFYLPD$kKgRDAhDWxx`del%1)GNpq%0nX@t@6f2zpZ-PFWXLalvsJQmPRjcau zT#!+oVNXr$^R&!czNXmPP-5Z{vBI?pUIP5%-I91eeU-mFLqwoqmca&qSq8o-afQ6p zW1}@*VS@vSaP$(d%NmMBjd~YHj7$V!iq8!5^KSR@z4y#(TG#1GE}FLa_MzHtB%K)? zNfv8LdWO+oUSLg3u==c(bGs(l>GH-)7EQ3WZJu6!)9p8JYB3ennr%LtHo3-U%PH%> zVAsW^g%fRY#*$X3=0RGz6l>rC)Zg%H4X`1G9qV?r1vx>)3#URc7Od&bl2Cvf?efrBm z7NN~d9wmMgYXnxCrfnSLf=sOfR%cMpIx+@`d=iFW!%M6y0^lr|Dw{_wiUI0pTg zRQO8)D(J=lzaR}6`oa;w`oS7x;uuA+f;^WKTD8NT?8*vGKOATo!7*g12{m742-Yf* z4lE?~SS%~-+H`nf-E?n4+s=DuF+PG^0e#t$_WYy_drOUX45A&l{pQUrrs4)$&yB0< zm3pT(jA2(wWxebDww#s?cpp*#vXSdx=ZH6XfN}~v4EZ)79f$z2^F@%qtcXD3NfPe@ z2Fkoo4n=tsO(n%vO;Tc#Z15$7>0f0T*#Z?u#Wt`J=EsnYHpxHGn70fkYMs9R3!7r|kjfaHWYET&GE*a^+m~I^nrbYYT9B8e zNshHxVv!Pgd;50}gqs@%>hh8%#@oGqXLNExOq{hU2l<*G28c8W`IIleC;50#7U|3& ztpZSyEuK+jTNA^Q!Z9hD`I*fjvE+iW455TP46qd?HvI^a3koHH@r@!ONxb_?=q5gX1B=j3M! z94t@}`HFq)?WB(R%e}cBRo2S>^<^oZjZ?&@=kM8w<(p{z#FFP8(7w55=1;Kvv|3or~qWv42Nq z_gEF-L${yZRU{;fSiUUY!0CeBzqhBH+W-&tvnOG-(Kv*elz9Hw}> zeCu_SlkF2avJ3ZKbxHn0gSXCpdO3vV=~GruvO2Y-yVBV=cg~DS8MeICyovDPK(2g= zeWn`~kB|gV0X)<|U?jXi!Gcd+o;u(wggO%ULqI^NSf|tF>+)^ME{B|{ac0VAf?(vr zom1>X{Bx9h)05#O!f;aIwv2{JQ(NoO#9mmndaux8xWjEI&9g--;zzPmgBw>*RR&d< z^om&%(kI&4m9pLvWX^;K=0KmXQ5+)~m`AmkiLXG5^ghA1LWyXc%PA?C38h$0Y+n^= zJfKOB!C=s*iPs2M{C1I>k6Nj(Rf=s(&W zG$7(l1*E`Z)+GpG2S1~Rcj?vSYf23IIlsf?3@Q9-#cZFVo1-)FvXN3=%4 zjV?=*dvTBuZlrsE5twf_mrg55;|je(VayAW!uIPYC2d@hS3X5&(|C%VmVi*i~WnoN&O2{c3p2Y^2ozfl8y3jCWg1PrnLIXG<`Ge|}*6kD<3cNE3P zDkyB@IE;pB``HLahjs7}0!wVHdV!nEYpR?9c{GW9=8r0L0ddpt?ivyP6bhRid$AP} z3L4A?Q3SI=6l$_qh5c{}cO!C<#sk`R#t>#V$>XqU5(Pt)Q%pvQZiFEwK(`LY*Sm?nrqYZJHR^=QxpF^?_@6|r)iBT zafZTra8ijZvU*Y?5?mAWO6#(s&&5wevIs8+EF`x*8Wcsr)kBsz-pmxDNFJm}TuFh$0!T z|G6ZR;deec^a1t{ZG)|riCx%*{(M_z5^^7m(59KN*~aByLgf)D5kabSKVdM1t6yNkMhZj;6h$^e2bBgKo zX`|kf!6LP3iPqXmZh6Sne>&7O!=+SC$wf+2CtqyI#m zo9Xt&m^>NLrL#9)xW()BTVrch-3%F94}E&C)Jl?x8@r>l9K1ROE97H_d<6c>rScJTgfgE{jHh0{-C8X4G(K*v{pxbKzu4 zrRquiM~QZmXH8q-tcmu7oR$?g&b600(;^n_Raz~@o&N0f7~wpyOv=DJG+GbX3QR2* z%&fcZwrf|_MeEXH12Jr`#^9T|X4Cq-@>+9*w?MX0G0!)^zw~(9#?3*NqD{bTk})5+ z3nVdFQVZ7@8rk^9kS3iXyqqw|gZZ|?c?=kYRW#wNIlBXZ5K_uAMlKfCEjfG5;}FD0hqik*w2jqsb;!v2nVv-^WG0QVB0bqQ?jLDdgJgVZ8?QEfe$|oKgys~O)SJuO8iAxSW=@10X38sdy^zu zhix_-QW69!-cAyxOhT$E9X4EK0ey;m)-m+Se8pOy)gZ#yz*L_iXy1e9ONewMV?Q`- z8y}o}HHfhR+@dq=z(XDADsYc&(AXm0)H_{}@dr!=tYcADl4{HXo(ff3IH z9vd95)DN605W27M3eg6P7>lIjOOe+oJ0pZN9`TdnDyU?(L~F8ezl26R>XVdpcd^G( z=Aq;Cc&R_+bm<<7vQKGiHjb+A%2bP?z?m5>tManz1s=(;;xjN%-Rg=NqrV$dE&0N? zGG3Rb!(Ra3@+Bv@NZX@vNRbh-kZce?Uak@JGs?Ns>wIRq*wOtI5M0Y9&9v69zUqc6OB8AaOE6fqdDVsjzq$RTm!G<_d;KO&5q7-_TvE6(pL#Oj zkB!BIDu6mJNCA=OD<+nKjg#YMrUG(F2&&4tKxqgthvpXSH|{K~eS0z{=(5HOYoD6% zLJWD;&OO5sr*n9LL;fXpF|4nse>>~JZCYzvOM_v|a$~EwR$g!cjr^2<2aIXcOD0;Q z$EI2Wiuyt`q$J|wtJH$?es21RJ=MZ zOCPDXdDGIf)8i}+iyIS^iJ7i6LkUcDx_te$?HP{gyZQo0=x;tOtg*#bUhvem)`QpX z94O6g=(68DaCs?X+DvD1nk^;DR5a0?H+yJP+x~(&mo~WW@ISx@R|>vW1|M9FzuF9E zO)ea7++WV%!A7neSeQb%Q-%8;Ojj1|vWpCF`v^JJa+4D6$vN;vq@CgH3R&}Kp!%p~ zkL;=uAJ@_GJ}y&DRoNK7gi>I7dcGqwdjEKDSK!6-y0(^Od6FZ}LiiLJ`=20{ezDF^ikVZ`WFVXr5g4Q}d_ zWm>Ve3UBh}=KO}jthA(Pg+900SM7~YPEU@ntxhPfUDE1IGTMwuS$Y1%30YpVmPO>w zzJ7VP;+D9)?yKIorm(dvSD(>XW}Pv2(Zczj84J|2%+)hXvX`#EVBHe8%Q%!;-dFo7 zO}MKb^P$f{N8F|q>F?)%cM#QhHT1cs5o>1u#Q*#~yb0G#4Z{HW<1`xbP1r*M3cMe8 z#q^OkAYOmtk>Gb90|SnoQ$9Gbau7BU=AF%sS&!Jxrw2abko&&K@dpExy>a; zcX~8ZyX!(ANHkeZiCKBox|$FO`mS5v9hg4`1aXt4oa8v z1B#WfgIfKOA}=Qz-WB2A5W9d=pg#&4hv5S`4i+vlB^mz56Ieb-ZszdC1T(mU4w?Bq z$1GWv;9mG3Gqjjhp|_<7T;&JUl`~hAd3)L?yIad+3LaeRn?9)}+g7Vr%*bjgw_=%# zq`C9q0zjfU;EDZRQoCwDxX>(w*ms<@$4iK5r;s`FZb0!W1F~3+EjzMK*dI1FbYeZy zMS22uTaN21rgM(|BEwa;bn)B)L~$pL?Ei{T{Gadt8cVoXaK#zF|L^vPy{0qgq@;Pw z2?9b*F(o9Ja)K@Yms`jbx21W+-GcWIK5yJ_KoTgD66jXEf*4ghd0j+9 z8HH6stW+gcP^DVDn5TT+%qo($;sJ!XWk%u*?)J1UM(U6$rwjFX`ejFUsY1CUoc^sizcQNWfaeBt20Gt<07@0jwEke=8fmb7K}pzkLHpK z(lvqn6oW=-Zdg94{gJM{fxu7Jx$CC8Qxht;y|mlV)jPxD@|j|c`qM>X?HKY1uncOk z6EBC{|41fuUF>fVE>5Rdp5-7D3O!HIyvRo#zfOq8Ns00fXt7TAb6pTzs{#4KaQFYL zr(S-uLb4l?U3ZQ<$CE8K3)-#N&y}PRG=Uu|kv)LmkUd{9*wO7rlvxYWw zW!5b}`0I;JQ)dnqdgpl5G1?SIxvTA9Ti`vadGh$TXKob?rkl%~1(S-33mqxRnv<_6 zx5%kH!1?fAbT zdEbwQZfLx!F1)E(*cop~7R+G^S@o!RgEiZ8rZ&`2>XCeEFfh2@LQ=lacBtU?)DSykQK%svxH%EV# zTnOAWPW&Uen7_xry0dza^Z-q;|*Yihj}?rgW;!(MYBv>Z_`mY_+%SIku;z@6O*@$cyy$)R&sdT3q$=MZLSCCcmJ{Y1%W}e|rD^i=Q}g z_aEHV>e_Yh-ko=h`SjKrcXoMSt+P95b95ePn|S2>(&Qcq|QGO0)-{3 znUvK-hROAYv>ORamd!X3b4W;uf0`H&9N&udhKe=n4Zq8Kt~|H06f*i%)EoYIWeJ`j zuzEvSQ#ibTg>&1COkNu|7O#J#-;;~L2RsHC7IW;Ep`!=Sep#w7*l$E#T}x9q;_8oyPuGAX$7oL%Ex1bMdIZ!URRusGH!S>@;7FplQOEkUR8fd z0!dL~$EJI8u>MsY}QvIbnEvvYY z>Mu)K{iVIGe6#hJ4u6XJ%NyUgVNw#-x{JFjoPmg?z}tZBs3ng>(wW|Pc9?+7wB2P4 zV402l6`<7&-!cU~$^-y@yvv*G@7{OEP}fX(ZgIp>H$+q!{dJ}q^NWfl>*X)}#sBz+|K|^SBnFd#cm9=E zU;oKx_shWLeEn>;q5i-_I|Ap*UspPt>L)gXcoA*xi$DI^68QPodJeDdXp z*T96CT{VjBM(l0OT~|k2eWlEu(R&ONKjSH_ICAofR+(UA`G}JXqa&^Wi zNKCcn7uK)KzCM#>Tvx23T$%kk%Kc#&xtW;#szj2c4uz&Lh{%BTBkV+&R6GU*lu3hPR%?9l>LGNLt+*Nt3-V+mnFg5{Ee!G8p+IVAps68luaaG~ z6?>K8K|sYOdgQ?^+pEL9ZRWsq#H}%yi@c8ZB`0c;^|pM4POaFQsp>t}dhq`0csX+L zV<+?K>#8&3rYh`I)Nh}GojMMb`Agw!Fo5DSYyr?-B5@annTly5y;=?bLPad;oLbC) zAlrqLkYP;3ziLEvB4JPpi50XWc@XIkQ1Qf4JFCVrtzwy&;JAtDiRr0H{HF1-(MWqu zRhhS>*p#hXDk}Oa`iT6g zHsEmqVrkCJ(yTuB#WExEilp64A0Yl5gZCh{!eWJp#IcZ@pnmkFmG<2i_>L=4F1ump z$$r4ib9*DfHnpSGB;0GCS-K-~*MohnO&!R&8Z$ikuE|{k1*yxFu5-fszwRtQwa{U5 z2a6*^;rjIPfb#yu`$lYgceL-U4=PQC7QI528=CDRUCQDIBJalpa&J*8T~}gx}0p{HKrIRTaXJnoE~$LO2IhUWGOk>NXaM}&Wjuw z6U8hNoNU7T&%3(Y+e+$D#Yd)%#L9L)Tdq+nIx2%bttX!oS=qiiZC}pHW;7eMvJ|{* z%9d5txAB2v`#; zRqU@U_(N46iYci2!~u*jhZMU=3>OH4FO6oAiBy9L;Xp_VG4K%^%wkTniBJ{$1@U_z zmQ)a~Ts0_m^h<;3M<)-VT~6^Qm2|4&kCk_><@ZSivL47_*gs; zd(z8&=nIGjN*Gqu^QVjeQdT?>0W6GP61y9SCIq>!{~U}tjby$kbnp=MS=%GCxIFw#iu{ ze10Mxiltae63-u*2{GddXx3PQRkY4wt+zt(3gub%+ie&J}bq|ELmxBta)|I^faC1yW)QL)9q+LC}rsd7Umt{0Bd& z!5PaUte*G~d?fHAYYa5$AW(8k@8s^haQ^sFr@P$gbXolNG^|}Bi?utE=0q--qzv8( zqR(&SgEhn=8@Eh~WJ(aony6Zl53F*SWU7tarT3pt%hUOQE!JmbXQrz)1^!62??j}c z$z{sQv4?zBkL*&)QTyrLTis}@>vHxkv|2S_1kBQ1;R8?V^K_Yk#^(Ia7n9tox*hEe zR!iS}Lte3?I7YdpFL5)xhgKtB5C;K2MPa&BGR`EW*h8h}|AM9{%#hM z78cPF5fxA@%OFwK@{P8>uA@DrJBDUnXsyWIeeUt0y&vA~_YI%!Zk~@g#-9Jl!{ZO{ z51GMk?GG5dCE1=PPtUPFM{(0+olJNxJhxQdH-73u&g4B4zVfl#`&y1qcjp-!b{q+x z{_fRjbRy~YMk@0Q&E_G0VZfQ&ckUxYUHh7G0x??zIe{NxuUNUZFBJm$h4++X#yAqP zd!RBTKO^}A=3P(;k(C3lAP656P#NHLNab1p_RGu8{OI~isW}DzPFN(jLT>r>-=y{_ ze*Kob9Z_{LKldZ}#=v6p;jlgc-&p*~lxiX*R*@#jFUCCY6HQ}v>=pW7C8xMVv%)D( zc_n$o7Ir_;%T0L^xx=>j?bf-FeBll6MtXb`ciZS1nj7|?aDH(y#}zjgH->7`F z6qcVu?x2l&bJB6kkfKr~FA)$yb-2vN=k`C|8~q86U0cgypGS&tGPKRaGta!d*n7dN z{Kx1&D)c(D?)^VfM6|)V#}C9fq8RU1Mi!7X(HpW~BWKPyqE>S#(n4fRVR)USbP%?h zEGH$0B1{T=$FjF%K*Tu|nU4!o_dk+DF@a@S&AU%8x{7xni&d)mN?=&lxd@ZV2!-R0 z7{d3hXd1CUz!X4M4`I_fB`8-NYV%TfS&_o z6tQJgW6zNrOpz?MuTy--!ZA73RoJ`@)eU$=WrZJ#$)Kj=L`3$=W7K*|;Qhq_yNvbV z5PZBUi#6+Tx^yT6qD5@tf9k*Y&0B*td+&Mi^?hv%kMAwlsJ;F5Hev5a|M>9a3qyl< zeDz|>+^hfgkt+Yt+(%C|-f{7bQ{VZXwQ*PQ&xL^t&+pp*$-Cz}y;|^h6jpXs=K4%> zU2(|MJk@APH$<=Mht58|>(XDpvhe48VD9Q$dms6D-nCE5rtQ(_zcinm3<1zC>bBJU zakTA|Js)NxB!9pZ^fLZ9TBI`G{u}3yGe=)hyoR;ez|Dm-z`VmXph`hYnU$E|TY!uT z(d~%fWnq?bMr_eC)x74nOgZc7f;CmOu0W;|@m-uWQm%}Jg{W>X1Ldp8s4*&-Wtk+3 zvB}A&do{SXGPA6rGDlU?JQMD_<>;}?pE}V$W&jgyDnQj=WwqbeuDJGZKQ`qH>NI`d zQm-R0Fg*|eqX_<^IGYk}b=67LSBR-YH+>tj2yl~OZ5qy7?9cdd3nVpQ3h~^T9PPHG z6`t}Nw!Z1e1=mt_6&fNI+u4yDug*l_#_IQGj1rPIJ=4j23C?dhc!;q4f|KHgb%0q<<%Mwa2r zvRTP}b`QO;JQ^FF2EJ=vR(!51qQN4tBXy#6aGYY|;hBd5IC$C|IWGEv|EH*Oy0re|FdBQCE zY9+7b4X+Z{w6VR;U+c7Isufg{#?~~o(?E1)^^yh;gxEui@zhg>6fK*SV|d5kZ9QNQ zPT5uVrs&IFQS+MHM-3gTd=&p zo0gf8oxHf^;7K@D_mfXCdh)SDJrA7Q-|GgD@T!obIQM>Ey465(0_I~0_GAZq;0z1T z@kQyNv?b!7*j@)_47;6CI}=idAfi%kP4a-ji4@0-!B<{>F`-Ij#9NazhB?91nxup4 z2)7_Oi7qe&=20~}ghhHrRl1OCA{{S@Y9ovjKhN9K&FQ}Jq0WM0r%>vx-PiAT4d3>{ zx6bu1RX*CZuy*zhxUrWMeS*ShFLE5e<4TJ*t$Mt*^{!hF4V0Fk^RP zt+jCNsH8|I6=B9|^#hF=6QUEMmS`pDfZzk9k1Z5G>kG;4wZ|_cJ6@P&W?=I5 zY;P5`wt{A_y|uk9jHk9V)>l<{T$Td#v0Y=2Z6rV1fGM}%#?Y{0zKc{%>TS6ZG>rJ< z#r+Dt>vxz8Z%Hk|gkU7YSjyrr7hiEI@!3q^l%Vf5eUfM`z+mqM!Td0uOL1(3JXn(n z;=XC)+5nIDxL~=#!4BDo^hTmLNkp)bk6`itQQ?DQEzk6?xx__BlEgAVa`i$a$qjJyqP`C>0!O!JYnFlUS zR~0v)Ha^w_tn<^K|H7vpJxWc$`rON#fYr_4_wnDE!f$4}@IBR?ScBu-*Td*|Dae~k za3YX=saONKY;>q#gm4^cO;mf?)+8cmX89U#nu3VC#s>R4+8XOC{KZ9d$gZgXkmw-;YGt$oO_-28C`R+xSW|^y z$i4;|?t8Y$rF#eSYb@ncgKZW0)NmniXzz|@yQTfu$iXKanVvlljPT0$sL{f^Xtb~| zSdjnbTFp|PAA9z6M4>CZ<)d$W?aQnI!{EKI{mDCrM(>>sbT?H_MLf~>qwg=oyDkj> z!G6|83i|+gIM$P~hr1)3(G4wI1dOiGos|G6qN^_25y%*M0d=OP-UE{VC>>f-+AVP* z2A{;ymEvl4T#?r3;d&w+jrElkE{9)qO2G4-lx&lM-U$_mSnQOKk&>FrQ<{y)FZ2Ah z$2|@HQWOdo<>}RCZ+n&VOvF*+Fl#C@%G)O!CweD87yb0HHy;?bghm2_Mx*lVI6r#& zbGJ15+DDzjX}&W0W8rgxK080ta`ev2K`|SaRTk{<{iOG3k560q)V{e_?;WWaKi3x; zD9=&l*vg9sk9AsG4m~u`ccime$a25`Hm&)8U(VWGMnp@o3UNoR!&z%dx^z>VwTS`i zan|O>IcwwB6EX;Sx8wz;WT0KwnKC9#G{k^Ee9fjhPG~Spxb6 zR`H?GeERE8T2*czxhA9Ra$KGE2a#g~K`T}E+bePwY`{jL-D4Go?j^Y=db{VOQI z_e}Oy9=U}N)ph&L+G%re==exKTgDFG)z|<0 zGxzRq@QhuazU3!hI3ZMxjgD0h^%^{$Tb~#$yrynjym;$^*3NXy+0)qC zCl011fKPnr{n-|7@xkb|V(%^)VCr*#nMgJ)5O9q21p+K{<+=*X zyka3(g2{ymA|74?n#4rZ;&5uE96UpTI}vXp;XzkW##X*m_xcHyy#0>X&rIGm<~El{ z#um@q83~Lv6c?inp~+#WJhXq>cKw%zLQ7>suCvBk5b)#`+o^It;3>*XFRCc19u5}D zv`rIPrfSQ9uRb;&n!hp*H0`Tk$^asc(f8C zfoS31LcLX>K5kjKQA%Rl<4J5R1raMF>#92Q;LG#9XLpu4n$gIj*->8Eeyn1_I(+n@ z-NF5X{_xz%x$sE4f7kd_6~8p};K8PXx{2ocsjm7!b$y4=A2@Jw@`)pj#8EbO+hio% zQ`uCRQ#IUxAM@|PdkVF}^EjX--qSp$;Ye+*$$JWktsD_f!F!4uOT4G62S9Hncu(PW zO09F~@cBQI_mrJgTj3st$T)CwVL>kA9;T>MvQ`(*>Hiq+VgAM!Z@j14kNtI0@Q7Bq zb~m4{F6A>}&=iDY|1b#MU<{*v$zz;am9A2!ALr7ws&ws9qX8|pGI>SjaXqg^UPiUU@(7L` zZR9g?#3;d(BY}og0Z_p(KY-Re{I5h~qPQkj?Jr)u>*ym9-2MBc(fcjoSI8?)#6nmG8Q}&pTBa&E|hT{l&+oq4zz$urF6{ zaCBI~hM=#RI(zp$%_k3z^mUyY_R-aW8vbf@arEl#y+j`0->28xoARCIbm6^CCl40X z?`nkf5WWM)&JOIUE}ZK_;eKMD>Tb(cfUF2)B63hoBIt*rdqJiI<14&q6|xjCjaXS3 z+cE5PhZaZK^bqdS<;-^5ydDk97K_k2QQV;zxk}u%sad#kdaa-a z9&v&4M9T={I1Q%~G^%}6&KZAEI4gwis>c3SYnRZuGJS4JijnMylnhcj zA-6CP$5LV-9ZCf6K}^rvQ0g+|=7F*WNe&cOQX&J#4r5j#+G1cV*etTh9yJqBRARCo zDA@XwcfWV(JUV+1W#ku?=1oW61&8=#?}>@7whnhsXGcpBnyvHpruv3rliwKXFV6xw z$PTODY0u%8qW4}nWJb2YIIqdFWJO2hT=YoqZF{=PbBF3%y0fefV@|NSy;vbLS9X`@ zRaMm#4CMGD6{3D4&iwBp)ZD^-@pU`M!fE;l+UZ4cB4~=`vI8*4*$II8BHM_~7xQb9 zCcugjK5+!nNyOE%!4OdLAXLc9R5)-{O8h~ZX@fD4H{}QsqIS4FPIsP7Lo6c@H=Q|9 ztHfg!*RrC#T}3$I;b7vRPwJ^7|L)z_T6Q;Ca!u30fyQ!Eent1uT}``!`5jG_jn&1x z%2|$Gv9h{K zp)+Oa+fO_`^x_{cxuWug+w#Yk$ys?X{4ZA`G(v&MfK^cnpESbl6tB=3LSFkxR zcZu7J=6vjHPh5XoICVEoxi7NQ)3bw3xxT=Z*?soeVgA~+U&xHhCSBBx`!VN5+;j23 z9>T0x?Z`#Iypr>K!K6TnFut+aEYhU7urE?x8aMGF8m7P2xe^jhgk+@sgEn?lKVvYh z*gs@3!wQxx5+*hIeo<-#*?)7Gv8PY|be1XCu_)L~OOw3erI>1V zDQ1~6O$mN?(KwGeLP@7mf*CsQanex=|*#{x=xALBsB5<)RV z;<#m@*nbZW^zHNXiX$MP1=3Rof?9~y;t$d)MU-HY zWigKfutAD+q2(Y$ZipFemrRyvXs#G;ttvJwjx|KD>4$oIN~;ZddQGk_v#Fyc>-GB& z-`fUUz}?oJi)Y(jS>y|r0=IR&Z?4^O>Z#oqy+?mgQ9g3){N?ax4%Bom)}C&iyLY@? zlPR~f)n5Ceu>YiU^y2v6{cUJZr}HE_=tcAVzUbFyzwn9s=j(c-lx9Ni?E~lfPL55G zH@P*g?|AAHvqs1B*66y~?8Oz=b_ORaBr<%HxxUG>6rG#@?YX`YQ;S+;26bF|o(A8kQYl-Y8b{TGX zGS#(=xza3f&5gA+6@ItNYBA-cX#tLi2pxnP;l0RDQn0uY$y$Md7dHy$HB!q5{>#Ch z@_db$s(rDnGw8}F^m}~fo`sFNB^=gQw+#*t6i4qgc-&`^t5uZrcUo))#m1cz?*00m zeNObP-~v+IGDI2NOmxvj2Q)|)!lqteAQ7PUgb)c4wjmBYE{687>Tpuye?wddEg?*0 zPKH#9H?TkgP15z$7j1*K5alCHC5SMhM_nUhP&ah*t`TK^X;F>Ws_tQ}YN;t_QfCN> zBt1}y_DY3Kvu(j)emr`)sDRo-w7dB6bFJXspF@PcqR{ule&H@3{^qA zEyhy{nbeV#U%K?nNS-*g>rSx6lB!Jx$suY{d=qk*;=b@Do7o_fsbU+-sndYmTPCQm zqZr9Hw@*uGtX!&rTD7NK;?>~5!KPa8@^JE%;=W3CIonxQf!i_C*BfbXZVJ^BL@2($ zri96~_4e0R=7Q}w*=wtIoTbd`jqkXvO^&z=2iMw#Tbn9rUkW#V2;4vfb5##}6FpUd zKB1jSkXGV2M&?C^P#7u;sWTWL7ewg}Lrj8Lpr+96@)S0@T@u4?!nKj&V898+t96oT zWf2QOx`n)Yi4~fUX4*@N^p(f!{GipCeCiv=+D`4PEDrVVobc|?^As6X8u0nMV|@N~ z{K+5ZGiTl-Pu^a8pvgZq0+9Nh=v88oi$H~|4>@03uh}7S5=JfG{6{|S@UHuLA zs6Du&Etr3(dFEJoX_;9Kqnp3+9(tlY33-fgW8u+s6u(p&sI5mg0!5%BRDO@+QhHyu{+^7rAk2rH^h0z0ZS^A!LU*)*+zgtjn_hG z!UEs?K1!5@Lq>QdK%ZbD|MBTdhpU@Wnt6a z%bz{^$OBn6U!K90ot}28Y%~%y@IODF?aZ#}bQ?O_BPU18+&k`=sC)KBbb33xpYpNV zEJs)IsrD0(4&pZn=so)@%xB_ifk|Pm`TuGv%%tAoRauF=EpuvjKAT6y{ zr_L~l`3VwZeJsO(-a%r9VY6e=ih<*X2O{m1+;R9l&eD9FE-BdnD^M8+7l;WuWh~V| z06#3dgmMW%v52%i$Vr6c4~rpHL7kzmYcyAP?(1n7ueV5HXtlA(R2py-C2}u~hGD9V<`DLzL~frB~x@7^&^P zdtZGbEGv}QTPJG#&{nYg;8$`87OK7n5`H6>%ei5Zr-ijG-Xc?WmX4GA(Lsem?NpUR zIY>pwrb0gvd;(XKb%jK9O^3oe(jMS6ju-G0@X9C4`hrCnCAEW#ZJ!HFoQ^)}5OVBa zE)4k!vMnaB!)nr7{yO?v^r!#u_kYOOJo1Po|MDgO=;;TaAFu58{p(MKw{j~7gO0uX z=laXPec)4P!~gn;PwMT%lP$|p)NT2jh{l_>`^?5_o~GaF-w>S-HN{K;A#b(2$B+jF#_0_)S(?}M>2+| zCr5_5B25j+Xes?x&{7+5gm1NzyWm_&6&`(TC7t*dyS)p4ydkGJbR6&_5yVTn0I>i2 zu+hu&szzQ=5A#}$tlPoMLD)vA!w{7Lzy_tvuZ&+n7aJMc&2kz+D`>Q6LWd-y4C$;r zuy5cmYqc>{iR5-pWuI5Q#@4tdh5DXMb;7xU$^ic42uFho{*D_aG-Z z))k^^d3Hb&zKHemv#FALEXom77b9NOeJj>fN_g2kFtf}&_;Ud;PF88JE&iA_0^SVsDFBU zynTAdVt*j>@|$-Jmzy+VukUMeZiyE>(H|`R3XN*j`Sp{{>BTj}=RR{*Y^nahc)9*+ zc5!-!y)0;B4b-vJafUHWE9yJ~aQ_Cvz1SE^9Ae}Qh*ws=yQ_0*wb1~cAGGZ{{da>37ZYvneY(KF6v|7$u))R)nKAU zr8zT|5g9v*$QXD7up{TN6Y(z6Vbva{_FttX)CSg>=hP5WT0DFcb9zMZ*~&Lv*}7sy zUsBc&Q|9&+)uZQM^jE76oRcdLr5MC0sr6mFS*h%k8=g0^=sfzKwJY9WGHB&6o1tnW z`d`ydl^QT0!h@c|k_4pk4J0c3Zf|aWsS>GAQ_|99o)6Q`E8m=95h-gC41GCw=Yb`r zs+;%S-T)NNw<`u(15m-c_AOTO#{9Czl9I+UvswKA`PaYT?hV=0M$*XHag`k2*H>ed ztCO4iDKN}uHv2HVsVqOgtm*yPWFQ8$N*I_$i?go0wx z2>GN2fkr9ULs^50^@m6e092}&M@tO=)_n+#z>FqFz*s@mT}3&XDuYKL&s_uWPm8sV zZqE$Av2qq#dAp36=u)hM*)P-sdh&lv^TwXi2DtebKMYZy6-BL77yQj(0imf$TH6Uf zpYR>2M0yEOWfr_h_V($FC2ZLo?8OG24{O1Pg0N&!+)6A@n0XpliHO^(Wg4>f(8-lM zny?ZX-YgDoLbHUJZHZBuqnj8;lM+~S7_&_iPZMoYrb`R9Gzv4sM#Zwp4P1lIffmq) z9B(4V%$zA~jCCx?I8AO679-n~y^*z;o1bg1uvNQlnf%fn&kX0e+IE)t4S<@n{ zIJh|Ha#rS7cDTj(#e3jmB_F(#?_7@LYy#v~BhzSM2rh?M>Lf51r_sP3To>0FrhCXW zT7*B=y9Ya!*F$+mwsjxoXe6MU1>x=9hV4U^4u_#cQ*CZ<=eYLH_RdHL1q)(G(6ntM zLCFff2{h>ScbQGRO-N|mKo+>n8;{EaSPy%-(_A>*+=Uvz!-!_h?ah@@Cjsylkuv~& zh%y^iEr1B#3|j**t=x*<;lYmf`k>ES3gs2EsgS3ph+L6?Q<-7^2~7cy0P&P~aWJq* z)D2Cnzz}QWr8-JM<)Z7UGdz7Fvo@Xn^x>ku{_c>isHWFzt#nz_%EK5@Jl$k%nyOE8c_ZVKJBtjt z)q{H`d-%-BM;3yrEJx!+Q{8O4Bde&?D9?6;Tq7fU4zgXODPu+*V_0^RO?xXUEXo`LV`Rvu*mh%F)Kzq0X-U3Z2#B>+2id za|$|xY(46I3|xK#{ObMuOX2JxY^;)42jrOvbibxfmgHO4Qi?{cRxPY(hzzx<6x2!y zp%04?D;4go1l)jUO;G)M9j{SomOvi9jT;bRzlJ@X`kNqMk?6*};ll~IUl)J)*2fcm ze|yi~{$mM$ia=mv+m>{v@kY*i6^yfVW7q zqU-c8*Fg72OSjyOy4kV38@1xkQbPX!?fc1QtB5O_gY8s}2pc?U#9CoI!DNXSkRWuc zV*R=$a0Xd2>T$%~)OqS&Rx8mP=xu4n4XTlp&2u_+TdI=)&V@2sz_Q;*+ zuAk9oSRK~mhxF-Ir&VaKjJYoBCi&vd%(ch$j`Sk0zrla|alJh~zbp{;*PlWe2y|lR z4YT|gsHHC9JlyyjcB=rU4D97{tY|Yr*?=TKct}%IG|Y{D1u~gOWN}RST^aGlgZs?m z#tlo#^9`h3f!ig0ihu(PKC7|JOsW8H0PxBt-1~g=YgHrlRwAQZ7%VSoojQKUgHJv4 zT(4uwDG1TG>P{Tq@8|u(FK+vnpZ=FVmnR!}b6wf)(T3;0@}2L0=PMt-r7a^}c;BKp zYhHZxclVLL5;)@xv#Ja4)X$9}4rp$`NiYyW#&Q&sKZf^Hq1_DZWxOUOKI%AB6{!Uc zk~&(H@WIwaRB#R*3)IkLL>7YP)o7hEiNmA12d0E}T*qs*9xWj~NKC=y;}zhfQc%f$ zs{165-qye}E%h-a4kn;)`g#pHPP@bHG8gHUB8|M%-zFw&z(IIW#BN34d2=Q(TI^|Es?o zP0U~0SN`JXXO;et$5dRIUR-If*wyAzUi|N`%%^3fWtvKcJN)`AlkWQa&qj0KRV?Mt z-ucl9eF?F%L9j;jOZ2EI)7A{5=CQD`Hh|DrbAueFH`2q6JQ0~#z(iVpE&(+X86l&3(p6L8j_8Ces4~afQ z1w6uw5dGa94g0#?2AyZG)M@BKwmPe$vH(r2TTgyO>@@V|bZK&@p+AOA1tAwJQ}i0D zsP&i}z6^`MXpLS&fDMU3M^UbYl3XL)bK%@p^cz|!TRQ1!+50)9LYD}wAx9JBHHE8* z33m(EGwJ3r=|);29qn!5xO{cnmM`xD=Hl!Usne7wm&svEBm-#ToL|@=^e!b zalP~5wP!5Ru9YbpC21g~3XQJej;zu;o4xoqpmVYikJ;vIJaq1z#_h{HrgLysN6#`& zs4?U}p9`CI?G%)%+38Z0dV}s&Aw9^kmSJ(J@@1b~R0 zyEkzztk6y>iSbSh0Bm!2@Sn@_MJjEz&g^V&d%3f&)HonZD=-(7nzS}YW%>3u&JRjj zD+_a7wMB((b&fn=y*tBRn3ZeuWZ6Ar&x>dH1=T4wU*p`D!};R~T=u0n$I1MqbG(Vu zs8yJ$<2cXNROhOctCe62O+G}HDK3Jxz(0~~rtJ@p&E?pR;lbYS4`wdKoryXFmsr9~ z8Ix^Jq3{`X^X`)kfyo^szJW%4)#q;wjSu$woe|TvXHTA2+S};JE6l5vFD&Nd=j1Va zR^aqEzA66}Vp&bxF!yTMh=?*@#w)pIWY8KB*CO@j#Y{Po?L~?mAxg$}hb;wQH1#ZU zqiRSl_YmT+3eK50uZgRXU_80T5F+*7%!OrWxW=OTL;Y>7_?=DlA&1>jAo92`<_yP9W2z8vYmyXlQ6|XwLS6qO(-3qz)Jokgg@pSjGaAv0iKl zRf=vNi`iCqKK#kw?mqp>Qpn(J96RygD+jtS&DIhfXI`ttSdyQaR#aKCtSLbBHHy{F z#K<_iKK1HrpL*;Fk#Y8VmXmRgJ^I#v{p&;BXU8gz?NjI_BUhB??=pFYxmUs&Em+TS znZ{f+H@!R@2*?#)ga~lJI$l$%o4cOL)sgDfsU)j28nPs*#>-d`_1#FSc3HsW2*|e~ z*lWHE?dSRS>1_%3<(FahaIR>(yazgC5BI;qrcU?-2+(MNBb0LVkVNUBvoL`|9}eP$Y~KFgKmbh@<&bztddAhIR}ED0GM zSNIbAPpJ|c4{R`r@(Rc8kA9@nR~*V|Z}xRg`duwG{@iqz1#z~b+_YSSrqt)HGz=Vj z{%~Nk`-Y#HxiV9&KB86!E9=JUESk)0z1eNZF=XUfGc8~s{c~Bv?O(rdlly6zUJB!U z$Y@Npk37g*DVL~Y_a-;eCI_&c)GZ#t*fgqf zK(kaHRqP1%#D`!U>RINN4^18r-sH7qD%uXzNV1G8^La%qAUb(x8#Kyw`ys1v_)2lU zFDAD=wxIow_ATq+#9US7tWTTej5PK>(sO`s@UlP* z{~mr1bW-|_A1U8JH^n>oiLkMPm#J@=80#odXjOV1*;!aIRBPIb{JBz1BrHmmTB$mU zU@A&Ev`jszNId~oPr5)t!fCw zve~<^a->x+N54wU*i!QxY7%N5r3XHWUX@>ZRYfBD@sWQLsnDua458IH0;l_)(!gW&fmV|U*v6V z<-OJU0=Qud9J$)|%92`?<@B5wFe=mXJ$8a=>0)^dYx`n%+pz(!d)NJQqpv)r`Y#UZ5=RH{~x3{{UF3i`);Lx86b?m4hnQ8!$jXKUIS5UQe2Rn3m| z6sYwIIMh~8US*Y~s>4}*`0SODMN4bYUQpTLf^4Br({KEhycTvz54stDD4d3FT(X`} z2CX!LGLfa{Ntk5l#f3sWD)SNH*9qH%dR1ZKnMFciH#$+pYpIj&%IhgJlHJ?eJJ37O z-xq18-U)fRu;aGfS(o8af8@FIg)h!7Ji5DV^HY>t-d9s`{Lr)|`reyl;7vcWzqWDz zhkCXqc;7%>aenPkO_IF_xypXYxpCX~o0|w58pWB?XLcO2qQS(R8z7j-6C8wtjaY zcH9F*!^yQ)aNL*{t4vX63|ttbo6Dh7|EBN@)g?&>K!-F4$gk>v2 zFDn6_vYQh9_g037`BUtZa$8oGt-QdDgvw2?{ZFh26Ps83JFahJ|19a7yHe_#RWkq( zAE3cXgp6122y|*$HCcrDTYmWmuWcw)d{grg{qDJUnr>R+qIb!2rs!E&6#ma4s+#FU zl;qG9c$k%P8%oCwD$>J*0YbEdiuI_r8rnw5K}rb_5aFw9gx>x0BSRf+^&wALfr_v| z@lFerJWY!ACMqyR&w?R^;%J~1hptpw0pyVEM|r(FcC>pmSw&#Dkixxn2=_L-vif_R zL(U`5AE_;$eQ2g;usW~lmd_mTxpE|&VGmN53_4;J`Jt-1nfB76w#DB0E4!QsT2wdg z8EUogGrjY@jU5xMDdN6$m+IBZt}{;$_daoP##q=hI$qXw-=Wro>#lTH*JkMh0jIlj zCg7i)7_oWgkDd(HE%f=!Ree>oZqeWI#!nR<$heKW5KaeLSApszE{x*9m@0RGHw0*P zbP?MFcTsX2sp$n`QF6Iz62bT?Si|8puPcjRR|CVAV55XmYiX)1_m&ViQHwA~Kq_QG zd4f!06N%%lgrrClA+y97)7#IEczX8m6^B0IzIwc_x%tRMq#`f3<;3KrZ$B|iN$njW z3w31ro$*`0czL2G*V}*ijzI?-5o7>Hp+PhFMs}zzCS;7JkxBt+E2YT+g{^PIRKTuP@L)_=a8}BI{ke8q9=Uc+sBH-cO@FHSmf=w}Z z02o1qM!`&8)Gi|A3Xej&(xU*@K&|%msF3SZdeCS@1pI;+UGzd$-2*NL+-K%uB<{81 z4rJOO+qcy_fB;pA8C9t;Nd?=z0j8SWfKW@t<>lz0*k9h?-PwvhQV^J*oSD*+!hBPX zEsc3Hgh6GX5iy&XXk{wezM?a;R_VYGc~@@Bp#h)R;#Bl;YL1`1qqF^qUE0#7iRSR) z{9<^L7i`h!r{y+F_u%M2CnJGStED=EvZ6ZF5hx}db1&Z+>w#KF-VXyP)SaBE&nt0f zMh`xBEgG|8Qxy`heH5Kk%wt`&VjpFA4A4g9s0yH#kpfE6Xi`jA0{An-g1K-`l47~! zp{)EGvXsec2#1qT1qSG(LSAX|4a(4#9#lNkV9Hf$aw^DoaKsHEB(50X8peOTfD%ZA zA^;avR65B7&$3h}#|Ga)99WX9j)%rv9AVm#i>PLvha?-GzmoNNh~y1~8zfsqSlqLsb!8b2j$!RLkqk{4n}eUh&NO3#wsB+2W+4|708SRX&K#QrD&}C5km?I@4gi(``GMD6 zT(tfx@L3z!g=@UqI+ihO)2gJ#_K5f* zeMFHF7SQq|d*1&l#eT6aVGB@=3A-ridm1O>mhc^RV&ZdBJax5|sQ)mVs+CXG zA2Xy<$cn%`9B;VjMFmFBz4DJAC{X!kR_PN@l$4{NT(C*#k*EoXR-rh$Zed6k; zcI$J~gqe}!`-Mw&KZ1rS%2ei541}Ozkou7c*Z=n6OD|sgxxT8gIZ&LQ)py&Nzw_X^ zgPj6ihuJvqDPDzc9^+p5Qhl8buM(@RDMdhh1^XpfVmV+%0U&2gnTcqWd-b((rc4MH zV1yn#jm1(oycEh^3I;KpAD{>$L#@rBnqn*JeV4}zfK3-oAytkHt-lF(zD%PhC^X~b zK#Es=3kUXjA~SVnLt&}2w9sI7mKpP^%TO~H{e9kb@xGPH-CWw;-k4XlFcL6Y94?2& zxT=sN|G+(0U--!7d2^u2sx^5+R^it>6!T4g_0d)8{*<%atft1M)+1N0e(dQxW^!W{ z9+J*i{66-V419NA7401zs1@W2SW@7rC1@#ExHxwXJ-$keDo$b}P$ zg<&Z&qgac1K=vyNx|FZYEg){)yVoTT;5i%mkBng59^iFhV>=4gC$OKhcvN9_4}ug> z6iyeGCBUqx$U|w1My^E)h|}scTB0oxIsLFW0k$VY9e>m5xT!QfHU9O`xNgKDk<5HvjRHJHPjX?>s-J)D_ z^5B=g_m>B!u1x!TANa=kB8MqmIkcze!Apk+eA!u9*~q2o(u*nno@F*GB40S{7<4~- z&kb(zT?huY6V`^J75k_QJ;i#$od8J@lMO*(k)M!Jc>_EXf>FUMCQ=)$oJp(*tN<+N zDR^!*^4{+5?!NB6EUy>B^@({Lg_ut!I>%%OOp+xFB*Xt=Fk_OfjOyjjY(iXDzH&N1 ztq1=Ctp^i=_K>yJx;dc?J@oeJM8`o%plDCbfUU{$7^G-H4?y%_|2`f|FV(wn7ju2xGp4%#67uO z!W`(URA98&lTyGpzaw>of8PGWI|In)&B;mHk?e%Ov7|`H`PIaAb33@v@K6QL_#MDL z3C&>Ko3N>i1%9ZH`0()WDlU0STFu0s9ooHP^)WQ=BfrS|}g7JX=%LGEHY2p|rfT+@t34+xl(R@WTDC9XS-+4=^RCi_gwwdXGRY`M4h~8k1hh&*M*A5iSXE7p!#-7dJNT$ zI1!dOv33p`4HYPx(`U20OYJwaXQhC`3cTI+SD28gZk|5bP&2t>*f-dyum1em(8K`4 z+}+f=6Eaid?mCeNTw?a-F!$8!dUDmJ{9mmGKD(MD%L!D6NLNv|8pvcoR^aJzEK{YP zgz1EZh{AU|Gph(oSH0ml6$jeDS)8`waEjBzoEhk=4^>rCo;S;&MTI#GNiAiraDPw~eD+dzVDCMnky|IKds>TvgO$^VU6DPZx`X@n?43JstZDRt z{q>&yBV?06)`}v?T8Z8Mcvy>&F`t15LM-7L6d-U|@Gwx}Pa=*l0tA4XKML%ST!q4W zxm+`e@+(Lj0Msc7o)ivjJdijk6x5Ji91kdCIDL4~X>^0^(`d+Kcp?$YB_^b{C2QF+ zV7e~wZPTyath`@-`P$EKR^Al5e@|VYhyqpr-^1z6$omzb1|h=Ze8CbY$0>jY9~u>} zIZhM>=A-xttZevE}XSk-_{%eP9fG5n4SIrE-9hr5Z|3n53hL>0{MH z*BzPU3lrvLmYbcL=<8{$57roROdu{mjY>SI8K=P~%biCF77v$LtUDA>f}{|#BHH^>X1N+>OnR>IO#L`z#?y~ChTO84Md2{RiJ<%UU|B^2qe`YBx`Numy&l}z< zx%lj-hx$L{)90G&cJPJ83_rDdetkX7t4z5jRX=MPxiQT`Ter4p`^V#=_- zK_s2Sb5inv++jILRY5_ENF5az!K@U^Us8X?%3N|v?L^XIuPm*^jZ17+Q!a}sFOSrr zC9Oj=k^~>(3sN^|m+b9-Idi)tnV$2XoC)w1RcC+ucQACIIuv%FCoj#DV7ky6yufr6ij8nuUcDM+gsb)z%AwT zxH46g?Eu52LNWn`5K7!v#>SKaeZ~@sXhZ-~i=Xqh`)%!`i}(NDnWblEJ%#1Xw#e9h zdjiNI5gxti@Drc=gN1x|apho(-;&WfRMr!&Z)|n^8NxY=YuE4o*o{AVYQB=XHV(e= zXa8`SPtV?00oh$r5o5SK<;!=rg5aaQO?-Vqf3>s%L`pHpVs6y}*teHJDV-hLlt5}E3Pm+ z60ATFuG@uouHAk80V#n4)z0#8if6DNia(vU1LK%enZeZ>h_KjAwYmH5v>uiRch>1 z3fTB+(ez{?i3FaAjw6%so#OdmX{4rDXUZ$}8jIX!t*v!Wi}2R<7Vn`zX{6q()#aP) zWjTdzv#vClDbh#yEIj(_b$NTrnWm-c1tc<@QY`w-)Y^u(k*TcibWL!L>1N*UcA_UYeSguz-iIa49V5ql<2ZV zM{euV%lDmcyMU6Mtx53Zm&v!Kb$0~&GYg~~cfMXvSYS!x_>muHJxx$R!CEFj>%jG$ zi$$-n=oAVS7M)l&5Z=P|R0$By1UYDbb|0;@U2d`5VnrBLv(>e?hiz7WNmdrt5FIAh zzOv<|xN5il>Ia*bD^wnAA>zhj2`=&S0iVzX~BTx~bzT1(SSfeM$F?_s1qaz*V>z`U^A9tqk?hVIzi_2P?9 zp6X~S%Q*fG4YHASv$tM4SJ{XcG5I6@xI9%?dp?4PU;%Bey_ zq0NTeeaQyN#X(7*PeJx{OJ5qQITR`_h$z)Em3mBvg)JLLs#PZQ_2@N7 z%S!EF#nd^?MHz#~5%Yz&-g4v+-hE;3 zta~yCbLVzCDPJhLe^Nn2qO5}QS2T5r7DB6PCq&DTJjrBZ;yJlh#=5$t$TXF_t6>CkU7J>+w{p zV`=C4v6@0H!91V5(_Gb4UfQ{Gfn4t?Fgt6kwOuaZ-e}kIiix~Zvwn5W1plY&ttlhc z)E@3E_akuu7|Q_<-Mgo?$%qoad~u(OdoKAKt@KTpK2%7TOCQFTQVFM#t2JYYDX8V+ z=#fN|tOKbN$4?;~mAsqn2pX!j8uc6)<<`6u{Vk-c;6*5~UT`fnuL-QYDb|be)Y5^4 zT{~k7rIg5(cq)*QkSfAWu9sEoM9FCk1>O=%zE19G8S;EEtL559QZAA5h(A}Y2o2Ym zKagd@A4;`4WTd}Ut&;ve%iklefoxHOBN}TEv{2y(5cBOq??O?JFaKE5=GCYa)hX1v z5e@+UT;xxf5RZu}rtoTZ7S8)OcF0_ygj%V2pry;c)nD_?8pL7UpKA3xm=@B`UkE z9#on{)-2hqut}RCMv6(4%7XnSPPN|^v}e%M$)HlBr;{tz()^Wi0dZNS7lAy`4;v4pmkL-Rl5LXoDQlKam&v5d@BwKx4VG3FSSHorn-dUrm)IP@ z-2l!Fs(7Sql2R#55*EpqRPRVJ*-Z}&Bn_nVHMH!BDl`s=hl5i+H!(cixVe#Zw6mWL zqc%R8BDDFD2**XbBi&t{t<8Zds#qnf35ARlwMTF+g{{PVYGx#@Qj#o4_mCyhJJ8c! zFmX_4ZtB~;>KIkX$5_X{=#CW1uY!>x zrr*Z8AltNq`%`HJh`Mbf>(oOX=3yGijwh^42EJO$R^4zw+%7E$``5bpT6U}f%AzCO zkt=Bl5z(?$Ex~|3A?g<>nY5l=2boD5s*z0EC#NQdOrl9^%Ufa6T7dIecSAS&Q<}B0 z=~%H(`}jTLJ~eitbxzW*OqjMSzfr;H4aYu=?^$_#&sOWTv}3VvkLy-#T9%MpYtwFi zWPIaD`lN38GgEEbWlv6w4>xUc=$iYsknP*PNMCPHch|C=o3_23D?!rbH??{Bsu=F+ zX11^tW#+kG$}b65u!m(_RyY$;4G^8uhVC_F3KTvM@OJ*yccMQ!spP053+vS+r+yc7 z7EEwQKbX^?5}uVv=@UByv}uA`t(k=8)d1PD*1Fp4xWuXubySd^mtrlYerjTLxM5QR z*IZFWoj3^&E$*2?-RMN;#IiM&zP&Xi6LY%ppxH{2!JAubp$)kPZ(N)U*7;YvX2VWqVEw1xWIG~t4w}U^Xl>S4gbxJ zO6Y1))7Q|mQfT^APfUyr*KK0hnp*w?w)d&>>E^U}Iu)GXw7rj5bo8wJA;dCzxjFub zxDrf_h@BFxq6=~^1(-Kmi;6x)%pFYrTAloLn7)xq1CzgrX;2^!(P0)dcO0200dX&& zcBJxk>c>jOM{u`LxK5Q?(!b*&k4+4QvRgJdzy_0}*ho(X10?ltQmE9##FP5@scsRj z-^^$h!-zd!K92C4kLpxe;rGn+$PjV#!$mAFE26@0ptsQ3Egm(8)``*H1cB#GD6Dv} zmh@6;-%nGa@|ooH7m@9t|96rDKac!iojj&lpRStY9BP^Ay( z3>qy{dWbv{g*Hk;Q+%By$4+m9p3sUMut)$>)9FR{f zp;Rp3Nj(R%98!aO7}+655$aA<_=^G+y6o%%=!}jxvZYnZH+!CFFX$W|^Uf@_WaoQp z3Xax!4OVqyQ%PlU2BL^sowDbpX+=@}#JLytKk}GT{a1X&ytT@0%cvd;yA*vN+r?MF zQAEU1>Fu+;{}tu2vY{5A#+I(vRXKGfrB)5juv1=Ftu4KJXkUfDx4K~58PXbhMzhL# zgM~HC1BXAn_xSzRmPa1Gdw=7D7cGqzIU4r{vP^neaqrn(>7RbgeeX9O-9Ok`;w>?S zOs@Q#y#wc;?ayn-_hnSH$TaCXU!h#!#GTl6{m8rUWc}*vm2A!8C98bqrGC_x8Db29gNq|W?P1J~-Z3l$UFNRxtzkzP^&@^hP5A_`N_)6ZVEa~kl$Yt1-Dh|`-^Dht zc%XK1Y4AJKD9HqO0=*fu*y37IyQ0Es4yT|9vV)G*>$%Bv9iZ#bvKlxx@qfiDO@_93 zH&J8Ly>ydU&pMBEU-mhXHQwwE%a-2|u8VbO=-Hy<;g|d#;cnq)zyaog8U@A!KL#hA$PajKz+K7`3(JnF zB0;#jIN0Oybk|y~wcQ?1Pq0|9dwS?!Jsvmyg>TutZ@hzk+doD;I6!@-sUJMYgG4Ca z6CT`8XwnAqY>_SyE;=?9*Xwnn^}B*8;TTsuyk%CZj{+EQW{bhQI5bVTEixB#*W6m5E}^)1W1qsH*nuYQWPao6eUr%EXgu0S(ar*QZybr)+ipuTO5xa$8lU4 zPo5`}ak>2bQm-73>^PAfkDp4BC9?Ux^WS@WLjwdT=1sk-p;ab`zW48Y|K+UT`A%P7 zC+}RiXQ<3Qd1+e*YxrK(GT`#II`fLFI?LU49ZUB={9w4g5B=vIzW6)nmVg&J%zZAJ z>qRJgS8umy5>bH0*nz1TTLiCR0$dfDHX^Jr9tCN+q_6^mw47W8$uLXZ4g_?PPRcji zqaEwH6VeBiYV3Bbcia$HI;tJ!4j&20$nE{?7v9*i>5={I#Z6l;y?Qv)R9Cf*2O|$WcwhKj92S;iwz~?A-Sw^(m(?+R zax#TY_kri8i>n5Yj`bcM^*W~?+8KH74_>@)JZ)k2-2c$Uy0*!>{EGJZHsMmTp0HJT zY%Srk`d)YAp$i|G-JimnOM6h~#U5v^)wV_8xt z`9AbeD6G@S`JmE}Em+>a9gR;$hC17^+D(3Ep1-Ui3o$tdb4*y-L$V|TlAW-v}E)Ml=EaD;CN<}s#TjCxyD9RJhGzZEl;HG~31#ZDc=|ETKa=1UupQmZNq)XW!F zs;D1TUu;OADH!EPkwXpxvJSt7q%!puMHdEGK44c7WptsXIIbkh)aF1D(X6>bnw)NG zg1C+}MOvCMSUBK@)TY9L%=3pX!<2D}3+)JFf}RhaeBuiSM$gZNAh|ESdT0QWJFmi5 z=yaEql~*yrZF5K5UHj%Hys>{^NSKkwkMt(Qx1)KW+7t0ui~Ay;+V-XUAA7W|so#@B zA}Efv;JLq%9uSG+QpefBfP}m`3iGg$PZ0*r$B&|(S|k!x1%}U`4PIiXdI|J+3@guY z-T%bq4BdpIGp(2^nm1@N%o%1bK5eKaNS-!=$g>g+R>7+2H;!v>!=yFc$*hTL&G$wo z?*CNZhd;TYxuaJ{zxlUfeTdjwxg8XlAZ9>JoYcyjbUS#1X#|zgGU;=+X@JCLdq#(z zq&o06Ay8&AKp0A#$sn01or>b^#dLMQux)w@9WwH11ECC-8Uf?H)}s4tiso9efx_!( zr@=2}SLCd3dkr~f_g@(7tcny;PmKli)Cj9RH7d|kqbS$prk)z;(YCJ5*LGs}Siv)^ zHq%gR1*kWCm}}=2qI1phJw@Fqm0gA11PU?gog@)Od$OS<2>LllKW6;FWMW6Ly$OXV zk(T(jN-Z=`7G^8vQdDWfH?pm&63~_n?5jAI#T0Ac-$Kn(1-C0|K?78&zzEhaMrL0C zMPo;47&xQhgP}GY^>9n7QObqLBdS{YDfViT;kxiOXTHnLtVo5R+v8hcGs-mjTxuWksnmQ~let9+I$16rhh z(_%pI0EPgtIJAB`&JnGExd530h&M?U{0O0f!vo%zJgY>=9A$ciB5lf~2jcUP7)SRf z632(uxEMo<;EsM#8j;@Q++atX;4VjvZkv^6gQ|BbF>x;HMS-By60QZO3b%w+jywZF;E7q}<* zY4M^&`>~PhiFOthk3UM4i{z%{9uJFa04{GA|t=mCY1^kYaML8 z5lZ#yz09zPcq53J5*Q&;q=$u}FVc%iRAdxB6}~ljL~f?W>DC8T@eeQC1g3OQ$!ovAqg`;i1Bs*EK9C>wT{5&9cuL&i`z%$ z!pYSp7xoKAYh@A)v!J%dZIMs=KX@arJlk2P6bIP+y&*?eeOYpOk>Tc#_#YXIi*gbL zMr2Z8&3Wz#xWjMY44XM`)CC+qOan~AZX6Wf2R2op(eWsB{F^ z9_R#OKWgCpPhEeKZ?22|;N2J}UHgS_{pRssd~lKW6wfuNs)W@F#xfQ?Z{k@ZM0$cZc{$UF`eMBSi4S zxBgCfhQE93CK%BLZd`~7J@QK!JHQ1HUWcT`iO0rOt+{|WT7V*|%JTd`LBMR}Y`l$l zhWYr>C97CUKDl}YO2g-NjtBE@zkWf&YABWKfTFTQ&LjzriOw7cUF2%_x#C@Pg~zQcG=@4dhu&s@81PpS-*Z_Ap?-})`$78fNBEY6rQpcmM( zB{2`eH)4?r{C_!D?kNUUHRIq{wmPyU;Bim@$tau?F0Q275Pb^Oh89cBNW#sYgMSmx zQOxQ7B!_fEVqmSRhY~L;`FBt|LL~W6fW$Fqc+jDo4fQK%u5bMu@An(nbY6s88l!cf z$b|Zc_os!i0mVzXj1;rglkY7KxY#jY8Cp>H1WB_5x=OeTm*-6P2nA-E=I(p#@Zh$v z0+teiBD7cZ_H@R+L0GB6a_^?z=A_Wf3$MO-X_KR6*t76yfPOPa{_gk}RjCSw6^C7iYY$i9bnUn#zG=6VXGP5U6};XX|q>f9BG7e37!tvo;o< zc}88!$xGT=%I{+>w{r)%>(QJp-l*TsOU8Dq0P99w$a+{^GWrf6EQ2~0#OYbRCj1Hs zb$5Vi64(fQGN`B2s+*$lQP;SIh1Qh&AP?iWp+6gj%bH0YLw!nv4xEouNS1YMvZt&=bU9(W~QlWN%VrrAB{5Zlt6*X^%$S`feQK9mC zh95;{RFd^@U670uOhkrg6huTuAzVxlE~H&~n3p^cuh?kh<}GH*(Xku~9oasxoD%)h zYWFkYq~5O6tu_)xzoP3I2_`$9L#JbLD@gaWC!)yLz@3d_p0}`+j-oK^A8wcgvls$i zh0V>)N16}s+cUq_Uxud5B%PCFOS1c%v^Nv`Z$oLCjQp_=A$_`Gcd)P z@*pwkM6)6$dD&@dF%j%4YCpDx>BYYAGt|*G5xYs%jYWQ|7VvsTYTtPQ%5l@ZpAs5W zf+mKM5qk; zi{_gYsz=tOjHn*hX$EZP!6AE(OZ!D&0d$Dw^)258SR9zI~ZtHtD)jJ+7=u?b^O%H z6NeA(S;A}V)~p9lF0&pONmvS)RLSrp9rTS^5410JM}Rj#8$~-)MO`oc(H~DuTszQC zk=fUd3^JVi7lCuHY@GyC_~nb?d-$rPs()&h=xlN_1c6nj*%0Ora!4vDVEE^gN*R&x z8Sgzj=5tQozrFL*uYTsfP048YrqSAhijHk*iJsLOBqm|v1(mH=+4mHmp)=pf?TF4t z=)ez~jo@yi(~nx#RgS(|(z^2KceZpA*Gux@w`}C_t6`vxo`3$UTG(jAQb3I|!3JV6 z>|OA$Xg)?^kWNP@&>1VE@Iy90Z^`5-QcQHS`gYqc|{X>_`BeBnvBz$#v>*OY;SGT3FbNaveM@vH;)zuvc3e?cw zp;G>5rR*o|H#MdFyUI1el9Hfu%?pVeYD&{D&+u=G%Xs|Nbkl;P=YC!qNur&5z&9YBE?ZWr&+0_HYMEFj(6^ z0SP#CXO>Vv0k;-tHALaSxeWUkUO3Xwti^enLY|%+83wW15c!lfcBS+{W3NwZ0*Gj2 zYC0uZO(bj+alZNJzPTP(TCo9Z`ZqY>53xMTdJGo+~vYuT> zK7Q=hJJM??JMX|6{U~a$f%Vdf#wo>^C2<(yxTU$Vp}vkYNopX|f%&2+9+j#S>ot<_ zV4t9>jd;5h1@yJ*h2f+N$?|uvHX>XG#uKczHCy{S*zW8)svNOQj`u|a9#_7fVv1;C zrca6&A+NQ9WuTy&SK`T(#Xul=CC|VYf|jyFRL))z_E%Zvg2zuEK}CC3Q7347k}BG_ zS`69m75__KsOmrZdQ1Po9;-9h9K|)`3SpBoyQrzoW0Hj*Q-5^EyJs<1c-w=Ty_{NGDx`3A-@ceEODy#aJz z6kwOB>4-3ym-$x3tYod1(1%7;Nh~#lEI;>R?0dXFPm>Iqq!5~Ka6uI0^j3G$>FGNF)hyqwo=_uN<*Q= zPL`n8>*mPZBOoccgb)vuf8w~Khj;Iq-?nKCjlsLQ?!tmXU#-WTO}tuS+UkMEl}ZsS zgd*iHBmkTmf=S5X!+M8PjN}NwT2~-RfN&unN&Xng^mr|i_}o7hZas9WasF6I#o)+j zb?vqRe`M*(*t_hv)%|U?Ih8}|?{!OpP*<7f0R+nZH?~;T55D@}On>J!M_9 zXFQt618#*<4}=If-o&U#lp7!sX^FWF?^yE-Op@k+$G7 zPe1y|^Z|C&9YWvOxjH=McSZJSxn` zmtE;$&I2f{U56fjiB;E~jfamrtBr<>@BUNami@=-H=V1j=<6S-Ox*-um~l-^PkOqp z9vQTUIx355stb+Q(p=dj2wja0V@(dDQ>eU7L~e}f`9|~WU;nb{YhDAKI9p+{p}^;= zH1p=X=BjLOd9W)`taH3^b6VRPIZj78p!W)0mlm<^`QVMC*Cxu_!;WCFF>R+Dbp(nH z)~3a=+8%G7sW|AcI?Js>z~}9qsrkGboF@4q^xSx{BJBRMv$wney<>@aSo-bOOZ9nq z&d5OZ=QHn}>)1P+xvl7_bcTDF=M-d@y@TgXNU!X_O0zTH?p=6nn$=4}KiiXxfgej+PhLl^rLKw{COhXWVemB|6e2I@)t1 zjNRZccbkU=mN!esCt5|FdHW{py8AEehR`a4&||+ApdGRApn4NG*|5^!bn}bYkF8jYW$tivIUmg|+YsYm_-e}Np(;s2qg}`^vupxcB^0GW zHlcKpiWab^u^(U>&#A<01_P?bVDQW%3?9;r;?MHv^4_KG3!A3~`XFYY3=v+o2UT-M zGt3xrGD*j=)m1kGteNCm=+)X5yi|GY>eGE|>8#gsUsJSR>&^jp_x{Vh+0?Hh-(F_S zsjezB%ElBG$kij#(({13aTR#QT%+^Fi<+B~?szpkJ^$KTlQD6O*U@;qHNLP@Hw zdnQR|VgA?}h;L&Ja%8aN#QIDtT|VUiwGbnR$}?EDwF} z#Tw=3^I5{f`{i(Jm+n)T$wTl-{9@)ERar^AdrqSLWRYq7h zEF6Nu)FM9dUW}EdSr5Hj-GE`D|1zaHwZ_6h_F9BD&D-D@Al!%sFOD&T%fs zXwIPumu#~!oBCTN3o;aCGD&7O%X8Y#+1aLf@ROwrHzfwMD_z3f^>3j7&fdHCExGe~ zd~Pm!L#4mZ-Tx8_aA_FPBzJfmAJ-4<|1G_ut|b#$@g?(2^=s8|K_N+MQ)`~~Uj?5xdD zoyBkkk^=}wqSq0Ey=V?6u@+anMCGP}z*GUu0bnoZAd6uQfEAdm0oKtBIKjSHrWH{c+FEV1R1}=Jq_l*TG!7 ze=6L1@Kj?`tl{vf2KaK14gD-`P=`|jJVJ@)rjG@8cnu>%}bpuoi6SKz#v_Fe$v2vY@YP5VxI2fKFa-HiXllRhveeV`gb-Pyba`_iIE9V2yoL`cnq!p7Oe_9Rz9gtHtPI0B5wAj7y0j*bZN11jY&S*dutA`_A73?wf@IWxxASlAlC-et6maHC{ju^LvbvsaOJ?=5OaF&7Sv zNei;2Spn-mN2?hMnab&7yHZXr`8AMT`YY<$dyJ1n3)ty9!JAQ5j1wphp9lX4>;%GB zO@M;NVlWbUA}ADf=%;8l=uoSeayF4nW)U-kLC}6QoAvYA6k=y$PCKqJg-K&?zT-i& zP(q)T1qGcx@P{5#DK{jUtUWB$ap~sGn;+Z!=;a6QIeq---aT!axS)av3V`g)Rzy%>9YRkb>i603^6 znWSkDruzFdVUeV2DG;@a0!fWNCCQTX__`3AL#*>E&i@X~8mj(KtYFx)C|EG5AbnTT z)WCMi`lDH(Um-d+fN2bzK#f?bpaC;S=&!UOsPxHrdiD30>SsEuS-Q+o zSqgDYE3juz&v+m!DKC;?9mwucb7tA@zVNFzN6O2c4J-$e99&uFP2?Y9O|}E; zzB9Ug8e7Nv1Y!cu90Q zMOL;bA3Tw=4oMXcty4|K2X@}cf)tlot4eZcNzzwAS%cTG1{b-H@PcA%m7JJyix$xe z;K+S|BwR);NgB2gzl=Sqd}hq>nQC!O0VR#z29(k?p*I6!{ua?JTBvUbFPe#m#vsD} zqSo<555rhjwfH}xy(F?4$OO|A5>dsh7!j>Nl@X0>MAaZe3LaT3D)PX2O&dBfAhXCG zy^0sUc<$_heLLsX6I+vPk=4;6w=^m&6Tq6V4wMm8Dr+(`Atuw0uMN5GPOxI~s`sKX zRV2C-B^_k>H8o1py16rGm7M)em2$Sh?y%~j;laMNHqnPz57qqnKjhnY|1(qNMNw!%(n%SWx64^S9{ zZRCL-0oYxb_w-vK?YC;g(g~O^3L(HRM-dyUj?ngzPA4v413)yZEdDDmRSMTBRvo`I z>WvSml3^sF1e33Xjby5Y8J{0;QQt9ld{3a_Md?-*{|%IBEp$K>a2p z6q`)Ng~`=|o_25SQm!xDn}9D6o)R|l3(`24^@+9bl2D-J0!tdaf>GSYn~lK&qyo>L zfZCLXVGR#pdL1xr=>pSg7Z5#Th6^B4*a*sJQp)J+XNV0cak~bPj>tp~X)rRqY&4=K z2FOH;DHsggf}U`Cu#YVk)`u9JL3l9Ad#`#UmVeb7>5U@FH-a70WF*lAf0EJtq4T5JaKZ(r~|c0~s2FQPW=2=_4ealTC{ zF|xOyS<$iGeLa#Wf zeF>pW1#4+vjh%@8=}&zOP?1xZuOlcNC;~ZkZEEL0F>Oz3`!g<-yT$d?4>)XV>`VPc zEvYhw7)t8{R~~3h+N4Vt+DldlblRp(M^BvXTAQ3uD^C>mrtQ?mTCZte(oT)XQ3j5T zb?@k_&3ld{J?+`vrQrtaJ?Xk2=lG3jYs2XBuy7$g#gZv50x`wpp^IPDrs>NQdN zSV#x9qr;Z;!Sk|K0IMw9Ix>t($gaTO8#&N?AR@gIA;1!u$*YUrqxo;|2$lr-M zB)Hc}lBjmETdwO*7V~#vJpIx7iuV#d?f6?;U;{r04vRLfHX00MQQ;atT)~TAHdDMH z)TuyE5Nkz~INBU`I*JRcCE)kn3aFOUsJB~In|^>Dg)b#W4w__ujg+}23S<66UZ*P% z4HnuwZSGvJ&kKh9U|A?oQxf|hu^;eN-M{(TeIKjs=`U#C)?Oao|NQ=`t@&RnEU6h= zYO3G6ZKxoxXUndo9iI9Q|DKocegALAJ}_}Kk>?KKBao{5Y;vaci3P=rqR z$Z>Ff?uXJY@g#_1vN*$6vWy^2K#e~Nm9l^cSN`%_g>(5aEB|Eic>E{+m$Q7+>39F~ z9AB*dfUznu){*#FW<3gRL%|+!LPlVKMCdPlWf}i=?5vf4ujupT`00#||JTAFp8Lyp zPsjetiJ1B~o{PtGeNOn2_&gEV{E1E=-T~YVPMO5R&?D?T9sAj@&(Zajxc)Wudd6YX z!@EYa9=%#V0{P_CdEM~ zuQ6R?TY#nnTqcpk>1}SJ1F9FNc|Tuw!qM9uDQ=kUs?I4aDa>)!HQ4llu1)@qsrvl# z>hiJDkhjY63^+<|##}YUhSJvgF8}U*d$&)Nd+M_&KtVXzrYAn}c*Eh6P-pecIXsC# z+!Or!@|RIxQ^WaCdw}Xx&@rGc1auhK?&x=*I$TXiZh7*33R7kpF-B&%4*$Leo7Z6U zv1bT=12&2T{D!C_#8A4!6^H<{!GB_eg?(2j*bVQCF}IaYbUzL!g^ z67g@qfI%UJKAkZn9*=5?ta~KjpnYs2lGI7tB>|U0SZ^tx07E)l`OX^UWj^ zWSvua^VgbX65TV_WR(mz#&Sc0Oa04_Z>zP)T2%uZ9$)wV&SVo=S%Z9a4Z2Y$vzP0O z_RP-+MilyL8%WP4o=WB$5dcq2ywRvzfU*VTZ`Y!aqOr86Ocan^-?XPh!&lss?7**g z_X%$#`}M7Ru8aw7>4jW3|FmJYTPau|uYR4gEIgCu>&rrXqbv0z?|%l#u--ttPJx|A zc`wf67N9ICk00=g2HC=k2FfrP;5nizrXC^;RG-Lwak4=tgXzv_n#Y!I96<~gTb$)e zscvN7o`r1~X$zI}dWwDMDq4oXcWO27?ch%tGM8y9CGRa8qC(!XBsdexUMfT}kaYxS zT3NnZ-R!hFSGHWO}!z6QYQ0Rd?h~lsP)75X!1|`4d#0Sh)V3@iTaQg zEnoRzuoi)$QmKs7fs0`Y?!4LohPaU9Y*o7!waHa>F@cG-B)(UZ5$m7h^c^k!G?}%- z&t|yszQ>*#Qu4#=oZ(o*%4tn7c2vP#X+1DeyFTz&($tC_=`*VInt(;Ca$~t1L6=fsw%VJw2f|JlVvMiwffyoT;3eB5Mz%fGosEW9AWA~fT zDAHttl2*n5%5_6uuiOp=&Tgl`ODGiD8``sDp~+v?#-tZZVx*mk%o=e+Db{r>48kg{ zi+Nl%s@EyK)|(;KEN3RWgo~(wFXtRwG};9d4is-PkJ89AN-LJN(_+HhXhj9bRX8df zRh25gm0=BjDwY7IS4>L$nsb4iw@_2(MDX zAZ4>e5!ni|^Az)~q@<(_|3lu2Ot(Y^P&@C0hazSJe7o!Ww@*mwLjDU0ND7>?(BJic^fSDO&nCE8Zw$3K&fvmfu2e1-%QTBiE z6Gl98CxFx>nY64WH{z43$|SbVlbD6yN6m=D!K3SjaiXG1z`JEKaz+y+ECBYBSZfBD zbHJ78L>?#;qmkvUsG$ej58&=vFoT_y*h*Bn6y5k3h6OC8A>lyW@eoN4M#$r6te2V>c$0u;!V!_eQ1A&Ei$h!^R|!LffL9XGQ+FxY6iPB?+Hl z18Qv1HAmvfY)WO;W68)gG32UnIjbF2svt71A&68G+qGnoDZ!+%dTEE49jDDe?3r-^ zf;Xd_Yv2aC?q~0xY>xd4hW!3OfByOYb2QW@czMar;_z7k8&b`vDD% zZAUyLvG(z&#r^dtHJ673SoLZG-}qRm3p@I%ve_fKG>b!qRi# zHe4X;+9sAATZ?i`Iw{oIRq)WmmONRk3OGlDM`J&ssOG2n zCw>rHuC8v|+G+<8#|U~)SB9Xm1+tGXo~rMd&iCYnTKvwKjzXJtd?faBqo)t_VBUO8 z0?n6n3G+3|{X^8;Sb{Ev{BSW(G}AO+gcYDB0Wj-yq69k* zD)!r`*9FCHGEaH8tRa~Q*yOCHK5!~N3Ia90VA7@F!R6i6D;MGV^gXj(4RvJ&l{RCk zx2`Y?xGPKO^ya{p8f9IIXc--iK1VKp^2({0g$W z4AC;p%t{O3p!+0f${o2Lm%VW~C_K8J+%jHNpmmY+*}6<}-;J8PTOe$BkhW{mCxqax zP7nz{$RT@-kPSo;a=hT)Rv3>+YRnsmJs=^98rE@>9@MOQJ&unmm)3s|4h_2p=Oq{J zdEDXg(qd)aMH}*WGH z7AK$q1kTSE%mYFO_?ZaBpd|A0s5OAw20C|<|JlgRm|J-3&>?>JD=~HkzkxIO9L|Q9 z^G7{Jg#~CzqZ0RutT)kV&Q4({<-Q z@ibqz{5#{wetEeG#cQyL%(Rwxog$yuvwYhZqm`U zl=)xtS|+9G+NdvmNTvpq2)xmNVYN#MuB8fdr2Tv-sY6HHvY^9;?jR(sDZ}R=NESlJ zNyJU7rvv%dpVKi=GI4J`5&OwccyFPjFWPDM4Yha-?#VHP;z3xDQ&3v4GEG=k@54>P zcZ=-=Jg#UO^4>ftaYx*t5~D59U*9(9vaFRltOyU{1}u%DdyTWeNj<{*qSk1OAeb*M zE_kJE0rXYbM50YA)QA}|XPbrW<4{FLbG8vEek1UL5FZxKELhA-to1I4Mr2COCTZW6 zOm~WA3K^&0iHN*kOM9rRxUsuy;&(^eZ~L_<_6d(r-yC{qe0BV0T50g+aF1}0JoMnH z6NmQg*uHg!EqDQXR%GN-MOlZo1J<=2)~95Qaj$2rHE3;q@ajX6{`uwtN)s#VAN$Gr zw@{$oIkzxd&FaxvW!W13k#@GVQnEzOS=l)2-*@FrBN>T9Ul4VNI28WoVA<#H8P2Ak+Fq(L=NBeK{Aj~{fUWf@tdLQj! zv{7j5I>w+o#x9RNc<=e+N0#^R*gm<5EKp5o<$WljwQ5&9C1aM>6z?ubxIf=mUD^6~ zW*V46+1TsT+HI4n9edjuvW4}66R-lPKMWPmd0#N!Y#AlBfH zDyoH&yMA&n*1DjE8(oOz;9vl1;wkVJ6nYHQFNgJ4r>vwX+bFt%w%%&tOd>Q40V6Gy z4~&kF^x3x^G`l7zMk*q)|NLzPQ3jv%Bj&E{yR$V z930WffWHE8rN-MGiHlGsDr*-ZFo*-Da%8T44fegtj~UHY<_X)}&6@5wE^2FZJ z?MZW9(SUA24f`AR?cA|tdSX*wZ*wENao4OW*a8Mq?WzhJ^&uTB1dW&+mi z@<4fgfXE-#y}YZ6h?R^EY#&HV$XPXUt=!*z#SXw4bzEZx6^bAAq8>O94q^iv1kntg zEb2&iaftRHsDVa(Xd}cx3MmHF8h4_nB6d&WP9>b7+#PM%*o|0cb|X|uQFAlM{9Bu; zQD76-gcDXkEeuE&A(T4P=F31n^pm?8H0`l6#P63FVRYNtZxtwY&kk3zm#c7du}@f zXe_X>DMO^J?VXO0SY)g+$88!N8i;mxv?W&AvXNC*vmnlDy;lic5sGG`%kD6AZ9ml> zUf41foM_K#{Nr51?=YiY<`ZjAkTL%ZzsxCS~KoHlcbuiQP_ zT_--_nAp@`c>On@+wPpWG_SNch`p_=4%FnterO$=D(efk?Yj8T1L1Jgo!xilMdIlH z<*j!NH}Fn-x%;_~aG&A-LfPASBfKad-q#%jf)dT*a>Ze2Tz>I- zj;(QE8zTW9y#Mv(%G$jAl59t_w_|>MWbVj_ar47p)b{lKuN}T=>fXOFyYtw<;b+4w z*ESEZwjY0lwjb82P}!!V+cpJ%|7Llqvs`w$-TfW3;ft~1$9n3dAL}cuA8T?AwN@8)9@?_&;VBrsp`~C&lef@b)7IHp{M>Ipza#0a z{Gd469}QP}L!R1-=3(F5bJPj0Dz9xckXz9*UiWKVW1yzR+*y}&iq5{sOC5{%bOr0i z?|bfoP#7Anukz;WN~6c1|Cr2pNB6SS!%cy6`dIYvtY6R>rfZO*0Kv3=92T84+>b~! z>b!VlB|vHb&>N44G~#apszNB6%IfBkTp&7dKoY4^h3GWdj})ETzjuBP<4;9$rXmHx}emowS$G<*XyBgc9h)1yZ;Qh0zgr1^E1tIEc7c3MAdjqo3%r z4^D0kES~JnFAX%?kF*BzDh%zN)eTiS5>QEI-KN*~m}VaS{H}z+!l|43_w#(6&dfqQ zflcK%N;AkV{^Zuv$Sygu8z=YFg+?3gbDoGPZ)CHrX0)ZOscZc3$9CWI(ejV~@|C%y z<@&b#`A_>E{qEEICwi&_)!?ZA6%%sJiRI}%^BH9gz^AfBeZQ4eAvA>UUukvqh`ce&KXys;J zXL>p!=#5WY-rFt-`rW)m@L2@WvYj`JI_QM>6SYYWA zk13d;I1!p*2?0c-4(^Rk7ak$rVnSt+av+eV_A@iG=&43;GZ+q8a6}mqUej#`BvmoS z>9d5a)TiT&S&Vi{c|JBIcoG=P+L|MRC1}N9X4pdJY@(T8Yfz{q?Nw7>Th$YP@Y(Cn zU~!-;&fjz5@Sdf~iSe;$H}-1?aY!_Qh@-$0asaAgBZ6XGC7T&!iE%#=83Y$^+SD4b zdKb2Bao7hZX8ft!y`!_bel5u&O{$W`sFRG91AX20Gb>VN8Tv#0ex99>BwYgINefy! zN6${%>jJJ^cepBNqbEfZMvcBKhdWRxoL*1bEu+wa?hvVGsx*ar(sSS;0yqGS8{h|F>V)JPQRK)#Lz7K~Ey~U3WCQSu zV}tSn=oIx|aqndFx`so_FATO2z1};nqWg|%6|j3AoXOF$pK@9CY;Ne8)y`0pt?sqpxr#oq1?kK16>5iyPcvK(;Ef-I*SJ^JWFe5N;= z=rd9IOfAK4$AwBMJ_k)>z;OcPO{v6Jc=E$&&4<7wnnu$ZqMsFp90mv`HP)CIA;Yb7 zPLx{_9!R>AsF_>R?!+Mrq8Eft$MWp-#jD*-8ZVrFH|!c-SX^TecIHX9HQ`o;LV%Dl zj5;9cW|SDMd;r`VrMXgXGr-mZ9p9RFLr|#ijxaU-i57C)1D8&p#L6A4^~`~X(Np75 znu{`EU>()bt)%?XC3Kf+!+IUJrT8I@l>9auTSG}?+XJs1 zMzKKW1ASKBu`0Wd#vAaN2>chP$34&$cI7jNeN(hS(>be>{B(V)_T#^Nbz8E@t2?rD z@9kNAew8x;M<4HABK22}G(Kt`)yT7A*74I$retV32H2Ux`JkEuXU@&d1 z7eqq^`d@EG^AH(wkjDw;kz6pCM390VhkcAGF;bL^lgx<6VlIKaHknxW0BjDkSwJgn zltU15Q2kLD#g^fSrAC^SW)+92y2@T!RFGxHIAUHlVM;I+)P&>C+*Ja)W%5^fDgu&5 zMy_XaS~p@^N@BumO;P&0tyVraN6yJb9$;;goXg1}uDvw7JTJvASN|2a%XiK{HLB<%aXVKFSF!H9?H+5ea`I;h&=wqy~*)5 z1XCdk;1y>)ARD#jfB#z&p#O_adabgHaupPBs{G&Qa1Hl9NtR?h?*IE7QYu5Bj73VU zb``oKI)~Tqx}y63`8lMx)c5pmoJ087+#`bH!+O~x$&KtYxZ6mFQ5Qt=e2I(hwmx?> z!+6a3&M?qwJ~VmY=*pO7(Oa_g=&_`Q0TSb^;Yw4oKgpXXf4q0qu~grh-f@i~)VtHX_;971 zl|tCtcKKP$+|@6z6jhQJ-)~#Piw`&}TI)TQ4>Ef3FDI3(|9|Ak3zrr8f;4}=k9^rK zIPeLdUK~a#20VJWwF#%55p-vQD!{4l>+H)bWL~{e>XPJ@A-=MC1j(;!UkmUGErhjoA=v-IQ7*3SXkmbps;+!DKMRM~DurdNX8c{0-7x1`m=l3}kE4^?05@ww2~0eNBybAaF;mIz_rtP1pkAuxy@5bz8X>#2}jHx*Z= zM=IS)0-vfzB>DTn^Pl(+dk=lAYT%38ww#}E%|H7WN1G-iPE*?-oP6jp|M1S`qxGUx zQQukN*|TS>{l<-&Kz%@V*VIpT)s$!FyBjO&N1MSwH*|hmgD$tMu)Mi}C=6en`qa7M z{gZokx;9^4{3f6KrCEDz)IGKH;EC>|3&Y_mxg?n1G~mzmkM3)KE#eMs&I`BpEMK{D z-e244${slRl-Rm(q9w=YDt2|x?%IzjLS}tOY)q)ZsVwG#QJ=+(Iv#$Ql`o-|1lwSi zE<#-@$4}s=Vy@WhW#vm$01wncOQc8(5JmV;Rke5vy2GAL)y~|up=oc;SWD&iD^32^ zes|kIz*Fby43(6Hhy1UcPm_^A0Yv*VO9SeQ2^GvpK2{2Y4;Sz>-?>~odhd@r?%+_z zgMI?y?B5igmfr?5L4>=YSZmp6NiTZAe-v06sVQTqs&~HxmoHR)Si{s0|a_pK($bMZ&y| zp^TVmPHQc+36ix$muIk4I2<`GE#~s6mO!f`JFB8@Xt5(dn5X-rTiif)Wj4y=i?i}e z%=zv-=`0!s<`wg@%bzdTxSh=z7KOATRWRU}+(-VFw4y=l(9~BlLpoxddvX)q-=85h8 zJqzKvQ{9EWDx1@q>nX2wmged$MU_^2pu#FuW*3#^6y+8b=gS|-sRHH0+?8!LTlXHg zzPnbRWi^)+>b=#igG156k}8|QAD#3VT{#uSIk`pIL8kya{^$Su&d=|B1EZ1&6e*a^A{PQEzH%mwFdu1VZxf5@y=1zbKCc9#m z`*bva7AWkI6njfjvB9mt1VcMg9v;m$2$s$3QJJWj9)K66+Z+q(WP%i5Z_uAacNGIz zT4miy+zN7iEgg|!r>OTVL@iF2^G;0_rjMuwF$H#eXUQ498SvZF?O}8Q4vu$N8vgiv zWNw1NZ|^{YiQ6+^aEHKkF@zonja)a`b*LKQZRpb{wS-XuN?0y1^kSo(PLdL9=kh_$P7e2fjDQW1n6IuiD0KO5{FHqKvR=p*lge6=XkHz z(c9BuZ=Y)`H|X0=h3(;^9rmd`r#j~+8@HVsFdMTf8{MpF%&+*Ljx6S7Tgs{&x#)8= z{#AFV*wD27-htrOKz4!of@sa&@dxJzHjhMhPDJgY#b9u}%|Tf85B^jX+?zdSYj$;e z4K|3tUB9(m%9dkbEAw)JsJ9wI7r81b8zRw#AJFNDN1qPh0^LqrRaR3VBPk`LDS%#d zqT2<;4^EFFet0TB^>`Uwq0siZqCnA0fBw?s*$Gd1``no)XD2>-u*+bG-Pmp^F1l{X zcjbN#i6EnV(;~c+GkxkKBRvnDTiz6OZN9ST9148UD>t_X>$~!A_M!j*e|YX)ewT1X z_!W3si=zejH^YFo8w^ zXGr-y@G;8op~)$j(ao79lZ1}!;CVJtR-X_;CPD~-w#Q7gJ=7lnHOnNQvsGgDlrV-; zt#G?h)Nsa%!QvKv&ut$h!w`U3!`4@{4Vq`%!9!q#MpO$)f=*M>Y|?4 zl)hjY!VpcTj_q*^`LVq_K9Qjz(4~>98fRYY8Hu}GT4YXF+n*;Xz3TH)r(0Sus z%s;qRKrDcACsZW;*Qg0qX`Bzh7_t+xu*t#@P_%l0n;AHMA9NW0Lm`@8uiJ;amG~Xx zuwE}Nm{80n`s0;+O)0m6o@ib7MmK(2jR?F+)QZPxCRkWft93Pvg{-kav7la!X%_9QDG2AK+e$np)7sHv&dG znt94LhR_>{7;^~dCxR$#iS<)O$Glx=gNZ(D0=Ec9mw{1(2H34l>DPnKgXnNl?t{=o z*AXZckY{6raa0GlwHD;_Tz_xtK-)lFs3sWjSC;2{3%sc1xA8WMEU$ET(q|MH%h>nEbo6W3>EmB0V- z^0nQUnkw>iu0&I03Cu?>J4mX7d!;H%ByN;!A58akA@GW6nz;nugnzi}1#PCK?@b+odfHdqFmdytS?#Dt^S*DcL; zA(3`IE z{ruGaZ|*Z!m)czAd1!e_@1XNSKP{qR8<^r;sNg+$Y;#kCtP^)y1cR=YmkknHjG%cd zN)$zdsH1v0ko}TPtQXPH5hc8$P7;^k4lvQ6goGIH$c6KJc4Oql`MHsyXa`#NcuWjn z!vJC42)a{q3vFy9NOx*l|U;#*UWsJ5tdyl#Dv;;~g14EtTAHIv^__uUEZ z7g2avlGsoy=%q3grRtEi|Xok86a7R{8SkM564KeHgIcA%B>LWMQv?uC)$o5Jg~U1b!Kd|tDQ~{+coPy zJsX1EZuqDPvv&xp-O$mDy}cpethO)2{mAP%xhS;ETy&--Tqq)%0%=$UJe)Y(hJ_x2 zSFcez^CAL2*a!%KU|XntST(WL+skpi1HHg}b$9tZ7}N=8o(P1J;^=9|R$k>y5+Fj{ zKmE$cY9|q8U8ChU%U3&OS6GT>=f%M4r^}O98ZKS++=z#jgbO=6BH<@#j)pnFd+g+8>sJ7+T{yymATn1x;nCruy^EF z+1}X>w(jgPUNZIZM%cTwkF zkF7E>fB1G6E+#nJb zV8=1S!YG6V!h~p$@!cn~c<~RyDIcKmQogO+ZmZ5m-7*Emcrgr?QY772Y#DJdnYXbH zn9Ns4aj4^Q=%kx(%zysP=WcO- zcGTmHWsT{7`u@wI>Eo9_HuCLovc(5A~8L1D_&hK0xPc!r{bLbt$0Cr z59iE+NSfg*Wm&N4LjYup&OAg5BY9A~4jW6r6;*4A3-W}O9HuC2iCmf8((uIW<4cn_ zug)WlY}E<9g$>i~Mn|Bou*jP&=q%Q(k}l_*c!BSUeTTQi-r?V{#6HLGk9G2&;w@$M zuA(ftv$8D&>Q{10%1W$Ra_lt48o+}tzK&Q!1Mz8lAx;Yr(`6EXf(62Ha?aHL;=-u6 z*yC+s8ibEG6Gxy{O}4UV4y9647>|TUsTUO(jB;!_7QN)_o(h2O$g`O>2&b-8Po(f2 z#XC2Ur@gY>cM91N$uK;>J}mjUDsGy4Taj6L(H@@zh5`DhLy%#4i6tTBcgQDE_Kl)# zRR+qcvADHbMoRhu{d7&NW{-u`2wdb^ah(YX7C%76>}pjFDU?#x)G!Flt4r!VnXZHj zyz-)&)Zr+}jTGA0NMCPzE2EsR;;IU~#crxScd%(EH#Kd-G5b8q&=m((jS#@0g%=&M zc|lUCX(_3hf4#`jhv>S(@0z*}Pw?)ai2rOWE_4)_td+qMM}s4`tYgPRpF4Qrn&o11 zE`R7*Szi?j&28!ql^h~g!zAkVWIn1JoVeYPU*#{%bynEQ8v1?H-~FpUduIOpx!MjK zzuB83MXtPZchAAco_eBP*^l}~__{~9&C$u-(Js+!@K^-NjEIOtg=1y|x?Z9_!pIrW z3wcRTTve#q(xG(?w}73?%mEmE=#jd-e{OcZz>Nv>d6KJ~yb3G;zO6D#E9Xy%Ghk=0 z(ED0i5nPf*M5u;q^oy!9TR#eC_T2xxKRDT4WAJXC9CKuzSnqYcr_n#ZZMq7f$RsnM z$YibZ7gsk|TdP^OrmRv_HW4OD)BTlwheoeowl|K}MkfMU<(<2FLF>7a|I1$DX{u}< z@~&j0Eq0Yy${YGUjfc-&n~rzzz-%!&p!+4}{Qz=q*$0ODYpgP7ET!WE8A=DGf(oU< zg0n=89?+~7GmrZgM6v-A{GZinS0TjWS1uJmovrro%WzRm+C|v;xr^JkOlZpoE+fE$ zQky;@SBd_QA95AtAEh*Yy1Q%0pH#X(wT{;o*t_@N#l^##G1B+IGq-|g7WXU;_Eu;e&i`~utI|N(K(Q6QDt3K0e`MSnFmHa0gl7bFH5f82Zd9gy8ETf-EXyA z;c;0aw?Jw3K=D=zoG5@tQhw{ZOF?cWDA^m={4S8bBcR7fB3MfUm6Lq~H^I48N!b^o zW?#UQ?#=(G9rziW}x9zdrvCs2=_f}J%C%fzZKf65s*=MirX{#Ha^FFuhqitZIs`MAz zJtbyGbANUHjsq7qDY^|l>KpJ&YJov%k4CKUO2~O@s>8IwNu__GJqLB;fb9;WkNkXT z0rAn0G}_)uMxRRuM3_5Whf$IdMjI(HRlAW1N8XqE3I9C@QG6%qup};4|NDho51vNf zlYW0>>B?Akz1jyT$B8BZGAv#Mzu`M zsJh)EwxRR$~p1=XOdP6TI=F$xZGIPe>hW9s`CU$D{EiuEmMr! z6eoGw+Az92EL>Pm95?1l=}x7{4!bHV@8K&If2|lI)3gZkJBUpq6PwcTen?S(n36s+ zr+lQwMA{Mo+cdIc#Cg?l2@&NHygXI%sv@LoT?52}yy=60^)((bUgH6j`ymw4?uRre z?dj>cr|0bPqkDJnSeTybkE$vm>yA`{8=mI+3mWfOe+cf4#f9%!-)yW|7TaG^8+@*I zSXSfQw&*Mnk#b!wQq<870YI2xYV*W=PK3SCHH7Rc3b!6jGAhYZVU3pvPaEP!@n?K= zJio4x1OscjB(GZ-PzQKit*C6J6|C^3ge=DSE?G+!C%1Wz{bkYtUV>lxnkH+bdqCka&9tK=~ylB-f1d>ERyMPSy^XFPr8(k5)BHD|Ik_DY4j`|<{tTK1nvtO=PA=yhpZH$8LWN**#fF-Vfi&wEhKmP zQk!<^vF|o?M~xnPF4tggGjP_e+{<)V$h_NJ`*FrtS!Am3DLV4(_Xw2tu2OUTaMyO}-*) zK4m21y$RDZk|?Y;!_8-L*&+s*WYs(9zxVoTsmjXOo3Xck{ZD_vH$C-KdFj;$LYvQg z^rgA_;o!f%rC*W7jJ^E6B))gUAYW?yZ_o7|uReNq^znQ54STb4KKMG||M11%)-B7Q z(|;E@OWmJ9jv~KF>Kxic$^IhtPyycxzP9{1=ibq6 zcb6ZVcI@8LH`CUlD=I6u$YNn+=MdspZ-P%P2LALCu8spfpRl+N64xkk+Ko9^x=ErJ z8R!edd4txyBw%jk_EhPy>n zWGl&Q%BV%0B1%Ky62_~_sNKcf%l7#PUOU9=#vb|Vv0+fxSzlNduDSan!SdXSde>kl z5z-a=Brdi*{ldLtv9G-td+$5Ph;nXnUo8Jik)8KF`jPIwu>_eK+v|)A-;VdTay~8; z4L}E}C6g$(QE{`t^5xrjuADhq~PJU!QNZiqCVZI*E zT zy7O2JP7dnc~-v}s8F8f=YXjyr$PkwbX*eYU*L)XejR5v>0jLJ6>DXzU|y67q(3mBKxQJgnbKh>rQ!pFlVq; zl>{fEjZP~fW7$RFIoclQ>i-VZcD9br6WtW)RvQEkH^yZXvUVU)%s|>K3IzNUA9NnI z{LTM`21I;Pe$1UFBsf|fP)p=wp;PKk^zG&%Cwrdzfv7mo~Pur&sI1Z=)0RI$@KVe!&&O0gR;AqZ>?xaZykn#2dahKsZX(0Q9)- zce$t$xK;r{tSs-j6giN*ywfLFmh6qP|rp*U5reQG05OttI$LiSERXHY=t zxI8~i)5+Uk!bsD?R2sth-YenMq7$gb0w8`W`kjeO)0wRyIUvoxusIhP-oDz#L6j-(UJ&Io@eqyQ&zO&SsQtzIx4^Bq?DuZ|~N5zS3; zfvT5R^BQzwphzKyrQmrF^?}4MT-M3b+fWE_bO5`8G!}y!W#aNCx*S7c0K7cta!it! z=4mss4?jUvxoY$Y0;F6y4CZ`HNs{vmq%_pH>A8zYV%%;>&}nsaD;TzEh zA@@_jQzKBSA_2Y`YqF*Geo-lv-gLd#@-O^d>6vFfx7c-Vq_75Uqcz1PnZq+{)z&I^ z&+O@rzRRPIuIGOEBq~^WlU*enXL(muha*vYEU~hGd+^V6rnKU!5}VAia^>Y2*YWNG z)_FS6>=+-LDtqrAin?6(1f4cEC8l%$JRb&qQZB#S|IBKgwQ8cicWb!0ZMeqa%$W7r+eI+kyZjrDuO#^8y+@v88(hra`p2?mkf2JgEI z_VOq}izXRsMmc8>S zj{EADKlScA??P=q`SzPHKL7Mnw{Kp(a{1E53nzCL=8jE`4|jIt=V#jyfhA-mv4cvo z4V8$zY%!Uhg9;8}g5vElqNPvp8F2>zg~>)_$@#Pp-H!&c}?OPV8R0H!4bxwnux#kG6K+$@#bCuokG} zsm-RMv5VdLQzd(`{J$Ri=JUr;S?RnrVq>HJE(YGB3Q=2 z8oi7LZ&D4KSfkiWf^&Dn#|M>1M2SZbHswy;SSQzd{pQ9^-2B?|@#$mv;>neRMjE)+ zE~l5f;*jbmO&=!`DwZB0^hJCEC2m-DgbzBv6un9R6Qt{T^*P0JGgG4jnW;m|=b8>w zr;O5?l2lpFiMwCg?7KQyj0x~}zq0w@=@?sqB|0b8XgF0c)K(e&erY%j`q#^`_So{a z+-T?2g(shHuU+cQji@2&f|jYRt8ML1Z@1(QU!SOY?VYzS_nccUa2LdDW3t=RPc`p6 z*SGf{!yaPHzxMc2+%5hImdy+AO|?bw28>}9X(A)JRg6c`x4r}&FopB21_FddaI(S) zi{v7SX~@1XV$s#)?{XbQsJq`^UIYj12m;9q%ea1>{IKh{uHU+OBaAl|?Qd~CDWk{d zjZur?$Lx{GmjJ^2nA|e?e_@3`#-XhI7udTpw3p3smv}+6bKp$XgKS6-SB&QbJukqK z2IrRn@x5rkm@Dpmsnr&A>Wq|9AZh?9HlUEwjV!c$H$>PG8YUscZ0LLyc^%Y)KQq1ZA~&qMIk9E zx$UCqqhu85G zs*Xaq_7+#)&fwmkgfV;yy&o$KIAscxZWNrpc#?&u(Eu>Ntds-5TwP++=!@ADI4 z2D}xcFQHA8SHiLZ4=ibu&Lk&&LKd#9)4<;7Cyh8RQB|S|Y?>&hQJ7@!7j3%3%Q7*| z6eXb@Z+|&H%?uHC1UZssk_e5U)u7KqDQHB^q_4Q2q$sAD(ibCZ=jiDn)qLuSo7c~u z-P-6m(Q{&PerhtDdYT_zJ-rCSKy?gHPU@?!AE2#Y^#-Cl1AG4zPFwFsP|kNnEO16l zOooIrb_N#h9!-0{8$nm)42|rEKTf2wytmYcd>V9lk5hh~>GB}lsjC>9_ZMzm8_%h4 zUz6!sqY1f#9T+62)~Jv;0dPshYy7RG4jvz@Bzb(&OF;mY5=w3?-cR68Pk|W$hW`abNulyA5?_VE%|#$Gmr&LOf01T zI+8y4Z9kaIVHN1TZw6p#6zcc=5Ho)q)-)dXn#MXJ>8g8g)(=?Y(IM5Bp+nV}taF!p zhx;1;BQfC?`#Nt@+W<@|B4E-NJ}rypy~%$1oiXHh?tmZbq)RB(PYJv(PN|op2DuH& z8iUMaSj40ry;7xL0Dv{O(+powJsBHil&jTcQsY4kO;hGE_k}^7qN6zp>V!f7>2=?} z0x@T@%qtZM!9xfoi`&OxuYkTV!mS=vsCy((o?NGwW6D_Y6Nn@hheVj~&usC%dpp}T zHDCSmy?5@t^Y)uBJa_-;%NMur?%b`}s@Ys!S(+ak?d=ArDWNDU4g>{ZK~1z*DDme- za7!C!Kfl74H4ODDXcvYlQ2XsO!Im)0P^04BvDh%;jv;)RKOhLE1aoppZo2MyzfHBc zQu2Pv{;mjb^ji1r!M!_ScA)ZaGN-m~cKV8?ro5zrsnJgBUUqJm%chA=GN-r1MgUKV zUW5oQm0-bs8&C1=M{!=1(P4|VzxrX|J{6eX@|VokPjhDw_rJ`2k$*$F|=j-_7`mSxid(9 z8V@0qw(Teh)q={2hIDaSH5dM_4;Id%N6!trN7>nQpzNcGrJd%SouRhA&wuu-?z0Qa*n9bL*{>WikDC*f4Vt_0=tn_vgI#%P^ZtURSd@ zQksxr?`d|*?95H_V|m|uF4%E8>^b-T_dB23Xv*%tGEw{HXWqWjW2@}2PrZS$<_US` z@)o-(y{fk$Y-)@jRMgB~aNCP|F1{xFUN{(|pFbte=288X6br0yukxQ2Pb%#kP~N+| zGFs*-ZqrZH(ofu;H%3{9=WJ_^1z$ zyD~;jk)Me9_9pq;_m_l_gHAOHNU&q~l}4wT7?wsBd01)gUbeePkWq*>ZezPE1tY?U z;BOm2UkL5Qz8P(1L$HV(sQlrbDtqafpKTo?E^n#&V3#J`aW067u)u}p;Ep;ClBlk&1I zkM;8U92MoV*KK8)(aqPtb!PJBXl`Or>*&gv8?DaKn)LLtn#Jhkl#-fwG~ZjDd6x7{ zDrh_NQlpHi#TjJ-mC3TbC|7HL&WS&Ge%y8Z$wAjUfAHsj^0hmCX)T+*O;6lB_j5t0 zD6u(`jk3~)6*f?2KL)ff*U0H-2gg9CIT5a>jsVfYc`(}}ECOB(Ji6@%{8?>Z3I(qR|& zI)q-{VzZwFHjLrYh0XQji_=rMxAEb@mZn0~cfG?H*i-h_cWDSi=%Y{N6U6>RN)dTV zx}d4rXF-HtiUr>D!wy#9EzGx1tX}I&h_FP~=rmK_)co4+1-EM!V+o!*W!)bhVy)S1a_?H-=Ke#-YBwUU zqfuz|K%Pp=X9&COIyPG%+`4y#l@O``ei9;TfbGT&j=ORD#_d}-!)b!a$EJhK-{aQ= zmR$b$v_W=(kr;&3`#(aJkR50FWwK|#(7pg0@I3czS(!Wb%CSkgDYlB&nO@*ybOZt* zhI|46oa9tdu~Dj6#IUitSd(r$fj0vTV1`+czyPtJl#Pv9Fz`Bn0n9pp0pj8`lPtvL zqN22uV5!z>fddFA{UfyX;Q)e5|5SB9`$(Uw*Q5H+J{&Idkv^M>?dLy=&qkEd$w^ENX+Uj^O`X)>nor`_Qr~sUnU%A_#@ZU zGwYH(MfKWYXF^i-TuVxGe#8^Ol)QMY-Acvu5?637-7AWU>DKD8+Cv-?I3qCY;ODRf zYgqW-;4Zr_toL;0D%6@ekhv}K3f&8_O1WNvu5mdM>T(TH(~Aru@P#P`Um&g&oeZEZ zt(Ij@S-~BBT?i zc30UlGvo8Kto-i!Gn2*ov+rJOPAu&yYgj<@;7_hpEj=}qT2+{2b9Lusbl4-Rg%G2U zcel4yW|U4`Xm2@pyuZq(P-oHXCrA5g_rZGb!FgjwL3vt=J*OFkA37gY+0cm%?nV9w z?u1S-VQjY5xGYMoZr&i%XuBA|_1NxfV$ol>UT#5hK2XrT_I zPdY7fG0;5vxd8Tw?qn+29AsDN9Z+NHN;`&h|$OacTKhao*#dgLc{Og;$1C0$4<%i-(&! zy7${n&h1IYF!H;bZ!`oljFc|!+!;Mj^dyAyJ$P$T%=KgNBN)+#bD4XRTX(OVglRno zhx-cl33z2#Bxz1v#-?g*rZgQs9Wgs_Jw; zt9th~WM4k9RGeil&Lx9Nyrc&iRBsVUV27;$au+{5tdx@T#Z!`P^;u7q5!Q3PL|(l@ z*0aH5J(KFldTNs#86`u5qt4Rh>z_TteiIbBrZukRaQ}dE^&dGC49rv$p^c5D2 zTC5c9H+^$Ec+@qeo*-iKG#&9)f2K&d_R*E>g;< z_>52(q+2*CWeQYx*sL2$g#r7|YUrRYIp9JnQnIUA3c{I+o_3m1;qUwpy;BDF-^aTDOTB0uNmKCI^fFkOKe`%9Yd*K?fC%1K(>3 zRy;s^;Ajq(Lgf3*T&u=u^Fo}T2(%7j@m9IjrN!xE+3~b`_CkM-6D)<;KH zMhvv^HRRy6#~BAfk%w!nXs|9rqt>!QRO?!jfG5f9gIZXoGC3I3;<1C-qTnDkUNQ{p{)oZU%M>=ZSvA z##Nata$ex9BpZwMUV#VmAH!MMR-~MCYP3XQmx|^V9dBXHEo)1NWOD)fIEtA4EO7Gb zDt7V4Dx&2eODwiZF}RtR40E3i%;;hdu*57)^^sZQUw@lv0Hwztze)D;Q!=|Ot?`cn zE%OjB zQFwF%-XF<+zxO6vbdfvqVU0MyE4IQ}OPX^6TH!p@tJDv<$Ei2a54p@;;hyIHMQm_P zbYoK930|ec39VJN7J;bl)>WB-Q=%=Bey0rkJAiB`Bx^-StX7Bd0x zpvaE=!?+qWjjZ{V=Y4Nj#6-c9YzjV=gFycn53r9IX*?nM0pKnspCCj88q_%M$$J;h zZLZ_nEicT)Whcbu7Zw)UMH3LJ4?)~zs8NU&4yk{VKwS|}^N>DTa1naQjMN(vnXcFs zNhf`cwQ45KGP=A~;zu|~Bu9=*gFzjYKX8t}+C zeKM}3*sfjlgLZ{;1@a2ko}DQ-yc_`L+A4AT_uc9@-tRWMM$Qh(&{3J3LJYn^YQ+Cg zlVtJhvW?5F%h_}Jqed7$Q0P~_%QbVyz?O8Kdxrn9*mj*<$gAb8$XvNBGNoph*UN5P zkQwx9G?ECOns?;CG2(CB^lL>}5%{&Iy}JctVKvB#5$qI0IKj>-1DyoiO08}Z3JK() zTJ3G!hVrrGSSgMoMDkM<4j@Mcv{ybfyYJydQBFXV)CokGzfjsPqYoq0cf%26yN3=V zR%$htzO-UoYD*66>r=GZc@zlx9^~L$|(SrCGb8LQ*9eE6ivdYgTmic;&eVyqI zJoAS=7_XS%4&z`*3CK@Opt?|rF%eL?(m->?pCyc}?m8#d6H{B-J8Tr`(p1=#g!20K z+@S6Alfsdz;iuI{EWoedzsaXkktC|D{(JnBz&vT#S zzQH}|zIy^$j15dU{Jc^Y<;`NqVMY-ENAntxVrh^JR3VL_LK;KM2^eO_lEo^dGvIvb z4U>cn0VqqS6REL0nT@C@UuNTLU;Xr_UVG)i{X4fVT{v|Tcd(nEW5K*`}A2)5ezu;OM^@XB$2a_M6MPdxWy#0)>@iVG|<(ao!rQi-NNs@8#5N4VT8JQ&37-Y^%X`2Ah|am^fh1InQqPsniYR{Sz5lp7=7 zjWdYRr{FsO^4)l&48y{ue2N>6J*Jpxd6-jF9W_*SB!=ZpHa8PwqLfpX)0xZ&5YQ#> zdF=_&#m1`oL&=fs6VD6dY7qQLe5A0)%*jybpv95oAW5sx>crcLB!&zc$5EhL328Q7a?hVp-&&kEFwUUYZtuNP!k zjFSY?gn2oXj&vPaW~7C-x(DG+GJT08)1xoJw;4$!bSIrs`(y-nw@)n1&fw7iiwP$a z#t=FrnL^QrJd_S8B72uU9SYCz$oy1bs8eMRp<}L<>Aw1W?V+^n-C(OGl0RDgEZ@-; zv3z{@>`BLARPkU$CFK~u`Qa~gyRcuMlYL(dNla(>C@t)mN?wO{W11Zl@RI~KIf#;w z7f~0B(rBZ$xhTCRO25g)0)!tc-?k*s7<;)2W-lIai+D4F8$I&>D!qIj7y{jRT#U(} z(CLs%)M)(Q@x1>#vzePDVj%`Mp#B!=4f8Om*mm+EKOe`oPKUD^AMSa{^9I}%7$0y? z`+hFf<<5MBpDUwsA{9t5`i*^O_5=2n$^ZRWJ{pC&fRA=xitvRwl{`VNN&v$~0xwTM z_Brfwd!F%rkK6mTgFc&81&d%)KgWIUoln00+RHC~;{M&+moJ{&U0+=~zPKA*jG;R#;@ITTp?C2Kur#Uc@st_r-7I z_pV-gvYj8^yJJc=W|l4v@W=e5MdO-T%tLS-! zp5N4=ih+!XlG+ZC1ktJmmJtCmn-!m+8=%vnw#Jd61aW{*p+EDNzZOuti#LtwVZaZ8 z4)1fagwIXPr6l#P+#Nc23QC^4G$S!uXpfYg2%CIxjJ&wr=!5!7-02}$-@5s;C+Cy+ zelhzH!smp?1YZ@i;?x_;KLJnL4dCWX7tj>uee$09APt@chz?xxkithr!MoW{60sCM`uz}-;p4d{Tz`*Am$`6y!)xIV-k6M4ZR zKV&kn@XoT9mpN|v#`29Tmrm|%NJM%Q<9=Hzh8b3m9rZ8j9c@bmSxJPUVSCUXai`@r zmS!eK37}4+JfOcBq%7dCzma(?pt%f8oMULUIv$y)PH>#NCh_gcQ8(3taPZ zk%bNA_RB#?Ij9Di>f_Ea$glqUe-%OdlH? zsmaQTjuMy~`RSq(?#^TcJ?@VW0Sxc-eFESt3#H7UR z4T4K~qwB(4dr^FUbwfu?TDCc^vc5T8DNiivD6*86mRoxhr+({I{<#PYkK_+9-9#Pp zEO(LrWH{{{#R+3lnxc@o3ah5k9yK+Y0E;}Dt`3rH!4w6w%AsV3(YLUg%kKHny+!tW7hCreU&wj_^31_ zHNW}kW9g5i<{_y$sd_8g;U6L1IK^{r9ZaxNTgwY-GQ)%dZor^0r5s!`M*IeF;Uzst zwgg_ypj4`Hnmb9@CnQ9?uYrT|H^0<<))*iKlfF^TJ(3szh^71Blm@xd02H!;mm7{M z2euOBTygZ&iRJm($%*XTJbNx#N+1@l(+&NiWQdX+e zCB*2PcV6g!=X<+3dy1tCN#ldJKR?c2ictB-BV>A`y$`)P&7X6}=GkRB6+$MZt{Zjw zdS39t$jdn$`VDo;Z4(%)NP%FRpg`>WEFyAJJhdwVu2n&84tX&h z)YXT*ST09SDM)E4r*s4X$j$@^fWk}Pno}Avk;v<|M7V#sJV*iyKIm9K&7I!aS~;;W zM{&G4F3)aHJP?b5JTa!QhiI!HA%A0R7z)84g!}8O_P!Tz;DZ*rW;`le3zbdX`>Va5 zW?2)9TUQ2sI?D^@^u)@R!qliOKCOVi#uo=Ftq4Fk7-|@xx6gd=lI+y2%ip=xQqVe* z*E!7eR&Py+>Nxk>0RR5`KbMcq@a}}D~lh( zxS;a^q>}=Yv*cguG%Dt7!g3+!>gQjQvQ-`KT6TVl0=$0U;V&)h47gM>X2aZYe{Xx6 zyP>)&I~xB>K-nO`n1z%L#O^MPuz*WPdAa@7K)oH3udA9%NgY}`UEeTWn_`XqhxNUm zVARFrKh5&ytpw|ENwYIQVK7`SC(wsO#)h44d5(owRx8Ln<-c@%FP3IuAcMxNQ1hiP zt@2kQ07u}bp`S(gbHormz}nvZ-QnJ1IXHH(oOI^oav0#G;sqLaO%2Z!GRP-s@_@6G z<~8}@earm*RE?%+|376ZU$$7(-r~Jz${mBm!12j(e0Gl`H$Sf!Ggw%!lZ5vX(Y!b` zyv(#HRi{VC`NBePA9E3!;woK5@MA=NCt45T&%N!-UIcI6+{$jXTt9aEi*x>CI#S#E zCysB{dO`P|w&kCtCuF9`v}S9ZcX&ric8|N%*RJdbqA%~6$awZ2-x>Ft?(uuFq_(b( zs*Dio>Hkw*oL1m6*c>T(-(ZsF({ICEA#P`D0^ga|WRv@1(5h6T4?-i?V3&EGIU3T% zq;@uSFyK-xgGwlTQ^mSfqo;rT<`?wPILzfSUf78%QbSM8%m6Dwkubdw`zvHDkGZ=k2}MgKaCrZxdDU{D&22-YRV zF@>nC!2siPkluo9*l180jH-hK1*u_JEglRjEKmvAT?Gj{NT)|0MQ%h5e>_sd=zIF^ zF30Vj-aSo#z!1F;X_`b1Ab7!X5tw2zcx zq&2I9NGTd4y7ghmC% z^)XSvLltz=hZ!c#NEOiBn6b#j%w51kRiyh3vpzLb_x=crMkR)H3PXaLX- z1WpHyj9)+oLJ2+q)*!CYc-V4?AP*T5#+GyK%E_JO6RAg_b}@s;j9 zzA)ZMBF71LM)|cfsKd20G=kM(2CNRi-WH62>@N6x0&2c;dHecc)9z46@4~OY9pNaF z35TV0aCA-<1RX?wT6cP?GHg3Sq+{oU7Xq;bhzZe;_^(*MIo4hNm+r(9Ei$!yo>!_z zv4m5+!f*vkXjCYXD->x1UvHeAtR3z$4M9To$SfAnq6DUD(!e$GgI3P~S$cjvyekiqT6Ia1OaM0sI#o$`YH92$s+mgktrImC z8lym?iIRcmr8vfMQUqp-G!Y(m)0C$0v}1t&;K_&O^%rBRvnPTN+u-+EuFqgM9T79}JVcWjQ8 zbd}pQ<+tyDqTWAYzA)rmvn!jbOKM8fc~x|(rK}+@CE7Nyc&3eaY@xoI=E%v4`_%)- zR7Zi$H~AWk(D%GW)WZ2!)~OhkSWsh2ugKpn+P{&(^Tw*i=X;7!!t~ z7{+ZJAdB4LZcZnd1f2=3geFcfp+w-j!J|tgSGVtBBr1`Trmw3~!IPztapDiySEgtD zh(h5p1_*VdOW6Chje^Oz|JTN`;<=;FD0B~d-{5|OM2pU7K`dri$DWQwv3T{w?DX(p zM_ZG-v7x@Mwx+x+KQ}!sAx@(Lqh}1wv%x$O|DBV)?|$?@LohP_;C(4ypna3>8*VTB zvu9^cSN5@;*-ksN!ltfZJ2PCGd127G%C;yV5WLDvTQrw#(X-g1R83AR%E^rTI&Gry zLEk3&?g2YA;H3Dy!|YRUO-qx4eK`#@>TSMU9NS@P=Jl#lUZco1q4%8i1Nr|%=Z$GG zw}$2zpiH4x;NK>v(BL06kIUgDQazFiXVOa@c=$B@q?!$Srjn!QHBY;d<_>^MFQPbX zMkbA6!Z0OlA7RwZc33%tC-d9~rOAD-{qGNU-!eOM?dtinCzfV*XLs|$XYL=~_;+Mgm*mIQFSTYTR*s&3 zbD@2=KVPN(^$S5Kf$~+X3XvmJR_Sb6=^FVZ&v9TWsJ5k7<%K&AT1G;TgKwIm)Uxch z6?ehf`tiP^td_-wl-iV#v*Ct5LpSOgJ5f~ErP3NyqD}&%i0)J~w*YY5lQNg2lU=-^ ztKtpnLX%8mU^?ml6O&gb$Iz-Mz$T$b4WNf8lw;L$gIsN3r8KmX%)_ep2Qo#_P>K)(y_&);Y0{bq~N6@+8PCveQ`_`398*7VakDr~I z80hV6Z>Y;-MaA6QDArsWW?LTC-l$~6e}ijK zK%PQcRBQ*OWT*7T+YajTU8)wD>LkKe=Yf~gW~e#D$ za(s+#+Ye30{GWgOanQl!2~qN&Sa|V+7bLvgej!Sa7e;5R9++LN@CVXG3RA>5MfX$D zAL9Q`(rKuPDyqLqX3#WMSmauE_{4jEXsocvv^aj6c#~JB8={Rejl!VN;M7sUBT^~m zQI`|OLEk1Po(40Gn&&2!P-ro+PZ6i*omah^L#1Fo3!`<5ic(J^W_2Dy5@~wt;U!5b zro==y=)5ly_Uin@$%4KH$a0UNhs~(a7!fU@)?ox~u=JopzM{w(EN%lcW@34_0o`Me zT(%FgKsLaMj+#h1FgVcH+tF56BOVWSi;cnSrTq|gJM4E*L_nJcZ42E`XOFwoSy zKm1Ps^35oY|1*sme6l<6%>F_|mnNR=Y-_eFRodO9Y`H>ZM(eJ;Lk|>tJKXw0XkW-5 zfEhsg19x&8Z`7XcY_?;TxaWE$rWms8Jsef77z>StM+3zftV0;?omK~CC{AI()&h~5 zRv6c)+14;YDcD{j!%c74T-Z_;{!#*=&L?X>Aq20&hLo(opNt&HaQn$n``rlenAqHO zJJRl?ne7qekk3~iK@KKU$#~h!zT((^q^AoEkmup({BI_b5CmR%crbKh5)n6+iHtr>h0SAbJ`z(FCu#zan@Gz1JgYLW1bHOt5K)4_4N0&CRYvB7Mc~AEzUHhL2b2}g+^yvbH(^pRn3i8 z^y7EF6c(-~m)Biy#rau8b6Arac(D zCU(6ROh13Zm{?g;pC&V>WSQ&A2b!Iyc9ydF`qzq{|Ji3IDEAj&JiaSz%pTv{n0U5M ztyhXH<0Yjjr7d>n%FdPPAS~rhyDJn1fB2-3PENt+EGO!C>QIff0&h*8d@s$L2Q{6m6Y6 zT^>?XQYAJG%x+z2?YlNvl3X``=PR4fJ{@B#utev?8V#okhgvJ6KQKqAE%E<)Io2Lq z-j*9(J35sbR6F`TnYp2>w>~F#`1(ZEYwx^ux#!$6(KTpe0Dw5vyz^Y&&OX>>vG0#C zR3pgqeAjI{mXGH?3fH;|=9hQ?$TYf95aJB<__cDQTx;AGkd4)Y9h^hZY%q9{uPleB zkr1hhv|jo03V$I|vk0@R;HhPt z0>n8EMu84qkO#1iE2NnXa&(T!ksA|e;2C-q5!!?q-GF4g5|bNPnLpy>hWzYYk=5`} zlN;FCN>k9pgOx_%o2DpLzRokFBCL!|t-1EzK@_QO&~DC+=0#P}BoB2?HiK5U1S#jX6h| z;D&7nH|#3#8h<7-!^Y=>!m`$7k;@co3)7gq0Zv#g=6<`w{X(apYA&&ul!3cRAtz!> zBsdi`u0zeHo|ScC3Jzl2QW@~N~$5^Y? z_rZ@O2*w0+YFS>I9`Ang{UH8RK01`?^m~V=IlZ6lNYqG7gR&Ps=oH6NlV2oz;eB;n zAla$X5<+Vl7nai$ypz%%zmBN_H{I80kDo<+a|wKtH z06(-KHq~PN)v)}SmPG&%EdfAiv+MjeJEbOIR2ZD+sV6{6e0_a&c6xLq*0bTICOof4 z4F5P}_Eji_h;PHoR8BOH`GzQe#M?ftzN*yx-;;i+)_lxczhd%ih4 zpS*xLdmG+bOb#zsw4s^oc(Y6|fHYk18FuLA4$PbwBvQV&lcGF(bSCb#r^c!FL+HlX^ ze)=XB*uI#m!&SG#q3z1?{?J4ODU@oZIPgU&4SYeb0@hR-_#$w;fF)Kce54*Grg)(+z5jCiPn z3^r$cVzi^u)E$WqHk1pmw%JPoyWhc`-7XE!Vgode_pR@^lmqU=0MN z0)CfPfZwH}Mr;+YqDE|@i=e?EY7EW7Y6_T5E~w_%s)B;TyQo@E+@Bj^>#K}eRQ0)R&YGjedp=mVD42xFu@z79)3?~*X*vd z=C)Vb)!F^st;wY$2=d~R;t=GOw^!sRwvpC}Tn}v6geI>b)p>*%Pxhx4E3*5h)be&u z#Fwav$!{sCZp+dKM1GxjfB&>c7d=EbnP~+!awf&N4}QX%$m?u!H@N>PI{I1{ib_gM zD3Kv1z#HIw*&8Vi0J>kPP;!cGjO)`W6~sR#D0RZ73Lc;wK_B64aKs2ant*|WV9*CK zJA{!5DvnGQrmqv$2mIpfY89>~gC$)If70_ZP!1?}4iq86d{inHniK@y2=W2u>sQa7 z-ds<1(HT^bn@XGT>cpOMHxDopDkWD?)#=9(~;RNYVS_yhmaq9e>2< zh;p_!C*;Q}QGsk6E1}iz?)Mqe+J|4I$kOR>o!DPGr;+P4i%3{URD#IjX^hQ8 zq}!GRlU_l(9*Qf|>%-_+Wbst5JF0lZS*UcFO!9Hh28rh`S@b-<9$iL%@ z98x+fp|SsSXLNVJ^uoP6SFfBuyS34Mq8n7q1Md)9J8*b!<7|FScGjJE3y_(>6@2a)SrkV-Um92# z5V?vA86C2aMxeBf`bCC6lIXmH)-@{1J7Z2fak~$e22c)Yy$yy#NTl=j@!cPtwvYGz z=&XHw_eUq~qV!yL0*C+0#%nr12IP zyjwXE5BS4uW!P~9Y?SB|qqIn5;HqO%{l7)9_j_3%@%9hNF+`va z|J4rz>;lX%c%~mH&T-fI-w@;exF!(8O*UXed$uJ?t^_p-Z=}Ky{ahRJb9m_FO~LF7 z>RnDHC9PO7AlQ+h1}T#0}|21lagMbFX1$$1SC zruoDn0L<$QOlLd>k%eB7?g8lrwF->mLRg~Hir-f&eqXKheYMi}6>m@wSnfkRj*6+4 zwV8P(Qp$t)EKw%8e9@EgK!P;Z9(MqrWe%Uo=P+_SKvTpTNE(lb)aXrzcxt7pgjA7` zH7MKR+eqpMAtxcy9djuuy~|g6DkfS=O?&_RGXF`NI@%m>NbT%tw~j{_)%P!)ZL1%4 zS`_AqaV5csvJ$ijcBeJDFxiyZvDq0T#HHn1E4nN5;utCGq4_NxGcT`I=T1B^zxPG{ zNB>mbY&X_l{ev65zwyeQ#p>dY@tn68A5@F*A*(%6XRBz*D4AQk-2YrzTfVvF(ifKa zTVnprlkF=Zs2~kv4!vr9?xM#-P#|;1H>>zw`{{2Mfy+9@~>5q5h>u z5D4`O5=eV<(6gD4HU=6BIY+H{r&{q&wcw4%oodB9)rxnj#hs!eE8b|RT-v0gk3%kF zm!+Hb<%tOV_n2e@!{;v>ZHA(mLR@*oN5S^4R;!;xdx5ld{Y8sGjpdb>?mvC|=7sYc zt24)>-J6@^DRff5t}jEBBW}O~vZMwHd$`nK2*)1P& z7eB&YPHk+caps$nJNk!mkc~=rV@+;m+h z&2LiV6+HaxptQQF+SvYl#zC80H``P>5O#Rn!2^VNnjfTH#2q`f!UxUkp$yK)QWM(duk^Z)RVT^R#-!||s?&9)38md9?hHP7 zT~I&CTVGf5Gx-Dc*(Q@NJ=&C>6dh~Jiz~AC-n??H`v&nm`|UiMsTLS4gr|DWDHwcq zt4XHFsqf1-q?Ght{L015=Jej11uLry-HvCjqWKkzSWNA%6*E^mlI%vcP8(;lSTZd- zeMU!jkHk*zTVOUs&9lP({txX*;gs^5+#u$*kGn^(xEg`)-~@2h3XCX&muq-*lPRzr z$zAY`@}_ySQWnu`7Z>Lz#vp2tjG{g1;JSW51Q)W?dZ~7S5 z;r)}b8AXZy!%aiSIzQ~ngha*i&srU}m>7&EOf1TX6+bxOJF5bR=3mf8)rE#oq+|#DiLn zD{L#N?Z`3sp&Gqg#=EtsD1G26L0tk?E%-fpjcPyqvEmeXkH@&5eXEveehQP%0;i35tAbJTmYH_)GA! z&+RJ>O68RRc5mqh_P-dHaPk@N9jUvd48a&THaapm(BIeI+EAAh9fN@ew)h;8_sR=~ zBuKQU^dTLku1sopK)bgMm^j7@gkp7kf~Pl0>Qn-z5(qlr=ww1&M`}e^LHS^%b+ozg zxy9|#=l)>j*k`YGcUC{2^0)b81$!?h^FPXIF0l@`Il9WMi79mzb+r|1Z!C{JI8imy z_>U=jzn?#x&;K}C_GL)2Z&Vl0-k(|fOzR2`xD{J_|9ELb zBVpI=tuX~{bOaZv$C1as`RG<#OG5Fc7rbTue_qu#JhVzT7`lKM4$02$KA!x%>b zksHM#qEutdCe#N)i%OT`rTCH6UFXtF36bKC}GT#n#klaZs)1qq^8QOBC9sBw5P0brn%7c;6FVzR2-)gyG7nt zaJ#%LZ|}#uzXax7om4$puaC*^efqE8@>CI{idv@|rfy7BMuh>Ii}k|hl;|i^c0*CA zJ|)L#vlL9tQlBsCg-+$0ga_gOS20nX(1|^Y5YVWb;yJ@@jB-o8_uNdDhHgwf)PphuB-JKf@bb2lzZJk&WHNia2Vg zH#;3LaLF>VyjfyP?4R4La17RFHZEPNPR+L(Rs2CaOr|kebF8H!&1F$nq|`~dI8#w{ zfhb7()w>EonbTdBp@~j1r#E|C8Oena2lN!IJv&owc$xMY?XZ@W9%t0ke|)<)-yC^| z>8vGvmw)S$*)@EoUp5{gPyNBqVl#}UEJvkHXNlEMk#D-UyvHdVI0p+kH#dsd?If=e zPr?`*n)Jpnx#7gDOsB=^hpru~JLIQ;{bNVb>Ey)NY`IKHJ4%cGOvHNdc>uptsmdfT z7DrquTp_=192^pK2Gt+#Qcz)ePa0|!_nb8QUXKrzjf-A%gzKT6u{&D}a}(o31G%~A z3o<9!8IU{#FhVJ}{cU%!myCpgNfxFhNcK6umY{Z9@knEK#q`D2zenRwAne1!OmtLm zY`GVkR9KslQCpapDE>ETJQ(j`E9k07^_lFJ%B*6mjufhXx~0&h$b4VzvB#$3mYE3l z7#~rPm{@?1sw+%NDy)0&wTO5Q`QCB(RGrYJe(pGTl3R11KuoGu7V(^FZAqr%kn2&( z)p9U*624rnrd*Gh9YrTKbCg-FUOrCPV>zuwd2ZPXcS z)mvnS`}C2Gdo;Psn`qW7v~{)W^%l<-CgS}bJ(?T zka@A~j)K3An^;;aN$>3K%?!JS#p4}i+K4?i zzx=0&E9V*W>zRbu(%pG>${m-KnV^ldf*Ctkua)w>5&Wsh%O+wQsXlmuyGkb^LKM9w zoi`{^q|%^9sL`X~A@T<4!1@ScA|+_K{A+|FgoO&u#&OJ;GCGW1D=Qqga&_hEsgpkb z0je9KUKPL=6SiDMCBu+Hl_xX4U&>tMDnY%`Nq>!sGi>a>g~a_!Rfnk}{%T!sO3O~$ zUeg=X>}j(463?~^@RJ?Bf|XwiFg=NCP+`kc$*gkKoWqYxl`HzY_g~Ow8&mTgHI9qh z`b=X|q0{ZCKINo+_f4FWG?(B!cZVMmF&)X%yjoks%amJaaz4c?gbToT;Gkqp&Q`bQ z*M@MvhM!D;j21ANsO4I)-($wJN`}%03@oQos?lMG6IH;8N)0bMU^;XaULkUNa=YWV@06vMi0)7oxp$rWNjbSJp9h-J) z^IB%Fyfx=fi&H$=T@$_cb1S;hWn;6=v-Y**uB9iAbzhz;llz$Vt2^4=u@+}hw$?S( zQDb2Y4YrKT_=2n?es}$u$zuK4cds>j&-X$;g{s0I+mS$<6zubTBygsq2KC!HAv9o5pIz=2q&a2I- z30cmZ^r(VPXG-O@zkGvty&@XUl8nS?73%r~3JRrdvdT01^-u3s+Z#uVI%m9G$%VsbyEOKi!HSMsi`9~qteri5axsNE{=yni zSw?2#M7aZ{YhKCx70w8|`L}|Cd%(TP{TFvi4=<=(NF>~W$$ScfKosg{(fg_i~-H&SGZv)1HWL3|csTLl%t-{$OLSs>Xb-GKim(^I)3a$FG zp|wiKc$dqhuj-pSu~J;nTa{kB{_IHe)t%|)EWhAJomJi{1~);5j^~UY{=M)n^y>yc z;Wif|lW=xow8g5_qIia+F6>+)%u^#L2RM(>3aQkBY7-n6wTl~LyHKG zHNQ8eQ9odY_Pwks;Dq4BiF7E2-&2D)g$TiA)-0q-Q;#gG+5eInP;wg^XtDq zKKNjx;qdyKR@LXIx_oihvBKM$MA8f&;~*MVJ9l~mNHauk!L;U;j;5{N{M@mp7LKN; zRRd)fTiu9LR=W4Hk4Pg@Ku2~^A=*LJbIcBYjr$MWzZ}XI_6HlWD9IMW69aFK(x6A^ zeH5$Mdjx@pu#XuW_uW7G*6)1fOP~H!SUVa0?_no{fjz-_Sk?bm?C1wy7f~V^F)z@ z+HW7TeSiPfVRqHWdj=>Efen*!IjCu;0atXBd%zpqv7PXh&%;lqfq4q`E%?bqt3{RH z$KxW4d4q?Qh0Wsglpl|~J>`z)xM!Zi_eY5!zaY0z^0iZf3j~pUZNb+EVb38n67#bC z_%xJ31p{AUK%ExgUW-%r;9l2y>H?0T?)J>mr$6(}>C<1_bw%52M|Yn2;)#xHvlXUH zSB|AI#hj58Wk@Z_sNS3(s7jA>&G$5HE*^78UUe5$3xdY+AxVI#dzqOBPu;WiUY)-C z*Dv%}Ui{-{+CTsG-~Rmb8}(_;Yh8J5&SZ0@CdXNqYAMQy8-4CO|I7cr)^TpM*fICQ zi9oay!M4mr8f$OoX{8}K9YuBB>kb&&NX_ZoET%5C&O z9Ozj8|Nc1=@%#Jds7b@-pXJV;+{vAcV;cjWIqix-h-bq=+Alie<$+*!v2V!R!6*Dg zs-ZA%yzMJr`&8A|JDU}UQg`>Y)601)e0noE;XJ78!26w`HK*rU81uJSSMe}^domKK z&8uBQyX|R**6hr>p<-EaustJQjP5I%BBM2+G+yGIlXOY0}p-E;Vx)MEaC zHXy^nZq_Fav0oC$J^KmnE_Zi#duj35RIJDBdRoi;3Oq+OyTPQ1`{XtrpYg4N@lEER zOy9d;F#h|P;Aj7E?e)$V+m334eKzDh#2C=8MtS|mHPngtKpX1F8=+2W2cg2FO)9xRSrm7Yfx7wVTk zHj&ILKddxnqa!{;uTL&Ajb7wHQ~+fD7%`2~j`DBi^Fs0?*z4eJ^U+xC;C=Fu+HSus zaU|;vPGMjac7aitMSJ8|-R266VHoD++A_4|Yk9TCLo{23bRQ~d8pi$xIxmJyP(bT} zHdl>8_mNAMFX#Y669+PQnPIK&xbUnZh-piTGO2jg_!Pz4FB-mv@E9=KR z>RW6tvA9aCow9WAA<|>nUQoTTTW}JLvd-R`0&~L~U;4(l$S6C0`E%=S6V90aJ71ZV z@#(If0@w8$m&?H*I}nLM)|iO#8`P8WYh&%!NNIdZPH%I$2s=t^-Rg6%_2gyt-<+*_ z^_{n_^x7&r>{D-?ZWoLxhNE%Fz96fez38?V^#3>-~Tw*`=GX* zk60hR9nx$Q(oXe}s*LOh2j-k)AO7^iKT~DGKCE&#dGOB@fm!_a+6)?(?b&LLK*OG7 z7}li0uqSt71FQ%A62AjF%QFZHzmpEp8vLQ47MK+wlsC)=NJmDAB~pQrE;Jil$Hq6Y z!9?seGY7uuO=Ug_VJ;<|#J>nP(et1Gv^r&q}%souc4>-v4TrERg0oQ9lJU zoY$_L+QrJP7TL$+@@dSGXgFC^Q%sTheq)YkT=^r6H&SIvaZc4xT>*_ZDo;}y*?1#2 z8*jAjs=o26e*E^A<~lJYGto71?Q`n@Th(1_HuIQjv>JpN6Q>$^&FWjOOqyzx-CFO= ziq$3NreycHOFa?KVWt|@z3~~$(Aj&$c}DUN+fjc#r|1O|Zx`sJ@4GXqu?L!XwS0CM z$jymznL=|?iMAvOwo=J+ts+Sm2HOkDUGPE61**m)VJlZ-9tVb)sl`&P2Blc^LSUd6 z%CL$lC}~hi=+F`XYzZe}%AJ6Y{0rNgB9JgQGlAhnB$%&1elRpJ5d&iY8_;XRxG_S3 zAxhR$qmcMhRlY=!>Rdn~D64wequ7GCeNzb*!uxL z&ga-1XZxK~EqOBM^7f7Xrrn{Ce9y0bCS+$;j=Bqz4e@DN#>~DH`LL7$Iv6I>KAzY5 z;{B_0E`6-kxM%1Vdf&8{rFEPeuQ@sC3R^9GGdk5ZefIK&lG@e`jkE0i8~y-LABX=s z_XT$parnL2zv%{}x$t#TK+XSmn+VX@ks+ukD62|e(9*5D7y zjyp@R68HVEX&BYeR)&pkb<>~f5A&xuAc?uJ4job&9TFoZULyk@h+#5lMhD^3gh`CX zr3J;jSR5L3Ucw>-0M#hKJd6xyL>VBjMbxX;kxA0%<(f^p6ATbxcVZxPh+Z$<2%{GA z-bdJ5!Z8GDte0PW@`~EHI4$gmUD{7&N;Qs*)knF~J9|AR+(Rw~mrU;f?eSMxXb z{{E@;drfQIxwq0rR?anjafP?;Ixn>UcaFZ*=Alr0l(~@9*l& zDvP%0HSxNrx|W6*#eWI`t?vV3yY|yBFL%K($(B#rhpvwQ?4Mn8ZT6G=-{kFC90hwn zh=^W$Q;%7Ab8mfbZG5!MS>Co%ak_Eg-guEFN|Dl3vDfBjv{*bS{~Pd3<#LUj#42aZ z=9Th1o>NAn35aqe^aF+O2a@hu!TzE|LK@8q#09Qkz~?|}s4#!x1TmXPq2*5V2_PO4 zCI$Tt-oJn{Y4fvV^X)ltD#42EtcVS(WK`cih8QCJj!!|mv@*CjA#WvImoZ)wXD_PF z9b3~U)c4F(RvhmwO0JnW_cEr4$MZRRUsuPZCl>U%%QDS$h9o$PbF_RX>vmTtEBc*@ zOVgRHm9~uj>(lM;yz|njmbyaI_Md93iP2TF=dWEVsl^vbaI`wehOje0M)QQ7T>1aY z+k1dVa$V?tyhnqo<6Tu)|2&F>(%qO*7K7nPS5`5R#oRlAcxjRQb42Y zR@J@do_oT7{u8Jv;6Xcp8V>-I(Siy6n?UIWH4Z(mQ1ElGS+S*9@{v?>sY*=lOQ?{L zdz(lV3m4LQmd>>IpW9Ul9`ehdUW@L4A}Uu4s1pjix>|Yr{Mo*I$Jmuwkw`qcn@P*^ z)d#Qps=E+avAM-}_zGeK|B81w&VN2&80HPCz3D;CH&j_)u#X(xuR}NbQNZU#ZQ4 zUvB2qfF6s&skJkf{^KvK^e#1Jr`syB&2F;^vEV#ofxot_(A?49+FNimqiJ$upzq{} zM}1|6x6GW$9zOh`>Gr8=Yg>icX*TGyv+^2h%8D$zdd^-nR<-tYw`KL681<+O=T`ZD zS@_D+3y!ui4>h@(9zM}N*K9K@>6>Nq)j=|OSkHRlH;`o)a{RS{DzqvVc!XpHA_Sq` zNUhNj!&OCXM`t?1PNizb`XQqZL;Eoz+!PKa3AeBzPqz=yhO7$*kUqbN=Ak8(d4-)F zt-)_ep`qc<`iL$0(x+a&G8_sCnTt#{U9L1VGx|3v)-!sU#d^?3Rk4Ivj}>n+4)3Eo z5O9M65$_@sd1?`s)~c7O>I6iEkW+Bc=yY=R7;FdS;QTDTm>d5q)l9p-kpn`g-v2)JFwWG%IFT_-ml}ZcTINac& zt9m*FHOK03sVpz%Q|ZjJLxG?X4@r(vt)0v6b6X@s;KO#=pgjf zfGad0tN5Z(L&rkoH|Z>_EUUz6SW0IhcniYE1Uvi~i#l0Mz`R;3@z-$UVL$#B!o%|a zl2zB%=Z-uC(|ON3nY$04s;xw)3;*)Xq1OeSr6@amBxY1qI*rrS(`|NRW}zj`UYxIA z1(l#B@<>$f|HC3xRTno;)(-6NsmfH;>9aFa!$+jm+3X5lNpt%;J;rQn3K0;{c?td= z#TS69ui+{J9v2Lb3?4RiKU%#L5Kq`3B7pJ%1$?18VbGQBbTy>0eHlqAOp_6|2joH= z2>>kImS}QPt*J(h(%n8@Hhb9MoE#r64s+^++XE^&37IV@RYK!)o2JsRh?+Y$gSw1g!tM4Fm}Q2 zA)miaO~`-hcj1ZuG7KwhQx)`dRiaA^>@Ptq6NM^LDpm7v z8da(~6$uoXROPW>r~QO$WJMEm37JV%n_r>@?EtJFx)28^-Dx{lz@`abK_*Qa6lZ`7 zCiw3?kL001b$DvItO>M+UgW2;Ktd0_hUlHP-+gHeOUR*a!Oe6IiaY+qNW zYq+nw-BzBfx3@Mm7iW1bNB8Ot`Wb7b*>GWR&8}9PMyIvA((;Q+vloY#C%XD2{y{|g6tX5|&um&ga%&gzCG7CDZ zom=~AHdXsb8@&|!Tcr>V;Xn9i9p7c4UQ9Qvxp}qh_c-WloS>qToaEnw!go5|9;Z8v zIY0EOveJ(!o`F*wl628IVxF_`%Z8B_6v|fhukUW%-H<2`-#g)w#96EIkJsf; zd0<0mUQ~aJc?od;XCSo$nov=KjuKGlAyrrc`%5M8m?2Od2vEgU3+Nw>y3F(aZW`uY;ot6xb(@ElK3)fi7E1;GR8LQ38 zCs+fNG4VorX#`Imcn3ktFvRR!XFxXXt8#e&Y9 z`impjv#b0|c;`Hmy(TPvCVSIt7qj=--c)=Fz0j+J9v2$UcQ>EE_0xbxdy&H z-aUe-iq*M=yOu$pN$L!95Z`LttSM_9akorVr-!?eC+ZxYLMBUWi*ZS3sa{5$XOR2b zfHB_!|ECs&GMqd!#b65&RM1PqDJLv>i zW7U+k4SQO~BiCU2o&A!m46`BOo6tV3#EH@z@LQlcDP>q!g#}U|bVNB* zAo3~)n;RX#NWfRk2|EQb7BFo$*6>1Fn! zlNg4g!z)P$*X6k(dIdolPoEyi0VW?8l@mlc#(%1mHDymqh8{jXz*&Ju6n#Bw|@9GT@zh>>t13tb5(T%y6C)1BTFHo7ZpvHNO~GzQPN z`0kNQtN3UnXSY_p6=(PJXuv8jciCV=p;oI%2RUh&eLJ_McnkLJy8}d`9xDXQpXc8J z*R~a`ZSH^ro)8GLU@$>GC^7>UEh$g~1IOu1cZ*T`m_S;rIFNzU;OF0oV;Xx#BEXhk zM%2Wrv=Ggd$VnaiFL8FBD71>;bdcl!Kk$N?IS2TP5ko0=3J7Om6AFyS77t8P%i>jd zelI`hbyqslDAy2uF2n`{S>{YKZ>7WFBqBsTp2n4%Lqc=xtK9uYjT|2;L3~Kb#hd~v zA@oiX+u6s`T)xh-a4d*%@d&rT#goT1awUPHn#%HgSpU7yC&CFlJF7*9@HHR=prAr5 zqOBsalk7(@St*jxRS7d9+mxeY*Pf-a2;o4clDj8Gy^ z1mcY38;)|rfdOB-AZS7Ghx8dc%Mty-@<5!()}jJwv+C zdQe~#lm{;4&ggZ2l~LL{US=%zjW%t`bZ{bq!hquOzf*Lm1+Iwe=c)tVVv8si~7m@V{FAk)ftG$Gu=bw{t{s_bc`sw^>xBWhg-X@ zfA!4VjcIpIWzY2LnFo4&)6K=jwaqK${DSJ{OlMtDp3jqAY$p;rpQkX*R9IC~JKm5l z1U*+44}JUT8UOx=C;YE|`}^O0{nltv_xecZhi;tvjapq_ZS&@vgqn*FJkZop(|6(J zKl!sy-14|Pt8(jht=5jfw&OV1c58^`w8Cud4RqNd25o);E=Ty71XG_%&8e0l;%v*p z(2#g(VBc|EUk@&BsjPsqv1!%WtYdAO?R24>Cm02`aL~P-~7csU14MO6D?D|tm%FjltkI^-Y#v-}Jo?3Jy@gHF4Q>1S>nxdF z?cRG_Mzyal$5~N1atJHQa?KhGu!Wi28SWoNM836~=hSDWCtXDxymasl@JKjI!TD|= zt788Yzy*3u%%}4b+^_`wE;s|=g&e1z(TUgzEuG?uc@@zfiawqgoHqc&Y|t;`xsrYr z;R5MfM6}6FZ?;Q)12Kcbtg{?lTi&y43h{Y&snb(d%Fs2j`Dj(x+>_76DCmtC$PbwY zad4aV5aoqNcsN1UTJaD1^xRU>EbQ4;Ho0Lx_dl+dkG7XV zWCnAad}eAn-mK-90Z&IrQJEs_1C|yCg~7mj$HUOESd4RNCiG}#8Z`8C7W9E)E;}<_ z15p6*z-o>Bjj${7-&hQYc*HL5{N^STGz5DBfav81U_b8g{uHRX$mwhBUA^`_j+Zd}bybYFYvD6AG>U$K4ukdE~9(ozDlFva@+E`|H_X|Jqky z|C2xZ^v7O&=IO^CdFa-IH*Y*}@%-BA{*}F8tMBh^X{z$NoyCQ@IVlD%i_gkYrklu3I^GFouF=cW z-odB-?qSe)dgcbJkDld^xqS8v?Ltn&*v78ppWUEvlon2EfJuPwKqCfubw}Uwy#_`y&wLBJ>?A%3WD~K_Tk~2 z{#p^+@ladiWPOf*;nbOR=hWk?O`hpn3upiF%g2S9>B;HZu|cKPU3&i6$$YI@Q`$JP zc&x4C)b3hBfn?R??+`G;YHCzRp_gj8A#MpAXa6J;3;Ge-P^)-g`4tLkIYIzkEt1mE zIvP#rN1YA_1t{QPx*DK#V7p4T3}C;40zQm5#ttqIw2N1Q9$$?Da2f$M41k9we*n;3 zhVKuNw%37h@#OKf)#ZJA<|oGk?Y^P9A-rFWx5DGd%eADLAiR>iMfy`Aschk!2}%jE zwDU1C9_KX1#6ids^$UxJ)Z*%<>f*wt-N!#P7AIUkYV5Db(Jy5CM~_bgzne&Kjj{C3 z!DnNlCUl~im7mp`weI%mBR7VIUwPs7!RA;=F?&2DDDP?$37>K~B=MGM*vE|&$(2thN7f`)cE%bSe=PC5vh^!TJaT_kA_-k`3y8|#M- zB$l?c`zLK8UPiv($&k;B?U&s zrKn}FgpWt+?~*!?9!K6(Iw(o~^(Gt$blSB5-I6l3!V%lfV5AItML~^yw4Dxy5(y^o zDNv0mP>m7erI1CCWIRjw9FBZZQj|5r!=x%-edW%h58b+c_1xKw_2JdwRq(6tPIN%0 zZ=o`Mw&Vvid7TNcQ6Xt*d5Fhy)0W?Ryh=}9=AxLe{ahh$@6 z7+I@FKHCn5foyw8vS0hu%OCs5^G~9_`_hFI8_7%o>lSjo1H<#ZLYKD^>)$sHgl*H0 zCX(tnhQZ)du?E9SG1%vxxmu7502?k??F<{<68tt{!?OyUz=pryGa`}UAe$<9vK=C) zsVETb=x}HY9S%{C5~s|Q3?l89G`yW?Fh{%- z8P3U`Mm!bd7m7Fxo_Xq#hi_cJcpjeG;s4;nAPkfhld|Ewb@b`5)n<7gXTU$pCUlMo z7`XAW8MNk>A=)vA!u#7FNwj_lqpMX#gT7-A0g7Fs7DK;)9M+TE*Myuv#`@5J!f18# zTH{l^MSIOGWC${i3J@zP))b|6gELySRwF0@1TKRUGB%K3ws2OkkLFNV7&o{X!*O54BPDF}G={yP&HqSrWD?HGkz=UmivK zs{K0(_6Z%^$lofcCR`2dJ-5s~!adKO3~a2_)tHqUZ9lK(_V9xKQ4s1X`vIQODtRJH z0&52`o^v<@^c;=>osQ*nv8#!6gc{}%-x2euS!tG6g%t0zPv5$E?#wa7OmLrlQxmPt z73FSQ3X;8!=)PS^LaO)})+B5B1nF-xpNd5>daet$!1S~8I^ zWvAqJjm#Z5)-rZ_xHLfydF~Q&$W7J37q(jce~Qd9Hy(Iovaqot*XAGcl=M53uDjZ5 z%nbDPHk8!NUg+ySw@DhBKfUEb-~CcVrkd$@^>?u5hqGX#) zELtTx4a1hF(woFj7^5==tw_oQjxn0{zJzh0_^zoDuDGV7>t`}oA@^7nyUI|Twh;*v0V^|RX@*}V?d6j zq;~I->(k>~?heH7gnK`R9&`Z5a+15o?Fr1GI~upn3+hwg&j&;qReFHhqasNs=m6QugshR`6MMTd+?dkQ}IoQTtE!5uSix}?2{^hc&QcD%MiH(57#wa{FY2L1m zEn<$SZ;aG^k!Px?`@#?y#Vb-%!d!1j_2k5~ujb(OPoL^MHc^4%cMZ#yi(XJf*BR(f)CUms#v~`XpT!hnFdA z_u1;!UOcq#kFO5oHO{s*&G$9=YMZ*ty}m;y=bk;0 zhej&d`b~CpU%Pyv^%ieiJa8Nox`w>cOq92JGD{omX8X{YNf`u9#Y~RL2N!#uZc!tDL4iT@zK!RdS+uk}-k9G6=(vlCKVHs~!R;C92_R z@T)|OcF$U__sX+>G&^#BvTT#BHP++1a&9G0(;wB**}*zGhY_)1G?bY_ZnckE ztA{`I)%BdMp(&VQg{arS(|r?5YiW1ekKhX~XKh0^7TsdC@cmKmpN1u(oN-OEZ(hL%rP%b=6hg z@_eM;^;$fz!knVcC}+!dUo|HG8m-K^4@hk)uhBZZ`>!Gx@O~>#(dHoii8WopsrKj5 z8gvkR%m$^w2xNW|RcbI`J-4M#`?fvS7TPs?|Ni}l_8&TUU}0`*BE!MXLT9OIM_P6p zg)k&3?@7^)ZK-G9{Q^WrES=ejvgJ=C=;9g$14O|mq=m4a;7|Mpu%7#Xt$B$1d(rL4 zsYVOCWq8bVN~-G$ftkO0K`;s`KtAbj%7lNDke{u9#DG?j1En5auEo~Y>lHH^l?42R zP6+*?BOVFnX3UGl5P3LF6J0I=Ko=- z?33QXJaFc8$aGZ-6vN;Y-Qq-zM}iWfo6>bC1u&r^3hfRTi?XGz>8sQ=z1`8ae4#nV zdubvD@hf*xcSbZg^sp}K1Pn##v0DO$-i!u@W>i->^(*cHG*maEp?Y_^C?THMChGgq zcKcX$Ad(iucr>D?dR&XcC=ucRPM4b24XZAYQU%mZ*?B7JQdX-|4{}%yl;nNki#nuLDAR9(I`bRx}(v;kCgzJuqju|VfIM45?C6{y0DRnCF;hLtlk_?0j5u6MI`9X{ckJ(5${-Pdm; z!LM7m*i#Tka09UWPjV`=js%zY#|U<9rAx2)aa=9an`kh8)T+%)DQV2}mgeh&#T5hf z1toTfzFgSU-B4PUXQ1x0ZF{;aQXh@w!%5wER}10-13wjufKD%KFH?Le2FdZxN9fB7 z&Om{km~pC%g|1pq@XYTe8x=Yeob49GqsT@*6xcroO}8Iq+UF2_g!c_9QE-f+a$8F_ z4FMDoqC%Sr1R>!C!p(y|1f3{@v`eu^W}W)& z%7kDF7zhr4`=tBK4~YVy|g(51Ce^Z*7YUNnDH zmd8@p?Mw}xCj7N$iZkinp&`V~5Mmp~Qc!YbI`y6*Ea9%zuK8|yAv$G;iJS)&3 z(qIIurO^nKa_qU0ni@VgKJ(g(ACVh4#GD`I5A6Jisk4qn{rpFtFM=}`>Jv|VD17ff z_zc=oRNnbi)FH*+1K+FuTR5XWDHH`#5Amrw_)%)15->H&a}j3kJg3v9YIUg_T&h8v zirxfPgJ7`2)WG=#*2E2f8q8dVc>~g;#93xQZB|;EekR>wGAi|YoMKvS1c%NBW0GUVMaee~I17n z1#hM1gZ64=oL`6o{}USoc84cr6ETz{a4#X{0}P?_SSN03p=ZRkqvvJlP428bopAV75F!tPwM0#w+>zCXCg;`+ zjO|1WJOKUsoI2NDSnDY=($7TS?FrPBsMiD5yz+IYvA}?;x6;Q4WyptO(~(-m5~4q2`1UZ85JhuN?NLr zlEQd6;^!Q;Jh6T@Z*n!Cnu?=%vk`~}^u6DoctPLa{fQ{_z2BdhL*LK+1I=lCYD(&f z&25hS&s_#w$%ir`G?8*DA+R1g2RiCY*h_y8TjMm} z7%(>4;Goi0(#uuf?EuoC!yKh&psg5?2I1LtBE*<6=)eI+E-^)ABGX}uLog3JZUj2~lRrm-5fC#YI1PIcIZ3L0GOqRs1EerH!#(Ue3#P+wN09pF8Y z^>K(YhjY4BHP>I=Q*vc3r=hOWvR@=wC2H2e3rl^KnPW}u{njFfMWSZSsqU}LuBoZZ z8_Ajf;tTv!V%A|3Qvh8)sq?mT}nk;IKadzh4_RAiD8i=N4ZMAFXWZ-B;BnNksC z*>ubVvXoF7*)zVk@e;}A`x`ESq!ykzbLRY+^XH&H<0Lj#e|`WGO9`f>H zCAEL}*0<#hSyj!APc9U{FVPj_NQuljDPbn-Ol<+|x)a=I0|ux|rLGd3D5Nq)45AJk zWje?&u_GQZAPquY!U;^Go?)Fgn92m&OsiS4TVkpuh-qAE&dD0>0*%xu88tc2wOX(2w zZ|_pZib+BhI)%4?CF9@-U&)TW)q_imGrK3yI|+&(+{-y}#~y_d8<0KP79;aEg-Tn+ zgv!4t3snn*sxbJY;Lo?g-yAJgd5m?3j=dNtQ%ebsc*dWD+-X>>9=rS8Ry@z~g0;!1 zC)-)yfLx7p-(koJ@N$Z2gK_}P1eFdJ7I;k&^54hIDLr_8$+p7oM*t?I9YjLts!cCp zCyaERZ2fF`MTLAP@d{Ww=>vU%_C|kgb%q06(dMiqdV~TFVG8MOuB|$ag$x>(3JNC= zoNglmyu9>Z90~qJ=9@m2l{Z!0qfYA$byEwYE%r77C^wuYUStBqe_OtzfnPp{2NmdRK2~lhtGs2J%3yjOe~(tNWb-qrV?KDb!ZbZEF->?3t9TxV2ac9;#JI-|HgQs)o<;fdlbdx4<0 z-5Xm>+pMxUhMTpxYvXW0rOLbdK78OM|nj!;5NejsLV__>aQ2OL2 zo_`K9^~l2?df;ko?7q9Rt<`MK6tzLl&a?pw>`P7J?x$AJye^d?4zG|_u-K3xsvxa^ zMslnUv3L4ln}9aa&xxcC;h}r7l(rPUrE3a6YC9&peM!=^t#9`1@_ELIM73~0p*56 zyr4aXl6xvQ)S#Gv$~iy=rsYs(sL_aMWtQ)fOAMv%Z>+@d+?lo2#RUvI*4cp*!fi89 z$AD;%PvlvER^Y5)iWtEX5z8jj`4RcokD}COvD=}~V~thkYhpD$&#Pk^sfu785YVEa zMh5c)pG%_B1$CmVs&`qr2{WP122xRC8Dw8vFY@(xd2ztbl<*PY^o*uhYr5 zjJ`d&Y4dX{`{vf?*Qq%bjuv+s%M*s9J7LtP(pPLw7Z8H>OHI7gE~;-}EZx3DM1d-? zWq@o&s+YnItf~j=Y`VG!?>ycXHWqo!@}zIgsp@R1ZmucjHD+pT<&hg(d7qI}grUY( ze|X9}-(PO43R#EYPFFeQ&9>sEvg`;e@SEQb{`VELH@kN-F3b}buxpt3i^W%dbZ+-# z*z6N+KHV9}g_S$Q|3E~#8%B6eAFzXu4V)x#15RBt z2U25Jd53g~{Buew@W_fe6XQ3An1Jk9{)N%llIhizU@)d$ATMkvC=XC_Z7~vAQ;8lc z`ACdxn}X&5II!o6X5W5~gTVxf8Z0o3*Gp09K@pt7sZy}{!c!LiZ0Jo)(-nHOn9-O) z<>0wvM-Q?NyZybb&FCxStF5W7^0X4D5yw@o04Cv^9s!MdJO3`C$aM%^-rpc%Z zmCEpMj3kS80(ddSOVy}FW=AJ8l6>2^oW#Fri_1X;OZPTHb3)|l3B*rA1h6|80D>7c z0P!tKudUG=H2U?pR{+jQz9D;rm=Tz0=gy;>f~dK1PR+8mc2M6=0_=yvsGI8Ut$N)F zem-VnsGe}-vetLr{`yjVV(l$-wleLFmU!8$B_0Cd)Do{IrX^lukutR)JNTn_eiWm_ zrO0WdxJqt(NKl8j(>TxMntJ@q-DlX2h}YwWa>(y8cb5O5D8H6{fZwNfRR{)6y~n7~ z8c2LI!ykH#g4U$yuSeOBEWOAG3kE@h3Pc26QB<@K#D_}s(hvi$W|M%Ti@CHEBl_|& zIo4_;ehmq7SL`TyI0TdwPfeAY6KrQBlIia4j${;tJ1qqS-jHs3F7cy~bib#eAf-`5 z1qMS8WWZ#Y&~rFyZaRGvM(s zBiQX^P1EI;jv>k4OmT0u1JLa;W(R0aIr6fp`J;EB-mc$5Z_`#Fy&cyb65SBP{f?+b zr`#P<+zb&%MS{(cSa)x0ON4q!#vK!syP}xZTiWNqIdGV}!K0F|0z#F&QBs7aJxa~m z;Wl(%9OrfXGzxF2cSBwgpQ70)$%l4JiT|0y9NH z`kv5gsK~}X0ShQ?68eR4Bi0zHEP{+{-=^2)FN(66*D+raC0e7 zZ-RPHayh+wUG(LsEH)a9i<^!T+ClZi9F#)LLDD-%U5%J{f=9r`AfVAf#pq0od1xEg zgF#Gw0}eeZ@xMU!wJWDiAcZ?KJlNgooXKF@!$}?@uhz)X;mBMmXg6!Ql31^ha%zzfd3DyFYkz_DPZ3fjCpDYYJ*W^s##UQs2JI{rMtIT=~-T z>p2b0ZAF5mpw!Y@H{Rttb^L&1Ep@b_!O-Okn^m2sKPF+HzM<4Y8+|8Wu%U+qL7%jg z$0rk|jCw&S1x6x;zo5$@U`~Y5B=wFskD8x1$XR{U7|Wx8Qk{0AH;S zwAtmQWIa|gmKKNgozO%S{%gP*Xs>VyiiX-8#!_|295*NIckV_(Z z*=VKB_GH2UUIZ=9X0>?ryRUp|t!J(--CXF-v^#S03yK3RwT_IP73C!)#)+xJ``D*m zzC3KJ?)H041v4LwCPSYMyP%ERc!wk;;xEfkiq9>@JJ&~+} zw#e4i(UPPqtm`L#E!4yp%zkf2)v|XStT*RkC;Y=$j^%f?8Or||R~?&?urwAnh`bli zbGJCK^U+@1%Nw{;h?QRegG=OIRI8MrKGLFcg*XD#2*If}OB{!q6)k62W_wZ>u_uj2 znev|FZd?al!MU~7sR@@kUEG%BIK_le<+6xG+fvZ@kZav;$?SXHoJDPoHI{$N{T&*_ z?xh;?{{lPmDEFB_S{1KUje>FS=#WLhAu1qRb&Y5w zOY4V}heivEMc6yMMvET629!-t%ZsUpbFY{a7m*6{8JAV-wk~DZ1Mzwm4wWt!3tp#3 zhOzEWH~eMs1dOq9q=PV28x3s?9xJAf1&vK(i&*!#rfy-wN%<3HIw;~J-B84qLRW^f#F&y-P}JUBYvGl-!T+UI7dMWS`>$QU>^m3g z<|a~IwO5xmlv-^4C&u^_l|9}}u{5!$cYU<$$dJoEabvIlg-^VEd8D|Zr_|MGH)j{O z7C5RJ7S6O?c6Jvuja8)=HqSK)S0bCZ5!qFPFTc9eQM-2G(P_dPfg@V|CVb=r+@}Ht z2d`kZ4Z|psQ4X?YCAx1h!YgGY;T1>*&}pOFzVYBfMT9@)oySA2r-oDgYwY zVcY4j?F>+t23kKJ|B!2rj+JTvhp=$Kn1&Wk`WbXd;^yn#!9bxE)Xo6g1nhw{3X%>0 z1Wu2Q4)kS+>Ng=aY&%+aYg=@CYZ;+tv7T)YU)i747qyxMc#p1NS4+shO;qYBs-!hyy*q@zJF+y?_`U+s1_i0F1maP#sN#P}d^?k%9U&_^m)EF{BlCa#ypU>w(oJQ2JIVf<#`t!0kgiTB5kS>Rr_e!< zR3wUor>XuyHV=$_tyDv{g zC3W}hsi?Z{zC0Bb+Ks>0xk7w7U*CgKxS7$%iGaHIZak1k3c= z6~HDSDT$Xh`M5;WG!gfp(ugD`7}fv*L^wWy$Rr<^B7oZ-7bYfBwur^e$PQ$Z=?zR{ z3Q`ixZ1e-C%!xIQ+Z>h!{@8y4#qI46-@bI=F(o0RVf^~OO?a|g-HRq%Ms2WBWrsDWe4wSgE7b56BF*{vEr(#z1tu|#@@@w2h=%L{fdFn3nF5;<6TGRT6Z*7l}?s%y;TbJJ& z6Ku%wwwDU8#E{b^t7r|DMAOg#r^nU^HQ{SuF??2N2;^Ml0nU$FsmE>$fc?M#qtg!A zzt{y!f%BSTSYaKDrSkBY^&_Pq@f3=6;>i9b8wEKrl!+US+Zc(?x%dA(bjaPG=b;ns z{XY*KZ};PQ0$pjm$!I!}bgH*8$)bV{6dpP9^pi&(I`Yts>*vm#*Z@7!Ec{S$3r5vN zzLza18lrI)E}DlY(Y_3wDKbair@dK7u4{inQjEL*l0**&OYi%(Oq!j)4e;2c# z;fkOx{U^$E+$H{k=)+{x@M_gSrJz@2fTUNcw}3cM-lq$UvK@Q|a#rivx_%IF*6-xKe4iQPla7zd&HNTx`I;ZUOMT$#0O$z{~V{AK`NKp3JF4J zBy!g>PoF%xwtr=DVfS<;0y62;(jkr`*Tvg;S0#=jIAeB^UNBkfhAatGxV3Mut`WVm zrGkQygI9*@XS-`sga7nl{uS_=S~61#2ZsCdX3UjsW6NiI+opWkO3UmF>()?;ZVgUf zUVcS>s=a@Gz^cwDD$A=MYVe>pNXRuqy`RWf5~ePXsQ2?Oet50PJ^P`3!O!x4|I4~A zr>X7gw;ve!`17|`Sa*h(SDt8!?#@uXw03#yDWX^IzVw*`{7o?uuvtYJ{AtcdTqVqQ z=m~UI7H2Dn0~={Tk@Q-NUQtB5R()R z*$hc?eR0Gv8oL}Fk?C8&??)~($ZREIm@4?uYJ;9F82Qv@sF?|MZYk>vDbI9bZkWyd zV0f^9-p+>cXj(rB-I<6XhHwvzXGix2=J*^p85pB8-;kXq@G7An zKnG4~;5JfdUa=S|w#$_>MwC}7DUEBAi*t`3LzU~^xtYm{!G17B6XA}tR18^=>CE6L zk^haf$Pxu1P%bV;C$)Jo9_n(D*1rsmLVZDMSwcylfum|`+74=a|I<~}+$;fjK) zL8I=)6;g;!5$zJXid-Tj2_iyKXcGn_+b91u zk`0TU_S&iVeWTNe`(~jqt9Rd(k-!47np#t?Be(H%YfV+z?U?YtU!dva{{k24hM8(6CD^ znGJ6>MsXztpRm^$_mb*6s;@A%=Yc>kEhJ#|oJJ`q!4iY?fvC@rzLCkABRJnBy+#bh zP-@OxS~Rig#U_g;qZ;I8qU{#Dt70>(Dv!J{a_~N^(Du?UduXzLvavv+R4W*-mBJn7 zwIa19&NY$%@3zN!smW(w+)^bS^M0e<=}e_WYSInEr-d9)vAI3f8iCgebNduG3Woi2 z+*n|kbeRgXt3surirWA}0ZL54gIS%X*9e>`Tnx(3AZkG&f30Y0paI@0HE43u(Scb` z!~hXxt;Wr#tiHtllcKVVo8uVrM`gMw_&b{4sGUW9)MQ@rAWHK@qfMr&`&gQeyX0_TX^Qd8c z@NW}*V)y3c$=~tX={qr>@Xy8AQ=a}tm$qziZoEi5Smd3ACUZ`s%Cg1W=4|oz;E$uK zI?^k8Yg+nUDG`AKwz=qN0x*l}z*KJmS2D=$1ux4L{*T3|cvcl}FxK%3T`#ZHpFAv> zQVaM)l%KEa;JKW8TsfxDqoL_f$YjMs=+tKY|~dc_#nFsDU-I0D}YdZhpv=XAvFW`y7y zA^0Xms=}1If$|0ouhglOz~+RU$P@r`An+tap@0}U+#?Y~>O{V{_cf*{@8QQxIA%&} zO0wr z(lm8uh_5v&#=8x9-&SW5z<^D1FA~+;%u@q(#cLv8DBT??j8eP* zhTlr;1zl>ME3al(S8duA$=5@8DS=l_HxH4KNh*amv#k!OaAAe*d zmxRB2b=a5o=>PWMNSP(M@Eh`~M=yWzlEpuDW=xpb%E`X_tMn36YN@xuX2?!A&O<^u zRq$YtQ~VfbK{0xi4{&o}fB&_38l(;aRX9H>P=5w=xWOq9^$Chb5H}))U4h^bx;E&b z`BW-3iigzdT6pCQTBy_2u(Lf<$x{-mVT)@}+8I*5NCbqHZ^8>lS z8O87r%nFw!7Ydb?e#WPV$Z}4kGGlEFSQH6+dkB}Jk%@ii?a|?=-*d6&XHqARcnD%J zJ-4Ezq@<-HCrAAM+?m+yj;(yKzA#Ep#x(Iz+Qpt7aY_*5mgnS@WBk^N+}w)RO}cf! zt`6>pZSWlAVFXC;MTlaM7|~ri{UM?%d}q52Z9MXsilSM(An0pU(8j*eFW z<+O}-kZYvXYMEO>t7Q#yyh^lCdGN;hbIVH@eqnUD$&W^+dKen9*ib1%1_Qal;&&9P zGSbyBG5qZjEDNx&O~9X!`-86$7R4bVPJl~MB1{nK817`Dd=>`^^)y8zmD*jy{SNQ? zov&ONJvC&v0w*|gzM8K>7)`4|&rWT2L1AkB!p5`5hb~T6NkifuJE%MY)}J^t!fKfHAMjf-tn!+Wbr+p6vQmw4|- z-M9bpse_{(CF$;Tou{$8^yc3`Kea_e)473ut9PIwx5nSIaDM#YcMcdza;>EWW_|FR z5ey8%y*J^rehFC7Sy&tsfzdJ^Ahn~1=VqJz7Oh5E2Xq>?mj+=tUT3M6jKdgQXQ=!odewOUCMZr-k|k5Vsx{{W-HA?H z6eFk~@t0Z3_Ak#C6_4+pbtPCZm8#=T!x=(z4%Ftdx)+3@yT!VfffFNtcqPd?MZ!Go zgJ&iReHBh~NmW5g!X<)|%pIu`PDR2y!}Tt;N6tMw@kX+xA^Q*Oq5fxO2lyq+Ozb@)~V$9)oV5UNR)}<*lcYmM@_ka73jT%z$~3Y zdN*$b^#BUzQ9~$f0CUTs&mOhqj?4$hK~SSHWyS<@Id94!S{q*6e{tj3%JQE1>0Kg4 zJeFoFlwBy8Eyi@B*F%md#D#;S=3Rz$+@&mrtEM;Gu-s<9nR=56_$CMy%#r(c2jPJFW_xDT}w8kaPKQPqlowC z7_RLn4*2!|>}u_E61JqdFuRR0`}RoKgyk5rACAsN{^x z8u-~dGz?}4N%NKZ}g){~BfZMo@CjAZ8gSv>gq z(&ErSpxxpyr@JyyxJ0rMdkUg(i4_6LWONJ`Wb@l3xV#$4K6W5Rpe{qFUc|W=Q6CXO zG*mIYdyh}=>E3(gV@ppyYPFSTn_cOqlv7o6L(S&kZ}L!^CG6hYwb!|pKX~9n3qzOZ zYZYPI8L_ALMAN}&3ZjIS5kxf9e&?|VmYdHVEDw}t>aAdvJJogksnN^n&h)*zySsW$ zPNKco#i6c?7CEbbhJAYq(Z4?rq}5slc+IHw6Wnl(3DIkV6m$UegU_h#rDU+6 z4iq2ggk>yrnC+KZLCY+_L?sjA_M|A0NiY!;XzWOw2?Lq7IS?vHAGmtnVCbb3BQ#G|jH54k6K{L5cE`iZRC8%^= zba6}?$Wrz==YVLT(ioOni7}xhb2e0Ap%E22+xMGTQI2+G&ZwMGQ2r{iD#l$i)Kq3^ zfAMpFHX~NW%v^r$NbjuAI(F+%_6mHlf4JO#{ejDMsDc@<93;CbwhHFmsg`5As6XIH zS6!s3L=`cCwPBBa?8e^47he6?l@VJ*zjOY@(|u}FLCUu3V7x-h-iv4iICkX)td){# zVpQ)SmQQPSg?ozoa+39G-E{IJJ8~slyTG}xAB$Q~cDUc~_1vm| z+XuPc--ydGoQ%!=d~hNm{9ua=1l!*~zxS5X=m?d<8bRj?qSn{B*C0}wi% z&Oi}nNk9n_DDyUDM@U3|p!$^7n&-?bC@?F%-Mh-Z*=_HxD^i&lgF%2X7;N~P9(Vz) zn4eo30PRzbfA-pIM|h>8^;(yOXb}JjPSfUv+(TR6$+35T=C>2$L5SoTRZ%ofK z1yhF9BQH5?i~7&aG@qRFN5p3mb7X4Gh5kKfFJGu`=_%3qYTx~KL|i6Z!@J5o5lEpL z-qpcA3&JpRMPU`}3&KBAPzDK2a3UbM2Ga!C8{IT=oT%Fs2@ygjiEpzj;FS>kfG&%+ zNKAY8%w?2`rMh~mUfAONiYV1(WNup-CRC)GUtUs>jWAB@u)BV=xh$>oB`hd~+adi0?NA1$r0 ziP!2l?J^+}lyiU{(#|DrGy(A)$rF_uiK2#!o@LXEeMv7SUP1$pF7Ko+P*4bUfqNTq zZ}_>=t+Dfo9aXw>!iPX=BcJ0Qf9!$lXHOF{4>PqiIqr0pIT%-JTsLgy#XuEU!D++7 z6y&sm5(8Nekf{6Ux8%ed4w6WTKv1o5z{rJ7jDHIGtU?4n2)->98miOfCfSTcccDhm zcU}Ja^{Zv;!Jj>Hs$$}F)S?YrMnrsox< zLd2XMzOwOx;JZfj+9<6xXB%~yhP2l1cB}F~B~&2rdawQb^9Ki^JA{KLos(B*e)UiO zrC#Sr{%ub%+gl#|L5#bbM3WfJM)lIizPC0rUF)msU9CUev3z@`QkSMI=&TP$w$SG9 z-M;sh;vDRuG47Fox!VoCKqZjaywGptHGJRj8_WU$7l2Z&)F2{)P$FrSsE99PQ-g6t zQIHw|r$t%P?=v{rq8KQ~WuQn3q`@p3!#NmFYva-1IMEeb^Fkn$s)BW z$5X=aF8qmIm#6FU_2qk>K4gkM$m>oXTX6{K!To!lO~7AtW#CppM}u9&u?So`a+mKQ z?$pCg5(2Cl^VHjs4gxPsF+56;)2TNQZW0t~su@PmNZ=`uE_bdX>P1YD7dRMhYy_k9 zl%~6FWgeY6my*ws0d!|MA44}CwND877#4lSJ4N${j#dlJho0DtBvWbA;+ZD(69I8Q zn2PFM<$Voqm)wJmC3bsed1)?x;>crjRmQVl zyVgZn;r8XhI?GQ&35@cp*!0##=4-rLX1Z02wX!p7DSfNu%O5kSL8>r6DT-ECSrR66g-tb}AJIv=G~O zI2LF^z3~?aDoCPqfz){jrODz&TYn!&3c8E zG2u1^@8hMdtR~oxTnnzeQhs=KU&)OJjb@dixXeCSz8?I^f8*WV{GA^JS4&Eob~olJ zR9PxjakZ`1ZA;@%-2BLB=B1O>EfeWZv$w%x52}@X@Nam3@E1B~*KCc|mA+~&HWztw ztGnH7KDjf>@AKbOn}7+l;(?JyCRudzgYHrR7!NCwg|dzzm2*Z+fO~Ug?2ziHl(v@B z*oZfCUs2vvJcINYO0T)BKsx1JxEY#!j0-_aQ&P^whbj#E_r%-5pPdraZwLSHQ)*@K z8hUNdxe=@De)5~a(Xn0qU4)4iX*6LIgSl;2WxsHQN#+1SW5GgGv3GxW|w<}_M39&vAl?e1}# zfG>X(pTD78;y!#bq`dv0y&jP_v9^Iql~7bhCo;lp$p$F;L5qOfXiNJQ9uU!aWKFj1?Y|Eq4*RE`4p|n z%q^v@mlcuGgz}-P0Gy^OG7ZHFzHemiiosu0jdb`jXNq>OtX2o#iU3)>Cc~iuGKM0} z+q>Mo`p9ghabF}*g1yhb^Gm`_;h)3n5epL$ZWcETcs%{}MMd@f9?w8Sv0(QM&~F1C zH-5ukX%oMu^nkK+EB!*60spqW{qv{zpT7O`r=eXO{7-`pac(h&kj}W9g~fHQjFOIprlRti zqS7Me7mDkg85z#HV%PkhS!a=VG$%c;xJrDUpJDvpvGFZ|R2siWd>(d(NHr|))}LjR z))vB85pPgYgB+vkTv0vUpuWhpurTK+^p43l;P3s*y&lk)m4~07#uuO86`|zi(bMVi zX*7ELLiYGCCmCGeFgJ>W?AfchjDW@MN=sF8z0gS9YGFRkk;GFJiP+j~+W05LsdQ%8 zwwg+JvI!PA%&+3M^o%%@#AocGXN2C8pEAKjI1+p&Y{bt_@btFV!<~2{1zIEF8Ma0d z^T?i2p2tK_ljt-4lKh0>ISZbVKig_elRO{euCVb+ENN=`kEq{(w_yrUSr020KC%76RrjNR z_M?-%C&tS%%DXE|y3$kf(o;;?#g>*MbG=#o>-oV2gOY!xAb2UqKhy3UAMVLl4xfE? zX!h2=4oB+C1-BGB%?-szANlp4>~{_v?Jk?{F0XIY*l`jSIZ!J6)^xZW~VVg5Xb;J?dX!%a7s^e>0Fd)mZC5YJGB`DGOn)!At;= zfb3%@ZNN_#mT)YEnwcei z(gGhX)b0lhL@ahLMInoBY7{*E(ymaXC!Toocr#zsPj}xBiz1kWCOH}7>#h*1DsOCSSw%3#X$6Th}`@Uj9^(NQB{ZSyj z-YdZC;I(Mxz-vp21h7MiO>x1r;V#r7F|Xf>FoB68fre za?@`HT+v^`2mo%V5SoIw!%ySnr`RR07{MwT-Im&1t2xK%(oxKk_619RN~MK`a5vN% zh24)mqp(}4-5z#`)u(CjHS<}tV)z0<2c5z-O^ROSba!7`Y&dkR^I)}3v$m&Ywb|C1 z-@4kjYp!MO$?4X$y2^5`MO%BMskuG9q$)qZM)9iAR$7|oE}eejo2$1kRn=!XtwRUQ z_qg9_wZY%{;#aLw$e6lZVt|Qd2VaCChqHjwE8UMhw2=V zP##Dy+7C3dZkkGtKLj-bTU$x>9V+!nh`LIx1iljH5A0&DEFuTRz7O+g%L@XP;@END zg>8rA(lUa`DkYf2l@zg1s%WxPajzP#rl};yY0lNcqlWOa8SUUBW|AoDAGyxf7*Ke(XofWx>kRr?&NiG4pZ68yS|v2$EMvgvfiaNX`0%*Ua6jHE%8Ix z{^sN7|Lf<^SbzO<qO{JQO+FfS=$ED%10W?-cOH{NV4~g5PNWLBU@Y{Gi~if8r;;!uuWx z9v99XzP%d!2j0GV`>^89-2&kk@1BF=gH6L}_Ty|X;_RFYwr~~aMsIVYEFE=MU3$tLg$n%g!UGvaf+-CJzZDya?-!JAOG*SJMc43t1O$}p0WDvEWTd-!{74S@Bj9x;Q!*y`N3b-@(l&S?|vir|CoRE zjo`1+g1^rHcjZroU%#n(IQa9+m7f#-=3?b%g4dTc+Tewe8A15r$Zkc4@YdZH`QKH{ zt%d&${kwWw{NL)|zZ?9&@IS~&*1dO>ud0GvCwDZU&p;rGC@lVe>b?WMvFgnC7U@cI z?_IVfS>1AzZMj=+okk)a)&(=^IMin`CAMpEo?$#DL)LBVRVW;H>SF#f;D>&ya|` zp>UQH-)iN_b7f&OL-{{%e`)Vc59%aCaz>ogw(E3jRz+^hHA9j8&?E=SHPzf27beT z?K4G3_-A$)9}ZmKQpA5czg9dh+&y=g{sGC({i{$!|Hx>y_w3wLry1|bhb~zJpF|(` zs6QCmj<#bpg9j%~ENeT}@D{ zS!gG5bw$%upD@1t&c<*+UBb0Tv& z)gI9oaC%?5Wyi}K(zl+xYjZ887G~Id7IS61J~>`jlvlH`w%_~CyLC;0Y>+jmyyR}Xqi+A55utc2ncTdLcA z!>xgr_XOT*pDNZTXp&Nss_KQ7Ht*(!qKw=O_tvDE-tj8_YQjyPQ(->Ly(GgN!b9gq z_3s8g4x=<=n70KX2T1Gm2DE5}FE>7pV4ftyJdu|WC5h1Ml|p$`3g;t-P`$T^XM{jM z`dRZ&K`^Ej3;{_$Ip#N*qe}&et}C-AA&@M2R;nawm*WK=c1n?Sl7G z%i9YAZyV)5m%g3yuN%K){JMDl-32b_UC_bV#V+XQd#)~M2;jTxini6ld=YzL3 zPl2B6;A6}ue-#>?nzFLdoSgV~CZh{zo!Obhv017vi!ZRqO*45c%Xl~cGw}^$;NITC zKNw$j4<2fJ5%U^~^L>-nu?eJ4dv-l`asKsF_aADQ`<;>hRpCd^+$H7jtsC6ac=F&x zk>2!7?Uh$uQtIhULDQXWo2!o;J>;$FE6?0hHFajQeovR5z2{s2aj9$J^Y$a|7njQT zj%>q{KB?HFyHTd2*XwrATdkoVYdx3P;6iOwKtyhI}$i^#E(vzV!TI3#yB;QzSvmC-jFD{GoZqJ^}Z{B?1WR|Vk zXsj~Cr6%b!Gcp}cPj2@A$^6aFs*YWI|G4~Zf!7e1mZ;B8bIvsJnvZC>8~^dz)~Qij zd!;cqBca6ZN;8^l!`Dn~8ouzC&wp@!X#0q*y{aHLBhg}aq#4cM`H^@Iz!SJ1iTgAY z=$Vngq2l)W9vkK;dEm?!Axtdk^8Yd*jAiQ%91=D+avzxepdNregyu_O>N2FTuv3Xi zTT{;M8QNEV(`@po#+<@jQ&K`oexA{mV|80|ifa4Zy`w2cTV{bp>nL*+r<-$=a!On! zIeDHIYg4cGp}?j5&2w+_U4bvNf8H#zXB*5Jxdkpup2uBU*-%pAugLFf%5fK`=jA%g zW_wbeIitW^US3&KXsjy9faDf9Cuk4Na5)$3jUCThNaa-+Vj;dok%??iAlHpio<_s` z8LSa}0evPL1?tNAuVE?kT(uW&^&-+VIT!EJVbmY51oGurF7mq+(@fIICId`imNAlq z(w0lUaN6In=hi1)obJAKYgyf{8z1}p1Y&{wk&`obx{A!01O9u5%X?sEIKT1e&fzAL zl;3yz53av%?%%$C>&DWJM>~4&xc10qPlBziGV|`6$F}D7x*K-(x!(Izd+YX3{^n-U zy}%O!bbBXG{e#ck?f0cM9vrUJ zB)s&6iO)Q6^+n#jvzzZe(Ie%W3Wi4-eb#zMcTM4ir^cF(JaCbwe&Pgp&<6(sPibc0 z6R!Xd%18wdVi9%L?g%**RIErS2|^+xcRnQ?ttDoRoxKA+?fIj7<4e#FywDf;&PSwR z|46kz(cM((QRsCQ$0JI9`R2+z{Y6s^J&vTnU;BjfMUew1l$2~15a+plfeFbC-d@XH z;?KZrK|wSjBwmF9wPLpcp)I5wkY;FsB?*oeEQ{15;2&A|8D-+i(DV864c+0&v=Dac58qq5o3 zHr3E6zI#EhJze#~``Qni4_(rG_OhL5c#-`6i<+7DJ`wmy;4O3On6GbJsWr6#EiX`` z@_F#&X*Bka2XvvI_Q`2aSqSCu!Y;@h7zB{{ z)9~!MnP-n0QfA^?;aJp{ej{PaQT0o>xQ9t-@uPSK$M?fYVPH0B3W0+3C2(!X-gMZ> zyxS6Zv-P|`@N+9~ZaFW;oeTVwx1HmS^80NP_KEFc9NaBRJc>mbi{>h=!uN%JvV8Dx z?}&G3euOh5b9?1e*zrD`b|+p4i66T|-d86{x?yD7Nh6q+BK76_X(fAeEYy**sUACG z<+wjyF{4xTQbE`u=qSQ2-fa&2P&tUD`TPWXMe)VQ13%&IkMqV0DR@}~O!n?E}F=IfWf{`!eG-XvIv+$QcR zv0d|R{4E}KefP~bPsmucq9Lhfm=O-FKup+@B5E$JQ{d;Yv4TO zL=E?zcwRik<$we0pSR~H3(yacwnSM3%sPT*P6s60h^4gA$AJ3$r=NCQ(&{~OXt&GJ znk5xwbvsQ$Gm_aq3|z}zk?ihx%4+hO94Y6>?95<@B{E%!ZyrJPsJqSB#6wQ z2**XG0#_AXMB$KvblGL?CmtOAt^fD~w?aYet2Y_Vj=^TDl>g8JmwfNRF~0KB?>{g) z_tCN8vHSk<@bHGodtL@zObV~?ui!lsxe`B8hrqpfq}mDar1Qug#S2juT@~M(VNMY# zE5kxLkkA->WL5KVPk*E&&uW#1KeI(AydpdmZ!sojl(|5^w0{p!_ZB?6i@VgHW`_9e z;} zDQrwNSV3wGGc5QGuChwIvC@*!+p%@0+iLNY3)${0j}KXQRTaaHru@nc?oHdhqZj+V zBQ2IptGCE#7k?k`FRN%adVAa>`wfP?6aC)CT1Q8wl%7#nX6x`83o1M8mKLug!H{~O zzi!unr>K5oMM3aLHF9J|P#SYKvK~dvE(moRI0}7k8jzyA znf_-;pl9K0&9Ufjq1@n75WbVYg>^ZMMZ7plPvJ!p=}CByku$aEKwYqJZ_PJVI6P>@Q{`xm2i@dp_*j`_< zb!^Nb@lR(58Ycp8@RX=PboNEzAt@I#@A~}RX!$C^#D(f8YR#w_(R9P-CUp@8v7jUh zh_xa$Cq~SMSe37hOpq5=&ItAyT(1M4?JW`3_l1g<>!gJ?ZS}g*aBNa7X-b zpL@(&Y3Z_5ZEh&8o;cN6vAMB0%jPvU=X$D39Yxjltkyc~m_^!AHD2o70m~t`-k+WE zujwhp4a45HOGc}xqn@e3oztbMD|eT}&@A12k-0#_zmX7!{5?AFi^5Bwkv8u0KX!J{0D!ZE?$ew zDrddf*-?>Sd(q_`mtNX-;=!@u?bVKqB7ItBaY5>GvNT>uvBfrKiL@a*ZX^5B=kwi?+BrM?Dn{=3E11p)weMLAVVt zuHYv9$rwf;WFu#`!TVmOHVPA__DS~ZdnWlIA1&hPt zF4cl2kf%dqc7RSY7&JAi(gBoWAp@Bq`-I!P0}}(@__*BC%(}L!{;~e5^g;~(vD>rE z6?q5-jPw-L_!>-Y(^6dCwj(pz8Ko3lR~hJ@Ll-+6?OoezDT4TPUbQo?V(W2#Ul$M?6 zt}Al1mE~5AoM=0Brv3PR+iWeK+@xF!1dn7l=6SZZ+MJ%k8hci|(V=-sTMV~bQM$3Z z-{U_yTK(jMN56UBXj+jcKi!;{oROMdnr9rp=hgiOrfnS)-eXR}2Lb-lzX*R3N1(SA zb2ds52;MYP%V^5k@|7}8OrMve%%Nxq5e>yoTNdx*7g> zMV!F9H2E>ZlIdoNynya{I-ALou8>zyX-hRFs9M`o zTCLfboF*%6;H^0SEvV4k!2ep7k7*VV?gl7sjfn84FvSg`k-V}Y-$?V{(6EV+Z$kDE zcMka`WDm7O3;8CvC-g&gIUBX08nF>tAr-tb{B-uvUs;kRiaM0{rL3E9B{H}g{5oVY z9l;*Cc;RQ$xt9HGI_e6ZO`RW>`D}QfqRs~dVH$PtbPReyC7ID9>K0W3T!ogbmsYDL zzm{Q54ywty1yGZx=hb9gYC5UOwNR5gRW(_Hnyh1LGVw3q>BFGY4zAhXKzef7yq>(E zR?9JqqFU4ID3?`PDq6wmRWWN{OqG>Zqsi_a**q1l$MW|0*7Ay`0_d@$`wjZMi~GDy zwa&I|DJ`?E+)8>ZI?i?-%+;qJ81N}ttfk4FQw%bvbAw5J1w6sXZJO6(i5+Cow?{)2 zRkV!NfKA8xq7*`Sz4TMQTz|tqEv}#9t{%c&HE{iY6mgWHGC zx^g#&^<||@K^>kjk%F2C1y#n)mvCM`cLgLL^wX9Q{Zvsm=k?Pl1ybobM@p1?X>~KW z8a5g!n$|@WP4XJZ4%C(EnZI9L&E#8|nhB$qshO8e)bQmefAGLqPot+PBbn4p>-0xo zBQ>)FYG$K_)Jz#pw*i+cxH^ALgpLWriVS_I?~0PCYLKk*=kKRKc1($Vc_W9fyZxTN zBIu9tq(2^I`lAT_(FpyqB(-$_`eQE9BlJh$_A9t+S$~Aa5Y!*(YnG8FJ9J2MP?ba9 z`YVU7teQyW@Qsa^h3bY!72R-pgVWS79HJX$+A0;@u+&l3s@%)dI8!s%=&uXW4Hwq; zl$KLM?|;9Z$NyDpB0VpS>3Nrod7peBLeKM%p7)LY`=@Q~6W-%4x;HJw6}8Vo|0VyN z8R>x?{Qs4e3MaCo5!;sxv!q|?kv#RlG z9XR1Kb|APkze84Z;DsqFL0`3&rrPRKm!-0#l5+p%eX0qI`&84ZTtyyf7{leN;lI6r z%k|?_F_atQOIh__#3TFuZzRp!@S>K1j&N81kx<;_hPhorg^a&tDRIf7gxLYnD4fJl znC5e8#^QCT(kJ~uM&hcNyMlO}#PB$3Ct>o+e~-|4b-zbAz4G59#9rO+5q4M5*%@{( z2%;#s5QI<*%gl3~ z3c*A!i4R{wlo7ck;weN1kxL?;LiirJB;qNAqLE9&o)Y6*GvWbSb|4vX19=`lpY0H>-!H;ecJlV;3zs$#9lna`L;fyc!`GJ-y+%w1+AP0M=<8ZjvkLF10l zXAt1l{w4(5wY~`ff9-EV2K-vzgzmUuA-KlDc8Zf`B5o-Hs>F~MJj()4z^(S+F|6}L zHTnBi{s2hi`3D4e1nJxvW|W>&@qr1FHX^pT2Db!%fCTV`Z-zuC#fsH? zDkRN?ug=Fd-+OxXjti0dHu%lW;5QvyH@A(i@#k#p6AW>1VCaJm3{Ce|UI!;1`Pk}E zLL`6>p)v+Bznv_GgIFHobb67WMVG_5josP>PT0XUSjrewHGn?g!5JQ-(JW_NS(%$v&IVab8P@A7lD#qEJm!y+k}R z+KV%{fnnH}LNILAj-9}B;Rpu!iQG#tQtk$x7?Jf?&OP8yah3p25V=HS*zPihA9Otx z=zB-Km%y}IK;RW*tt!xYP6d~SG>b6@gtZ*h6(@dcFjU27QpD|*Z zd=#Wn-Lg=a^TPjT5dD`>h%V+?3cL{kH7)lQ(AJHBnQV*u(Z=WN{rje(Bs%@;R@f5^>yJykJQVi$8g+H_F_R~&IqBDV|o^a-YO^>Vj~ ziT)xR0=B)p4t_Gdj_Q|p@$tgtV?t7VA8$y~DS`Sf1X^_(Es9Ozg(M+92?K--XlIOJ zSE4>{8=Quspc7}Hi*o{kC9_bjc`!q!ykOSJSYnu((!0WkvBzjMYOp-~fuysn+uM=q zvaWAOdd#}L9obUr`gTN$-3wiY1ox)|2k-(n9OG_@O#9dJIHvU&42fejfhiGM&l;Zw z@}7TMPz7TBcaI<4zjp?G=j4PXJLYYviqPuQmev@~c$tWPZo{fmpZLIvB`N$JSFbK# zYVO>sBPk-ZFIm2dTram*c-)^+h#ZING(iWpfu^&Y(XW&$uMEJa2Kb_N7>@!Oiypg7 z7ek7TAfdCiAt_Oa=M3@Fth@v@xnwHobkx8w)F^6M&J);PrPEr}Q;5Z^?LCOEto=QR znXK(S$RJw#dk`N&M||a8bky)1ZO;V}#ZPeCM%_+0Z09dW)^KA#MvMFhtvIvLVojYc?Pj1`NvjJ0w?H(KPg*@3nT6V0GO1tLmCpGPE zQC;m$Chyyqpx;=Td4gj>r4GdXe^#BgH)mWlu&Cv_6@9M@G<<-&g1bR@&Yu;MGpW~J zb!>7_6Q@xrxjGmbrlJOY{4AL&aU3KJHD{oHv>-e-&Ys*8@Sw6PY1I-_b0s79GCi9f zKxt($_Y?K5_P2>{>lS?PrGJ|!cD27vw7QnxCMt#FLd`LyZWy4_2+&6yAsq6g9?ZXi zR(^t-r5f`|;rofe;eH8!gGKi<3pOr}&1YlHa8|k<5`TWXO5W%@ef^osPVU`3vbDFT zdxM%xo3Qp|T8dHdtFjX8tDyDkh)V?gE43!pki7f;A0*9t-(OuQ6W)#y#v>>#xB{%2^aPGNYWtUp#>eXr7S!pSh-%3`8Vb2C`UuwFBP>(52Y$8C#}Jx#tmZLz4|*1x zrOrykSNRkm{rppa^!|)1EriM_IkiYVr4RN(7E?m9RY~)Wd{H|Ro zey=cz`ET#738z1<$h``5EZ)ZL=8p5X%E*`-Ork)Q3PP-L`!DLQ(-`3FN1aIpFUd)~ zk>4qpT#Zx5BC!q| z7Tr%QzBX#Vn(m>zL&$T&f1NPDVFkPK)^q^<7-Ge&BgM)#GjmSeOw8S%a_q>CnR0h( z8p}yx?#bomG&4WVYFM}Mo#iG&2hK5szIeq5z04%)zx{a)m>ijJtA8FdnON=m!tuq` zXViw~(@M`JQmxstGh^jkC6*Vv!36nd zat@vJoFjqWb-CPUxfK;F$%vERN6vl39c9QkhGfI}LI|p@{U4Qw7@5Nt_d;N9_H&= zrRNeD?Jl=s6}TI$SCyXgNDAG{@LL6oU$ql;o$5!W=jv9*<6}FGmSXa;JVI+Q_ZXi? z>jJq}b8UQn@ybcMZ?$gnznRak&|HvVqSic0&lN1hSO3Qq5)zEnI>Nt~d|FAxUu3;s z2(SO2U9czXKd5_^Yxe$o`TfdE>3DQ&;c5pyC4$^15-sE8 z_5~;cP0QAqeEb7PPBb67@7Ztf-~Z$#&7D_0dxXEzGWT2Sz9&z%eC*+kcVBa$-+5%O zIZ$9dr=Q{D9zF5XZ=AoZqx|m@8e-sXWZCPV_m&o=Q_n6m9|#tMQlCP(F@d0V#A(rp)FY`3#j^4s zT;bd9!M;9wQu3M8{WrV&tm8ZOR*&C0>uox4=VxEpwe^OnO3(1cw?1}5-<{VUwEFMg zGX3bqepAbsct=9MyQuX{#}l7xth(6R=*;w=`rOgm1OM?~uiwA5;-WLd8}GVmf1h*C zFm&^mk2qa5+pim{8*ep{y@q0X&D-dsiQdL|Z#GXH@134$sxj~;QIqt>`+hNJ?wsg; z42I#O=gw(&y!WVv^*LP2Ui9JlAfR>Qcd0K-9QB2P@oeEu^e6gb>i-h>@p;}6IL-d` zUslZ*@VgIdchNt%e%!wo?@hh@X+Kh@JZ`)$@Xf&csN2ri-0Q-t#TO2kgqpw?P2vNl zIiIMXd+6LbVUI8Y1Y-NOG@Ag)a?fGV4}KrNjSkJ;bl#*11in4@r>AEwOaISK{^$J5 zbY}jw#{;LdR{S%Qck!TRkR+l~Df@0h5lpY&Va zf4aDF!vv-&`I_ynzB*H{c(i z>ZLQNq>!FVrNUg9B>DztYHb@bGx8j*<4J*UCi(`Z zYi(Uwnepa~ma!!5waqi_mbBCzY5kq=d6d5=Y5F?>O5oox?(rPMKV&^UZ_uF$GVDO! zYrt)!^Ww0u?@N67+}$r8|1JNYze9qLa3OFZAPRGL2*-uvc-Mc${#NuSDZ;xJrZ7CB z?qjF`RGU7Nu~JKY$Si1tY|?Du4l~QcbC4ytZ*y;E#{)`Rd2dPS?~-pZ)k(_sD;L|E;c1O`Q3~mO$Us`EKEX zp(nq;|8nK~ubjVOrlw}*hVx(9Gxyih@*Sg^q^h#O5&rf{puNbYeUL4+>2|YD zH~7I(wxCa3F!M6{C_lL4Xs?^U!$%d23szs$? z8ppNyTU+n~)mDc+x4?kRF%z0_+a<^WD*tCK&cN9q66|^Cp-)FogfeqR>#+wXTx~;7zxdKb$+$J}wX*4{ zNq5UNO~No6y(9d(q*%H#@b2G!x~bBeq<4;O>U{ZU|9Mg>uW@Eu-N{BzVfAFELpuGl zCuS2;-!p2D=1yJx(UAm8j(Fn(3M?PgJWxN5&0(u?w*izcH5KQ%e zsa~25gDD!`D!x>@gbKD%N6o^Pxo?GA=t{=@c`Yp**Rru?V}CEjqk?xsS$(U#8{%Ri z6Prw{yQXhN3|m_Dg=wb4CPc|}utm=y_jUk0`EGwUyxme~qfXT72YQo{dQp-<9qkli zK%S(8fRSE@_MvFDL&Ty%lMw3fhA*hi?hL3z&Jj@h|E+8bYX+E5;x-aVoSg}{m@%Kba@=Pd4aD5ezJ_q*zo8lKE1_QlwZ+W@=q$& z@RwE=*z$8*^<2Q!U%N3woA91-nKyFmJC7YqNpEu6JFAR=&L9~LHn^?XXm+F_zNGyO z?nCBFUFgWYAZK!iQ3FOtBcv9^n^ZbNZf7X%EV7z$Clp9`(eRQ`4i&$8DnPJ`0#@Sc z(4YTlaBkW%!5o8AHL3&GWSl>xds^XFKaUMz;#XCS?P#dIZYc18>Uy1oAr_%RKn1ic zHN5Ihv(SYwx<7Awhi3%SnZzR6|y8#Vf&#)8lRBN{Dg%AL1<{8Qa0K6%ua zYHQqjEr%y}t^g%#%dgVP)9iZgxF{ilA=6Zk`9&qaQ6@0}O9 zYA^r#%^RM0=GiAca-g}WeP6G$%Uh6UG1$FLg*j#B%&m94{LjDG*L`wp`Jq|uH=@QQ zLeEe5;2o_KeQese)BYr+4{PIj4d>_eY_9*78=YK)N zXYu8KRl(@qc%>N1r z%(s8EZ{OWh?jRUP_H8(O`R+bv>Bhrn?j1V$`yYS#=8ZBC0mFcu;hYcF;Yhl8( z6KYYZLz+3Yq4R*VLJLQ;tze=V)5L?tHkCBfgMrV(5=#hGUBOMzS0r6Xr@)B4)Fx!{ z#Q-*_AKd_{wg_|&jh^xoG1A3H5XU6dT(@`GaE_q=S5^w`1ChkPQn1IGDJgJCAN)*n z1?;3A=!aMM6RFvFk1rW#4su#FOjI~6b;m*>7Dip5cUI`M3z{_qaM~hQa@>)q)ijJJ zWuU*Wx3j&h)LfjC1wM+wd_g`+t{ypZqjseY8KFkpG&@Nf(m5OBMc;N_{jo1h?Y!fn z((2jU#@ib^E_-4}^TAD?9G9=C&XH!yP0A>8W|j^5in6OV`h2sS{hpkxvcBr_!}}(T zPcZ|DpPaaTS54!t>v}eS^6sPA71wrceB`PjlYgeQY^c82C)uhR@{3CI6RI}vtM!cZ z`jQjs2Dk6tQ|=z9E6%GKs@9G_0KP!5{2c709&UpBRun8r;V3ug1xcrqU?7FVR0o*q zv@ns>j{QJAS$+{xm$7XU%%kP)@_QE8Ko=7EQ%t7i^!D~n^iGUy9p1cgFnBX@Yq*&R z!)Q&H^g)E8vDWL7D#ENJ;_0|M@z2mVdLZqWNe9u2$6|C4xth_z_-F{U*FXo6+Qr&v zBJit7Ub9w!$I?4wdikmDIAA`D$vc^|C_>li+Y{aay`(>i@jD;{w7ZO= zhDh4+S1o53k%YRF?j&P+YGQ2baLBzFR!;>ATVn%w;0lyg!L?lu@6tC<9B=TB4R3M} zG$vGj?o!{#V86%KnZ4#q`b|l1qcx`>r$)1LPi9_bPPW3+z6xEZhua7*S}JM@L+?j* zqPf_#yJcRBbCJc7w~@ASC`?x9SAQ3xtQoBh`cEj@(wbqNK)MsbH((c$PsaGpXQN~W zsX=g1hI4%tTS+~E3WNb+W6*ByUczXnt2V(UuLu;-4%SkE{TO`i&* zf;Dg?*4~F)HER;cx}d{mJqRHHLqd_knh(QoL;BO}Q4l8mse@LJ`L0~@c=)3ioaptmL^2yyY+_&Duhv~7~~5(eo}oYD{vPmZ2L zJt7K}L=OL(L~SAK$AO$`r8R#gwFz9)6VO(1++Q$0&T-?@4I8Jk(pxP>UTa2%rPA2Fr(lo1?vd>m-LyBzRSGY4ftvDyC zyS@3+{S$2^vs1^Otoiimz{?Z-v+mP~;cj~H?YlNO`u4WqCQ1j|DhhK8GVQgdVxK+h z>MQxz2DkK{{raUR-uS{@`|9ky``b!;Xt;2K(_2^2(ow(bmXE(M{n5vN{cob>{CV=9 zLZUz>;SRMn*fC?=0Y2HE6ncLo@QDyRlTiekkPyEU6H^QrZFx8etr##3@gN3C#Ay@a zW|wt|vb^eG&x(g;w}wag*ZdU1iE)1+Ly80A2lnjRF*`jKh88L7h!#vUoDUqWCwlNN zMUeTrp^2tD%5Gxx4!dcLJH$N|jVr`_o79Uv@weMJhMzc9Y^yqa4BHlM^(3m`6xH_n*miTFHeJ28Zic=-$vJ=sNTL z$|sm#EPsMZ8meZgfLz7UVgwC!obFhN7^arglrqCrlMh(^dr&gN$+yrxX@qLXn2Qh$`Ms5mdFAbPr>z*%3~t%f-FNHvu08v~zkTJ#ekZuMJoG)$S?Mci>>T*;v)}t) z2S;w6@lHPW;}6Zn{nAz2RAcVl;Lmls%F@$}Mstu)YwlpOc9Q!-Y}#u{MzoT1RF|Qyt#{Xt)GV@O6*#od z)!v5tGGW%rDGcp_UZjOiq=vN2mxXN3>dg7kK0>n5eu;A zn}H!_huJ}+zwvWy_IG|xYHGZcg+vFFXkt|`aIgjyn5=9}05|dJvbG|c&IjH+k11u& z8}B#78)}B@3L5v^^4L=&+4hVxyypyW4}AH$pcaCBBkl3}Up`^4G^R+IWdn7cAHH-~ zuTv1_9u;=Hr;)AW@+pM$q6%j&M3nZwDFijoxsNf9PzsC z;67+D!8ie%-o3;kHod#h<#Kskn11eL5U{WwPBi>HCo?6HJP2N7-H;PG^876L!~m3T z(IQKZKR8|$4S`L(XA^JV_<7@}e-ZeJ45)vd5$-hx-ZW}%{7o!C1a9Ro3EaB({kJJM zOJh2F_AKdHxrl+>23VLdt?ahv2^9zwWb+q?U%#GRe~f5{QC$Z&J4HKWY>}7Ku%ku3 zCqx;?>^`ol!eI-=5yKKVVu*4!E(2NS_C|@aC9oz|xB@UsKuD$^x@j)5NY6eG++ahE zNF^=MQ4=tYxRc6|A+Tn_BpsNEAQO&^V)<;1h!I9HmiQO^R)$q}ULMEgx${_8u;N0z zLT+}39!*8PF{sH9q2Rs3J8rx$EG7w33cMujiqO@xN9%s^WE3I2r_ntgp?b-%5U+;r zl?z%L2*QF$DFff4npB)&FwiJ4i19IF7s(vwa;OKQk!!II#7B+>T;N2*kr%z-iK?Si z5cy1+PWXg#xhn3sKdB0FRU1=5cor9=!xf`Lk_Ns;5iVe4JHijl35c?WT=o)6*rC%g zo3+f1fwAhrXR448Nrx&Ic^3E;@hKVSzEAa;4x%eBz<#N$_F7j@1 zvp6^nyLR-1+->B?>fI9KlaY0yyG35G&$Pga_+POI*+Q=`edhtZ2kDM|q6e~#>a!2} z<8yFlVC5*FR+u}6fr5vNTBKG|YBHM$=;+abn+r}d=NI|Dl#KPP%1U@Ut1GL$Rrn3u zT$bHxz;Hg3QqGCVd};{MCr_0P=k9zwjBx&xqpZbi>o;3c>Njk%m-f{b-M=w5VWymV ztEq6>SKsNfm6tSmatpj0oVOiZ5DM^Mk@ZY)u!|n>bfU@qL7J4Oss-;WSXl1CG(?#* z(V#>iGfiU*xzwmnWlpp#f{o(S3tVvE&gD{UG)op4o=)N32~SPj*5HYWP_rP?Ad!N& zs`BEPU#LXMbd?~+E=-h4%Gm;k;x7$)C>Oso@;s{a_BZ$*Nv_-;JO#-WBa<1(g@n%$ ze+qC+h4LEt`U=%W$X1B8%D>nG`BGOTUigR%t_8sGFUyoJ(%s>XJb|;o2ULW6^`mRp zwf>}b#C<3iqZA#()S!=zh2qd344svU36sDnq}xVnb1Oe(QczBDBY=*pC$0mX3R6-9RY*@u_{>oYd) zz2#${9T^UMKX=pB&tKJde9&%cooX)H&}2_YFE$n=m(*I)@|~4g=DKo6n(&IM-D;25 z{qhqL0{Ok+lV3Tr!8LH8t$OD`xs>m#EGbLLOwi=Hd<71lIXS&{=O*bJiq=a!LC|gj zPw2xm-b?+dlztAar5d4u4WlE1)G4Eo34JrAW6VZ|Rs$}8*a0NFsxu)&SOM z);$xkmL+yVq1!l!U+U}Ws;hOBSWFA6C}NAQ(#u!Xs)=iqlpgeHqHc*qo}?4AqYU7f z$aZ~hTmQzsj;g}9=Dvw`p8Y!-vWsj*ZfpB4YgLOS(d;xQ7F3v%Ea~TS!foLNOo!V{ zW4re69`CTt9TQBAo67yS-F#JLMQ>7iO0K;!r~0P5Khj9vQ&D^2!b0|OLV(i_0f#H0 zUw_n}fOsb6Q<#xVqzWZjlR)|)AuxfQFgECB_CPN6KT`!3U||}EvJOe1oQRkJTd#Pe zX{n-gs817-M~(F9qpH&yOQ3J3S5;NjRMk{_D?AQcabadU8&V&R-Bd=x7i!6Q%&=Tz zaiM()OkDmqF;vLcY7QPbe)4piYn#Vlt?hR8-hRhj4?S^FLRKRGC77|=iMqF;PZq*3 zDOoA&pBTNihmKQ#z9O-pk~ z;e;`m9=-_Viog}*p?b)Y)9^Hrb>5H9paz|qfl5PKIS;*V9;AR*Vr{hwDK-muX-Flb zF_hYuS8>>^5N_EK__=HdKD&UQW*!ggxJUdcwU~|+glUkQ76WlKKts%)T^tuf*DZ{T zp{ry7N8w^>oezjurNVdFm?+25R|r(0Mv0uS3?W&JoWW1Q$9w$ANK4RgIc(G`y4MBu zOVsBf#d2mbI)+(|#1SIiu*LHjM?{S8K)Dg?=9d5|liU4uwJO-8Xz>)AfFu0GD}~=x zQCixv@lvRYw6tWI^fgJ(<)hQ~r)3vz3i>t+Vji+Eg>Hvk(8AfvKGKAIqQ8JO*Ddbpa%)B@aa)sv zxiA+&;}_o3i0@v|Yfo4G@V@rL=7Sga-gx=WZhK<#`!8z7{$`3r*nlDYd2d6$6o}Wdgcne!47abrZ$Y^C85wTzL6`}E8T&5Jatv}PwsL)&|9zHfU@zSX@1T1u@d_TMMX#(MaE; z$l(4XU4Y@=5ZC2zkBNbB`JfU_lytFiaA**1|7C#1Q8*}=*}Y6OOvn5bnxV1=NKL&J zc>A~@y%qSyaqXI5^aaXdA|H?jb^AxPsgMgzu$_ldb-BwwTh0rb;WSh^G^Zk-+S3gS zPSefOQ{#BO7Fn(Em!SgUFf*dLgJ{Fc!OmmT88BCxY7ksKAYN1{ZP~(cTSm5wY}<K6(T3x1i1U0q35c6ehHh{*;%+vk->a%+EOMe|K`5LoW!hyxg(eLn~MB9Z+zxZ(N{~i z^kN=$Y3;?%p$!eLoWhDm7#(+B@0z-M|KO|NeEHr9NxwxSc3tzri2_SzqPAzW^SYBe zdK|*8i!(<~e{^EoKfLyphYqLTp*>+de$Qt=|C#Q|Q}NcqJs*DPiBE6ddy9)dsM;i^ zK%W)`nMenk;U@f}fR}CvRZ8t`0xD|&NiaU$Jmb@&O*v*)qFPB#eT>Bbr>3T6re>zM zUo>vF<`E~1m-3g1f;y&ukbySubSy(x52~%nB1hx$5pw9%C*Hc=Y>V(p-r2Id$Dwk| zv!~u_ToG>m>X$!!dl;wPHxTlxt;~)H7^AzxMGdk`xXDo+$%w6}lVAMJanHok-%6jsiCYs74TSS`L12#VS@hWCZ=aVQZ1Cb1e1-=C8~h zMp5PPw&87Cx8V0TZyacCwxX+S9D>kPTPL@EAx~sf9VqFf)E$QYwSeoAoMx=hZdZ!` z;GjFNc3V?aY3QlXo$wj!hie?Z;-pv(OLN9~K7kx**^Yp{bKg~s?x99Yu*7jb+rc+^ zX>0lH(g61jk-OcD{e6>F#0`A+Vg05kU?DmZUyW$~M-0W6( zEhMc-GsUGN(IBVA4CF8XN4ACnTfZ*A)5qA1|T|x|(G3?S0ey+`CbTG!< z>Q5g*evW!4Vi+yxk%0~}V0k)Gmx5AYa@#AH;tX9In-*vTyO?aGO^<>QhC?rBohU&z zC-hy(LPTSu?+ikIbxDhwEyOQf$`i+M=Vu3KQ08BS=7WG2*eM*2}U4>HK4(u#Cbfh?3scd^e)1H?6~+@V}bZ zpVsR(WT_(SQtS>8%ihfGx`g8a2sV z7z12%pG;v!rWNcQ-Z?#W(L^|S00iygJoSs};t<4p~W!?D|@CqZTt+ zg{k0v zQ{5CLPg2YNMWtlskdjnwD;w%`c2(xL@494H`__BEeR9Xgj<=K!>}%}Vkx)C*WZFMo zJBdbqEknaYE!M8npWM0ShUw}NHGr@Ay_{TKFjdn&SmYbvN z-rRZVXjM;ZVeMeW#D06{c3<7z+3nLayAL&OzG+vzv;P3UDVV+r8P$ax`9o4XU_Xs| z*m#0F-#s>p)OdwJC~X%3Vt`(Q?3aT8JHmZ%#R|xZj}7*+#kK(8NG+KSZY78(ZVEzL zzcxrmM@=+q0{Vrw!}Ybb!v1f6jE=nUxPwY|2mASl(Mp2X8+P$Re5L^{E(Hn)(&VX5 zPH)f{^k@&H(HaQ;TFIc54s!9xv5F@@5t0CQVkQRb9)gH8Vm9OG-y%o|*7_u5+~oWH%X=LOut87;Xc+!p2B z!d2+4Le6r`x)#~I6(FWg#{xFUN&)1@zy>_X>y}wf)dHL8idcSSt7=W0oM3$2;XwIJfjcr0cnzHX{YdRpJRa+kmdo>_R8pxc_U$Z}_X8Y& z2gP|`(FPE$eAFLj0_U(J#f_vb6+V?{dCZ}f5Ne|shhkg6UoX;VJd9LUr(O~9n-zIH z6LXKea>+%d=%9r}qVh7-H=v}+YAG`2WSP)PG0UB9N{?`q@FmFZf>#=;L_9Sn6RGnr z3LL)1C*PN|`L=zHN=o{`lYHFEEwfwt`nOc|e8{D}_KJZ=w%yKeEC{@CS>UIa27W8t zA$-+3_1K5hOgP`3SMHh6#U;k+@>0)US&%w+XwTeRf)ntPX{D)Wbu;YLnLFA2H8JHep%z+zB)@8^o~E5i+W zf`n&wu93To^}K^_QSC)0hKy>(81kznXBuM!p&+Boig}O~%Ijoc&CIV?SNRuPAcG0L zu1Z}YAfnzhOM@u7R*qjDv;w~j*Bi7;KrM#*hUhd<$>6tv*ZEWGkYCZp3x;{UfMj_! zXMhG^P&5EYZH-1PE=OA?>Z3vUCyH?3AWwy=4rM)nD7`XruObW=dIXcyME2#88{vuo zo1eie+(~H_59LMFf=QfqM(mdM5D8Uw!_T zgYL1}#Inhc{qB?ETQSOYg0R~G*tK&Neh-5gCFDS@(rUIx!KodccV!q!D~1tjbyf|M zVma|<4d?G>^*#!&JdX2j;tqXLIj)>|W1^A(Nz$S>1Wqq$W}{9IGGc2W{});Uzd~zk z>!#LC1ART+Dn5~pvvPcz&!|~7*shCo?yMewn!<==8c~7e%YfxDw}Wf)*Uw`QDuhv~ zEi30UQE;4{rmjpXbXH7l>0#cOLP5t;{uP%@?P`H_MY_AQ!c=3+$Z)ln+3HHt2E@et z-29U4IFq%aOuKr>iI19FD+;pgHH8Ijb=Dkry(8IDke+37rdym|IJOuZ>yeX0G`NAQ z^?MaKLhnKF3!Z>zI;2vQd0JdC1VtqQX|=E#2+2NLJzzAa)!ZZS@IarG2;F-dH%?hu zoo+$m($kQ(FCa+UA^h5@YZfA5?3?yAug zjZ}qYxpbbamMVr%^sI=f3-2k(Fa$rll!%xt(c;KFUn65ZKZ5?Kp9NDMJ(vmW&taTi zI~lQv`RnFsbmiPWBFSa7m^ODwl#Z}^gnNHOto#<4j{)~0=?}yQ5{xMa*GPYAH?!43 z<&*P)nAJl=#vWEksOnHp0|uM8WApe!Ar~`~c}PgxO=3~2k)j!TzTcuQLT>#+tJX<2 zhG(d(7KDL4>n9t-d|BUJ|nQw|=5#G9R?c7ZvZ7~#|iF{5oH}-;j zM71$S7RvoVKWK3xpAXqga?y0GFWBKS+2PDZW>c|xG%D{|_-N^(H+|7_jf3qjeWLlC zLh_k?7Pdqo+GStnPw~MTM@u#3?$n|k6WpGp18UIkgl-Y;G4&3S&?%pBi8b5Wrl;FD)z53IV3an;Neted>G}AuNY<=%~jTo1joM$t63KB9+?o9i( zE{_~ke|I2C+KC^$gIRXBz!_J{b#UGMKG{K+RLDz$2huJMW;2R^`k$ddP3WgODhZ+w zL}eL17)ObV0qZ=tO^||Ca~R$R5CsZ2aIqt}Smb_7k}!t&mf&XfQ#7rj|C!w7Zt{j~ zB9DkW`j;?SOfWz-RDUOQ3mu}8wor>rH2Bg;Itpycuek6=WNt38M-<)i$q<1K{veAe z!A(nL;H}NxN`Sc3n&Gn9Xg&=}1jvmoldqC+ZNxk~#%A=-&9;roM}OH9H2%3K~XF-U9Y@#gJ$Co;j;7M&!*e~Urj)Uw>TWy#14Djp zYTeYOSDvb9^cP9lo=%UrA4ao^Ge2ZFvyH!FJ#eNfAqr>WaFcQR*~ECkU|{NfG~#6A zLYKcYcr!pb!k#L6be!SnfyZ(8Qog;A=ovynqhkG~` z!cZ$|m8cb7u(L)idpAOn;#ZAtnw=3o293BX> zjbHsR$h|Z{?p4DPPH=JYaWN1h9yl3~fl4ZO3FTshQY+dVijTya8pD4%7Gg#I{`@2S zt;^rN5N`QV!@hU-^whSk5ondTIt1KRRz%*&o9UV z3G0@*Z5~-kMOORDcF$k8{N_IOw*@rdjMVO;e>`+M zv9{*$?JCWkmqrf@L4at^)7$3>+FHH%(C8Udv|SdR^z_S)7NdX zh+6k{cTtT!D>>Ja+1TJO(%DK~6((PwW8}UQ8>H0Y)cRgmN@49l`JI}^$xE8u9MhP-&tOwaoTqlhBlu5tfO= z(h-1?jAUSFv^Uh@AzqhNnG`qQu?*>0)Uk{*q3yMDa&(Bb8sYC3$J|G6`PA;-OSgJ* zYPOv|x36=oIwQ5vk!7*w78r~DjaAmnbgR$WymMsG9{5b8uY*6@bK`+F>(J@Z#*dzR z_=LNSKVx{a zNkrKl+Dw$g$q|QCXPW6?0EyVqkpxXSHR53jor|?1HK5P|Hb^n2iW^zymm9=bmtHPQ zF?l&DYj#SZJ{tWK%F{!aQ_hWhspYsRmgIx5SN^hAqp>&(k`cZ6QA5|))7Dz!1z?a) zX0uTfmDtV+jI>nB#o>&=gk$Pc7kb~3-KsPFEh(*W;uRLkN=eRA#_$7MS7_ z?2YZ9vgGp-7cW$Nu81#poHsu5+2DnaEOPVZ&nL&cZOz+vIlsK;!t23XT=25rzVO#r zHw;1`y&L}Mn{b~poqPOgp%gB5n|MLF(NaScm4_2JNoD;wT$dg_IVmY}y6_%_Y$Ns% z8aShWM~AV@`YDy4L{hwG=?!5tzr6KfRFCG0BU=ahLg_wk)pQ@;GHA_IAGj-;_b-SF zOVj<_?ntLMlLg`!eBKUFeLZ)*?0~KU*wMQLB#!6}f^aCcKocgdfUFgregtU1Y^yNo zh%EG|O?tHO(4$R^x*1ssl;NuiR919ZU+1f>s&F~+0uFnQ3mJ~YbHPv5zC^NEjjgq? zmPH}Lw0h)<^ZUC-y|NM_&dbp3hC{=ZSw?$*yO*C+9KS&!`p~(DPxqT@yKUnSLbJ$r zrm52NPEEtqWqw;(|K;}!w^E9fY|DyQYJbS!)y+NF{|qUTJ`7h5hnE3IH|S>7qbI}( zdcB;N5efl>X6PG({^(K<0LO}eow2r-<7&HWyF1!iTd1?@JPZ?81VaM$d^%OAZn7M3 z3SCiV+KK=x-Vou|RA5Z{8sTIw*XQq!!Ymb|^!oW?pD_5KAxCF8P*#Lkk>wC8h05t@ zx?LGm3K!7Z#9zW@CAc(kBmON7s1ig%BL2|pc!=W&Bvhb8Q>mkI53P(EBZ)75C5WTs z&aV_Se^aL|&TFyDBEU+u*PP6=9@HLZa2VpA^~Vjt;oS~cQ2qb~&^j=3LT`w}_%WJa z1=E;_kv|wkWHNwe)o5H82Ic#k6fd$q4pT~X=;x&4bXJ|l`iF&Si_ue+-a`P-qy znXnQV$IP8wDa3_Ygt?D3c*ln~x(6E)t3G$qH##6s7hTyMh)J>XWSO2Jj%m^qdi}7h zA1o|G!XU-8gfT_4z%1nja2V;5xPr-OHVE;(CQ6SCNUs#Qfv9q)5c6y~h<)M8NTCcl z!+h$nSv3r%^;|Qz$v?ON`p%$^9#WY+)v>6&xe0Om2qC*N98{YNtyIvy5aLH(5%&{n zROhj(pFGCk(9NBbvymH_)Wqbm-3!4)HAG@5DoyHc{_x7TkNek4@J4idUn%1KXl-&= zsE_uEz7yayyC7dGF|Biio8mL&*htP8%5lwb4phNPu%!sRG}J2~{|~W4^(!&*E5%z` zA5ZEHk`M$c+NJzBv>1TToR!upZUi|4g6weO1#riz^*Q7$U+x2-Q${|(-@L?+Gv9d7 z)eyNK#$m?j=;+ia21#a?xm;Npu2Pi18r|BUb}F=@Y3;nGn#Gb9T11~WNz{pvDGL}) zCy%(V^{F{$Kg-&(=cu=QON+I6=CX!dtJZULk)e7Ag{)tfm|v~6Zj#l_)C44D<> zwzyeGkI$q}%}Xop$l%Yb#qsBl+&GYzTiIXb-_cv0cBsN1n%0nT;6h)Dr)#ET&yAyH z3F1aWUQS42L#Ct29`GewT;8JioQ#C=DXl$NC=Z@Q_yOHl#*cmcW*I*+qH%-b%Jgvr zULdk8yAbLlu|dfaNKg_S=vEfQ3(~lk`+yjDA-{Az{S*baBhXS!S5V&|#smD#OYB_= zu~4xH%-T1)Z`Y2QX}gMBG{A5ja4TG$7uFTWgo6=GXFX9(`cSwfpx_(q02$v7aPO`f z->M_8*C$UnD?y|Iv_ZsDI?3P1cwdv^!Xf|{tV9W5dan)Stt-I3+GnD>h%mi5Ooy4^^{eI? zb?7$>e4x7G2#jEg_L69^%>A+OqiOM zu1H~5lGTL|o<%P2jBXUM?ndqne^M>FIpp!8grNd#yaaip%V;d84oz9b!)Vus_7BL? zWr^7o0I6R87r{d*|+1XXj*HuF-7l zE2wZ3C)`4#K>6|`rnVMePUY5Sb8=R0RG)7*&1H>PixIg*h&@&M& zQbMChI#Da2Rhb%ol|+q1p(F#svlL1q(9?)eitWgWH>D`C*NQsotfGW$7vDqIRS~sE zFKYCWzXSgRE=!3cEqhC7AStP-5qFc}u_BB_B0F6PBk3q7Cj3rd9;mg`!OKgxRNYLW zqi+?wS`qU?Mq*yzU+$DcMZb)B6|pW(a|-B%+U92w8=Ar0RKwQ8?GRn?-JlRegebb> zLB}f$RnZ=f437s1g22U`uO6LxKdyx~DQy~qdxMjr%c6H+-X|z2WJeewEpx*>5ut|y z$8~iy)(7dwup;`22;HxkkS^RGsT-}7pyno`9Yg}%(l~`CvJk1rYK_ROy^Db`NeI=*lnK)M(c0Z=vLU z(cvzvudpR_Xx(j_TvmTWeNnyLV7YRuqs3QKoL`x$CMOm&O|}(u*o8Y;zP=pw7JnD* zsZ?Qhj7>G%BYTRiNNWg(2s6UVjJVcW@jz%3SV9+fF1{5#| zi=5g#_wObld(k6O{ekeolYu_q!50`EBe$g(r9~(W#=M_yP_9U9l4KgoY{7@TKrU29 zwrFES^eEr^Jc-x}?UeYSRAtzeiwkLrj}l>Y|BJX)F{0``c(l9>i!-7R{@7@_FXE1! zd7ehIxv?}?r4{wynxgUQuu|Z`>+16kY>T??$IXrI+*~(3#FK}I$vlo|FJY!g4gpumwpWZZRB) zFx3}9hpTi=)2BMFy5^qF7E5cTNu$Ci7VbwD3Wy&(60kEINk{XNF7A}f;maYAaX4xy zDM7yli%^CV0x`5&AOWd=nkHD4-&2kY?END{9 zx0ZM zg61^zyDD_e__jZ#AQu)2-;D`-U9Bywu_;+V(DF1;3nW}C`R1vmCTv}1{-Cod6Au~< zHy&;PRYq^3+z_&U)J@Fvp`EgH$@ed750tj~JurVTt;<(~15|m;8R;%?5Hz5bS!Q)B z+D0nPCz;`cN^Ydwk(wUy1}SKywmQzd#26TT$hll6^mV#UiU%S40@2i<-37B zW^?_vx_nWat<@G+Fhl6VU&4JD{LyRgAIv&+tfFxfQpP;BPD?-{W2l_>1%7F;wIc)8 zp0Nk%sYM>LhUT7*<)(n#CfW33-PMez)cI>tF-r)Mdph8dcX$VUH!i<6&GlA)?o{V$ew8^%F2LTJ{Y<~B8V_KyJp zvg0BAW+hkdFU5OyAw6E~M6<-;`=P>{I@sYQIS$j+*z0K*dA;ZkwGreV_Of&TJMsn= zdGW>IEjA$MmCmv41(!1w-BPGFo3d8(aTtts6+rSxedU4wG=)yZT@>VFAbse0W&7Np zxV+P*N6k=J?6k(HJWp1is)(kDTWXA*$N78U*2~&QxpY+Al=w}V$lMI_GKg%b{^Zy| zuUMPgQKF%Igb2Yb29Ze_SIhKx{^c}tnGpkj)6>o6Mq`;d?bj@GwWPwB7q4-)3^`WsX>c!OhyKAq^Sbn8W-tEXNQAKiZka-W9olJOrKvHlT~Ea8TY5 zW`ZtneW(QrMpo~`39I29fRiA|$YjlD-Uncc;Vg)zl?6=DpYZmqn4W_R?U5)I(=Wgs zi0MPnEP!JqUuHCVc5g5KKjz*9K91tbAFuA|o=YRiy6qfESVE39(PGb8KD?%yAZ8O?Onbib>rUcL8yN|fq90QU$pTV+Fd4)9qbJR3qfa1I1?FtA}h z*ZbK()5-rP7k+BAVhiCyIJ2hf4q2mS_8*G92@z1b>JSU65g3LNOIW~Yl(J)%4^SaB zE-V}`;5~@clk+67XAn~s*fD@Rh~sHqg)o&mzn*Z!`Eb6nuzI2*xh_;WJT_lA+CumN zhsL2t9`W0+7_JA;Kc%XHssZGx;+6}A{{qPlU!xYZ7>@MSp}kZ!F!Tx{`vN)zkR16A zKF1h0Om=;RH9x~-2zCzdVvcB*&V66syXkwm@QyJlf?*1m+Je2>Y3~Qpe#A59KquPS z<%**yCmHj1E*4d~Z_I^|W(m>Fw6HgiW6uL$kIAG5|6vJAOMG(pD}}x*%_ui!mdPm{ zdflXAk4r4ANGf$%c(p;n;uBh_CO0lAxtcFVWz}y|4*!=wSA+vu>~A@>&#~d7k8SR| zW@A-a{lxW;UW6aBTMO2$8_hfC$xX@6LQY6VQejtXbzx#uT5(q4pi(7>JdoLBZ=XoG z`wWEwIZjiAv({U{hqU!h=T zomM~Lv>Il&7->au7At)euz&&7JXuF8KE-l{-^_a~voNgj5#RaumDiy`n!-0^IizHS}Kh>k%xx3UL1va1y zMVN;C0Hl+Sn&?+xR)c$BADXeU%;n0;EW>`^Rq6uFcxF*nQ9?<)i-${R>P9uXRnkZekj<+0nJo1N*rdH>gYiU%&d{^;=7o}4ZFJv(xg zmf8~R(YJ~vJFq$Pyji-gw?5i)BHmP)+3x(5m;LLdCHMVo(_@>SxbGvA)vMYr+f_cc z=lYLz2>11kzD|3!vkm>%Jv8aLp#^K|)1CooKjLxgfp>`L`PO>3Ns@uqCFKar%)P^? zQ>&k8YhGbl=HT`?jW(Ng0z;=Mv3lv;>>y1CU&t&AZ#@WL*SN#GCZcW#9aIOq*ZtFv=FCwpa2A6Nh&@eWGKr zZ~)SXi;^n63wbEDh0NT2mSdtdKszjsw4TnTPqgAKG|}F9WbH&od7D%9AwZF9xj#3L zUH23`IZQ`cEGEY$00{xSiI@U7ax`bID5^*ZWqm#n`1xH*VDL&(urIE#xG;`Vg`Eij z8xx#xmP^ij#FtRm%m|jj=^2f!9fi)ig82Bt#=@+e6&7oBY=u(v$iKnhOYDZ!a%XaS zX=8RqU1>&Qwlh1i%z5^GNi8hO{kf(riG0>oY_}4nJ|sMGR7Zlm7&-n2qJBY>B1_~a3att{=kt9ec;_4GQNz`Lz;lDQ8#!+a*g?gP5I*dwz)P$b z=&_55xnQx6zo;xiCdL2!G_UjLpWmgN5ZD!_9-y5bLp1e{7^s=+j5&L#sNY z#=W7FUu)*ek_ZkxlkD!#I+xYdm9JE1nlbGR1 z%}a{Q7H9QyLt%E)wWV;?M^_APswil!blN{7xbG{z<@uvKhTHQ~isI61(ou;a!QEG% zUe(Ywb=8_3&u)*(PfsYwinE(8(&G3)GmmK6A+>Xwt*2eAPARds38a&R?%^R(>XIpj z40yjdEkVeMq)tLAiOAFBBaL~HqzOGpSpt=+gD0gWk;-EWcgQD#ZdIIatJ!9Dr;>vV zRZ|7xP*ZT|+9HUuTE$52-MD_NP@=#)DrQv5kUNA_Q>sNR;~-GRlEsYE8#9vcc|-;x zBuVb5gb{WokuOHjs#=GrmIq@@U(nN~v^B4)sYV$gD|T}c$_S~I{DNh*hHw0|Qhh=s z!To-ivO*U$<2W^(^o~Qka|TD(6;<(qLY^HFggK;u-|y|UJ?ly$2s6Yz&z&7396+@p z;dhZF8`LA2b_K}vUL`I>rqwW+Tyua_>pCA?B_J#C5`x5+DI`X>4m<#HY)x;sPyVUy z)?!S9F??nT(%)*FewQTw=bkd|1O@LeC}u|Pf}D0J?EwBp!A&>@tpqh}Gh1wzpil*l zBdn;fM|CR1aYR}GO$ce5wYGjYRvb87kBdu)i{qFqrkVz4Lk&Q8fXfmNn}z(7lP9w|^N#J;O6;1;~$%817(1%|56Nes*8jjV&KJj^i3Bo;cxU)CGd)!mS z<-46dswAcWUSO3V+V#40PC?Sl`6_0GiB`ql1hEG&0n!d((?!813YQ?N)Fh2-@O+Sc zia+$5_lCJU!@iS=H;#e&t;&kFmZnC6G>XfBx##I05em1ev7F&Vio(>@igCh`Fs6N` zq0?#&OXKnMp-bCiB7 zX-31+n%EuXLQT3{e~6?x-I-lolH=f^;~Yy3!0&mHaW7PIZ{6BHR2m%+_L-aRtRmF3 z^97UhIRSLvi|4CnS3O1KrWt|AT?~;k5Y~s96hx>Dr6}}LD`p8`CIwxnie_DHjh~u6 z(VQPO2`+zu#5)>q64&23&e4&hL9BW+!>17 z2ajYVsn#v%dK}f%plDc4R}GfBK(`5yzUYNZpC1!xp`@!Z>`(P*?fDTgG=5v9=LyiW z2e=GC0#U^+l$LhT(ry6)teV|i9jwhLAhvFJuyb`FT^6R5#(-@Dg!uv`%=5C2S{}Bl z+`_2l2PzL&NX|s@meLG-Mx?K+=u|8M4GBiYGER^x6kZl!3mM}uDnVMfK z!mL2)A);6-Qsvej)|cF9;8!O`fL>WSwro2fE@7Eg${(M z6o%Sw70)oB2g7m<{^Ve_TbTJat}zyBkHY1kEo1@=U3$!4p8~;&f~c|#`lJC9EtDLd zzx%we3sWb5Vue2cALDb}-9GstpKKMMvqTO~6f$esc<5K?GE46x0+MKcotAB~Gh|*Y zl$vM1w4~WCG(UsWRxX2&wucR{k0>!Qh*)mHej53W03 z{()4bqf~KeRQ))sqUqeZENv_m#)vu*n#(0i=Jn?ui2wPr9+p2&xbTgUb z%&OuX$I)OoHqUngvDa?XsrX0`_S$6y?o?ZdZBBEy6^NfZZxUZH9f#O@Wh|J6rd|W( zC@kMHt~sE&J3W+sL;XXE8u=*PHW(FV0p#No+;Y%v7pA%8pcjJ?1_&?C@Y8PDG&SLLEsH#d^O!A*bc@>} z`O%inH?tH1)F3j3v$;Lkn-Ti+$)^jmuq`F$8g0%hus01?I~D6cs+|hV1DON41R#@8 zRLDwWHw|9|r#osH3x97am^%N<)helg7$Fc^+;DA4ZAoSo;U`oHdO;QSWM7+4^Mq^w z!l)n$lt7WpzcudgMEm8bB{^{xt0f`Fl@yRgxa2E7J`#A(VnBr2!)VSCj6tpaLjwq#} z5jL>lEZ&=D>9I0+mDeLw&Y`5OLQeEhmuQy9;4oM(i2~B}M9>?I$pVEt7;3xBGKb_q z@V^xyincwB*%`8knP4>uK#m9InZ>#Vhu8?uLcse3!YBYWV6)lBqXoOY#7-zO#49Dz zNC;&z$>y!$M+_Wii9@Wk_Y?RMV-p+4H-G>r(H56f z(hkgVL{7W}pqjpLN>P!2h}o)Yx=eYNJT!8iWD6FZP_M!5! z(aXA~52jcXnmdw9^AbBQyK7Bd*YHra;`!lj z;or(UwG}g4rpr2RY!S}ESF~4rs~}H4=sEMjFUDLYi3ntgT6w|P>TkUA_LXLLLrF?* zWlV0Rvtq+)m-+hNJhm-5HhM)${+dp=BOxW~+?h{%l3$f)(>LAl*^Q3;6zLSU5D1+_ z?PqHT4Rm7Wq$p)+|VtY$R|`$_>Mrz8k@RJA)ws7a81m+Cp-c{MMzYInTw z6+wy@p1AYe_ufH;YbpN2cjT+XRqg&TQTqLd>C*4d*wv!I#^>A>`kd*!x-~tjc{b!p zBYnA~XQf>3c|GgPD2%+2XEmujwHyWM>#@_mILy=HK`nNXj<;vDr?vU`njYax{*DL{;>t{-}wY6j&4%o2`|)yiWxKtWH%eJHaimtbO6 zCx~YM7?#s75kB+vrF*dqxbluvqwl!^Q2K#$^x;iLpl_rSHSWNu^6GU=~ zCd>^HCWzz|Ax@hQXqNCFI$5CiG(FtZxoT@~aa>f%mURs@J8V6WXiey>%)qv}eeeBK zrK?AtIQh&}!DON5Tjg6eO_#OZ*dpFzY2S9R`=(p&?^OyE0HplshKHWSoRDii==tF9 zzZk8miLsVUjCP&+<$qskuBaf@@yJrfN_U2)$~sF zMy24IE4%xXT{YPqLcHf4EWzSEF7y4ChcupV7gmSoIXOhzh~3zkZ1*!76@^(8TuqU9 z-G@qpQ4=gG${j^qrxJhy|vw3`d z7^$IJ)ypC^#)af!CFlnRr|#Lk#wF&Wi}+WKYJ}bKxb6 zWTM#9W0{z|FrQp)g&yE-yz2TmFY)ai&oZPV+zAJmNI{8zO(zl(iRN$$W> z(KzdqSCwzSamY*o&1Q*G!vlFAsILIw<+D5onw#I{#1JiVI*$^=sN>UTc+_OYjxp&v@oYaoe zslB+aobtKd-889n_jRL&d0SUoS7*m+#m9vuOlrub#ukrKrx(kKr#k-g8evbth0!t>TgVA^e>lGhk7u8cWbeY7~4eJK`LzqgX=@&Vlshg4ITA|qV{mR*pVD=?w zpSrF2V8}Spsl12H`=~b8b+JA{jI5Is?ADA>ce~AE-$U%TOLoff4YYkW(o~xrpdtZ_ z7M**l;cPJu0nn29kAdBm;ST2AT@{0WuzoizewGt-{T`k^yoA|J)9+b*UW1>@!{ib9 zZDiSY!{$0tQ{Wk9`3NYWojhrD4n%?HtXKK7KqzdRJCfa^zDdo3t&owvGZS!m&_&f4 zD;KOMa9)Dw4Y)YqIwgxHTO?Hh7|?f-|9dK78{45Y)>pcVi*mD*63pgA1ZSz9$pF8Z zkS+WCkdm_$9$drXQuyQHd&vd4wjrze!Xuymm+=%=qUXDHmt3~*$^)xQH@Izu^}VJ2 zcO3oXXCA%4ksMuSTvN(Zjjw&tRh7NMoK!K?&~@`wJNrva;+YOdRdZ`iZcM_!)$85e z7hZc|x9B+&Mz=(E8}^g4So7z>iT;EVlWma%P)6v@LQYwaO8G1VqjAcUcM&nmRO>ka zePQsp6C{NXPK91DUhBggH(tTUwb95~8R<)M#DLZaagCoNu6~gm^>-5=uM)I2O zJGoc_|R7X z!)1_f`CFbRJ#YT$|NbAL_KrKU(hnVUk6r%p&y831mi_I`vp+PFTRwY6GJSB?Dj%r+ z$-NzW@-NxnfB2g1y{_ok4^K)HAG{bM!782ah5TkCB5d#1)8X*~%%Wy8Qiy=XeQ6#bNQ{Fj~EFdUTtFGJm=?};_0(Dox3fZ(D8bZ(hcz8DeYe0*E%=mwVA3wb2a{T9o|Sg=1VXK}2cpBQ(smpn z>6k!7H-rfwVrCM@Np73&F>(j>LF_Ne3TU0wI@88ZB-5p#ovaMSL^m1xasj7DsH7f1 z+o#kv$!sC4eQb2_V-fo)wdd)=BX8+mp`zNYa{GhAVT`R`JJ8qOT2lq`t}LX|c1iiUJV%dXgXVN_bnzy%G4Vsv-Q()#Qgq*Zv< z2A85sp#t@uJB_lV$5w9HWGqo1yN5&dPvq40x`cnXW#A-o(^Utrt!!3u%qi|JcWAt+ z==~4aRuR}+!2wT!!6ASuo3z57xz(^I{+9I@>k%TMb-xx6vLhSkg5?O`5n7T8 zt1~kR@V8I}{9Srb$cur)VR$ToHQa_64TE5fGQ=?(WIb!!q+&K86I&*z25hZ$s0KdS zYKSnZ?lZP5>DWg5xrB6V!5u1zOMq^W#*G#8L{{XPknXT-Lvrafdt8a>gdi3Pk~InI z6pE=PFI@{tzt}8h+a3pEfl)X65*EemauhbGR@BI_N;6oH;J;}dECfW=b|O`@URiv1 zWSH=oZTf<#N!;K>aY=D$QE^dmA(g}wv{XPUQ^&()Eakq)8rst&I0I|2swc)Y6}Fi; zKs-%&JWGWmZEn6dZ~EHLY#F?6V`bUE&Q)u+Bqy{xb7~3`6P;CAy}L4ZSsNeRe8DF# zY^FsE}>Y}OD1zR`m{bHRUsqmW<=SJ^;?URJ& z*M@VAl|!p5v(qw@T=jXm4X)%H4hr8LUe|x?x39YVe~Vpu7Ix|7Lyg#_@8~ZP#WNCxzrgEE+MS2}VmqFp zhYcfs@|a@pgQb9fidUBMdo-iq(lWuBPwOj!DACGE0V`ty8yr{$_(~_S%fS*Gky*M& zQ&C-#5jtx=%+N77=2~y>=IQloDS#Sas3<8@TIS$zu>jQJITsS3bZCK#8W1o7`d*OR z1K_anpe$MxYatOK#(RIou4t!=hz4jeF_V?^NMk_A2XI}mJZ$9_UHMJYtoueQB z`b)pKaPrnEcmHkAUzc5&5@R0O-1qT=7Y&t-9C_~Y?Qg#R(}%XM-1gw!buaz=N1vN9 z3pJ6QktP;{7|Hj+CyKD%&VHrD4PY1Igv9kV#DebJs1v(t?Nq}E0X#qp#4a3ragHY= z5uS_&XUVw*Zx*E-_%={9Aym!Lmv3%-0GH|zw3V+3(+81%46_MfZ1~R_x|(QHo8I3~ zN8=RUJ%R}Nu8#7R`MIgd2=OMY6m5|M5LLoZ4qT3NGw0HZpcZgUenO9bxd)mCYKM? zR_xh5l_mMS&JP)xElf|{v7@ee$4C3d9=m%srShikH4lDdBu|-XFCS^jZ7>&Augb_- znc=7&+g!*@VDqv&A}t3po%m zOfgCmPr`G=SLK!G=_NBv?VEg^Y0VKkJ+*eUucs)!xWc6tE77oHw3e!8Qmux(`RNLyj|fycJ5``DIRPmj^)N^h6-(sDX;Q(eb!PQ#G9 z>zXUBzV*Q^JOBA$Z_SpQ$GWcCSl!p2T|Znob&;!Ub3@~WTQ_f+*?DQp*ljzSN(L_$ zEyk@9`OFcCcrSQBzTC9|zFe9UlgKLz4$K(5wP8LdckRNwwINm7=knG@8)T3giNrFXzl07=w->(K*hO7%5i(eO*0)h*cv=%51u*plG`~%H0WQ_Q7Gwd?0@7A%` z!t#XW9k47`fd-zLLIMh;~e4Z*Pp4qI4RHmFs4XXk^kvM@7$4Bq}!g z2%C-#iKC4aFdY*VFx?e#u)uKI^Npn}eHb;WAfJLucJ0`@<$}qu!LTb9A7T;|Lapb6 z2G<&1WI$0!SlwNyOT4C}plwxSPJOX0|N3>V)_T+>MvCk51X`a;t1V5BON=Wtb@#`{ z$F6`UfcEDUcXx!xpo}5w{98)S7#u;}ifFdABF1hlh22kW^o8A%SYss%Dv?37n_j#rLNlO=D@Y0eGi&z9O>kw{!cxi+xQ=--RsIsSToRU5i;YU>i^NfTrJ|BvaW6#|!Eb z1M3`VNH~O7s~OR<1jmm06slW$1p$6`u-wiu+~)2}mR#>oQ*i2zZCf@?Zd|`^Y;B^zWaxvt7#e?a;=JYoU#6ppCQ*#c5A? z<)I>lhHX%|{nOSh(^KQ?d6_X;&mZ5|-NVDSF?; z+2|2q%Ta8>26mCimLs~L8S|w-y1;?x0y}(GcI(#ID3RbCd}se*JKL*7wG@W-02a9$@M-FFb4;Ua^ zRDKr01~jJv?dhoEJ`G6zBk z9~e?+&h;5LYKxDI2*w8d;BUr2BuzgMheY}@z%~otRrMpj8-OQ)5jc__fn)pz=hGRA z{-G}tNAgADG{@MH-wk*xaZhxh)3 z*BDXE5#`tvd^^548ZGjuJ$Qg{qCWR9O6S5xh$!buE{XXClVfYT2D%3N5lSBv-a{FM zixKkh?(d~V`3P0|VaK`b<&$cYh8}Y!Bnc7Uiche+~iyS6UDrue9J;&XI6VY(m!taS9 z(}1MF7yJ&}ES}HmnB@;=MTSWDfHgyO964{g7C1y?AukvlBrzWx8N>lkSV3Q`HRpn! zAtFtFNfB&9?jFw@qrweEdu)$B`OC%IXj9Q$cL^Ij|19Lv|M{8)GJM4Ryk?U}#LVTE z;Z?*~hv=~G43*j_VttfjbFeiG6yGR_%ECtolw48(J}=Nc80H18I^l03a0n9q)%s(o zLxhv}^AALV-^FY|Be6NSHv8{s&H=*+KhCZfJWNCdm{k738jwJ4u;o&LsY@QJTe=Fo zs%n5=2j0+hV7r*5>OlH-AtrjG5alqgPt5xIB+?ZYT%j1h^x1c_Z@tpPqGRAhi*dvN zohAxCHL{5-d~2B4z%|VI&HU0vGYb6B`R^^9%+6`_`@@Y%5zPFdMJuL)d0YSC#f}wG z3zPzy1k_D!g!N9`Qr0^eTChN{cWAk^;&HjOeWb+M+E|Z3Xj|TOV?`}>wK?e(u}fDK zu|2)IBn<@{;4kWljf-8eg8Y5z`savQ)te3MGF@+yFB4*8wh4~tz%`Jp>rA+BE%;Um z{KBUza)7SH#6nGCqhsNEc0g+!HplFW5Dn3`fN``rMwv?8at6*RG$Zt|rHmG+D`eA$ zB8?VKLn7Q^;Fy$uHM)c`!-{xD_#uf>*w+&!=eS#V-T-43HtfHMwC2)_FWgC*6JawP zzev3a-V7(upA=9N=v`f+{+zaUTzGT;t+zis&|TP7=al{dY9zJSO?MUDaDD%9N=bdL zP!vX)ke9;OVcOnU7}r)|1O*zXMgE$LC>*cckkwI#+IHMkbIO>+~V>y#5zlBa-vcb9g~}6 z7Z(X_9=;BKh+^cYwlIZ#^Qi{G5~ai6b@9^`!ZEQ}qbz#}W<;=Bgi9P$Q$ds{W`}Ym zQ92SakTOCq3F8)~UYG#I!8M+fM4?jZAx)H(aIGv+94Je$%tjo>Fv6tbY;CQtXRK9e z1s+CyOFf;qHC9)amf*&VU8$u7u_(c*t&tF;gNRr)VxCuX&=^&yht7*C#xQNIO%r9a zN4~VP|El%w)Y|du9=WJ{V@<-yp)XI1ri8+V!q)BM!!A$Cs!P{aC1<$?J8Fb41#hNN z+i7*-$bpT`pLzI!1A}?>y+xDvU*2O*DT%M`EQ-x-94fm@TD9qFrKo)Hnoo=U!8>Se z9b|e9duWaRg2_jJ+P=0E#iKy7ogt(mbQz$|Y@VC+>M5I|4 zQCtS-j^;Czk&XWtKJpFX;u)!K2^Yo4z|}O6zX+d7)PqqAmdP1 ztD1LcoP0*nas*uhgBVI_&5RxfF$O>>zc8SF-%5qtsgsPX6 zC?15}MmvG>NF8y`MmTFh{rRLv?x5;0y>LQ~3N^vK)U;~VgsRi!0($D{h=@}=&(FbJ z*C277KPY}u?+91`p1efa3837t8+DG8TuG$`Jb6i7O;a>vT`eUiSWI~d^?IfP{h^nP z*U(}SRjDQ{A=cd}Hs-0a?K`)YbWJy=W#wlLWL6gEI*xc=z1M7xMahVo68;wo%_rw| zC@mSqJ@rM_!jXZl%&K**`LRjqNwLm~yz1h-6(7!q3Q@ScNAda845}rOUEAY2H!HD= z3*Bk9gwoE+rtShqdgDZE$(HTgriQbMD$^@Fi^F6?B3^}RB#1AV52C1E6R0z!^rMs? zif5wA37}B?RWnf}0hM9^2R{>9nGZ|NKBXxs*5C6hb_RCQ znp?-ZkJ0jG@$|mDSza$71nV9vD30;1KfStg^_L1*o|M^;fZXLsnGH$y3|_G=rf7gU zF(kB?+w-lc!}l5FyY~oLiXEsJ08~jAsMK^E>}w6;$z_v(U|v9bn`91LKoLYyn1hMD zI|-1_YTm^C5+ah4kvEV12pRO+IlDq!IksnLUoz{Bp?wj-gnE?xXN`TaEy0YUt&bPn zHNZ$K>2-C0l<%qQ=}_8Qn|U0Xo9wi@Y4xQT`Rue%Xi^cpgKToJw?vu=Ym$-GS8-Y1 z>b8c|s`aqF$!W>D?e%=s+PmiyBX{2W_-J2oUsHiB%!V_)^1hODXA9k_)=)Ehu4!vu z$>BpIYtzb_^FSEYZis({-N<4E47GRju{{-fDLp`z1mI<0XNkl^Jx33ASH|8$5U|dZ3Lq3${ z>4k})^uBw)RzATJu-mpiRgfMdiS9CEoxy~F>c@fiBb-ThH|OU!uT0Ztv>Spt{8hKO)7ByN}H&cev%LgMuM3eJ0+8)hA zqvp81xm>8@L~$#-xp9eF>QgLvnN-W*AYj0Xpc7$Q&($uqi|^eUX7obO%& z2O@#)Ug$s(WVw&T7%}~}Xs+_}xwZd)2=mepm5svut0kQ+2Mcq)(BOGN_YZx~{D$UN z*uZ|K#B4y0ML%*ZXdSI%TnvV!LLe%d=T&frL5$Js6WQs2wUB~1P(zl6UMHJ|gySya zct($p;v}cTy0MX=zMk-ohZPHVJcK_CU9k7T=gOPo+-6};2+hA2{>;(-6to%7_T82&uGZ?p#Hh65tinO1s#RMDne6Qo33t44Y}`3~V4~&z zhd+DWpywMR01DhGf3Q~Mlr==>xw9Nio3Fj`U`>ru7}Ih21EPw?AbQ{T{>2<^WvmTY zlub%~C)RcDM7WW~UM%7ynE)ZBSz4H@&pt_eAfdmzs{>%jjrCkP z0?zkTfCQh@J_V(0@ENV}qz3(=-xl%?=XH$jI{elBv!C8nl3CuG*R}p*n`>-Qwwkq# z*)11+^6_tPPcP1`9By-G#kP;E>{FVW+Y4i~r{HH@g zO!B&`KeI^#FYK%ByY1Q?{l${`xaajZzIx=6vWczH<>Z7bIQYf4)sY~ zkb^bM{`CQ+ekJlO-DP<=bkKnw_;UyaaAd=ojZ!=Ks>mfIoM-PZbO`yWW4G^a#wv_J zFNeM;*iW@>T{keeuDb8~Qu(Iqh92DDdGnKev#-}KM9BqVpV1*84;5}YcD)X&(Xi{e zd!{V*XuBmn?$(2uac6#Qi8t)^!|wfAnrEwgJ7hkO)v&KT1qdUNe4?~XE251NRd(A6 zl3?$I#9(z_Mz~SMeRdi3b_hj8bz!^It6}o!%wdkpm3duBAS9DYR(?KX`8D}974EW9 z9sV*qDzsE!=HvQ)vayJY~FR`*y98^ zdPr~|5?r2d-eA}xnZ&amd0*4(kLpzRL6@BSoVe|bbWhNhNaFT`&T3Tq(Ze29Rxpi`(=I&X##xv1DhNs@2oc7|FbYVUj?|yv853Jt z){XV|2IxrCB6TF>_(fVA>2KAcU(TiK-Ui+Kuoy-hjC2sA>(LvU9$moxmEsGc>}%j7 zhaC&xjh-EdDwh5PO+@-})8v>pzsQ`mh8uzxt)g*Iw92P!VRb}FZD~QC;M$R)Af81p zl4s#pu8U;cow}uqxPDy>|1|R#ehn*nfA9Uf>5sA#9=S&LF(oDyNO^Ja#5o1YM0*h% ztY8M9+{IZ;^(H+G0Lxatu_Hqn@e*EHFXFcZa5|~P6ctvM7d93(mKGP7$*Y%$nuSzi zil6)Az^Sg5XVCHzl$K-{U;FZ9AdvG+S!1_9H~Yy?1J~~Qqr*2S*+nVVsMO}n9JjM= zZF$mPb62<47pD}J=5@Bz6(yI5U;mVs{p+RQ`0A!7?)%7Ob$?uWeRFP2bzDkub@fGC z$I^NaRc+Y!(T{hoA1Yrvd*dCw!yDl9=QP5ahiKHoP7#&NAyh*B9pt)-<~>w&k78y3 zZ$bdlb5L#GT{sozeYHx}o~g^&88DPol@fO=&qlaS6kJ9TVk{_-IKbx9Lk)*0D%2n!{3>c+sErI8iM&8D z`4`#Uxvs28X=%=BSZQ;9bi7z;Y|P87id(qs2;U5;RE_O5#WzS>jf0f7$l zIjjGV^t?oiI)UfZ50u^@OC@C-&0RlMnB%-Yer0WAwmO-YZ<`*?Joji^-U{_757I2E zG{8KLnmBAi+2F=@Sf>KET(WHsHprASjBr;2L3kWw5LLRn^?FhP)KRy`i=>V~$1yV+ zw*AEJDA(x7KyLYHbH3F|=Y!^SXLfZ-j^ju~3Y~imm35a!CJJ-lb(FpDV!x%z%LKbc zvHK-P-DSCf4KB}y&?$gKL4^*K((u>ALqs(T0=n@%m0Hs&fUxSGYO#b3LgFkJmqg^V zpEk~@OQU#bI8v~jjw|az6~RrQu=>U>w0N4)1}m>)0iK-*d}&H zN!TRFcFch`(rZ(%8x^=wl!rDk?M%krQ${^TI3A+_0bsTBxImz1hzNf+>bu=u+7~31 z+H|G_3}cV7U9#|TkPN}Wu;nQ1Rn@#_z7xj86>=LvcYx(&Dy83#uOA&5><>^5b@RGN z< zYEx;M*SyAETo8&~Jztcby2^yARZ6}})9QbOv&@#OaR~Tgr-Y;iyebn~LA!-R9(AF&*H)sU4EKxg+d*)>!?zt_xYdRe=`F&xaj1kI9FM^3De~Ze9~m$up<_w!D*&P@|ex z!sbIQ3w7?^g9_ELhS^)Su{HCY#DmIeDV1S+A!^!UoesMKKpy4AyJt50ctK_1m(B~L zMP5F>c(Ovw@;m|i=eJb&`wbzMIamiSP$rBzAi)zQA*{h5`xa6Oi!~U2USE0rgOq^G z_VN*XKiTeOC9kdo8ci);*p(}({wI}4P2Gi!+)fmKnyMG=ek((M&J5pIz=o|yB>bCu9Rd7Wp#He6x;tK*;v7f@}Hsn~+kOSWz{T-2u>yZ69Zd0G;gkO zo(@$wSAAY)4>FX>)9QN?^4u9|Y8)N@&IpLC^V~H*FKb{P$rmWJuBV;`RI~DelInh} zE(CNsZ`SC%g>6x$Hvw`=^-)I)Dk_wfC?1kt7lGD#<+Fb@r5BltcYb2OZAjCZ!}~vf zf*;rLGmLVLxm=a&5MgFfB;`P-L-ObUwp7p40lPq{J~%(G?EHzWNwv>@m|yYP5BRhr z(b>VGtd6M2WM+&C`Gtye%yJrzguI5l`S`dOMq-86VVs8(bpA9JlJ4U<1%v}5@6~W% zri3c>lsGXI1BNhj>0<-_3$TGyFL|v2d<7>8ws9abB9m%P>=!!eok!m=xG!2FyzzIj z*aEsKz%Vq#nJ_(3utkCwM55DdHQ+|?bUv&YxSIl?V(cgcDf`0hMO0%z@R2X-e7;aI zRJL<@abiT73ruj*?Gj;PKFZ~Ve4i_Ly#89YgYBklcOI{g3Ec|ZeV{QRVBf}&l8HDb z$tFuPA;J4QckbN1bN7Y2wr-i+xMsM!Qw`&fT5uSD*zkA%jLu!7iwp7pzA*q^ydrpN zKX;7#OBbC0U^*HuVBR;&KcQ{!v93jafcf{93s?rLK<=n38_)voGMkVWg)lp+dyb-1 zTCiJkN`}x-ThHsq0)zo!Z-l`hf6Mcv=gmL;-~S`j-f>4(`k{mFvCBXHx$(;0vcJ9g zUTe_Kalu;H*_XQ2mp8JND#XvcLcEHQRe#(Xk(%lqTM(Ztra= z-neckv!bdYDLFsCgy+|BdBEPQjgdTD!v0ka-H5u#pU9D+;4iD5)&XllSn^ItiY(i< zLr$z_oVv);)(}C_&du`aQX4$#b6lyEs24#9CD|%z;um&QoQ0)aaxvr&Ky&|40n`>Y zi%c^)uMBz;i}p0_5i&=Ykce^~IlM{OaMxX6GuH7&y~jzBruTkL2P}{PJ8Ih;!pZ+3 zm8a#+KaAWi?tT8ps=P{PH6Kc~ukhXL_7$WB9?fQz-Vp6j%Ni=w_GPxJ4Ya&jB#E~h zt*Y>NuvNA3Noy(M+&-sSeQGb4WnN!sC+4tPsvf{D6!MjfcK8X}>O`|;iwp7l7w&MI z1XF3W2yh?-GRMMR^`M+klmmq!HMnHNaH6t_ya(x9Y%fAlEN0-kz*^fShkYxulBh27 z3{H=W`(mQSs3;!5SR(5gOuaOk#f*r8B@T!D@nslEtyz^mI5@a@aP!mzO5v;-=r71G zPoN@3D`IJpqn~ca2$pIDQ=9eU?wV?j>Vxvkc?so$3wd@lDGB6pB8QXeZ=w$HHWlhQ z9Aw@VX9c-J~LG?S?Kwe=hX*C zZt7gMwYNCVR34Wf-PKi9SeQCg)VY2`kGWg8+0wr4VE0Y89LOwh&Mg>dE0a7EdSRnK zT1zHIyH5S`zppe`)Rm+Zmc?edvumfjip>Xp`RGBZAG+2gH3U zkORk)#cs1(Yq7JWNSlMM$OCn6uwflUNy8ngh%srH$^BEt=10wg@HFTH*tM_jq7tOyi8N<6(xTS zxG(}Pbb|}+;DWIRokgoT)u}Tkh8QC`%n~xL0yW#nmO#x05WP$~4M04Ny^9@%7ZJ;) znsHN;>&Au$`+M8E+PXSBRx2=4wY-!VmBSSt;$YWj;PJS2b%v#n8AMY2Gi~(5e{x(=_BWv}9p{ig; z>L%LEY?2v;BLf);a3GbD3+%($mJFBV#K=%@cZZ)@vY)dNtrq^Pv z3sJeHR(_Km5j2n2@H3r--t}R3_h}`018TCb??<*$04pWUmR9)E=d>z)7M?0FgB6k$ zdpD?@ngoWZI*otj#va7HNWF+@i95DWZd^M$Jm{;_XIlcRA|Hz_iBBI!(6}XY>A~=d z2WoOZf$4GZDGk`Y7b~$vh~g_u7qJLMB)$#|l1Wvafz&&L>v3i#Z${7JJ~J+%+Lh<2yH8_Ii3y*yMUnnKs^UOyg zP)wd}{OuP*65`KDmY4{XP|pF?TJPJ~dSz@KW{I`Em?dZ#MxYvqDUtnwi~*B^i6(_` zi>_^33!MdOWkPcIoiCz+V+{vJGDfDx5|&v@J#G!Z$ck{fs>eJ=b3e}%>sC4j;oci) z2hKC!oPw~3B$LcCc0ABu$r9=Tn3`NOOt3Giv(LKVZD~YZUF>djMD+CR45p6% z_q2xpcZry$;{T=02+=WH#>EK5SHgbHtFHuo<0~NHFTc_iT52T*by#AeXLRH=z2r)4 ztYZQt6|q`~RD5MAV+CTMQO4jvq{1chzPrE?2~}-m(IZBHR~sYBIAR^P*gf+cn)zuM zc1)hg$m_0La`BFBo2REHB7g=iPu&$)SZBjB!w9|=x;ma!F))`3D!3(#??J1#a-UZ7 zYetk*{mIyXx<%^;!7mj33IZGS75$2M39tGU@~uyo{AIrsD)AK~!s)Olw8U35fF+|H zGb|>?HbE&~bLi1x#|e~pLcQ$?zMpXTe{C}nrel|@Q%|Zs)(=XW7ab2hOY$VRH#}Y$6u{ORK@jT zM)-<0tBk=RFxrJY*}!5%2+CAX@>9ZntgZ~|XLaGwWiWH4*`x{@C)`#8 zUORaW1b7V)vSpr75!3wG?HQDt8;tKB=xyNr{8z(AsPDz{b2YekzCYISK{@0EKcrOc zn6~!~W46ROAmBZ(MkZrq#PvDsj*16+A5-xhC)n4Nv|&t^L!F|T0MVlSz>fO)Mxf_h z$DGq0-%(NK38egmhpr>fd1HX*+|U{Q;CDA;>I?@zg+%g}mWhpHYj8%@9e`Z7coeko zn}WsR*ZBY+6GCjw67bK$*&CH#Rh(ZF>~vT5Tk%7vh8>fWC)8n8$(y6H%|u?QZR>LQpK zAC6QN$2Z!*{;Z_*fCt@8$XibptUi!6(icK;D1q-62N5C;B7EdGAOdOh#B!8?i{{xu z#VaB{&$9!;6e%up@&Qq4#&=iY?}b-hDk|KtexR>&b!)Q^4Q#&#m$K-%5R8U6_WwLc|$TE@+H2`4AgyS)wX;au5Fx|py5RS(HW$3Rz zm7&xbdxljcV?QJc@7yspQBYWsoa9O^4^wbet5l>blol_RkcVnTyznYw?tOJuBWsqp z9F?rbB57N2aQ$K`TFI|PvVH>FX}U$Y3z%#1EKZ4ux8Pg?gAzM~Hm!E5U}p7~?;cA6fJTkSC0y&>gBnC`H7Ps_!|_dyo6dewi5*8C z>$T6AFf@6hxIn}yov}JtjWK81^Fm0LGsa@4q%7ey95E?ug%Z6YRs_61ZohzTKd|yq zLkca$vqj-_VqtZ5ZmlaRzkRAHr>rWcAV+#Ux3(xLsi-#BHF?3tq8#^dT4F|S1;)Yn z?@I^8TY<-BVhOl;V2Ds`XEE!KTS0e?BNnG{{Iut_y=F!@Bm%3F4hmiV>je}&#`S`B zeL_uwv+8uqKK1IwT))u!VYq*)5o%_6N;XI@2)!nhmJ|?7DhRkQ+#LX9;^HNG8txlR z5L5ILnUV&qjLS!)+f9dnVU>zZ40|fhv>X_VHd>TclZNAd(&#<75HZ=8V9?6|>r+Zc zS_xQUinGvo(=5IPz6IDb`LwgZSs?j$rg{J;DPVnr=}<)Eh^f%zPk|kko-wt{Yr&&b zoRHx}O;}4(2FeR;Kw}i*iA{Mt?pJ!|K74*ey2Z3#KE~o$HX#FJDq@=?JcUroX%ffc z^5Y9Q29q94s$vJ4_S*)p_|&@lKmYah!==NmE?GX-a^Y~<(NC$;mNRjUX>RjV~S$}bHu}aLa znJOw=6eXVudqN_k_o}&``3VX6YBH&O-VzG}tALFE5OzNkC?-+SKx1}*dR!RD%EyBS zCT5xf3wR}LJUEJa(-n}78GL8r`fnPis|F^Y#+D+VL}3o!!_ARwqa1P7P7Gzz#X<+_ zp~bRvRtPv;gyNZmX$U5pkU+m`v0q^6sfqD63yT$EWgMg?P|R_Rr~*5SDSVpdosBB-Co|0LVk=8Ds*wE)v+-V~nuCD5=&t_zo6{cj;@1BruGTjB6WWodo zUh&wNah|IHI}jJQf(t%b4r;To9{WV|Y0q!>nI#X(m8f>)Md_fakn1gohr5N|l4$LP zgp%6E$E`3C1d*EiA?(*uP{9}~0f~Fq@0k&Q?VaTElBJ~M9?*R~zm*Bxiok}JQ))cF z3KtNsCn!V4xLzFch{87SLEIB;wIfPYr<#1S)hQtfMTeA{s^;{H4p&K0Zc1j#>!tNA zb@}~0N?J*2c|v?vRz8NrV_e`F5LaS%oXX0SVj2^*KCrrAFgauc_)LRhE=(B4<*6*y zw^PGFeu|xZue@Xw7lFbKj*|T`!7}g>8uRRpMIa5;Iu4c#x$?n^~E78!I!t>wQbgVh+6m{WQQ-&ql;Kg4cB9|yk6lkU}C@tt&(b(>zr-_Lm8m)>R$%ai!*eXWhN z6jP1&&*GbG9IqcUZDzYnx3dA^0jyE#yl9AyO#JKk8!0Q| z%a~LpQXv~qb1^V&|7xl zJ!m4kyl?aOL^t%8r@SxHc;*K0!+3_bVfI zG!HNr(MrAz*BoVOmUgsj@&0MN_TV)KeWtvBwA_XFcKim>Y#-WvpaJv#oM=UKv&48$ zn9f3iKm*=D7wKy6ljaJ%#;7#owEH#ahUsgL@x8hrk)xdU{&*ZXU^ z)%zY^-!tv;o{)E8oCfccmJe7g^*6nP{`h_VUZcOxFZq4%lk)89R-oMyfXkFgFkbIi1W$%m6cu$+{XfE$*qOCZ^UgR_;nxhFXW3x)~ ziY7hDc1w&MfzH2adLOUv!!{gZLnbHN&w25<_g(QF@9X9?+`}30d_)`bUA#~9{w{D_ z(5D@G>4L7f=yPer>k*#w-XN{;tT$(&wW>|(@l2S0?wPPupf!6Yq-~z{rnf!oEkkHG zdDhe4X18Zt{vq0kXWVoeba@fYiPiy`eZ{+0dYY9;$61c}8Y>Z>gRMH|Jucv0A*b)+ z`gdgq-oJy_G~7S*n!cmY^uOsd{`m>~p2ssI{lzn7`aa|gc0zazI_Lmx6TNTq=Na%m zBR}AM((3U(X=7X_FE%|4IfhP-KoBjo3pK-m?^&Yc`=?Pr(Fs}IkuNnUD$rkEOJ_z}KM0}g{n(V1$73{E$Y2ve> z4axIg@Qk;5-?XRT^>^xf`EJmF+7!NDkIxR_^#EiKw#fXX+U(7ErN3W7JL&zo{I>V! z7Q6T7f$yz}7~=!<716TP7UlGwz~}E$qtC5*;2E`p-Y4yKcuj#Vo5h%DR@^f+dztrj z2lz<8ZM_%w{VsU-Q}7wrM6Jc^V|YD+Yfs=Bd}qaX82?EcUw%>j9nv-Z9_%#MGun55 z#P?{{2F%%5Usw}a4ZeTZ*5Q5644P7tCeV(uW*M?)c^h;*?b#v!#j_31%6V$(@t&gR z!Tp`Ew&I#wFi*gS`CeaOF3b-ui}p%-%G-n||7-7iq)P(yhU5-oJc*Uh>!#g|ar*_{ z+E?KD!4o+{ZMYAWSFm698qi-tdlsz_ynPXTeH<;|z2zjXM+2YUG(%r_!+ZNP-V>Im zK~rkr12t<7c=RgXp9C)p!Ampfp94POc`Qf4%l-HsIvG`lYwuRCqj52}yvtwThMhd6 z{)X*1pL5=|9Krb1Ud1y#&1&%ZyH-T!$j`!loC3XG!t1RV>jpggec;#K;8!8|^`!Td z`H$XHbbq*q6PDL79&9GJn@@OuXFlTXfh?c4J^*^vqFleARRt?Cy8jsOjg-Z5oBWTFXYoU$Ypj(_*kbtb^Qim|Agvt(Z@( zY?ttJHZ2~*n8(pxMtcJ7CA5dpevbA$)^+o|PW~k;v7Tflcs-5w0@^cZ&!X)>>($yg zUcV4=O!{5={e}Ma`>YA;x+dxSY`ydz%b_L@;Po_gqz~(#FSBuRpVy7g*GjG6`vB_; zw@%U5%zW+PUppJuCceLEO&!o2`WhQ+55BGpTC*6}FotzFt;MNHufT@WdR%W|)-{1^ z9a_hSZQ9yLUjxzF)Yt;oL6P43)wfwyQp397&5)+e z-86se>jAueQG5R&UhC<7;Qm4T?p^WUp-Tb%>AgOe^H+WD*5-Hq8Eg{YYpAae`rc#h zOY^qg@EgDI{f^Un9Pb~*_`!2@n7?Vy64(O!(40+cX4+Q;ws3M8_!-HFzGvgS0Y7j* z-_)M{UAkvoCQ1HCR`}j1K#sUffS>xhTOVJ)E*y`2pJ{s&ov*a#Ald{xn~!&TAAT*Z zsj&9udnDS22J(U4V;yB|0b}~c=WV*D2q(APR_aog3>`!|Z8dKZ5=ycKP zr(dhnJLtI}p+?}Ft6a+{j|=v7)!W^u_RoVjImP-7)!$# z>G(Y38pbk@F_w+bvhmwFS1^`)BV&2T8Ouj=qF=$yj1}VZBK(HyM~syuGFCduSXmd^ z2aK)6HSYC{m0Qv9yA>xGtIR~hXO+()%~C?c^;H-bF(XKyM#DJuI~Z$dWUMilu_pX> za{=1hjJ5m}En6dFh#x_o%y}{VTdq{W3{anxmWVQzw9Cm;l z{4HZMnT&0t_6Npx;QC#-=EBDq+l}A2xR$X?W*FNuilYqt&TJ!N`zjf`{1{{VhZws8 z@2|kPS7Q9DPBL~i#=Qow*FMhJbvqb4a1UeG_c3;GJ!2oi>kSUZZp4^3UBlQ%pJnV2 ze*YGQv5)tmWVeC_Q{q!_r_h&NpnVT7V z0OLG}_BmYtdEDQzD;RqS<9$J5>=E>T^ghPEcqe0zy~o&>USaIZ81Hdh_b(4H_Qa1F z`^sU)j^jSRdW^BJVa%_6z}QoLjD5YBv6G2t`1>1gGxp30#=dzHqWc(Qr*awl)-{Yh zSHRfwwTyiSeZP-;`oZ;#y)eqy4{`rL!niNK$Jk4_{>Nt-`^f{0{cMP_|6q)r#&@s0 z!q_j+_g5I}*ZBK4KVa;4dl~yryuN|{Z~m6CxA6TR?qlqa`0T&%_n#8ce#F>2`0T$Q zW9(i0=AZGKf3-699G3_`LG886c zU4ixp6LN74^hPK=#)M*wReCcM+!(9;w@j$SSk-qjp>8kQ513G2fc6I_G(N_JW{lbL zINIAxXvJsk7*j!8&CvSLu3?`hV2tCqpC@l*!q@N{PoH4I$wnr8<4$ZA@ZGoZThDhf;X8dy_%2?*hjD&z z4HF<Kfj&{r@zgFSJ3xWv|nJXU!wgA?e#DxETn+bn@g9(2*$%MaRyuad} z-otnAW8A-?|KA^H!kJ@C_z->0;(pHkhzXu&;m1CVV}xsPl=>d>sZTHwyJ8WtE82g? zL*X|$gWuP02AvmZUg>qLjUGRnAm=tiL1ZE#O_2ULJq|~d=B{&hZH7`VEoZc zCa%4ni5t*w0>3+jai`y9;?~_v+=lCS?PcO_Tz~P~Ox*Jd6ZfuQ;^jYJ;uZHW@v34b zUX5$7yN`(n@tYsT-yg$uhaYF+$N#{@+jlVW&a+Is`%Wf)8qfC`2NNIsf1O!#NqCtHzpa`3=n}lS8sN~{|5H3wTnrxCyvJkRyvw?urQcEqRsHkW?>roFp z`+}%wskikgwOFauR_ld|7VA+wtMdQOd;8|S4Wa#f{^;!d<~P6NJHPqOyy5Zot)KW! zUBqwRL;RLq#BY0w_!j8jxrO-Muz7DkaT6G}28eIlLHt1?z5}w4!2T24i9c-;e-88? z#uDGTllTj0?=o=18uUw>i2tRT_^TM}Yn{aZv5okfXA^(Bf%u+m;_p62{QY&rKP)A_ z54JysjZfi!KYV`)yx+7D|86>-ZQ4utwRIBOvn0~SlE8Ib;2JJ+$B;NIo5YB-NsKf| z9KMgl=xrp9*iYifjU;f*7PwxEW2Tch7V-w{caPGTZ# zPuxjj(p4n4n`Dkm=t@ zV)Y&pYu1xkn;^07IuaL7BeA}o#0J>DsE5QR=v+RF#FfB!6);>4-D`J}xPB9f8y1te z3IBR}^DYv%`bpe*BW|SBkT6G)*!miYZIHho^@DelcqpC3!?3>t{g2j>c%q)fQ_Uov z{)EIcJ4ieS-t&7&?A%P^1=!gI-k*VCH+25mM&ecY`Ws|lhpjiVNxV6Y#9Pq!mbXn3 z?*Pv`!28Zd6xiDX-91;Kyh-9+_0r3*J0#-c#({Vgbn)7}sYboTBi z@d4@&;p;=_?<*zo5iooVy-(ol(*%jnAip0zKlhXP0=U1Lj`A&uuWupo4RrpqgT%Lw zk@#*ciSOa(K!`N_?yp9#k^HA^jopp1mo$DI$}Z9bcmlN8hj)eH7Z0b)8E7!H6fdYx1?sHFJ}~Kxqg)GqzyxT*lyBB>?CdETGB@KkcJn#YNO94?FiT# z1KFdXi+46?$898S+&0{lfq(2Rnjd|WUm>mJThhuPQ*j+>Q`1puNIMDjNzalt4K|RQ z+R0s{onoLs{?v6S`$(HU0R?rXNm|tyl&46mUPD?xJz^4{3eSSpoT#u-QMIv{f5PJ5M8R4eb07^!YnUTWgT^<2KSRxQ?`+yh+-+y`){( zOxn-ZkhXpoX&Zp?7x1&uB<*6*m%!Jh@PFAh(l*2X72lHf%hyP|x`DK7P+t$bH`I}K zBlK^A%+32ryX7g;ZiCM4z_bOn@3@<^JHfx}E7I->k#=u_wBNv%`7CJz@Pq5AcHfPp z-4EFZH` z-GbM1n52s_DBqHqxJG z%^Ba4J`?h@Zy|jS=(=g7pSFke`8SeY5BY`Jq%Q)02{50&m~{M|NN?;U{Y=nj!S*@Z zNpIFj5AP(sbu;NW3+kQYNME|2^yTR5*+F_Q=#|q+Uj@DM){wpi_RfEb^tH{TU$BjI zyHPSB(kiLEl%5Kts-b4CEjO&uIq;CSgOFtp~GL*|9cf|zKuLQoU7L$H8`mVj3 z^y_w!{;O%E->`@Do9ama^=8s z?+cK=4LBYsB^_rz{UP-K7WIxTq(3s8^hbM0e;hua1pTB*`qQxe43Yk98|lxZy%Tyb zj3NC`J4k(9}w zMM_zJD)4F33>pbPVpZ+cwi^v2f(m!G9{r&j9WC%A(^mO7gQo zThERGPYyG*nj}A$O7*ttSkJ0>w4*a&OlUpPC=LVzM$0OrKHSn3GiERE33qjc<56S6 z%9SgNqE54@HMac3x>!qZA`)L1>F9%qrJ&@e8p+ z(q>`Of3j&rdyTM>h=Kc(ZBX-|aUR52+zB5uVgS7;)}B}yjz^@^ zu4rqdyEoEi^mVsI;zpt~Vl0|nXUy-3blbvpwt(MoqYx}IEMrMs3;T+2vzMZM9kqFB6R^86Wfhwe$ngsLe0q@{E5p^*I@P@bms1`^VRF7{lv``l`44O^Lp%+H03!hS3>aDc?D?)2KYhD5ylaq zay-*!z;gn(!@}^IKz}EsxFG+q4 zK4mNtmd8SPFhEKF5vzYCK4%WXSvY9?spB(%tQT5glmsw@v13ILLmBU7;KeK-Zp?<7 zm7@PKYyVyQf6wRtmRM{>SdL?c6%85bMHco1vPF(X#>XCM7wT5DyD{zvMr&Y>x~);m z8A!mAlwE}Et3y2>87O7Fmg`b1_|Z31F35Z^aOX_Uy+oGk*Fh6TK7=75XI19C^t}>o ziNl_i8B|FNEINVji5TF^-0A^68UOWSEOKS^fY%F;G9SB8$H47C|9nKG?*FADuZGs2 z1MSw0UAy7=#C22d@OX;@UWJ>5H!A1g`ZXL+GmfBQ(V(fCfm7&?-U!aMQD;<|VY z&>u$yG>*p8@puY*0@lDpnnZqNb`h}3ouHUXkn2;Z4C^R_E9_LPrfGPS=qYq6uCbL= zh25kEUs0HWJfDR*nnQCjzSC$PMp}GpGU2U!F;45q`@EZ;x)GW(wn_ za)N1iZ7g2fh2M(IV43*w=xmmQm*Wj%!`WeM1RKdlvBTMDyzO`lJCYs6^4M5*G`@9o zEHhX>JB}5wacn$0o}GZFh)=}B?vt3G6|y2WnFUyo72}cQQZ|K^v2qq-6>KUyiA`fC zvs2iqY&xrCRjiuTuv#{Q&1AFKY&M6@Wp(T{Hjm9`^=tuK$QH51YzaG^oxvJdBRi9w z#m;8u(1q*=tcf+#CVCF%g%-Mpg)#H@;%xFA9iTSW%Gy{2+4C$tPk&(T^a1N&owSqw zNH5Tz=xr8dOUa~N^dhq2CAt((V=kjTtP5W__=tAXUyva$(?99Atef6rG1kM*WpRdF zVhQX57a^l=q@_%*ljUp$Tgm#_D%wjwW2@PDYz-a@eTxyra7*(a^a?wlenG!uKcWlh z3Hk|LOn+r-*^k);>?dp;^{}6^3z3<>un6_9lCaz0KZXd)T||J@!7^%RXQqvVXFD>?8Is_A&c}eab##|7QEy z=j;piCHsnf&Aws(Vc)Xv*!S#!d}^C>d{0E)zFIeu7$XYwqb&2u<@K#mXRhw%}7 zBp<~O=cD-%d<;L5AI0hj;~_%1`3c_{sbfekz~ND|r>K<~6*Q&)_rpEIymh;d6N%KaJ1h z^LagAz!&mGd@*0bPv>Xw2HwceOZjE|a=w{g!LQ`Ml`8E7nejUG_|BBzhZ{#=eoB6N#E&Nt~ z8^4`6-@@;}y`VR68vZ-Ki{H)f;rH_2aFY+v4!)J&$G73{!I|^`JxEW{HoBjl=J!(? ze}LA}mAF~@B~H#i`7{Pw}Vu@A)(QS^gYe89Q?TaFfm*lCPs*nVw5;sj21_TG2%#Zl*kif#nIvzajY;zzBo=4 zh;d@PI9{9}CWsToL@`PDMWHAXlSM!TMX@LmrDBRG6XhZ#D#TQAl9(n=##aeX71Kqf zs1ntpM%0QKVy2iSW{WvuuBa2IiFsnasHd;R0ArVrZ`KSEzS`? z5KW?4ghh*J6>TCS+C_)x6j8BMEE8Q~x#$)#(Id_kanUOhqED<4D@DIpC02{`#2WEK zalZJGSSx-kE)YKv>%>pRh2m#oz4*Dii^a>;u5h*Tq-UTmy6Bf3UQ_QrMOC5 zEv^yQitEJn;#cAZaih3N+$?@AZV|VN+r;f+i?~DFDee+?i+jYq;y1z+17fSVPizzS ziwDGmV!L=qJS=`Ic8K4JN5rGzG4Z%~LOdy+5>JcYi)X~M;yLlW_=DIf{wQ7$e-gXI zi{j7XC9zxlMZ7HjDqazdsw@0JFK%lt9 zp{4{CRjeqtw^Z?_D5^|R<%$X^s=}el0*VTz^>s%Bfyx@iaeM_!mEEAS7F5=P%386q zR;&;gJ5~b43TLshSFCUrE6c^oaCElqer1%14RvQKEd5 zDj%iFN2&5rs(h3xA8uSqm5);8qg44QRX)lTsxqZfrZmcwMw!wmSE$MrmU4xqTwy6! zmdlmpa%H((SuR(WL&|bUjW?uxgp`kv@)1%#Ldr)-`3NZ=A?2e&`KVAnDwK~3<)cFR zs8BvCl#dGAM_I6Biqb82?K$4CW|FxZ3^={PfTIx%INpK*$6GMqcnby`Z^3{wqF}%o zQ81u<1eK495?^IeZ@4RwRvGKS&5mWhDyx}Q-5QOz_APJkiuC(xEtaTl>QAe+rNoS; zD4#vYH_z(v%?r2oB_h5>RwWiUb)rOlXIjn7GuvW`a4YUtB=m4mq`OUoVFx8iug(lx zaPF526pC|!DcQ+rdw*KS*CZ;Aqq{9Ns8@3M@yH+5O8 zuBO!jk|=#?D3+Uc^mJHMM^lgJ0Pv2c)q1C;XBp(trM~D=O9F<|P?GfO%%}^`CY$=x zlf-J>R#^&zOJQ)CRPrseW<$4731C85tuMFiEk|oPTHRKw8{oSw>v~Kwv{+L(B4P+S zie%`hfn0vB2ERWu=3=qQrrvCakP1lwspXQZ(~~0oz8(u&Zcij0jkU>Kh{PjpA`Vn> zpt5`l=%TFl_1ef17Ssfo35eL?>}y&f`Vb}*%WI#4rCSVrm8G-_v0eqmRj{_&63JYx zvM{}MRlF)5SrN%eUZX0?q>|GL1!PMKwMZf7LNdi!GJ%TF$fRP~l%^yVDj$MZp?GDE zT$!t@c;&?h%T-J{h=+|~2wuq$ywV|fL)Z%*Y%fqAJV-ZCJ|(@QYgJEY=@i#U`49tg zcwV3mFW?!Z%X7gio+pqY$49vCB~)^YD~hpj<6lB{w8b z+(V>ht#|ULM6_;x$_%x^1#hMoDL3>^YA=als)CcE2ri>G(`TnSSp-N zDj0O~z{L_!_yVpECFk-2p&|0mE}=#gG{NVhGa=W<#r5$t2!`IDH_gBgFWI99f#DwEPG6O z4l}8yJRPZ~yd5c~-183hFs~1{L#B$ydB9!Csm?tegG_nPMX9FL1~Ax^TJeKTIa~Q) zxaDfU8m!@@&mfJIQ&TD`cLq~KQm$rjun*5gEX9<&n+-}I_lPj4!=sU!B_55`4v$7^ z!g(}OJ3Jbp6u2IZLv^I)Rls|!NipT_&x58`9UunfmFJ|As^RGv>|9-YQs={~kvfCk zlaCi}%2CJLk#gSgcDNdY@+#%zdom$UnY0%WV8iS_Rdq(m)PdO;1b{uj!yT{Db_2JpCQajv* zGYD=-?N@^a=q`i78fsfgYUHZ>3q{fHXu@ftS2mN!){^8+?|?RMNnKs`vW|Ep(%lvA zZi}{BJtct|b{!1*mWNy8vF?o4Fg}ZL+b=WR6YEXHV?CXbEIekl9QWen-I;XUEoq5# z#a3F1#nlzEE-nsEksb23+R`MWLaXhI$8uU@U9s-vxPO=k$5&Zhfl6B^P+6vRMdM+c zSyh>=E3$ec@fCPTNj^8FFKX>v8P87{+`%78O3V;BbKZ69VKNa0v;yqw`O z)Lureg|xeGc_c1z=181wOQKY*VKzq9&b1JFni8LC=16p^HO$85wrympoonGzO*`Q# zEA*O3S0b5yxRW30O+=T66Op#GN_)-tDy{p0nU(QqcZYRPF{84rrK=+zUJ=QyjCQYx z#360VRI8hfz8b8zZ~~QFaTzsgUDYP7*4i4iu10Ml+SL~E)!G`e!&-?MwaQyr!~uK(#uU&7SA&m}hll&Qple<|l(T-@=+Rzq1ch5${{x zg(o|+=J$4mdpj)$Y4ej<=PRu971sGFSbYm^NDIB57uvC3sI(UN^Qm>M_pTtQ2Q2JMw3$3J{Sm=6=y7Vq<;hT*=sYa(-qY^Wu|vJ=6z8+&RE_OS6b8#rY~yY%ZNI1pd1*{R2WNL+u6&!zPs#P z>Pq2RgVefUHmlpc+Gclqg}N=F%x*QNv{*7~F$+~r%sc;CF;A+;lDQC5xMK=8E@GbW z`QkRbxYu*s@|+P@+Hs|gH1KF=^}3@@Cb4ye4+N*o$mn&{wS-Ldgk>}-Rb?-TvXYF1 zBjxL}r=Tx6$UbY3dY_f*ecqv_^(BYb=jdkiDS&+`0DUX%^j>L=GGk?16#vH58|}?n z=>pGM<t%f2XB61g_*n8DQ{X)q~d zTdTA}GrZEZVJVOFFdRLvkfod<_egt*oTezbJ=(lRMTHe5)6VXdxn)zU94b>zo4tC| zW+ta%riITp+p0#+cVRk8BWn-l`R3cB@`zib8t!3OBgm9{qU|wL!nMia9+S47hhga@ zLuk#EH!L>8BW*K0ZY@Txy|bwygbyCVa1YPM;9*!8yb_kxEZeF@`@(kII_yA1TnDx> z55qDx(!+3IWh_@z!bvt?pJgyp&Y2yotWImOSX1eX+P!kmO7_~AET>6)Hh7Oe8*t19 zyu_+-6>?U~EZ6+-*x+G!81^tc3t)gmp`OiRfYw@4*!wJh;mi|mZWmW5kl zDsLvzD%(j3Tt8dvi(8d_ zaVxI2&vV7qRT+RM+dfJHw$GA4 zwJlwov{Ib3Qk=9>Y@b9+ife7Tk|5z5W9+~IJh%Vf{@g)#;Cp6k@ZWa4Pa6;XAK3pr z9z^{f5B?u`T^r%F@N9O9oPG_y0S2k0q4w$Tz1q<{4&4QlZ91W55;)x0w^bO12CW zzh|0n2BhR;^$i9W_?35IEL)YlvJ6d%9`_<@uNR^CY#jQSYT3pL!_~>&=h{7 z)-bj4VF1#r>l;kHpvv?WQ~`dY$(jpI&0hdqM%#eiQf0^<+qwKSMRRSdDJJHFUu|qK zHo*2kKp&4`Eof-2&kHYXY$#|%@AO3t=*p9WN_s9db-$TbJ!vbxwqb?Fhh{-l0YY3* z6*hTGyUAMN-_$1-nrVJRg2Xdj+cj!|2w+ZcZj>U;H5SNp|JJlDs;;e?n6HAJ;ZF^I zrfr2y0)%RexY?-PP!N_AVMU7aWHe194$w`w3;e&pc8WTPTfdn+48`tg+pUc0!# z99B?e)S6jH%FF`fTb0oa_xBGUj&FxjRn>;(ff2q*W_(iKaR}2WjBVtkLi2F{0F(7- z#97uy_y>fn$M^>{Ss&>i&}Ds;f50c}JpVwNtjGEX(q(>Ztk+tDa zp;_!NI$~O(S@OR`kzuV6FU3^Q=Z%e92z$7A4s z3bv5Z$bS59iI^GHlOh|63Jhb~2G}ZdyNx2-hN;0OqztoJF6QYA8t&tUF!Ju>$BUyH ztKGPBLN44Y_YTTC>rm zF0J-N9h_Xv1<9EK#zJ#y5<#^yHO=zcJ9voBRG#E7Fp6Zt%vUlYQ@o2J;9 zO_zPLVq4OVYKqJ$esjtsrzgeeseZF;(gx&^OqLB;jt4o$v=o_>;D5RmE}4K%bY*fC zU{w@hk=Ph3u~}e)R+;LI_kXA2%%KwF|C4<(ZgO9lRuIa|_sn;GV-jPP42BcbYB~OV z8F>jYISw`C8VvbxdvW4Yj&(S)$P8jF)*gaC1A8qSHPS4G%uK&oifWdOS}o#g%)m9v ziPLPqOh?pWRp^>8Wh7BAWhAjc%1C0NlsN^& zA}J$@#ZpEROQeh>PM0#%L7X9FB+(#cB+)2kBypycsRnVDl##^QQbrQzNEu1|K+2p7 zqDjg~qFKsFA}nPj(c(ADRhV04!#oM>HjA1DDq`gm*e9dW?l(h9xK(y5i94}iBr?16pD5kG(#bF8} cI4(CnIF%-(k4h8S6SuPiKQ*{M(8^tv41d}oRU?8#IBFtJy*9zAN5dcxqGlMZGL>GG%R#)4J zDJ2;)4*E1pyHia%>lMv3X7Q`UoFyoB@|xvh^)kOE3)IL&0(G&i;g08s>c%~pHkN&6 z($7!kyv|A2DsV2mq-5Ku)D#$Kn$CzqD-wm5Q*OtEOEZe^&T$xIb0NUL}$)W)Ck`6oter6KcQG9Zcy>lXip)%e&!lQgtQ*N`#abOlytt!&i3fo)cKV zP0BWmLxS1gQv(r_r|?9>rR0ZeEJPx;Vi|h1!Eo*dohr&^lJgqJZns>&vexP@fs zkPv93Nyw$-kM5Mw^{@wPU47Y1dSkiHyl3dtHLwV&6Tm1iv{ve;sYA}Z&kmH802s9Z zyJEn+cfl7yFu#1^#DbtP7k&aR06|n{LnYFYEphKd@dJEq@)s#S)UA&8VJY@S2+{~> z(4?M();zvayyd^j`@4>xCqH|Au>Sfzb$mEOcD7e4z8pPVRTiMUWiw;|gXHw7LS#U< zsT(}Z5SJ)CRMXloh$qPnK77w_)ctHmgh}QAe<2S{DU^`!uwptCoq!Owz$u6bF)vnb zL`bM$%>baN7l#)vtS3y6h*2?xCk z>w+s)@`O4(4_I{L-!+b%)NZcQ&ND=2lyP+xI#9OzsiY8$c)ys-MI?TG6 zEP6f=vuLo!G>J7F4v|s#lJ+7A`^nEQScH3e?B_jC&{sj>m zYD?!1z4nDG_Afi$!J(<{>z{~Q)$SaXWjj~%ZvF152Hd^VoG14rFykR=_TO)mCn&K$ z-TfZ!vMBvnToyBoKRkD{3=&=qD|L!vb#jf1f}2338z)e)g>7#NPe!FoaY*jY{f)Bf>ohk-K z4{>fVS}ZCicCqgLuYR_fYx2;*-4k>kffuywghn?15s1dIOOYfl+XLf5w?wtU2Og*f z%X5x`H55F6g1>m~%F`655-W1wFJtY>>qNSdVT`M`1Mlh!5Q6#3j={n5#za;!X&^OJ zgq;d4UJV-F>gg?c3Y?d=kvn3eV)Jb^ zO5vg0G0yN0%}xy#(6oTDSVw8l=_*2k;zTP?+N=*18H5wp`s90K-C67q{W3d8vQGmr zhpW^>1HEQV2TG#8_P_0q91h8QgHT~8=-Ij5snJ3cj?Jn5_66uV=*pq(j}yHnf$Ft;5VVC?bz%9X31asJeQF2jEa47H#j` zk&uxf3t?g!tltVP|B#G_UfDD}`<#B#iY^i>oDd-LGF}A@Fno~dR72c&hs6bR z2F}9(i8+PR%R|~FV$;Ke^Q_E_Bc;$)xN4Ti>Lgg4vaip!%M z06oxAF_*)LH57w|gCW3SwoEHwjO{}}U=pKhjKSZ{u!K?1zm1q? zXyA6y@)}_sONiJopF}_}(~}d4FDyp|(@w}Vb;Fl5bZL%{1`}gdw#i{KMjp2@Fb9pg ziO|u7qP{$kxH$qh8%L+)AvwZNgUT6^zsZq-MRyZid{D?t`f|KzSAD~C?WT3d0rO`0 z=qQ6{)&UXXuHY{9g|P7l_nd-%eh}4%VVaK#Nik*tOu9lBM$<%FS@`NwGEbP0&;Xbo zObCq=y%a`jSJmx_uTLa{@2@}^&F4c%z6oe-TN&idjv+8E|$FHOvBqg5hT zMB=7SHq`_-E?5g=()*!V>rIa&LcX(RU}aLm*38U_V$C_g4)7GrW5$GnvTwJZdBmy6 z*X)wi3=R8L=esOhY0a&eH`^fSpUHV8h$J1|o^3fKO|9QzaiKu>yZ9wmRkW?HTkc<*v7i*ylJ#u#j zD1-n&{B`04oG>0Jn{5PKP*4Qsz{~`VVA3578gA+JUkiPc$Iq!^K|}*p_z3(-c&5z@ zKxmdNpp2&wg&%xL3xZNzG-5Xt7jnI@{?c z25=M>-VF|;an2Os$Nn%HgQz7m(ujC}Ii0Oesa(y#8>D+P*_m^X##E|h$M6tJr%#=P zWP*)Px>7z`E~U^2LNCNiy%Z7!!6RI%6fF@#ZY3z`CK91}^J$F!EB0YF1je9hJKU7!S5MnXV{+#K;y zF~s*H%p@vj&-ru7#(F2L+_;IH46X(z{~HTfcThqD%b{>~u@lSc<+f5#xgt9L7$gSK ziDJ6D*R%4&YeUB@yu@4+&70MBNTnjRyqMRd+@&lU#rV%0t3OmouhC`mkN}pL>tXin zY*p)mt=}$EGT2E<4Q>E2`6)gZ`QJhGDNpI}bZL9}m+R>q?l`OzFjW?)Y)P`fUH(_4 zCb?sm1=DD0+Q5v}BW#0n5;Nm(@RTEa3(Y17H2H67La+>ptQHJ@WMy2xRQT$|7l`8c zYHCxYw2o-rI?(fR2-%}pbs$I%w_&LPYE{4bo}vRoAW>3!SY_zH3`ofx3F1PsQ?&iq z*BRG>?<6%z=x#`NhlEq{K~&rU7Kc7Y-90aRnoj~rVoKae)L$3^z*Utppk?I`)CX&& zZ^@Go9fm&fN`b`XY zt0xE5aw4t@qTg_k=!-5LXU+_~DlW?53!afv6W(k@FPPX-`nA!FBMp7b!ODbL1zh58 z*69I}P_-?qSLKj}JW7gP!la}K@M}L>v?rDD!DY-tu+onu9kLoJz20M4urX_xf2dfZ zORd9Zp&28_ff=wdMpXi%IiTTNegC}~RLkdYjA39kWqlA?jO~o1`*B&85Hd%VPkYZT z48MPe62;TOq#c%H(`wX5(Bu>nlh4Fbd*Npasdhh?oRy8a;NB2(eb}6DgwXtx=n}fE zx67rYw=(s0r?EsPjaya}^Qc-_UT5|*@|$Q}*|>V3O~USkIe6a0_>vd~6kHuP8=m}_ zo2IGKbv;yA+TBtlCpnw)8hDn&eq?26gN$Bh;SdxaS04Fsaih_Cfb98s39xbv)=mS0 z6M<@pM2#pe32w*lYSWG>DYqB95XhgAA)*9dOxHr{t)er0Xugoy)!Vz#2C3FaUMzYl zCxy{igFB901*R2*F4>grPF}+G`;Yh zGi@nRjWyG3mR(BVOeBPOF=_&}2IWT%)pqdNAcL{eP`L*^FDv#Rzql5U&Suq_X%JfR_lC!S|y|xd5mQ0{0!G#9hV46S~A` z0B!{yI-4FZEtol5)mNWXcX(`x&Pc*&gh4k{w%0S#EI>rqqlH2xv7mR=9XNCI$V#NG z4wb-@u{PfQP;tTbzK>(DF(~bKp3;L1-A*HS!VB)Ae>Acnvde15Anb`h;I&0)aZBS6 z55ZS7mL5Wp!LCt45^{2_70YiI_Py=X{I3>$Px5Ez0ahLQ+ z9EWUWSyzA|+g-Axp*Lx-M{!ReQO07EG7r4^)K(xbj@%ZU=0tBC5shl)1a!ifM5OkF z0w2xQ-<+r-h1fi7B6waX15|*GGqfva)S)dVcgea`lQ~SQ$KXPR+(3Tn2I2R<0 z9tK`L*pa^+*n%>tZPiqt{_`%v?Bb7CR-!GhMON_Fbs0$#|H}G?rW|{q5fQhvw!FxI zs-5ZK>hAbnCS#ZQVi5K0X3PjL1JRdQO+&)*!oRCqB{wen60P6!7bGiWn@vD|+E@Xq zb!!_WiU^I|@1M}Hz6fN-m04x=>Exm{b@>UCW|c8vC`aNbtA@KCHujh^2RWZC}iYhL^<*Z93chIBJYU&w>$CGZDRcHuIgF&oyesDZ#&mA;?wxx4Cm#c0V$xYG?9OL(Smh}#fFuX(K;otJmvRP{h ze^f-qv;)HKC7geB92_@3a9@MGijS(hNNVd%-rZ;%@F_f7?Fjinbe1( zn#jQ*jKZTqE+AUTEd3y6t>*=;AO##cmdwU4gc2&rT8l`rtKW2JF<`_M#p>cj+)yCG zgKF)y8jrfxTjGO&ccm8RU>qn|HxQ7Z#sUo$q)P5H%8iBF$({0Ya51-rA@!It#NHN8MxqK zrYyl_&=}WVfQ?+ykV4*@F6)=u_~3BebR2G2>>mKaEBPmSW3(qYGGXj??m3L zHec{@jWCsSD8`xUy0pqT?Sw0oD?AUK*WxZn#D>-$`eI+IT)6ki>ic}W)t$V32^ITD zR497@LO}S|re%A+#vdv-?fXsQGVnP?QB_d0cGE+U84Q=aM=XrOwGFN3`Lpl@P0fL$ zKN1PqOwojH*($uaQFh8_)H#>Acl&UBSZ>!2W1Dinei`R4dJGX$;~60X=|SG6#jci} z&t4*dVDR*;+6Y(G{KGj1B2!qjvDYOyPC}%hnPbJ@g(4yBJrViG1#$$X75y+Ul1{%x zBAuD}Q@w?MFNqF-m39FGpq7RGI?%Bvyyig&oGv)lR>d<`Bqh=p>urib5DE;u$c|$J zwim~nPb19t?LJZsm{<(Iyyt@~H!a4yywmHKW&=1r5+oj*Fx6c89heW@(2R`i!Uiy* zp)=`Vr8sR!)KChE-6SEIyi(dvG3<1KoVt>kGV=zZiG7LGonH1+~yOK-`g0)r#+O|Q>)a`I2FVW%wr3lhO(P{ksNQuR!G_d zeTx(M!%brW_vS9?IF>bzZ2A3mWX-MEaOk^V|4d38{1D|KOlZSjBKrj7Fgf^>JyL0k zLoI$adZJ0T+8i_Idsuj}C;6jgx9LY#Ukh;!8eJ^B1N}q=Gn4onF*a2vY7~`x$r@rJ z`*hi&Z2lazgu{&nz>gjd>#eq*IFlXed(%$s5!HRXKNm zDZld+DwDI`O6hyn2uJ)F^{^;ESf9sjJ)wMSKD~R=DqPBHyP!?cGAvL<1|7K-(=?VO zGcKcF1spUa+ki<`6K#@QxOTsd847N8WSWztG~?~ z!gUJn>z0O=_)VCE|56hkT~n5xXTp}Ucx$Ii%bQ{5;-a4~I2e|{l9ur#*ghd*hSqO= z)GD@ev^w&5%k}YYB~!A%3*XbPPU-N6&3Lp1LxyP@|C<{qcn&?l54+zyMk&I3YDT|E z{lXH-e?C{huu<@~li+73lMOk&k)3s7Asn$t6!PtXJV!RkA`qdo4|OC_a?vR!kE_}k zK5R9KB%V@R7gt@9=TGL{=#r2gl!@3G;k-6sXp&E4u20DgvbY$iE**Xqj3TyxK>3AU z!b9}NXuINqt>Htt6fXIy5mj7oZ{A&$XJ&thR5ySE{mkxq_YooME#VCHm2+3D!f`{) zvR^WSjy_h4v^|!RJV-RaIT2Ctv=)UMMn@fAgjQV$2G+4?&dGA8vK35c-8r)z9Qqa=%k(FU)?iec14<^olkOU3p zF-6`zHiDKPafKK^USUU+D01>C&Wh{{q?>5m zGQp|z*+#>IIo=|ae8CtrN@@t~uLFOeT{}vX(IY*;>wAU=u1Qo4c+a&R);$^VCr>;! zv4L{`lHgc9$BeM)pQ#XA_(Q#=_iSZL4>L~8Hx}NmOC$&*Q*bq|9Aq}rWgFnMDl~d*;7c44GipcpH9PWaBy-G$*MI^F0 z?Tdxir1D<2ui+Q#^c4?uKvq=p>)lq56=Eb|N^qz~w7rsZu)@E4$;~snz+wIxi+980O6M#RmtgLYh@|2}9BiHSpTs zacjGKvwkUwR3lwTSsCHlwb&*(onU;)$yvdhikonn|B44JMgs*&Lo!jn`6AE>XvBiO z*LKNX3FVz9yLcsnmL!cRVO_qv=yIM#X|u&}#f%_?Tj0>8)8P_0r0!AjWNw;S44tst zv+NXY1{zRLf9OYMr6H-z?4CF$Y%MdbpFIN@a-LEnmkcOF>h16cH_;A|e)pJTuCJ4O zY7!4FxT4>4aFT8a92}84>q0&?46h>&0Vv0p>u~k&qd5$C1A6Q$I4V(5X~6{15;PD@ ze6!s9xh#^QI`J+%8*=^(-!P!@9%~buBmN2VSAp@TOo6}C?az+ALP8~&a0FWZk*F5N z^8P8IREnN`N0i@>O0?{i-FoFShYbUB`D7O4HB`Im2{yzXmyrg$k>cY6A@>bf7i3n0 z5y&cf2#`zctT>dz+hNF&+d3g;2)U!#vsb-%LC+pqKRTiiSn#FH#e!bVwR1nAf*TG^ z!RKcCy$P>?Sfq6n<%M{T0I8?p@HlgwC!HoWO>~mT+X<{Ylm+$Vtj9};H3$EB}P2wR$3y!TO#$iY8eO-!}+F&jMu4%E6S>m zB(N4w9O@2=<`WNJay5PwP8javDp~o~xkSbd4t4t8)9jqu@bHmJHq=MV~Pt|(TghCA}fhMS?s-{klV>~=VrT$nsp7mf{?cze~KKOD4 z_1Y!F)*7^W+BBTt1R2h4f1X4Oy2%?=IMhZU8c{qk3xI1=!na*Sg<=A$?K=Y=GUR9@ zQ(ylIm4Lgm>pt#%p`zHxok%vx_=8Fap1|?OM02|N%X-g5_#S~sT@A!x&8k#wVI2lo z1Uyj{tDQRpb*>c}mjU^gYA9{7mNhFAlM=wZkXcA#MHXWMEs^3>p9X)Oa?dx7b%N*y zLz@K^%1JaArjgri;8ptNHwz1<0y8tcURSbHsm=26^@CYJ3hwMaEvC7 z3Wi-@AaXIQ)%F6#i@%M>?Mw7$6(kW@?et@wbk-APcvMCC{>iew#vkZej8%9h0JSc? zCb~K|!9cBU+))^q*co(E^9jRl7gR4Jihyqa(Z(P&ID#TPyysVNL7(^;?Gan!OU>au zN}miBc&XX-M$mSv%3xs)bh>Jq9#aD_l|zO?I+p4_5qI0Ms*OZyyxA`sXcyiy>-{YN zA70%HmibZYcHW&YOHk6S&PQ+$rJ3(utuUra3V0~@=_~QZy&nc~)AS>v&<6$gErZC3 zcbC=eVkV4Vu0#}E*r=&{X)Kgq|8MGCh(wsH4geLj@#8EGYa})K2;n z{1~=ghoz=9TSCxgzr5x3@sQZZ0FZ+t{?klSI_IZa16pSx6*;=O%n!uXVZ@1IL;JEV zfOS&yyfE9dtS*^jmgt6>jQDOIJM5Gx#Y2eAcC3l^lmoJ{o0T>IHpECTbfYgPI4#LZq0PKqnPCD}_ zyKxz;(`fE0z~nA1s?d{X2!#ZP8wUHzFSOoTWQrk%;wCnBV_3D%3@EC|u$Ao)tO|AO z$4&aa!wbf}rbNcP{6=ajgg(`p5kTeu$ji20`zw)X1SH*x zN?T36{d9TY*S896Ijc^!35LLUByY4QO=ARCQ#MMCjudFc7s!z%P$6DESz%zZ#>H|i zw3Mc@v4~{Eke;FWs`5i@ifeYPh-Sb#vCa#qJPL|&quSKF%sp8*n#t?vIE7kFWjNFh zJC@u^bRQ^?ra|%39Ux^Dn4I}QICyDKF0mpe+Bk}!lFlqS^WpYm&xwIYxUoS-rJ)N9 z1Tz*6Rl9;x`4lwS1cgW^H_M*)Dt*DX*W?ArBf?-t|1~ge&S}xM0K;U9Ibf{okZHf~ z#4v4qc6s6Zgm8iKch5VMbQc~_V-ZviirnKCi*ouN^c_2lo&-M;YSA>W>>^5tlXObg zacX$k0=9Tf$Eg+#9k6yV(R5-&F{=DHP8!yvSQ`Y~XRnUx@{O$-bGCksk~3&qH^dqX zkf+ZZ?Nv5u>LBM@2?k%k&_aUb5Xjqf#!&7%zN#VZwmv65ezo^Y4S#(ed0yUn4tFOB zh1f1SJ6_s?a{)u6VdwUC!Hv=8`%T9(^c`2hc9nt$(q{Dm2X)dK49ba+KEheQ;7^0) ziFKw$%EHy_B1)M>=yK^=Z$U-LT36yX>EKT zvD8IAom2&2?bTmX@_PBR4W|p?6?LQ+&UMzXxqHC5VHzf@Eb1u)kwyfy+NOM8Wa2y@ zNNDL0PE$F;yFyf^jy&RGwDXQwYw6yz>OMWvJt98X@;yr!*RQDBE- zE*l*u=($Zi1}0-Y4lGaK?J$yQjgb+*ljUvNQ!;QYAoCq@>70=sJ{o{^21^?zT@r~hhf&O;Qiq+ ziGQQLG*D@5;LZ%09mwMiE4Q{IPUx-emo*;a6#DrmWr(zY27d@ezre)Z1BGZdo&pXn z+);gOFelKDmnjq#8dL7CTiVH)dHOqWi~uE|NM^QI3EqxE6+_n>IW67~UB#J==QOGF zp_S)c8TJ}uiaEiaER}MyB(grNn=2m&0yztA=!%3xUREyuG_jmadN*D&1nxvjZ6^+2 zORi7iX1iPi$tKasppaR9$a3IUmrrX)m*)fg1>H+$KpqeB*G>AQV((-G{}h=qItj|d zz~{5@{?&Dab6;0c7!!%Se>w($RmlG7Jlv_zV3Ru8b2rugY0MVPOOYGlokI7%nhIy& z-B&wE=lh2dtD!F?noD{z^O1~Tq4MhxvchzuT_oF3-t4YyA*MJ*n&+1X3~6quEN z@m~aEp=b2~mP+}TUP^FmkRS_PDMA{B zaSy(P=$T~R!yc^Ye0*pl5xcpm_JWI;@-di+nruhqZ4gy7cq-)I&s&Bt3BkgT(Zdjf zTvvv0)8xzntEtp4iXm}~cT+pi5k{w{(Z@l2XU9lHr4Vy~3ycA_T?V(QS{qwt?v|}k z_ST!s;C4!jyV5)^6xC#v!o*uS%a-jQ6< z)>o?z7=+zNNtIz1*F_HJ(w@=`E+T|9TqhC(g7kKDc8z~?RbKQ)LRMn7A1p*PcX2YR zUAr{);~c7I#3Ssv<0i-Woj0&Z4a!u|@Xt2J1>N-|ED<3$o2V?OwL4oQ%$@!zLamVz zB)K&Ik^~GOmDAa143{I4?XUk1<3-k{<%?&OID&>Ud%z*Rkt*)mko0RwC2=qFf-^OV z=d@47?tY=A;=2VAh0mF(3x;!#X!%{|vn;U2XW{(nu5b&8kOr)Kop3-5_xnK5oO_3y z!EaIb{r%D{7zwtGgFVri4_!yUIGwR(xEV3YWSI_+E}Gdl>TINWsIrfj+7DE?xp+5^ zlr3pM-Cbse*WGKOd3+*Qen^*uHk)+EpH-{u@i%y}Z!YSid<}~kA*IRSk|nf+I1N=2 zIKi+&ej%Al-M5`cP^XU>9A(m7G>58>o|}j0ZWbMg&x`*$B9j#Rnyo0#=BMLdo%=ks zLa3(2EinQLXQ(3zDe7Bce%Oszu%?8PO648TNst4SMFvj=+{b%)ELyB!0`B?9R6aO{i-63|s@|raSQGL~s)9R#J#duFaTSZ2M{X z1?YuM*a!!|jP^QJ(hAisJuPOM`8Y-Hzl~%d@latwj}t&0{DNNC+zJARnuQfiN`HQ# z?boY_2?*q;Qk)LUB)s8(Lz5elaW56p&fDH*AWAq7Zrbeq1!?FBGYHCnFgRu5y1jwD zc|yBz+UW|X`zDsc{W~8m$sh@VVnZD$lLnKlq@Hg^;ky!}ZuPdKNi2BI70;hrpvaA4+Q_+K)I@|)q1N-H zrycZU`*YUW``Qi^`bDX-j7j^&bO+-Xg$cz2#i##($uyW{Nl&{DK{=lLWV3|=<&si||2)l=8^8_z+Vho-#5LB0EqQ3v5U#*DF7 zxT)1j^`m+lW}p$>WSIG1eZ>L|YR-@Feu!YNWiw*IZYh03mq+2QVtQ}1ezRJM?0PA< z;mK(J5@N8>u@<6Y$QAHWNE};rR|)U_&bv8dsnsza7{=zD1VBcxrALqnOf-qW(zzTn zTAp|pEo#FsQ$~*$j|~Q;$Zy&Liu9OM;VF@#_&*nL!N2hH!Q6l*OeTxq!l>dEc{;Hw zCQni{iN%jHU*C;?M-VUaXxf0FEJ_G=C8)C-wD!DvhY+qQ#FT3}Th8;GgV&AV94F`D ztT6=w_Xm8)*)dBnDkZd~UWL|W=Glu!$hc|1w7_7l!3MAt95oIp4Xp{M%clu&TXehO z+L-1#{mjkpTF@?|w1P98OCky~S%@OR&o75P&ZHvC}Y=(2_{ib(-Al_7aZ^U?s34#H}= zGfFi5%KnFVCKtdO^>Htpb07#BeCXMDO8U}crpe1Gm`>Q=6qB4i=nLoLZ%p$TY=OcP z)r}Et-Ed??u~f09d3Nx3bS@ja!fV(Dfa5lXxRs#;8?Y8G+Qvz+iv7fiRkL3liip}) z&G0u8RdEC9c$$rdU53=MH`p!Jn|DHjhOxHK$tW_pw9wCTf0Eo<){HoN=zG!!Gq4z4 z7PwGh)VNPXW-cE#MtofE`-$9~nmmj}m zlzZscQ2+Jq%gaB9rMgVJkbhup0Ggpb)&L01T=%>n7-?v@I8!Q(p&+!fd+Y^Pu9l+u zek(_$^HYFVRRIFt@0Fp52g5Q#I`tC3li`;UtDLP*rA{-#Yoa5qp{cD)QYhldihWe+ zG~zuaqLY~$-1sjh2lkbXCX;lq+p~!2Z=76cvuQe*Fl>IFwpUBP+d^&E4BGc{m#l%Kuo6#{XGoRyFc%Hqhf|%nYd<;yiC>tyEyk z4I+a`(%%Ie=-*n z-{mg=j&t12)LH3R?@-B1tEb7FLMePI1HK0`Ae@#)KcS%!Qt9p4_fmBl5zhO10n401 zBSfnfJ;?_r{%R)hh}BBNSl=$BiAKbuWrNGQUZ)+0=Mt&5!X*D@yGCSaMNY&@`;^a4 z;v=%D_!K!WXV1!3%4P-M*s%V2b#2jF2bk!)#2GLVuGKd#vNpRMyg`kstw0GQ8@^k^ zuqK5uR<>FeRZ#3{%!|4X!hh7hgirQ@Mwg%%ez8pF!N$xhMNQN((yS(F2-OfduxxKE zxY#7O(VGfNuLv-ImAw5+h@gwn%!ER;*Q+001;W7W^waWT%@(T+5k!c3A-j)a8y11t zx4~rSN0s$M8HEOzkcWW4YbKK9GQez2XJ|Nq?TFy;jmGbg;`m&%U4hIiarKmdTHt#l zL=H;ZHE?fYxKQQXKnC+K!TAU}r086{4m}r()-QaFmU(qWhJlc$eas&y?=H9EYQy8N$8^bni9TpDp zkA^WRs?KgYgjxX4T6?`SMs$`s3vlut(YU~f2F+id(Rf_)$BIMibk9lACI~LA+i7xn z%-+=DHV*0TCTJp~-|$VZ@g2vmd*|2QXV;HeTzt530KyK>v&253N1l}bP_J#UjLy4) zBJili9#-ey8Kj(dxmW^ctorxd;te|xo)%46l%5qE-YhAjP`Cc03vT)vV&GAV%#Cgb zX~2}uWNvh`2<*AuxuJpq>SyNtZwzuU)r@@dqC@v=Ocd(HnnzytN+M&|Qi#f4Q8D=h ziE<3ziFW%+!yy(q{il8H44g^5{_+pH60Mx5Z*FgC_3hKxmeJ+wVuX?T#ZfOOD3E4C zRJsj#wA@3uvwZwHKKGN{{Ag+8^cs?S4N@6(Wkd$CkoCst(Z&hp+l=ffZ?2m%%ffI3 zdV7coR`R+*dPbNx=*ivWeNJK=Iy_vKd`-_Hng{l?hmp=|T3U&epbmgXXWs9ySE|=G zeQ|^ioL}tveN{s72_&h+F+W;G}?;?_s@h5>DX(rp#eaZ!E=NivgLI zWykLKev+}sHH41NCRm7W>K+_qdoJ8x9o5Cf!)|qLtF7Izxk*p|fX8UqEY)_sI_45O zL2u>x=r5xLE%s|d%MO>zU%KV6QKFiEeo12g#bhei4!Hm+`~Fo~4h|BJ)%ENxy9)Up zOxupSf1QZWun=)gF{L0YWJ<(r0?$bPFANrmphJ>kG`&7E+RgrWQi}ZS#-CQJ*i#8j zM_A0?w@4Mq@xvk^>QSvEU|VYQoVI=TaOrsLTa`RZfe8{9F~mM{L+C`9YP9?OknLw| zmkvz>cS6`pF0FYeLdY%>u&XpPj5$*iYkj=m7wMzHqzZ5SG~$i_^f@QEPEC+<2nf-{ zE7W+n%)q$!5@2pBuXMxhUSi*%F>e_g!$T-_`ovjBh(3jK9Q^~OR{)}!0}vdTE^M+m z9QWsA?xG>EW;U~5gEuKR)Ubfi&YWnXV;3H6Zt^NE725*`;lpSK4HS1sN?{~9a4JkD z%}23oAovytUKfRN87XTH2c=kq1)O5(fH_M3M-o{{@&~KD`~TRot-gqg7Q2U2o-iiF}K>m?CokhmODaLB z1p6(6JYGntNOg(s!(>ZU&lzDf+Ur)^Lirm%*}Z>T)9)fAZ9>k(kvnM;ab$ptA=hoh zVgsVaveXbMpm{|4*d<0>?l_JUFOO8A3xNLQOh%nVXjYI6X8h?a@6kDe5-m&;M0xqx z+1U$s>(P9P)f0!{z%M@E7|9nn#IWgEx6A6JNJ(7dk`%6$3@!C!l;JK-p2?gg+W|d- ziEzgk$w7k48NMqg$CM*4O~Abj3+_yUKTyK1p6GDsGEs;}=E_q>^LI-~pym$qhXPJf z2`!PJDp4l(TTm#|n@bN!j;-FFOM__eLl!6{*}z=)UAcGYloj?bv!-XY1TA6Xz;82J zLRaF{8ayzGa|}c--}|^xh)xgX>6R(sZD|Z|qX50gu=d`gEwHqC@WYU7{%<5VOnf9+ zB@FX?|UL%`8EIAe!*UdYl|6wRz6Y>(#8x92$#y}wMeE|ZM2X*c}dKJ^4NIf;Fm zNwzq%QcO?$NR-7`su!*$dlIKo2y(N;qgH@1|8QNo$0wbyyJ2^}$iZ>M{BhBjTdMjK z>gPEzgX4;g3$rU?jvDeOq`X=>)zdt|jk1Lv3u~bjHI=EGLfIR&+K3ldcc4D&Um&04 z3^F*}WaxR(ZyaB>DlmF_UP@+Q*h$&nsOB#gwLt{1#F4i-{A5J@`>B9@{^i?g_Ce&O z<<}_We-RUFU&&MHa1#t56u_oM(Ljn7djja!T|gcxSoR=)@?owC*NkDarpBj=W4}=i1@)@L|C) zQKA+o<(pMVp*Su(`zBC0l1yTa$MRfQ#uby|$mlOMs=G`4J|?apMzKei%jZql#gP@IkOaOjB7MJM=@1j(&!jNnyVkn5;4lvro1!vq ztXiV8HYj5%)r1PPpIOj)f!>pc^3#LvfZ(hz}C@-3R(Cx7R427*Fwd!XO z4~j&IkPHcBm0h_|iG;ZNrYdJ4HI!$rSyo&sibmwIgm1|J#g6%>=ML1r!kcEhm(XY& zD@mIJt;!O%WP7CE&wwE3?1-dt;RTHdm~LvP7K`ccWXkZ0kfFa2S;wGtx_a}S2lslw z$<4^Jg-n#Ypc(3t2N67Juasu=h)j&UNTPNDil4MQMTlnI81kY46uMH5B^U{~nmc6+ z9>(lGhhvRK9ITfpAD!XQ&BPphL3p8B4PVBN0NF6U49;ZA0Tr75AgGw7(S=Yio+xg_ zepZ*?V#KD;sHH+15ix&yCs0eSB-Z%D%uujlXvT#V$Rz@$+w!u#3GIo*AwMI#Bm^oO zLr1e}k5W~G0xaO!C%Mb{sarxWZ4%Dn9vG`KHmPC9GWZwOOm11XJp#o0-P-${3m4g( z6~)X9FXw%Xm~&99tj>a-ri})ZcnsfJtc10F@t9xF5vq6E)X!iUXHq-ohlO`gQdS&k zZl})3k||u)!_=nNlvMbz%AuIr89l#I$;rG}qvDGiK?xTd5HzMQkw*p$YvFLGyQM!J zNC^gD!kP{A84nGosi~@MLKqWQNacfs7O$dkZtm4-BZ~iA8xWZPkTK!HpA5zr!9Z&+icfAJ1)NWkTd!-9`NWU>9uXXUr;`Js#NbKFgrNhTcY4GNv*71}}T zFJh?>=EcbUd2<|fiL+H=wMw8hbX6?+_cl4XnCB#ddwdG>bki* zt*&6Dy&EIPluL@A3_;R%)shA-tDQA1!Tw4ffBRyy;2n)vm_JV06(4Or&QAOKNZB5f(MVC}&_!B>098R{Simr!UG}?CW1Ah+X+0#~0`X)od zLYablwmFxN21L))!_zc`IfzWi`5>MxPe(DmjjO1}HHt7TJtAW+VXHt!aKZk>y6PoMsbDXRJnov;D~Ur~2R_7(Xr)aa%wJwZhS3gr7IGgt%@;`jpL@gyc6bGCVx!9CE7NgIbUNZ!Ur1RHror0~ zr(j$^yM4j`#c2KxSP61;(Tk^pe7b~}LWj~SZC=MEpdKf;B@on9=?_n|R|0q;Y*1_@ z>nGq>)&q!;u-8H)WCwtL&7F4vbnnfSAlK1mwnRq2&gZrEr!b1MA z(3%vAbh3aU-IX`d7b@q`-WiT6eitu}ZH9x#d&qx}?CtDuAXak%5<-P!{a`V=$|XmJ zUn@4lX6#ulB@a=&-9HG)a>KkH=jE7>&S&N~0X0zD=Q=t|7w;kuh#cU=NN7gBGbQTT z;?bdSt8V&IIi}sDTzA0dkU}Z-Qvg;RDe8v>468p3*&hbGT1I3hi9hh~Z(!H}{+>eUyF)H&gdrX=k$aB%J6I;6+^^kn1mL+E+?A!A}@xV(Qa@M%HD5C@+-4Mb4lI=Xp=@9+^x+jhtOc zYgF2aVa(uSR*n(O)e6tf3JEg2xs#dJfhEmi1iOmDYWk|wXNHU?g23^IGKB&yHnsm7 zm_+;p?YpA#N*7vXCkeN2LTNG`{QDa#U3fcFz7SB)83=<8rF)|udrEbrZL$o6W?oDR zQx!178Ih9B#D9Ko$H(jD{4MME&<|6%MPu|TfOc#E0B}!j^MMpV69D#h2`vsEQ{(?c zJ3Lh!3&=yS5fWL~;1wCZ?)%nmK`Eqgcu)O6rD^3%ijcxL50^z?OI(LaVDvfL0#zjZ z2?cPvC$QCzpxpt5jMFp05OxhK0F!Q`rPhDi5)y=-0C} zIM~ku&S@pl1&0=jl+rlS<4`riV~LC-#pqNde@44MB(j%)On$0Ko(@q?4`1?4149Z_ zZi!5aU@2vM$dHR6WSZpj+VboK+>u-CbNi7*lw4K^ZxxM#24_Yc`jvb9NPVi75L+MlM^U~`;a7`4H0L|TYK>%hfEfXLsu1JGM zbh|8{wuc7ucV+`Ys1kqxsj`dajwyM;^X^`)#<+a~$WFy8b2t_RS{8yNYKKlnv+>vB zX(QTf$kqrJ;%I@EwEs{cIcH@Z3|#^S@M+5jsP<^`@8^I4_8MlBb`~cE^n+{{;qW2q z=p1=&+fUo%T{GhVX@;56kH8K_%?X=;$OTYqW1L*)hzelm^$*?_K;9JyIWhsn4SK(| zSmXLTUE8VQX{se#8#Rj*lz`xHtT<61V~fb;WZUpu(M)f#;I+2_zR+)y5Jv?l`CxAinx|EY!`IJ*x9_gf_k&Gx2alL!hK zUWj1T_pk|?iv}4EP#PZvYD_-LpzU!NfcLL%fK&r$W8O1KH9c2&GV~N#T$kaXGvAOl)|T zuF9%6(i=Y3q?X%VK-D2YIYFPH3f|g$TrXW->&^Ab`WT z7>Oo!u1u40?jAJ8Hy`bv}qbgs8)cF0&qeVjD?e+3Ggn1Im>K77ZSpbU*08 zfZkIFcv?y)!*B{|>nx@cE{KoutP+seQU?bCGE`tS0GKUO3PN~t=2u7q_6$l;uw^4c zVu^f{uaqsZ{*a-N?2B8ngrLS8E&s6}Xtv9rR9C^b`@q8*iH)pFzf1|kCfiLw6u{Z%aC z!X^5CzF6qofFJgklJV3oc|Qc2XdFl+y5M9*P8}A>Kh{ zWRgRwMSZ(?Jw;m%0etU5BsWT-Dj-5F;Q$OQJrQd+lv`i6>MhVo^p*^w6{~=fhe|bN z*37oV0kji)4an^%3ABbg5RC;CS50@PV5_hKfXjYx+(DqQdKC^JIEMo6X66$qDdLRc z!YJPSKnbY`#Ht6`g@xGzJmKzzn|abYbP+_Q(v?~~ z96%cd{E0BCsH^0HaWt{y(Cuto4VE7jhB1Z??#UaU(*R&Eo+J`UN+8mcb51F|I|n*J zJCZ3R*OdyeS9hWkc_mA7-br>3Tw=CX2bl(=TpVt#WP8Bg^vE_9bP&6ccAf3lFMgr` z{3=h@?Ftb$RTe&@IQtiJfV;O&4fzh)e1>7seG; z=%mA4@c7{aXeJnhEg2J@Bm;=)j=O=cl#^NNkQ<{r;Bm|8Hg}bJ-S^g4`|itx)~!LN zXtL}?f1Hs6UQ+f0-X6&TBCW=A4>bU0{rv8C4T!(wD-h>VCK4YJk`6C9$by!fxOYw- zV#n+0{E(0ttq_#16B} ze8$E#X9o{B!0vbq#WUwmv5Xz6{(!^~+}sBW{xctdNHL4^vDk!0E}(g|W_q;jR|ZK< z8w>H-8G{%R#%f!E7cO_^B?yFRKLOH)RT9GJsb+kAKq~}WIF)NRLwKZ^Q;>!2MNa|} z-mh?=B;*&D{Nd-mQRcfVnHkChI=DRHU4ga%xJ%+QkBd|-d9uRI76@BT(bjsjwS+r) zvx=lGNLv1?SzZ;P)Gnn>04fO7Culg*?LmbEF0fATG8S@)oJ>NT3pYAXa*vX!eUTDF ziBrp(QyDqr0ZMTr?4uG_Nqs6f%S0g?h`1vO5fo=5S&u#wI2d4+3hWiolEU!=3_oFo zfie?+4W#`;1dd#X@g9Yj<53S<6OB!TM8w8})7k-$&q5(smc%;r z(BlXkTp`C47+%4JA{2X}MIaPbVF!35P#p;u7+fR*46{T+LR8+j25oduCfDzDv6R-hU{TVVo9fz?^N3ShMt!t0NsH)pB zRK8-S{Dn*y3b|k^*?_B70<2gHt==l7c&cT>r`C#{S}J2;s#d{M)ncW(#Y$C*lByLQ z&?+{dR7*gpdT~(1;M(FfF==3z`^eW)=5a9RqvF-)2?S-(G zhS;p(u~_qBum*q}On@$#08}ynd0+spzyVco0%G6;<-i5&016cV5UKzhQ~)fX03|>L z8ej+HzzgVr6_5ZUpa4HW0Ca!=r1%*}Oo;2no&Zz8DfR)L!@r<5 z2viSZpmvo5XqXyAz{Ms7`7kX>fnr1gi4X~7KpznRT0{Xc5Cfz@43PjBMBoH@z_{~( z(Wd}IPJ9hH+%)Fc)0!hrV+(A;76rhtI|YHbEDeERV~Ya>SQg^IvlazFkSK(KG9&{q zkPIR~EeQaaBmwA<20}mBO?)N$(z1@p)5?%}rM| zGF()~Z&Kx@OIDRI$d0T8;JX@vj3^2%pd_+@l9~a4lntZ;AvUIjqIZbuNTR6@hNJoV zk4F;ut)LN4ARuyn2M6F~eg-e#UH%2P;8uPGFW^vq1vj8mdIayFOZo(tphk8C7hpT~ z1Fv8?b_LNR3QD9J+!v=p%}# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/fonts/glyphicons-halflings-regular.ttf b/assets/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b GIT binary patch literal 45404 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 G`u_lkUM?>H literal 0 HcmV?d00001 diff --git a/assets/fonts/glyphicons-halflings-regular.woff2 b/assets/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0 GIT binary patch literal 18028 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 literal 0 HcmV?d00001 diff --git a/assets/images/blank.png b/assets/images/blank.png new file mode 100644 index 0000000000000000000000000000000000000000..9a847fbeddbe0eeb7092ee0a8b4ae8318c94a15e GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}blwj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&pIskyVI=$@SgtX+R;_%#er@=ltB<)VvZPmw~~#C^fMp zHASI3vm`^o-P1Q9MK6^dD9-EY;uyklJvjjgfLvAv#<mdKI;Vst0QpKM AE&u=k literal 0 HcmV?d00001 diff --git a/assets/images/bx_controls.png b/assets/images/bx_controls.png new file mode 100644 index 0000000000000000000000000000000000000000..5c4898bc3fd1ad5ba3ea50de24684db89d75f469 GIT binary patch literal 2931 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 JtaD0e0ssdsYEA$E literal 0 HcmV?d00001 diff --git a/assets/images/drag.png b/assets/images/drag.png new file mode 100644 index 0000000000000000000000000000000000000000..2aed13b2276d7a86051060df596924031547b70f GIT binary patch literal 1063 zcmV+?1laqDP)w~3=N$zfUZ~ypk=au$idV9OKNpU`~ zFS9fA`+ev4+nJpi5C{YUfj}S-2n2!_=<2iqP1WPTHeeVS1$F{k>aTAA-vZM>5%@(` zB>TP;tf~4#z}vt(KAV0Bd@L){@ArjZP1QF5?*m5zc6AJRPgbObH7i(C^}WDM$YWTL z6=^oC&SD{oo#=pAfSG#VYe%rA>TduiIyl#ysM}cml-5*T0nSIXs*KBuq^_D^P1WM5vaK*3K`MEiM`}GOXU5z@z@A|21+cp=A#fDgbFHe8YU$<^`+;(8WnyU8z2mG`#Div(UCg0zW>pEon zvSjl)78d?)$AtrRAAA#UbD)O&Hb`eO439mB>o}bK>I?RcjIwUs`XHa;LNGdFikTwAHozo zu%cMkWo~wc8`rN>wJaRRp=w#Rr&`7JTx{FEU1nKWmWAhfoSOU;(=-D65bCm|sk*b$ zV14(E#+9FbtQm;K=jcQ-^=%4O7ZUjy*e(5_Z} zh%BX7{NboY=yhVT80&j_*tjW6UoKByE>AX_BOZ^FPG`vF`y1t(vRMFj%g^$}z+hk> z!jAAXFtSpGWHQAIFYc#YDmP76p651ATk-C03j4-*Z0qBGe26T_i}M@fvL&k zjoJENM#i3J>$dHF&7YJN>9wdg4RbPU>HBD-%7{|3B-U z-(vsu%cuWuR{bxm|NrS&bACXemD>M@Rmb+Oi*Z%||8DdD4}1T=nEwCwn}Trdo0m_9 z*{KCvtMydHuIzQ*Gtaxy#iqr>X<2Y^L4fZ3XpiG@$#HJ#H+P0VIuzZUY1|WTdn_gH zYkpO8sKvBM=OkOh^JyuYr@2Qvt51LKI1T7SzLFrnV21Yw_XQf}7bparcj(_=R>W1# zz`zvh>Eakt!Fcz2Yt>r?9)<_e_On9z=kMIT`*-bs@l~6gc7;B>ZJ#dh7^U#%_s$gO zeCI`LrHi)SDvf1wy7W3Vd-W_P{UDRAKDEA0;hs^6UzaiMoRU`eK008!SQn6)x5q+e`0^6AjB%vrO!Pailfw*AC!=1$AW zGn*a!HvVwi_&xuw&st_6TWQaKf!hX^(i5WB6dG$d>c~9LVHdRC{IElDdqj}2>sVOR{p&^Dmm^m&iyt^T<23t%qnz8^U*_{JP-j%BxGmt| z6(;C#)idRhX(~hTFGC|YE7q&=OG<=p9hg!#b!M3e!wjzO&V`IxI_XjicG*iE(0+N9 zAwr1r!ZW6lJ5I7LpOjw4G~{l+U?%RM-ksU7F7m`tMgz9UbH+Q;#cmyzOi0o1>t z$tkiktSqZK6sNds>g1HzIK@X_&%XV$`S$E=mp!|lOkQ)x<0`2txkb-;=ewQzJvlY%|KFGYe(TG;-~VaP|4U#0W#9j; hKkxniU;h~F9w_ZzbiDlhd0^6G@O1TaS?83{1OSmwy@mh) literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f601.png b/assets/images/emoji/png/1f601.png new file mode 100644 index 0000000000000000000000000000000000000000..1449a4d40eaed9744d5ac2314a131ba2027e16c6 GIT binary patch literal 835 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!Rs{HjxB}__chiYMX@2TJWp7T$ z7ldoiSg@=))A;7j@c;k+A6xD}zs0^XLBFTSeAA9So2R)yx_5ogJnyAzHf~zK;{1l- zGZ!v5=Lf9pb)G+W`lCb9$M&v!`uyeBE6LNUtqUSeS8v*W{=}Y@v)hgy+%a$2n*B$P z_w=;&RK;#yK6(Cxibad&-@JVC&C4fhy!l-~xAK()`2{n)HxQVAzd>QYL&5p}fb6MU zVGImRHl8kyAr*{g&TM6LF=RL#&~ACJ{#Nob`SR~ooc~XU&99tTyLAFj{*OaH8eR3+ z>O>YDZp!#Ewev<0Q#}{!{vGFh?>=08Wyb>5nnd2|653x5JzP4S|71XdP}~kT&*F+} zny)H?G_)&3G`K4SJnzoCy6H}tOk3lJ)>MhxiO-%Gl|B4>KWFizty+h_C;Ry)D4k!a zy1BNnwzB8oQ&as1TZB@W<}JUAHUKr@5?47I~#BJO@F5(u%_+iykBY8 z{l6aXKAOGuiGF{Up;>#rQq!FEfl0=vTsh*W=wAJj#lCl=cW}HON2+#5)z-;&NrvZm z{2u7AU0*I$WA|HV%XY!Nw;kHqq74?_%M*}zbAUygE&fN`fxp4e?)*^p^o=@iqPVwk z)AH(D+>iRdG`??rw*Gy-*@wSt9#%hWzTu-e;pc7MKRg~s(>C3{c~rlCdgFiYbvMp! zTgcGAn^%tUUO)wh)Q`D67W_-}Su+hUi(g`I-?EuaJ|&p-RMnA6Rb8P=Da%-2u6B-! zYM#GoE%V`bsyq!Dugf+Zskoo}q3;HtnBgs^gd3>_42`n6n^>mHY?I0Yjg>nzSI=vA?UYiRmzTdTwP#?cTekP{*7!#(z!b*d>FVdQ I&MBb@0G|n-FaQ7m literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f602.png b/assets/images/emoji/png/1f602.png new file mode 100644 index 0000000000000000000000000000000000000000..6fcbc87093101b5822e5e345d6ba980e608a620b GIT binary patch literal 1181 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+yeRz?dE26XFWw{=b`!AEj=54@7V^ z5H65>ccTm_2;r7(djMhd>^Tb*O!HF*ayL(NKepW8$5id>mE@Z{!+VO%r&U|eZ?Qjr ze$wWI;QTGm_ssJKsy}*m*7*&=1>xHB5AAt#qvGqWf}X0_M~9-DGmRsi)cwrW-kgqK z7989hYEhY>pVrX5ve&uN#U{Z+J;g`e-$L#G|Nm_zu@&3zMLVlE?Y!1q8T-Gm{(M@> zm)y$svew`WXq$gjd5=3Nw$WmJxh9yexADj zX#VW2X;BV)?*2$CE=rxWF~n9azou;dw!>j|YMYL)UUB(bb5m)ItNNZ(i<@gQQ&&Ge znUI{n@L-~+`ti8rf&kt5D_5n?JM|{F>2E zR}+~Hcvvn>zRAZ|@O!;v-i5E5AA39rDrDiVqIc*yo?<527 zSE?~76W8f%N)0tQVKk9%{wy)w^ZvNx1UNj=eJ?*T+oAQS(Q*CZ zEn8aKrm=Uo=A0;2zU3{`&>gLFx4ljIz2#v+?o}3nm47D7A23sp3plebC8$I7+C`>E z8ELA4DH{(ftO|ECJTQfE-$(JIe2mb(x~`NlKE>dN${R17ZxVw!PnAaDGCHR!{I%deF zs()K^yRBW|W%#y)i+k1Ke;)sa^Z=XTetjT-p+shYS!!ct6vR&hTYeyQ2&2(^_HWWQzJZ1H>dyn z`Xwdf*WFLmAC^Qesd!@U8@7~-;qF=g$%mdl6K8l~c-1#-&DqOU2fn_oHnKFG>Z4cQ ztbN{kdu5kf@aD!1TkG>ec_-hV#+ndmR=eu*uU_-p()r)bZ3+U~zvbsVx%uP5){h(W iA2%=0`f_(`9iy61@y1DUM|^<^pTX1B&t;ucLK6T{pFk7< literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f603.png b/assets/images/emoji/png/1f603.png new file mode 100644 index 0000000000000000000000000000000000000000..5e69b434f1e711bd430238824c45c45e166787b5 GIT binary patch literal 593 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!G6Q@*+uL|68bqr}b~I-r&3BF~@xK{raBMO@FvdF72FOI+Jsc!lp}Ct@ML5JiG54 z-6wECiEDM`+(RBwv;FTM_R9a!x2=geboJRe4Z=#Do1e?=sO@MEJHUK#(~s~Ei>l7L z^85dq{;Scv$aU!lwW+V<8Aa~91Sl{}JTA+iaYb+jo061TP21nIivzs$`@YO8WLi^S zKQB;nU*dv(o`$dQb3O}dwtSI1@N4^zE3O=+4gI!PTdiMIaJ(^m;FuvWi`7J4MnWj> z?`-Q0pYI>cf8HQ26#1}qN~`sW3S+^y@7ca>YVO*_`@271;H#F# z2i_w`^clSx!yOj0=B_*>^L~!GklqtkK8>Os3g+p1E`MDyfyJu5FDj8g)Y*NVr@%dy zrbpR3l&jfPANu*S6^gQ?_wRhjY8|6)VbC~t(r>t!};;8NMVg^G|Y40Uh&I#pB zG7EIRT-`c}A!NZ3oyJMMZjV&BjZO;-?V5N>=MdBVw2NF9n&TCJ2!H6_QpL63L-AX~ z@(B&=ijugt{g=t{b-cvI6ujYg;Ra(?MpKbRZOz^V3(_2TQv+Jqrs*9Nl3L8NXQfud z;@AR~fVAMJxqDllZlAieu<6Icgp~(8kFs$~=UQ5vxS8=-^M%kFkF&xLLIW;It?%KA z5a&rfxiBQ>;D$98v#vI#Nln~2eNC5YU|7z{P3tO6mT^j*$~jxCH)~bIR*_TXp-(^V zJH74wuJ^wme5mtgolz{qFtboFyt=akR{0Gjqe AumAu6 literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f605.png b/assets/images/emoji/png/1f605.png new file mode 100644 index 0000000000000000000000000000000000000000..8472063f77667e2df51fd06eec144479535d27a6 GIT binary patch literal 870 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!&IkB}xB}__chiYMsT<#8MT-yb z{CcYZSqf;{*DJ}74n-G)Yp40C1Er2F_peOQpH^+%oN2tW*Li-6{rL^So2R+=6q(=L z8D5#<^yYN@rsJ!p?mxP6cH7ajv*u5z=-G4j=H-)n=6Rn#v8SiPB`wjnrz&>y^2w>I zALnm*{^mx-o~02$d-t4LT(SM$%}bs05AFH?|Npu2A5Vc^k|_!D3ubt4Fkj$)!~TMR z^A7zA@Ao?>2n3v;|Ni~`{ssf*CZl-_3`|;{E{-7;jBl^EPn&Hez?Q&yC%WptpwQXU z-+7a&FQ5KxAKbA)(m?joowyKcXn_S>@4RdZIISUc_O`#9~Xmk-TZ?8!V+tV;OGSI4980uJz$)`mRMyld|; zSv2MP1^3)=EyaERFX}Ehew*#iLN=??3+~M6T{<(&*lz0ON`8`&DYTK?H2pTWtDM2v zBaKf_GRG@8{`mCZsJ7_B>Y2yC?o-+3apm@;Jw3v5MrRK+uG?-t+xN>^&ToDtd*%Nf zyvDhHY8jU^d(WfPHrLlHP8G#y+P1!WDS<=S3G&DX13uK#upFHbN&!Fa5=Or=$o6-L0V_Q9c||LL}botq})rb?f9*R+BAwd*~;6n37# z3(eXS3{qR%WU3CQR*DIw^*rH;T}W{*1 zIU)G`hTvpx_5X$SkxuG?R%$V>>OEDlJ>j-DFP}{GR1daRi*r*?vNf!9v1##eS{58! z5TH9h+T(a!@|WDoFgvwrk6|mEDNvvk?#oowM=oD{@v-VNy>&iF8x1kPRsbsoLT+TWx4e?)`d&#JLj??x=~=(9x=XBKHnQ_kBDDykWjJJ z=&}?qWOUV+@DkpIc#`@5)HiFKPdbW`TlIVkO2RKznm@GpLj9enUu|u(6 z*(t>(y6>q*_D}WDP09@`GTKX`qIi=mC;Kd)nIh@(cFUIc_nvK^lKJ`6p-JZ(e!ScE z)xym%JheiDws8%8u`8=byzd zUn*~xV_$Qp{zv2Ehwk&*<#)-|y{Z0j@bg3W`{K{++2Riyn=g&u2TXwsp00i_>zopr E07r|OUH||9 literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f607.png b/assets/images/emoji/png/1f607.png new file mode 100644 index 0000000000000000000000000000000000000000..b2d700479da73ed98d63aaf02d22b00ba924b45e GIT binary patch literal 1114 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 KT-G@yGywqooO((C literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f60b.png b/assets/images/emoji/png/1f60b.png new file mode 100644 index 0000000000000000000000000000000000000000..e99c1e5c7cb9f73b3cea472468c4927fa3741cb3 GIT binary patch literal 925 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!?gjXSxB}__chm8q!g_=(kPSgo z%b^S~H_cDIAY2=$?CX`}=1k*9kvYef`}Y)?S0?DM>~(&0C>p4ETDA4fo#FFa>??ze z_RRA>zae<@H21#+b^q&YUMCj4IUWE1TIR3Z>QCwA|68lS=2tz7$@{;x;Qy?$+5nUP z6?H3P{m!SQ+|0;4mJ-((Z1%sW@@-P_ov6%@sbxR1tG;Db&X4wZ9#`=HQ11VeIscaz zZ%zol6_HVR_~Trl55-G@{DK+Y8wkvAxL**kzu!UOyuyKX67cOU>$M)7D?7Nr8gm2Z^hVBz* zzj@gk;JR(*`aZSz**kk~n0W1-FaBo3nXU6UcMGupI?%GE-){ydqsj8UIvkOgwo3?_ zsQqV8+;4wM@Y(&n4;g-cak6Mo+0)o^HD95E+m`RueC97fHK8l^@-lBUG=6E9yx`8i zJBFXX{nOuaMse!SP|c0nwcn1qCqFj4e`fZMFpdqJ(!P#uSNbOBcJW-w*&xZSzsfzN zOUNp%YE7V0=+}aG!RFcf+;}@X^;ay+Zk?U1#!*vv?y0!@(;pLAlFS|+J~~5i)t^Mh zm(O%kZ6{0<)_kz`)Ye^0H?$tJFh*s#{Lb!PJ7uYFSyx7}$_BP=ss&#Qm~L-(OplC8 zZ)*rX{c)-?qn*du49mt9p6s3dMeL_@n*NvNo|)<0nk#}L z_zh3qep&OHvBtum$*ygKUuUbxs}GI=jeX(s{U^ydd+E%%RmAF%WvO;6MBqpL+5R}a z3+sb#N91+C`tXwJRlx6M<_6D#Cp|uS=F7bgGrF$r?kUSUld1P1!>=*%ugI_8bIOYn zi;QjNL_az*kbP0l+XkKmfq7^ literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f60c.png b/assets/images/emoji/png/1f60c.png new file mode 100644 index 0000000000000000000000000000000000000000..0ff7e2364b770a0f3a8d714fbd0fb018895973ac GIT binary patch literal 768 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!dINkyT!HleyXi!tf^h9LKlRE4 z{rN5SCsw+>IURp&x&O*u=dV|in=_4jip)1pbDvS8adT(*+J4h%)z%YBRbHKndU81I z{D$CziyiOo4Z60?Z_hmM&C@J@Tu**5-fLCaVr8xAjh_Kq+AjM?;}>0TRFMK*p`-lbiWuw91lcbcfyuBpd< zT-al66t%E(&MeloJ#$X6_A08E&2>HDdw!*q9QXVCm;6mPb6&GKF(sxzKHM%o?rrZK0-4X+yc$AO&Q-`9584~JGekr@{nMZ3Dq%%e zp_Yj|JhfNJ`Q34Oc$tNReS4CY-Pr=DynZUwOr33Q`#`U;^}nhk^G?%C z3v*28XP;P`WRinZ{l zEe!nXsoq~>9Z<9uEnc9xazn*kl4*uYA_uqun`ZJsDGj7S3zU99icD(jCcl+O|$NybQ lt$(|Df5ol%+W&im)2FWBVVk)5A~5AJc)I$ztaD0e0strnb0`1+ literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f60d.png b/assets/images/emoji/png/1f60d.png new file mode 100644 index 0000000000000000000000000000000000000000..af21d68e95ff3afc645f40d168012b043695a4b1 GIT binary patch literal 961 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!t_JvoxB}@f>FNLPf)IoOC*k67 zS)d495YG5k4-$l+@9pXTE~o!Jn*L)N)W9@9_5c6>S0?BeglqQ{nOCMbHD?-sy^_3n z`Q-B(f_tiBr&U{@Ke6Z0q3F%i+*i(STiNS8e?rBv<^DH!hR<)Yzj^s2#9?3a(!bTF z|2>}m=Ro?`vh;uF(*Ipc|GhE&*P`?vlhc3BPXFGT{%1$}_n!1$E7N-z-`W8^rce^( z7tHY9V7|cp`wjgH?-lm<7o1OU2nZ+;2-v^AVg3Gqfb;V`n7nHl7?`R(T^vIy7_VOW zn)J&+g!MtUbLzdHGj`wJX*%Qm-}@Pt3?^;y{Z;()pL0<9=Y@%TXy8et?a+n*IFG;?ArY=D!Qj6t0t~a zqLA-^<-|QHQ!cFDc#|O~?DfgLGZ}Iex83^pv7t=tfS9Jh##UX2br%;!ihkg+`R~K3 zXx9?TI60@JpZ|M~N#w?31s(i{wXk0(tz%Watw&7y)j(buc-llN>uWw*K>Zht<^L4pSPDs-t#s5A=4?Z1u z6vTGIJ~)=&;^r2Mi_EX46e_&UopYP%ocT8eOBEA^*qk@Fn99ucwg_?H0j{fsFPP8D6ggEOW&9=fRWUEWa$NE{zyE8>MZShyR<(K708FwBp00i_ I>zopr0BuX(@Bjb+ literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f60e.png b/assets/images/emoji/png/1f60e.png new file mode 100644 index 0000000000000000000000000000000000000000..bd9aa8cd50e821fdebf23dfcaca9181426a493ca GIT binary patch literal 794 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!W(N3#xB}__chiYMYHDgGMp{4; z0)Sdht`DEw4Ms3!$NzVGM$|1b31vWY3oE&Iahy8Z?4vV47~rm@`@*XK&oc%<-Y*UEIp!@N2( z?yi>mrTEYL1^@etzj;*7{139@OH`G)eYyXGs`6>uWx{t3rg*)yZQGqNuQ|>#ph~=5 z)0urnVEaRsxijv3yTTzWdG`yy)#Z091my3{-9Z?fICLLzk zBjUMMK=Z#er@MV?Ny`W*hh*uTif>)dIVQ<=>N zYwpjMzjQ!Y>|j>vMQ(p7mj%Yt96av}Of=z`5co@qA?uWavjT6D$TWs&9IQ#13<;hR zF$@o!UQB10!Z=e%=vUn>g@yeWzIB=@tk-0?@GbRlf_tc^)0K+r1_!K5nSb%UzrYr< zR6jt(`_+0g2R9Q&hb>NQxdN}fB&%*IPFxhRbyG@p&R0u!?tA}sPZhd)Y9e1%z^kW; z+|6$vMs-HDcQ0vV=d}=*)OQH@;PWBPmKiWedytiPZoNy>$2zHe)Mw3ue#_uX2-80-qI?UUjWk)gQu&X%Q~lo FCIBbYaR~qb literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f60f.png b/assets/images/emoji/png/1f60f.png new file mode 100644 index 0000000000000000000000000000000000000000..1014a7d8b3d391be1ddf3f122a62161e256299fd GIT binary patch literal 773 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!dINkyT!HleyXi!tG(Yv8BJ)Rw zqTig3KepU|VyVjJY3>E#+La0VPY#EDy^=h?#s22b@RhyJ&6&pMHw2$p>GtYW)U|DX z^P6;*bsFxO=RK|3`tIJK&C@Jr)M$LX5WlwH^vCt&gNq$^&9Obd!AoD$>Oasyd?i7C z!3^&W=HG7+*x#=ZP;lO1O7_Wp3=B+?o-U3d6>(>;hwomjAi(xOHEY&M^Mv&;pI-U< z-#)+ht>C=Hotwm;?`@sQBXMi~{p>Vp?ki$#w$kEz%_Kz5MC_Nc-R|?}#Fl64k3{qA zo$=MACOc`uPT6&Joy(^&KaR-#&~$dy_tS=ZTF#n0n#z;4$FEKFFh|bPW9Q8!QWw{C zt46&K`~p;3^ha#!?dvzSWfxdX;eG!5etF1~`YE05k56X11h~XKUYupT`(xP6ry*wV z^8-unIDh@QSO3mxyHwGzbT-L`+KWY2cCvpTzCQc;ULV7a7`+FFKYx3%@Ji4Xh3N^? zR=#K7^PWB$fKB*7ZOQ4RKMn;-kC?KULT4R& z@o))KfKbK{drq+#ITzQY?fsgQY!qE>*?%|S4)?AbH+0V~m)+GaXJX3jdD?wN9xX0^UU9G3aAjZ0%ec=a`m=V0$KE}??Okd7_k#<6 qKDk&^^3v}27rA+}{O`xVmgjX|`e>V literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f610.png b/assets/images/emoji/png/1f610.png new file mode 100644 index 0000000000000000000000000000000000000000..590d790bd3c42a9348e298f57f5089b824ae2c1d GIT binary patch literal 494 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!TmyVUT!HleyXi!tG(Yu%aP2pz z;~yQ0?kO^#-(vsuO7hK};W^KJQ-B8Xl?3?(GrTuw5SV|zpnw1Q00oD+ON-4I7#O`g zT^vIy;?7RL-FH}l$L0D%u_DP6YybaWxjJv9$gY*#KbAf(Tp}sx-S>9>`=!OllpprK zesyQD;vR=Iozm>o!p_iLN7i%XD}KFb7ro)e%=+5?{x4_BeVDlgX;fdCvpzVI0dV&N>0DE zbEb(BXYYg`(~tcNnSQ&IHN59dLia(L@Yt7|bYs6SWpDrRL{KjF(q{j%3NHWq>z|5C*3Vg+dFJI=V0bfly85}S Ib4q9e0GrC`?*IS* literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f611.png b/assets/images/emoji/png/1f611.png new file mode 100644 index 0000000000000000000000000000000000000000..e93769e07ae5f59398b2ae1f0b088a5f46f05073 GIT binary patch literal 579 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!Vgr0aT!HleyXi!tn>)jMip)1p zbD!U0|L9P3nxFdDE6J4!`sX(Uuk3Z+Gtc|ja{q#G?Kh|6r&U`wXBt0m;N1zdfUhLT zFPP!IL4&~j`}-Bn7X&!;&y6>I#lXPW?&;zfQo(rV>eHgN1|qBvSgwm6wEXlh|K{zW zZ#)M*|JLnSw$?sYr?39exyQ-A@P_Kj^M;52PMP~;Cu11vy5oKYmS%<1Wlu7_;o9`~ zRk6&e@@s-eEfo81u(dxHd3WRca=~xEZ}$om#vBm0tT5E;v`srz7-(m0zvGNeAfq1l zjTUb1cPfs2+;=wXHthJuc_zpsvGbmW{Ir^HeTNIg7aizw>fmBK$98T@;BOuFt$79) zU+ODfsm3EcGTat241c4Ob{+CrdcWxH zMso(iM|{F_`OjQn5c{{8(J6xarN-?~FO6<`y|B7n^ulrD5&PGk-W!)Z_32((@;p*s zeAV3ZXKjrc#O~}}zc$$T?!D{Z)_=EJzzB?NfouCs7561_^3Pv=e>Zb;=i?Je&n!*m t?&`~ZzK^|Kz2AL$`uz6g%ir&1kea*Tv-J(Xx4_6^@O1TaS?83{1OWc*5i|e* literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f612.png b/assets/images/emoji/png/1f612.png new file mode 100644 index 0000000000000000000000000000000000000000..075e950e3cb4b352cea39ecfe42e90bba3d959cd GIT binary patch literal 765 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!x&nMcT!HleyXi!tH>cwt9g6;X zCHdHL|1>}Kf^h98hr>2cbMGlKzqvDfTDA4cUgwFWD)U?Hn=_4Hor>Bs&-=tmx3&GI zGio%hZSy<7A^78k_{s$R^BcT2PqVzcH)z)!+xbm8KdvVqTLM3i17`OlYcRgCtyH9Ac z*gtI^pXoNsF0P-SZ6dE97}589aoyF`h6kmM;!4-f^Hu+mVKldN<$R$U*JW#;&gPWz zH9NaHe!+`q$)>a}=CJ7P_?9ow=4Uul@DC z^D~^b&cC_$)0D5jcSbCE>KXM{^}rYJe&!iRZ+~TeFm0OsJNC&t9Vf*2e4g}XQ-{gE zI#=I@>Rk>C13v7rxgpPgpk@7hrW-$hui9g&^zpBDgXVR|NwxJ(?iWp&9Mb+Uwaxe> zE3xR+Aui^r=T{iANr^MEFi(7>cPQbftttES7dNMDOy+$ba@y>Mf8v5gCiVG^sTU?K zTzqU}=F!#WiJeVSLGzgW94ZZqPU|qR9$j!|r&nj|uPi|`uB{ByF9n1@xX{$v<+t+T zN{8ZxI=iNer|ed&&`9@w%zs3fslw{)4gt-|9Scp_9Q^-3%WUxQy`8W+gO5SR{jhk~ zVy2`60rhGLod>4{l^2(4o;SP^^RH}L{emr~j-j)oFMJ6IO}f3HC-FF!U6iTqwXF?B zOuUOcFLxg`%;%G^J}g zd9QVN!I0i8#rxLmQOD)ePBNRSBG23PR^FYs_Rj)M`&XyxG~H+XG2z8YxM%3kL^^SmD&ioUxys4_vnXV2NAXJ_p>wfN1AinaZw2Nyd& zJf57f_EB?3^87=4^0z#%*naQkrOxx`C!M*Gy#weOnUWyCV21Yw^Y05Z6zuO;I3M8f z-a%pid4c%>@9!J*zi)8td?v`i!1%(`#WAFU@$B`lNskS9*b`bO8$Q;Lcqh^S@vr== zNxPPBSzY@)^T%KF{7WL6U;Zsp);|{V##PVuRM+zdjK`xDy&YdTpXO)YBw%Gw

Cf zt;{q3>T&y@t3z(zJ9Uk3%T@Is>s1tPo!pd@JzGpi_wb=lm-4PzENPEn5Bv6Qb7yIy z%{k-LV2S#V%BM|Kbu2gNI|Msz;EA?3-sY&&xHdlW^^Upr8xF)T_{k=J?cF9xoBtoT zurwC-M`~#u-u-P18LK z?!GKpcaZ1oGnVP8kA=j}-eL(~T9kTmjc-A;)^-s0X?)wW=^g^y_KoV3)Ze@Gi%%|) zP>wrysPoCEHl@cC9-R!|yoqVy)NcvGA6MGmba7HTdGXksh6oM)19!NWKkW%F=9kcy zcq*e4vDETpvbM(x#hoddr&qDFUbi_KsdUnHx~1Mk6XxTmjSKet+2!x^<3YkB_4C1U nvFks)F}AmffBy3KuYU|5-Q4eXt8e!MrVR#9S3j3^P6d?i7C z!3^&W=HG7+*soA5zgg6*Aj0-QNzXHZ!q# zuLo|IF}ltTlo6VDFXh|Qikir`i4kk|$%b;qi6F+ywQo zD<8eOy8Dg%DlTu2J{^PBEwQ@EUpDPnq3I*-y}=>=t-l(rZ?l9 zBmUNZx#Bh7vamjLJJqvit5aH@3ZHJ|>OU(R+8!-<^qNKLy8L9liLQYmd0Y}*zLC5s zR_pB5*cV&Aa**tNshlgbj{j=mvtJSNN0@T^w)oGW`Di@0<-6mwcRQ;gSQ4 Oat2RVKbLh*2~7aa^-!Py literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f615.png b/assets/images/emoji/png/1f615.png new file mode 100644 index 0000000000000000000000000000000000000000..7dbfab943540d344d3b76a44eecec7d009756edb GIT binary patch literal 880 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!b_Mu^xB}__chgBg|Np1?ssDes z`TygV|Mv_3|NT}FY5M>B&Ht|!e7%yqd7AszFQ5MZeEk2@vF7}MW6S*u!nOZD>wR?Z z`pRDCo0m`a6q)~jSap6w@cb70|8G_`XBz+i{pQWfC;z`(`2S-1{||fTPpCM5V$Y*P z(UmDqD`&S&Yt8PdihXlB{^ri`$^`vs)z*79Ej+e&-R9+!4+ktS2fCiWB*-tA;l08A z`2qzE3j6!dI|QuPd9t^Mfq^N^)5S5QB5v#T=hJR02(Tt3i{8%GE)OVto0_fv^6B4r zZT2Q{U!`QtIe-71H|06x@Otmo+y7%F+ifNG8syEG+`=T|GULkHJ}X8o*20kG`;-f& zyqKdS&r-m}_U_{Rhf9pzYq$4H{kpqYTRosVD%RkkPbXsE15 zzUS`q39*x>hL$L96rOu|cDBqDR>8kjQ%|Rxaz}J>awMj(PPLiF{vlB7d=1A!P62~w zM{FDp+g|j^TA!05kS2amV)CbA&36BCtp{RKZZ6e7*#(zwxMii#w($3Nm8lP}@f>8y zS!!m&SR-ra;JmCp{?@@uOi^Ag-YaWNR_@`n&A72**7-{}R`=b0GSlmaiLzF}rOS*B ze-))RG2C`t^tSGFSomeeHSMQYHQdoV&vcyGEah6XL3ZQ)$$r|-14AGRN<-SF1u;jfrT?@B(sg84b&tA3ANg`vd=&6+f~^Z{a|0hij}*0Yt~!ro38Udd)|B3%imYMuDu>q4$2zxK-f6jg{>Wt>lYbw1WckV;sFw=Z-8s6v z_+qp5*Atf-cklF3*4goDs@>#Y3N{woW~^`cF{}Q7q5o?J_Pf7qJtwis+&t0W_4xb_ zi~Eg7v-G6*Gkh%jvE@gF?d{fOOq-LewY#1yxN)HKt5#swq8Z}8q7qz=p8Ime+l=FySvar@7gPuw4`t!cz81p3&mGca_h&}W5}l^ai*i(a zAGpV>zHrLklhdPKkaVezbL~1WhFMkiN5htg3%2=xH_h;1T6!;ZRceXI`cGljJ!Yy0 zv?lOG*@PXKvp{ckYPL`I;*iu_zX{0}vlwRSl!oSc3G_-8&RI20bwSWx-^UWtF3*K0 z1o=$YT;L@(pXZ+!)0`lO-yA$29IGP4!#^LM^IZJ$=hHt=wFw<9EGczf=sM$#(qF-A zaxd?;Oj{t>l&6tid*h#G=>7N0-pP7I?f%-f3UX z)AsuHM@sl!Tnsy9=6hSHd8_&5h<~nqW<}eco;Eogs361k&E9*urR~ixS}9jKUN>BN zXmIt>(%PvLxn79##H`3|v$#}t`2Bmg1v`#u^UdUrs=t!lQa_3D_pLMPz27BOElvhp z`xWQ;Xy=c=;%A?)-{l{>ZQ_Ub`<4Xl-MxOrlF$Zr sHIp-rrzopr02ZmMNdN!< literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f617.png b/assets/images/emoji/png/1f617.png new file mode 100644 index 0000000000000000000000000000000000000000..8493c0053bc2afab2807ab404ed75bbe4e159e94 GIT binary patch literal 714 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!+5>z-T!HleyXi!tG(YtdE8Pmh zwI`OUJUSFTzs3IRmEv@bw0S*@#BT~&C}dZA2FN{bP8WdkY6yvdxQJ) z8w3jW_bUWAoNrox+JJ$9@rkF4V@L(#+v`u0UK{YR1q5$+``n1_*q?vr%cawoT$>rQ zW6$T{UemKVAD;(xdVbV0?G$2vDcLD|>5Iz(i%TCa1?n)l2+d7Vv8e6UfBEnF)%1ka zjW4F~3nWbF=JQhO2+8?vzdnbMJ}XapCLJv&H3YdvfDNADb8NnZ2L= zw3*iTUy5=&_+vj8MVx(pRX{#W{P5b--@?O>Du_*y-v991_eW{1e%;--KmOQOv{leO$+UM%w%s~ zEMaTl{qAyl0>Aq#9$J~}%V?(4y7V# z@9YNsdn#=@%k*Ar->x{YuSMs1-s!WCPuw#7rt#3DK<&2DyR;jsuBRIecW=JtwYPb{1*Eshr^mPjelHE-aO56VyViBm2NX?G_Gy) z`?Di`TDA4BmFeGG)Bl}IU)E{(b9VZ-+Vnm1yyrLR99-=9=5+kmy!5+!gTD8qZ@+(Q zH_(UDB|(0{4DSu*-)|5o*zXX~e_lbr;QjuD^Y`DcZ@8~8Uwm;Z8v_GVs;7%%NCo5B z>8-PF8wj+V7x_J-@C={v<-(os|2u^WE&b}bO=bFj{wCx5X<@59tpDrp%C%Tv(Y97R z_`Rf*gh{f0XzV7Rl%yzC(Y;F*#m`PURqo4SSbp^Cd*@U89+b<-IW#sOzH=@!!0B>o z)y`%Q`&s_Bhqi=Wcv!G@eQnGc4dq1M7`~;Ub(4Qa{d#07HP2j7{p7bKd55pefz{rt zrffLBMqZ%fUn)!Jy>%MGEl+d$WLC+YOnYb=^mJzCURKVbVi5Ye8xfQ@tV%Q+6G z6mq23OkKkIAw>E};>T9qgDqBDHD8KMJ|xGrF(zbVV!xDx#sT#|2NtkNP4R4Vta7}p z`DowQ2fGe3*wnq*CA;LtnJH)M&c+I-pS;VyWTUY%#~t3mFU-cfbDQl=#~J(fb&mzjcq;!gyOAm@XMSUHx3vIVCg!0CyYHk^lez literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f619.png b/assets/images/emoji/png/1f619.png new file mode 100644 index 0000000000000000000000000000000000000000..533e9b7070ec376fa546cf190532a71ffe574636 GIT binary patch literal 623 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!q5^zET!HleyXi!tn>)kP{M5f* zN!~oo{mtq4`7QR93Hr^M#>bZXPph^r2-jZO>-^|YbWf4_o_XG%1Z(#JP3J2K@(X5o zZ!rIUgTVQIhX93w{f95fPGVqS+~(=x7*fIb_WJW_iw$^K6K2P)clEFRfBeqeSPRMC zKq14uwf`?})IV|J*=Md*8;&jFTYVrWs6|XpTFgzeQ@LZ2g(26*qoHPI-=7HPb$zUvE6PDaiF`dU#b?Nq*jgfgfIA*)H zb$;YA^uF*&GG|eIgU&V81s)3z2=`{+e#vpZFf01{gU&-|oDA~Z|MTk3C|mHqjL#<{ z&E^nuY>%wiT@P_~xyP4WE3OC|Cm0G`ethvxuxRwlJ?AzT=e=r|>%M!z|J=^cd#tx@ zKh?cJc~R}{2dkFd6%Ksf8nBt+#`{&u=g)0(9JiV{!(qwajWVA19M}BYdQy8s=a1s6=>pPfxBiJK z{cTXJXWvG2kEbx$jQ pE`9y<`o8J$Ht}^||5ns9J~f|jZ)UiB4lr&RJYD@<);T3K0RYJyFZ%!h literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f61a.png b/assets/images/emoji/png/1f61a.png new file mode 100644 index 0000000000000000000000000000000000000000..24cc483845b749d6c7c59a62aa7efa8d0fa9ea0e GIT binary patch literal 835 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!CIt9|xB}__chiYMX@2S;WtTGN zx7ha-nNO>>{@-5p|3uECL(%`ImlcF-|DROxe|ho$wMAdAB>z8~y|UN2In(&&&hY;| zmFG7Ezd0TMe{bHg<^Gik`kSY@|DRj>|3=3DO@(h73ijlM^~BiRY)SrlGSx$_|1i)^ zd?i7C!3^&W8t%^*2-shs;Lv~m;`V>W3=B*mo-U3d6^v)6vrc<#z|&?vM`THZbLu<3 z`~ORr^VS^GD&EiT`uC!69-SCFdr)x4#dr zWC`I=7w`|fD1CrIyYBwC0K?wIMTa6v1t&2$7)`8~b!ByE5fyY0>|OFkg;9Yq=4(hp z7mG?EW4%t*le0|!G?FH$tl;<}kdV)j-BrcI6=D2lp&X0+bsfivUpBbuGaePX{v(J% z`%s?Vk=wuB83p)_Qc{{F7W}BF7gl=T77-}^qN{69zx9jfix%zHydZdF$Ns~0IvspK zVX3Fwc@LM0n8uYh1_*r7ejb|9GRq-6W6F-!po|jJ#{W*s_p35FJ>RdUAfcHzfs2jv zM>Xp*SCjK)oIgTN{mkQkw#jyyr1*)IQ89(fN zxnw09m-k_dC%pzN5_P?mLOfELYtE$YXnW?^W*oQ1uXaV7rS1IN$t0j2h%6kc)5E`F*dz+^PteOOnLK@52pKwrp#KU9?{-!_Kwm1)(mbQIp)67 z4;9ZNFKp!3msrDBRddi{!=nvePXaS!<2F_3e^7n>VAk!QZkff8|!cj4%AZy!ijM%>P>p{`XW~jn7)` z6MEy(rN=F1sgb;-?8` zriGTd^-60>$#%6(HCo5awdIkXSNS_}KY{Pu>O5V%A(NV;Z>HS+cl3nY<7M?Xa@@{r zn(2CEb928?$eRT*4;jVF%ge=mmK?U5f8gfJo09jJ9M0t8Rz7}twX!CkenqN;rTtzj z^`nW+;aw9i?~d*|%%yKq&A;H-=FYvU1zyS%oPC@*9@UGsGtWCI8!YF?KjE+Z2U~uQ zo;#hF+>CnWxMXVk|7G{7SoWL$LjT!t*Rmr9BHC*Y_b?~U+VXvW^hJA>!>8BPr%pPv zt%d*8)Ad)`yRA-VdHuf{^NpWNr)izig>vtP{#7fL3@rO!U6!`7eXq0b`|qij44Tc~ z9l!K%n|EZ$w9vp`+ZVO=v+gr1_r4GvwqLd2VfJCgieqgGTi290PpGzFh+#Dr7kr|& zh9Nv*#xbt|5$(prPpoWSGUt6Y+Y&u@&5L-{aAMQM18x&lCsvv_O;uf*r}0_EsaPfA zazK`iYACY`$GOg@6Atd`Q+3jmds^p|KGUzLsVF|nVvcenbDMKwWd?@{!xkH^%ceJ@ z_t-9c8FX`>Ld?g+hHd`2HnP<(?<+p8y!6ZNnf#AG3a@|LKj!AmKNYuuFH{PcFc>^t L{an^LB{Ts5{AOV1 literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f61c.png b/assets/images/emoji/png/1f61c.png new file mode 100644 index 0000000000000000000000000000000000000000..b03460bbfb1872f878a073e8aa70b1f4f903aba9 GIT binary patch literal 1040 zcmV+r1n>KaP)|EF{MZF{q)lh0aa|LB+ITyFo?Y5#G5j8{GX`|ON* zU8_u0)n96NPBZ`Ggp6`GpOAQhQaF}{Yya}ba9K5QP%Z4sUxRN@|M}z3$h`lIc{cvH zZ~y=R4s=pZQvmNUfS=zGzfeHWAaIWXcN-S~00OK@L_t(|0nL|%mfSE5MH?C(#TjN^ zW@aoi_y0eowb#mc<=J>#zK25Z9Ys-W>Cyj-Tkz8$N&5xYPMz@`AUJ+zUUkX~U?zc= znn&+B@F0$7lxG7-B*-R5Uj!q?g!jnjU=DKm2fv&HbK$sVy}bj~+dJePu)xvskjjA- zIr=S%U`dhG4@_Aem&@f{Fmb=40zh^f6+yM!G1R20_W;?e#5{ckiFir|9gw`QC{%Ta zuoeO0r1Su;EBE-K$=j@^hCnmWsdCx=JI2;8g+m!se#lugD+?KrjJaro37&~Gz?5Oc z7;D!-0oN!WBwJjx&h9woCvg_K5#tO&#g_&SNE#SG9D*!|`fJ8%cS%9ZzX%Kl;Ssx| z3j|jf6ifz9hSZ2bK}iATVDy3AajE2>TU%s;BbbqdG$2b{bIb&vN4%6ECLD@D7CKJSckfo~B zH{}WV=+_ z#^Wc9-Cqtovb9N?s=-C6bfFqF0rahngb+q(z$umD!;g%$Lp=aJ3-$JF1F|m#q`^=f zqN%~n&D0=L^^i?yal&S-T3d?`n;|F^lbfuTZqTAlR$`lXfU?6wJUXClUSgwpj-DGlehxF2WnZr( zZ=UA<=uq^d$efkE&eN)`|F>4pZ?W$wGOtX~-!sqq=Faf{h4pEE>dl$P|4-)puc-Tf zA?sy);S3v(AK6uJPRD;tE&IQqbdihy`3=F(V)BkH_y51V_*ZWA`KYwL-cjGOD*sQe zc%M@8|61n%tp%%nLa)YW{qLz<)p27f(5-wWL4Lsu?+pa*&u`f85O7|hp#RFh^E?a; zOzxg8jv*C{XD+!iH9PRMK6ER*_t!uAx*^Bvy5IJTm;XPyxwPU{&a((x2}MV<(rXGiqHKd z#|xAG$hZ9cr{OxI?t35epUd12876&T6N=m4_&}G(BBO$DgZKB;gE592hd=J@-}Srr z`pNJAQ-ryAD=THM&-MAI&N}N4pL*l6BfkQYojQ@jR_LA)V~G1? z)1A_rYI#q_sv#yQvT5mSmIJ@;H)L-;ddX|+zGcytm%H+ww!deV`%w6f&tkGTmq!fy zd8f&B^-8B7IR(5=ty(I%j_<)EO@-;J)-vDt5w!Gr)seGtEn%;}dQCgYq1R`p6P!1l zi&rLH;q;&5Q*3meWPT1gaH(*b)`7+T(l47NH5;xJ2C*LSxy5M3ZI;b!Abr*$yCKn? zVa8boftwZwGWZL9)_;8Ub=IQvZS58+Cq8K&_^)+BDe+#|uD4~Iwj52Ir*tXCL4D!+JM zzZd@Z?_Q5xR!eGKIsc_9Uf!qInSS-l!SxCs-%R;sx3}oKx<_sO;(Ls&Z?87kx9@fV PCN>67S3j3^P6sM49+M~NqM_8F7(ID#kB!Qfg_w}bsWwJ7NzrW96 z_{RI=H4PS}?$a;s_i#rkIiz;Q$M>^+DwonU@Yv|iC*q)Mq{W;p!S{K|@z372X9awE z6AnL}&r4qh+Od|WtTQzGlqmai$x7aR6? zTjng=9K3R>wCm)HnzjEjduMCrq-*YLkk?|#RAVQrJ6m&4`t4$%n~S_Qd{f)y)|-*&XzdweBh7Pr29myYv>8E=j(p=^>bFv=M` MUHx3vIVCg!0QUkadjJ3c literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f61f.png b/assets/images/emoji/png/1f61f.png new file mode 100644 index 0000000000000000000000000000000000000000..eae356632ccf9e06562e5b55cfc1d038ed2e8542 GIT binary patch literal 701 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!x&nMcT!HleyXi!tf^h8bZXf4mUCtkZDMJn!=xg6B8soZsNJve#Kf-bV)L8orVszhH*< z1_JXN?knsMC^+xXUoh?4T?PimE1oWnAr*{gueV;hZ6Lt%!1(hlk+imL@Bdeso;%T7 z=RVQv{)d@)*Gd-IpZ)AHQSz3Z)jru-UnU+f`@nse&tuZl9RfwN-6|Gr`%)~v_`OM* zBHdp;|H0ZLQajTHRb1q151J?(HTc@M{``XSJwJHnHS$a7TSnB@txM#+612m@Abdj;w{6zH9vJ`?#E-f@zcDo$mlsP_RiwvJgygi_>ok=qXJHi2SFSQ zG!{(bbv4_{qhYin(P^gVRsrUmSz<4zFbX{l5McD~jyh!!_00Lh!P#PKHC0a8T{Q^! zvgFkN~x7P?HTEp75IC*u=Sb_##^DgZpcI`dj`}w*}ISJN=^=7XC5x?Dn#%d?LVg%;SPpH|alyL9$O z|Iw<>kC7pIyDO8+HMRT;cEr!#&}ySw7QQaK?5=30UXH_@L;aQigkIKYc`XosoV>B% z$i(R!?K+hcm)bvj$v^AY;&uNvthImlTHoT!bemt@dVf>r|2q_%|MK_yzbtivOQw46 Ssfz-}JcFmJpUXO@geCxN7*Uk~ literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f620.png b/assets/images/emoji/png/1f620.png new file mode 100644 index 0000000000000000000000000000000000000000..757cb72d079c06ba92e7b14c09aa0fd62eb4abd4 GIT binary patch literal 792 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!mInBQxB}__chiYQ|Np1?so&fg zer&n_=4tL1Q&#Bzd0TM|I@MmZ&v;P`|bbz!fDmk zdp0dxIlJxH-gO0$rvD#S{eQQ4ev5r`wrypK)BFh)|G(dS^YY2&<&*zEZn=4W+n#ye z|3BOCR=BbWdKx67Fg^ zC!l5ak_RUQ?uasfyK%&Ma$>OgrYqbdv3h4XnFATtRzK&<+r4AW z?{9zauW@7IRE_?9&i;*4i2$Rs__1?ZTyt)yGMkq*$(!@s)d&;(I;W-e&?3pOgHDeE z*2f3ur~X^HE}}!sWMfCfidU2W9NQix{>0%#kkDi`zX-0znAa?k_IVB`m1m2X^?N-~ z(>`~eL5i7g&4-K!8y^|4O%N+!S-0kcXHjifOylDmhSVMAYb+)gq`4NmyM1Q#-pU(# za3(%ALW>c!hC=`I$YMj4?5i58@c6*y~?mu$slT zqL<-Y{I`Z5evet58J0>`MY_+*+cDvi$pdE1PbKUL)3=#i?Bcf6w0p7oXZ-cg(ZAC3 zj~4w)*MHLXsehjR)oE$>LSkQAU*EIR?%uVvQzKgboifUM{p`>q*EJnB&WVQ8%x0_S z6lVt8JJ#B1%G~~Su8gZ*@8Q|zPwzI$SKR76kbeFGbFsZdqwoF=&F=OR_p8=3O9ImZ zL*l<{jy2j{$B!hYSbmn7s2wXxO#0tLMuqMr>mdK II;Vst0K9gEuK)l5 literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f621.png b/assets/images/emoji/png/1f621.png new file mode 100644 index 0000000000000000000000000000000000000000..8af9ea000b2d806e4b598e1704b5573b9b9666cc GIT binary patch literal 795 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!mInBQxB}@f>FGqG|NsA=jEUS5 z9u((jK0nasWlGAG_*hSCgDHLPYu`}Ku8TRknxBE#6KUb|PakKkcSXk%jxPIl5 znG?HrZ`&B+Zu_;W>euGYoj$I=j~)Bo+nW&L)!SP4=jP29&z~-tJL6kR%Z1%LR)+Zh z+PnAIp?z7tE?+)>x^(Weh-~|LphNjeg8YIR-Wv$azu!=BK0sl=L;te^sVNK$OyZs{ zjv*C{XReqsF)NC&TsT_$uKxCpN0YVIv+pbVqyMtxkn<(KqUFtED>!7!{I#<$q^`MT zna|qR5-WF}Em-aRV*LoM$u^6Qv&py56~3XQQaEqNLM#9K0<0WLW?#QA__0fzbxF`! z{*3#=sSd{RpZPz$ac5;cAl${bAnCZM!fJsJi=WFcJ-_DK)m@7Ncvv44&et*7;cXdZ z|Nej4@}^e4-QqQ$7_VVJk$E6a}dchPO^<(rtNDm7#=991^9Ph%(xlTUcdkaAs? zwP98WovOIOZbwRCRe_t~pL*benzu@T&p1`+&=N?nc@tqQrX+*YUTOj<>u?%x0CmezrUMd@}{*{R!blM2~zIq L>gTe~DWM4flV)?W literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f622.png b/assets/images/emoji/png/1f622.png new file mode 100644 index 0000000000000000000000000000000000000000..41b889255def6d7b562c9ae60994bca74cf797b8 GIT binary patch literal 1208 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+yeRz~~a-6XFWw{=b_}3`*Vj9)hl2 z>~7h01;YMtv$Sm61Gp4~0W>YmPyOcQlgIY1o7S2Q6#W1H|JPdukM3Q+w$1O@a{tN% z{jXm>O)ORU|G4G(MfFt0J~{by}KL+Q0wz{XOSw4lO$V z+iq*ulKwBo{CDHu#I>_q$hBXu+xQ}|o%hxTOE>o3vYm4;h%Ucv>apiGo9)J(Qy(V# zz347pQ~&kxf|Nb}^2&z|7!E7jx}RfXPTU-C6F1jUcKs=Xq-O4f*B1_|ez|=*?fVt4 zZT+nB`>$?oZgG^lw&0(q(?qVgFPP!+#F245YxV{AL#|v6 zCCa?ao2n9a?CN9^cVA(^C3N<#LeUf}=0lOMG&1RaBhL52tua5lqQR#PiO9Ovw@Bz<<^6?C3cYd}=6SzAw`xLj> za*6%xXZ|qEVCO0OuzddP?}mppBPv$1c$Pf*c*4w!jZNeAwzQ4?ex6!Q?yIh>|Eu0U zPt-x{hqC&cx|Qbr6CK_uG?*S^p5-{>dxLDtSBv?Xd?##6R8Ay3ownRx<%8tZbe`g8 z$Amh>{{87_XO4|J(en78{@?mK%i`?BD0H%xFUAk~p94*Kd~ZnQ_2**`_MX{i!{FeVYzA zicKzZo|%5aiGw9>*PKutgSk>1Z%Uj44G#P4yU5$xy+G|slA5X(@YVOh2t-8KRt1l!ql`}lMcx`#h3b&sp zQk<4BEM)5aZ)z@W>#}HbvEf_o$v@AE3iNEfy8dVw*O3piPVRBM9PwM!Jx!HsN~T-J zM{T~nDPJE8FV^ARtygw-cH$IvW$`^3(7DZF@G+K{yM-iS-kGsMV`sit1Ij(fAzeysW1Gw{QZ$DS5AjJfA6gqJf64j UV*cO%z^udI>FVdQ&MBb@0AROvEdT%j literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f623.png b/assets/images/emoji/png/1f623.png new file mode 100644 index 0000000000000000000000000000000000000000..19ae7dd83eb003099cb6f3b710e0af70ecb13fc0 GIT binary patch literal 841 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!CI|S0xB}__chiYPJw@gP;o50_ z>i=(K%x|&(dL{Yh&hS0+yf;sCpH^-C=5+j{L(%`Im;GN}{J*ENIn(%md)5C-ng8dO zuIzRGzc=svhTzHs{r{T^zc!ctKb!skM9%-UMaP!=Z!YyawkY81$<+UgN;YQ)zK+cO z33L`;NswPK!+QgPhWYmu&KCsi?{`>pIY5|!fhpY6#WAFU@$B`lNv{<|*gjm0(3KaM zzRP$0p8uzP6&AN_TDvpm_utbG6C8^^|CjP@lC;{KU?de*EhQk~VX$}Gw&(2|xN6_e z`ek>pz2krCSBoRd5B>Oj@BGK5Kh+<19NTfo;#a{_j&)9Md|!Kc(rTyk2p(im*)`+8 zA)DmvY{T{m)7O9E37e_YYGA%ko@0u4XdidwQB|&m|6N-ryh=LSI`?9C&hggJKxeM6 zzwFM?5?+Yc1Evwj^pI^VPa+Su^&P#Rd5=&oB=GdA0z2bA78!N-4x4-W8yXgGv zlE0W(qiV;e%yF>SrC~|z{H>nbm%Qj$x|wBSo;YJg#A~^PMD9t|Sxh58 literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f624.png b/assets/images/emoji/png/1f624.png new file mode 100644 index 0000000000000000000000000000000000000000..51d59491fee20c94d4de5660d89311179d21c252 GIT binary patch literal 1438 zcmZWpcTm#@6b>>}Fc_%fl{(@9h7E$OvJx-?0YV^@6=f6@5gE!(xw1i)sDN;QgkwdJ zk%~|u6@=6%%K%{ok{|(@F+@TbYWOwPUaxn3_uluu_r340_s7e|pzXl2%CaC32<%{g z(M{apf7c;NF+Tb|g$n{n_+gyfk>U|x1^+*%zlK;B_ix+(l5hO0G33wQ7qP-;W@aA#Vh+sR0zPvmJJ6q)F&{_#fRz#!ib+&9@^DspI@D)>`n#lG7|yOHg9Egmz~LBPqh&X zgBWvmngWfM(r*>6X3OGa>3A;AnBV?x0NT}ulBMzHJNYw`R7K9&YEXDwz zRX#I4${47bV^D;w?B(U<-Wmk3R>c`iS!BNvjt9>7dhG7*>JK=-7oYf4v>O@=+JF%B zljq*7!lNOIKSBEmghqJ1g@XJ`hI;g3r%Qvx1@ zOs!>-%?V`kECT?TH%*G7%U@NJ&tN8(oX^E=^{wq$>h7)j7F_Rbp~3z zzNJf4U7@y?pz21o;UAwCHa_ml}mMWigKwqtYXN{RM^cz|3*_3%0Xm=YF#%#9}mtc zy*9jv?=PNcy5Z#A3yH&Kp@|1QTa~YOh%0hW7F(tcUwN ztSI;K%6-Sku)v{-e1yk%(vPg648#rc^fMdPVm)zdSlFcTmRt=~2*gDLxd}=_3dGayGfQE(vscv+#*j(cZR7GLf-) zSRm;c1mM^j=Tx6Rt+5fBLrea+Qy!+~V0ZzfS(kaIi zDQCX~MnxFFn>boqtFDB%IWNd?_g<76hwwnsfwHe`MNbO%#1%*H;!VYcG@FwCgk zN+6Bv4jNCN`Ho(}aQ7Yi6!~gPclX1k1fhRx;9wV+EgjB?xNhJ{DscE%01fjwXP;Ef z0jbhwq*enf9w}#`sRuNbj;vgGTiYuWjV}me+Y+hJ&@xC_`~tltLuZl)V;TLN+WDYQ zrg_5ByIa<$!`@&_>rX2wQkf9q?{~-dQaS`Yf)l}^5||Hnj$y$aE@#`+-o!OVoJ%|rq(!$% zLDVbT=cp|-?N9bGnH8QqV4@Lhb{{pLlcu>ghyzWwKt{O^Kv2=|n>aT@1H2Bt= hK+|Y+qnGR&&f1K9uo literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f625.png b/assets/images/emoji/png/1f625.png new file mode 100644 index 0000000000000000000000000000000000000000..20983086be31bacc818ef1d741e9dc985c1693f0 GIT binary patch literal 826 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!)&=;4xB}__chiYP6H8T6H@@FI z%{|Re{p*$FCx^qn-YU3xsq@Y0_=0flqi1JrI==eVsi;SXqW8@6KC#lRV*9-rH5&7q zbe44*&Tp}A+IekSwRQfM=ey?ERwn5GxSss+Lj1~J=M_h`oZsMecW==74Z+v8`Slc; z&p))MIn(&&&hTT){r8+&ytdzT>i(k#7d!g*?YcQo(rkdTH}310IHgWfiw}KCF6oe&2ubYU#x#DITX@zTeM0X|;Lo zpO~uSIfuh;zj={$F*cal#d!CXjKkX=D4aIa__&SDJ@ebm57SuHBiCMD`~G0$Ug5tP z-x?R(x3Magnvn6!`cWX8%>Q{jzPutCTMG?-Em+e3d=YzBRmR_jO@BpG8;w>=uei$E%*p_{uW#h>g z5nP)CFQt6hpDAZ|Rx9?$;ZGv3)%U-+#VdErD6T!`-)_m<2mXJ^Jk_G9@O0iQhrZmi z?_R&Hjqs1)oX{u3R3Gxe)nwYw??1QCUdP(a!0RMEMdt@oOW9%uuXh&D%N16rb5tts zu{k(H{Mc0%wl_R7$0Zv={#!g;`X!+$dV2wP(A&p``fHn*Vf!ALI3OUUAxlGceZ66lhN1y!C`dak|sa2|h*Qb;X)fy>~jx9T8D~apJAdtYcB! z+rpQ)#d=imm{cwiT)Sh#D!I(q1zz8)FNE&D5m)gt^?%XkMjg$v!xoKAwZF2u*$M&# z*tV|bH9shAcRWw8PR?!0Y~J1`^K$KHa!;$)i%H~f+^t@>SVUsek;;Ze@Jcp#-7Lb}%WQo;E4 zI_tLE1_G=BCwV?fZ zHk}g{PK{7~Ts$#p>6EqdYqkY1V_404N+7BEf`nr)Z^;p<4N)3B4p+a|vYx9sgc#C{;B4yeH!aDJ(aiv2fu55*zeGDHfh_GoynK$ugM(TuyhVbe7Wx2t#bpE z6K~%PnCeop>h<;OyX*u5BM%;WT(9x$UZtcwUpoI|?!ad2D9uEHd7ZBgn`bRbKP|9F z`+$kd<3>r{T#c6I-20bqzdR?swfbcNcO^T^8sUWnTi$wZdG0=YD<^X&TQ&0yjS`ht zYm^T#yLm3UBxewDWFhCbj>Ar2mW}N?-)B6RGr7BXUG|N#j^FRZ`MzuS|6Y3f@2%%` hA4~TC`d2ld;iJrA)1y&`@v0EGGZ} literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f627.png b/assets/images/emoji/png/1f627.png new file mode 100644 index 0000000000000000000000000000000000000000..c8e673383c71606bfff7deef7b7d09de71189700 GIT binary patch literal 794 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!Rs{HjxB}__chiYPX@2UPr@22m z6g{z2Wo^Id=4qBER=V|6#a1ThK@+3UP{`Q-B(g8%>jUl6YS^-A)qQ&G!04R_74 zo!?^r3-Qyct>-uC?3w5N<9hP7ZGO{Qv+wQ=I={iIGR0}nriG90T|cZsjWp@(X5oZ!o_>;J(BD0)_s7^RAAva~T+z zggspxLn`9VPQSkCv4Vh$xa#T50G@LnpUHgx|37D=TU>Vm>$817_85lVH8tTlIREs~ zm%9~BTJr8&`r8(9atM^CtopW>VG7H<{6*h6{&0NU@+ppCF3a9`@7fon-Z1PxD8VDa zUl(J^B%ro8{ntZ~|oOkx7}_c0z37TVyS$RblH;%aEH<>_O|r$tve zZ4DUP*1a)fi)k?z*~xfe8s{t7jNqUpEX_uB!L{q$`WqZ~_6y#SPT*MhSLD#G1P+IsV^#wG+7f_{CodtOnW?3*BV>G+e5Dzl$2W0FoS5|EWS z+Q@X8_3xiq+CP3R;jR;Nsa&%0r+Ba`>uJXx2fL8;Ey8)aZmW{_E}1*!)co1ky(VO3 zJbkgUE?0O};-SB{o`~&R*_OYLQImC*s}IA=x%mn)k?qIW>I3bk=tr7P6uZ)2d)4&3 zjM0WYFJ{GuzSTedt?KvdeSez||2z5lxBK+Jo8N!u_y4{8{n1bSlP0geyXes#Az;E` N@O1TaS?83{1OV>qfph=> literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f628.png b/assets/images/emoji/png/1f628.png new file mode 100644 index 0000000000000000000000000000000000000000..27709d0ca95a68f47145240dfaf6cc570a0fefac GIT binary patch literal 1049 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 literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f62b.png b/assets/images/emoji/png/1f62b.png new file mode 100644 index 0000000000000000000000000000000000000000..a9b02cfaa7155e66b5a88f0402ff482c85d8d8ae GIT binary patch literal 1143 zcmV--1c>{IP)jr&Uwz>EzwLQuJ+k!J|R-^z!)E zW8G$M;%aZEQ&Z2dN?}PS^>2EgTS)9}bW=MfgKtolg=^2qyiYhLUPdQeMJIVgJiM}@ zgh)bgP%Us-HK|=rykc2aH!HsY000hjQchCq^DF6Ti0ZBwb zRCoc+mxXrZIt+&I@RY1@h8fGu%-p@p^#0GWiR0*uCLSz)TlDt-k7CJ+{NKkVoQxzu zkccG1qp4>iA?P9$nHg3ci^f4pJQ^ED9}PiILeYWpsW|i{KGi?^Nf^jvpXZpEh9Q`q z=$W|?3`HpX3_Usw)SuRxfYh5S105!aey5blWVS)D;`~y+Bo2Xnh)n}>dFsk*2Y{Tr zzn^zTG2NXDFMp+GHk)0}xRiFFgKfUJoGq8j*|L|-uKEE^Mo_D-KoVMTz>m zEjba?%iADh=eF)dSId?}O_KVDF^G2TUmfuVCMisBiWGyqFcOr2xU zO-RU7o?`PLuvki790_g!J+L(pVCn*R2G8Jw8&ow@;iy`5bOT$RXC2I|_DBXc&-|yk z#m{?tyNh#Myef>L46q`%ew-{JCyQI80ugy3nT~vSsf*p;jH&WMiUjp@7fS&y{tr4t z=wb56F`r`Nsa-6#pBhD6Y5^fhk2A->6M0w2=ktw*^QCZyCz0-CSkh2*COCBU`LEyH zuZ2S<&?OCpZUUyi?J8FpTXny;u^{LcU{ghG=EDQnXKdg7{sor}AWfCFb<%wDF60N& zrpU`JDl_1ruQ9g9A4O&mrLQ(>;0b5HA0Pjm9#2J;W3@QI>N;i-2r3@*DFl0ali2Ji#crmdA#2UzAUDKBMzzL&A*!r zdARm}v2kGSIb_Wp&g<~GggK1+_zNuy7m?s}Jv7MltSXkBJMpdJw zw+!f_rJ9<7`sWYZ&mZ@nf8lukmFM}Fu4i2Po^kPf#?|-3@((T1&C7MGVif=Y002ov JPDHLkV1l&lB1`}P literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f62c.png b/assets/images/emoji/png/1f62c.png new file mode 100644 index 0000000000000000000000000000000000000000..7f907969a529f369572100ce76a01916aab03440 GIT binary patch literal 764 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!76tf(xB}__chiYMX@2TJWd-5d zZ%)Vm|Nno}jy*FLEPHhC`mw$1=C{}{U9<7bh0D{bt zk1hBAdL{Yk^Ou{axgR~aW8Shg1(BvJXSba{v1k90n^Be9fIGhhC*xzp@z_yWrf$_Je zi(^OyXzEm!pvE-pXbR^E0$ zQ+M@SwuK5^*Y>indm#6H$+!Re!vwu>B=^B|G^_ zS|eA?mLt3&yB8E~RLuM8uTZyyMWWB<_SI4!m!5r@9kH)_+Z>eYRsK!2*6ZS5JDWAC zn)MFf|5J-*R5dKW&3cQuD#mBgoMNA^YK`-h#GjtwWtGSm>)E;FysLNcf!!;U(~mfM z@a(r#IH$8Q<>1tuRSr^DHwq_ZbUd4_SeVqQ$t{->&Hm?X_y@+k*GU^vX5@>VnfNh5 zaPeBEKfX-zD=M~}RDP0@A^OAN9D9WHdv0-!X{-N5&oxqAc3-FS@6}BVcaHw5c+Tpa zdSimmNml1I7M>rPj_qObJlyr!vP(L0iuq@a{EVP`SC;PC=v!Gl{}Uhk(^$DfbM?G- k*G?(5d3pKkQhNr5_7^)$`L8Sd1tt&%Pgg&ebxsLQ0F+jA2LJ#7 literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f62d.png b/assets/images/emoji/png/1f62d.png new file mode 100644 index 0000000000000000000000000000000000000000..574110d6a9a470b9bafb3683b4ea59ce178a0d98 GIT binary patch literal 1173 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+yeRz{nTi6XFWw{=b`!hEg}a2O=~< z2p1xSOt$R0g3JZ7Z(iyIl4*YGKrJ_Sh6C9XOI4;-TW_A`{`E>SQ1;cSsLj(Xcg?Xq zw%q^C>G*5g{EqEi_vS`LPm%eiu*g)GU&A%xHW4%#VNLpS)WuTj{IG^Htho)3$RN{V5&K-wXBpNd2csfZlOhm`%K4|pFf`4cjEB#qJWSGx{o*fwR7m*Ui7T~o{Oqe5YrULpBp;T*tUK; z_f1=&|effd*JQbvVV7cPcfJNMZ1`gB~J?PNCHYiUuW`W&GJA~KwIJWu@I1T(nD zG9MmI)XksCkc#WZfP<_JG=t9tghcFP5S<9Scr7KP<)e8{_H)4{YYE2cg@ z`sGC1?L}Xv&T)1%ah-j(Vv2b1g*Ee&yqk2JrdS?duw`M)4&7auOb5J|7nfaoxrf2w z^Rc&&TC1HEh5KS$Z!ue}w9hG&d!^1G8osdqiLUOty$=KyY*xLM*=!LE2nb($q?2IDBB&u zsvUYqbm=$ESkjwej13GGG^9#tl3ZcND!nT+M;8kDY--DH&`Fk`viR_DKV`2sVRF3oD6_GiuU z12WRLj~M1`vMiPp7TkCD%SEsG`B8$lRhmYkaZ_F=tUs7kp(PX<=IxQQMJi*-#Ydb4 zVQFEub5_3G;_`dj`qcW{e%U_WVlGOFjwxrqUf*7@d#5(*I)DH3mg@~)|K$F|t`*VS V@vdG%9hjRKJYD@<);T3K0RT~1NJanv literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f62e.png b/assets/images/emoji/png/1f62e.png new file mode 100644 index 0000000000000000000000000000000000000000..b78e2b12a3e0cbe1324b9d7ae454b90cead1c6ac GIT binary patch literal 618 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 literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f632.png b/assets/images/emoji/png/1f632.png new file mode 100644 index 0000000000000000000000000000000000000000..209ababbe7024ea5ce086360266e8950c88398ef GIT binary patch literal 1054 zcmV+(1mXLMP)(r>jB+=~sYd_ddjI+3@z7tqvZ3thdIP!X*2lOWB>Hfn0zRof-KLlN|uFdgKto?r;~YPLU30r|Lm&4qd}>S zL(i~N*0xTdSDdK;000hjQchC6+NHX&t1?N zC@{USt2>+1AQCN?-Nm0{5DUv~wU;$WL@Os(e*jxKNEk<{2s=d*4|`*#=g@!o@24$pWMd~8K^EyVf-V}HMaBt(t2SWW6L1Lw*g^lQr(qL~i zvj5=+&jT>)5vIs<;aYnn#$%>{z{)-+7BTlb@8p&+$unx7aOkk}ZgH>G4e zqjW&#yd6>p1nQD(%mL9q0~iW!=tm}~Pl#-|sI$#rt&JhTXOitCS)%p&XyAT&JHwm|> z-%@=Z8vq;G-*r)TyRyCkC7>b+N5)tG+>Z%gH5hzcbR+2?;ZDv&yAK3Ej5wc&Sh|(- zKoMysmhR97QwF@`7@Inq>GmgkrP z$Fo`xg-#Du$_f9V5zjh-2nq>5w(;wWDe>|eF$gW`$Fj5(mhg>S(ywiy1}vg}Z3!i` z)PPoW0f@GLfJQGE`v;WOD-PvD4fp`c!S_oR;jbF-7YM~{#5Ip_P5swEV5O}W-D4VX zy#2DPCd_32EZU!(aJokO`c(1nc-QYmG;?}?%|p8>HBN> Y4}mVcH|;}D-~a#s07*qoM6N<$f~)HfivR!s literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f633.png b/assets/images/emoji/png/1f633.png new file mode 100644 index 0000000000000000000000000000000000000000..72e76fab9df055a9db8889f113eecda3409c0692 GIT binary patch literal 1093 zcmV-L1iJf)P)#=WlpE!s=WB=~6mW6Bormv=nF`tll&#+4W!N=XbQh8)TpM*dE)@lFk z?|EP^|H*9GxmR#kEC11wyq-&`jYEujU9*-sn0zSg%U|TfR{x!+|LB+M%38d#q1r80 zp8x;=4|GyaQvmNU-+-SGaE~BRzt2GLPSOgR0008uNklF!{ zSM!jN^LN=P_A7n(8WfAe)eSk5-nB@9+vxmJ5#XyLoUX!@^6VdQR(o;KS%t4ou_#9L zFTtrhDhh0zn%%312=r^%=fi&IqoT_G=YQeh{l5^xIUjk-6Jo9z)I|T_5TP6vMS_-a z|A6yKrGwB0Vsy+s1LzDP>^G{6v1(%=NYD{8r7+)+T;lobI`0;o+5@RlVfz|gy7Eo{IV>FS0Wpc766Y*Wj&5}=mX z2&cOPO2l-+xOHk-XWTz>6+Pv@iK*lS=tQVb8FxlaXN()wz|}^c^0ZC_-3~B_biqu^ z$G;sfyZ3#=Q@$XQAp>+G)o+7L5ir8#H(b}}yPl%hfm6Khfs6Um<_ZV{D3#`?9#qq}d7As1)A2yTuUC>|n|cbuwO?GwIkw!tr^tNQ zw({;dji0Y)t?YGvbSQd$i~Y@=;SJMT7O$+SOwe!6G(Nu}_|B>Pi-(KWZKy2iZ=b%n zep+_2=0qvAny>t24!BS8b3*(pL2u-*#WSJM{wp6#Mkx*5jobJo7mJ{LuV*a=n#p z#Ur-<6Iop=*ruPYnzeRk-KrC->o;Xz*k5$eZDRQMNw?Ky+k3dxj@)#Z_qTAZQRAi$ z0WT_94=;|9|8&S8;G2KsK2GO-qke-P6^CbnKR*S7L&uui9Z@=uemt)(ER$3UqolD zUH-oHU_pgK)5*pIff0M^S2@iVQIj{-u<hvs-hfL|%o*K9dceiM?!V zj!%nS@_zptkKT^WyPRiwbg69QK zbIHjFzvt3Nj{eH2+~&9^g|)J3m!nPJqKuu%b8P442^b!5D`|85bx7qg>)aHEM?ZHY z=sj7GsjRy~j{R=Vh0U^8FF6@!dY0#SZ)M3y*Y!RYw_+N*jK;D<{VS%eOVvA+aXKQH zt?ykxuei(0tbdB`*JpkxJ^pLkuIC4mDnIQt3%hY>~EG^&iKwP1LdW}J9aFq^;6y!8Hke%c4# d{Qmlbe~(h#{>0XXm%t3c;OXk;vd$@?2>?d;1bF}e literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f635.png b/assets/images/emoji/png/1f635.png new file mode 100644 index 0000000000000000000000000000000000000000..ead8e901b09d69faf3bba2258f17bc80eff38739 GIT binary patch literal 725 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!iUNE>T!HleyXi!tG(YvPSCR|D zwKq?5?#Qv}*Q| z#AB*w*Ivz>^KgldU;fH|*>go7uYPiE>)v$q>9z13tGv!%ziyc~;d;9Jxrb_cTr2oJ z9{l>ya!awn`0s>g9Fxu;U*xnP%dB3YCq0DiDZ7UKqq{E_vhh#7_@_N;``T+idvz90 z+jMc)#@y=xAD7FOSnLv>SazjqBHv^`7vW=JF7FDS1l?}%TgI|>y4>VA5Y;#Pfb9lL zwLO2GZrA!;h`-IvYv5h6etAoz?S%}7rpiOrwyI}dPt0gwRu8ZRqB-l7COE2PPuS|i zHsSFsEx~(Cp;_WB-x*7t8b1UE92H>@HQ^UwZ8_&6op9|C-{iTm+%gV}OLI*x{kX-z z!>rRI*Tc;8XE`HlUDUzgn^JtSyHh#d}j?cRu?W zW|z5l@3Yw58D%!Sht{v!_mr(Ae%kSCGLvKSukQ5S@U^n`bMs;Os)_#|ylsB`-M;dW oeC+=JH^u*b;Hm%hZ}~pPkQ+;in(n=q0HzcMPgg&ebxsLQ0EEwDeEz!J|R;fevO^Mnrm={qH$^ZA!N+sZjYt&M8m*mHvPm|euUBt$oLCW@SPdpP?V z=WO-EyZ$Rx{5ofO{VRjvp1&*a#9Qq0Pv%du*gvu9T&|VC;b@_({4=r+Jl8*Qeq;V1 z&3-1&Sop9xzr?o^{v#jGG8^ce+nLH>`bPdh#aZU88CQ?wtNknH+g$ViT-wB%K#7;t z?@JwkL4H`_%>HZ_lZQ(C9_gQ*ziNM}yx4p*`SAJW>}|rwCq6w>oMBZed;451KcBx` izutK}et-Y_znQ#_&fz?NCqxk#t_+^8elF{r5}E+OpU>C; literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f637.png b/assets/images/emoji/png/1f637.png new file mode 100644 index 0000000000000000000000000000000000000000..5de9cf9af6f9661c7474b0a83d472fcb010692cc GIT binary patch literal 1065 zcmV+^1lIeBP)_3Fa^`|NpOFY@EA|M%Jd>Y(}g`PsQwgK0DW z=$D^_KmGOB@YHnAuv7p2_Ug}Z^3r0Kdpqdn;PTv&yq-(^{QUg*>+H*4|Lm&g=jZh5 z$?wl#@9*#G%3k^L*5blj{oH2s?bzqjk?`N6vzABv>#^_KnfL9?^78Wf*=73r`u+X= z?9_$b><)(j000tnQchC<@86$*5HL`WK+hn*a4_%h?}>Na!TUXdO3m%HFmt6!HSP(7zhD0yzRdrq`cmuLs0kfKL~sNC`K4R{XY`) zVS|JOs*MIr`gsHU=IcVeaTo>w@Yiq5n-qqXnPJT9nCamCpXA)yiB?}4AMgHA+u4ev zkksAm*|udIm*Ab!v0>SEZ?hYjg&82XhAmiS2$d~cFm8ba_oxX7?N~Nh2VvbN)((Uw zM1TZspU-a?hS6hxKxnYlvyU1)0<9q-t|ABxhFDL1zT4$42;DMINdL*QDK5jWsU_Og z!MaNjqcqqXO3sp$f&=l-NVJgyDG7@}$tr_VnUV{O!vH|~pdt;T06#|^Aa4o)rjQ>S zpk09xrc=jAb;pDemG&?I;;xr9LGW7`qveBOX1!fR9)N45H+(j~fUydLF&k;V6$(I$ z+(Lyd+QA?|_T8etU@U1!D;u0h`7@8l{fsJNNZmWj2Pe`*kkWJkJE+vbLOM8b6Lc{N z7pQarWJ$i9p@vE|Ak*><1)8YTgiu1drTuh(iSKW!N2qi(a#NLW>)WWb9r19RguwnO zDxB^^U^3#-mdc<)CM7-Eq$TX3!k)AMISa1hOsKh12BZSRe?G)mhtEE6a}gy@#X-D! z!x(Q@h)zY6IC7C?I>?-y$6QdI^AltoQ!cWYg;nJ4AF4P;_2C}5)rfL;c?Fr4372|x z%zXV4%oZ{$%kpdy!83um)^9MvjeZS`>B;jc!Ws_(_dbbV)pBct`$?NhC^z3N=1$N%4kfnq-uF0nyyc7P8-U(pVUp) j&$oSlvGG*5zWE~HZh3x#k6vfHzry3p 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 P00000NkvXXu0mjfz~5y~ literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f641.png b/assets/images/emoji/png/1f641.png new file mode 100644 index 0000000000000000000000000000000000000000..4647a2f25045c2d63a466deb88e1d12bfb70651e GIT binary patch literal 562 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!q5^zET!HleyXi!tf^h9LKlS-7 z_HRzdf4!32Q)E7^+WOI<=*`pIZ|)3l&NSXL&-?s_;A6}ESN1wP?@yQyG@Y*`$S;`T zy+Ol#f&1tC3mo<<1hnw=tXXG&OJTuGwt%v9$BSuZ z3J2@CUrb!19&PFA$QL|mn#^+*$-My;vw5F+7A-Y=leqLtYm}@`#L-JjU-hW=!@y0V) zbL)MpwErH*ZUhW&hC_eWHvb3{Ip28jNMVZMXPH@kvB$R+-)}!W{rK|J+s_}reEqxL Xo8$9DT!RYALFzqS{an^LB{Ts5f&}|L literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f642.png b/assets/images/emoji/png/1f642.png new file mode 100644 index 0000000000000000000000000000000000000000..11876302f74824018afb7cbd27e8c104bc4c43bd GIT binary patch literal 583 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!q5^zET!HleyXi!tG(YwEE%ucO z`aMPF1>xF{4n^PG8UE&U{ITW!D|?;KZwUT+C3*8S_dWBxn=_4r;?1rAP3J2K@(X5o zZ_qGb;C}ykhX95B1+4SK^cff!`#fD7Ln;{WPG>DUV!-3_+Mw^P!Itm#X@#DVtfBw< z)h``6uVMQqZqA+41xlZb(&Nh>Y5D}jZ8E)G&b)zT-G0^kp)*`}u6|kA;M!DC`9(2| z^Y70;CWqJ-m6SadFwPW64E% ziJS@c=R*8UYT2Zp%<*IF&AImUvP#Nv_X&HY8v^Dqb^9762h3fz`6D--l@?hM~N&HdPN|2^}(n=_4nZ2Z0xXgXg>kY6yv zdxQB60{71c6zuO;aL5+3NMT@LoaE`^7*fG_clz@~pA0x!-^yuumcQQd|8&Xv3&BS} zo&El^Qpck~CFSG$N9m4!=ARTk@89gl+%FL~!E5be12qpBH=*Ab7JKgbu=uCdvh7D+ zf4`{zQu(y`>j+g9g-GA9bIOAA)^ALg+p+i1;Zw?%PkKKIsD2UUT+h1hegR|n;xSs(iOEHJT5-*&13ba$qsFNuP)8e z%x>h7HF@TxJjqdcrnSn1&xP9JAH3Bzhn;)o4zxIj*XI9*H_gmTcP-tm^h=}qgU9Ne zOs~^#Hp*DEzv2n1SaZ7b<54B`mhjm!`bpDYuVE00?D*KAn9l1iW9j{M!cy7KTbh^E zUAfAC`&VK7{|6WBE5G#X{oU;U|HBpg+W&U$Y@6qmgev!D0^^Or)78&qol`;+04T{9 A@c;k- literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f644.png b/assets/images/emoji/png/1f644.png new file mode 100644 index 0000000000000000000000000000000000000000..2782fd08c2fb7b602e306fb7a999d0ed769e0f6a GIT binary patch literal 671 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 Ib4q9e0Fx%dPXGV_ literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f912.png b/assets/images/emoji/png/1f912.png new file mode 100644 index 0000000000000000000000000000000000000000..caa967740900f2bb31615e3a203298d1515d7053 GIT binary patch literal 1286 zcmV+h1^N1kP)lq&|J`S1PABb5 zT&<5ak#!{J<=xr2SL)==>gwwC)MNeLZ-Z$wvzABCuv7j0{rca3d0;P}gg@u!=enFd z@8Y)fkC}{eH}&9_$f-uwwobE_Ii`s*)6>-K%U}85hwyHDn0zSl&|mNG@4=%%{POeU z!&bbWOZxiysf|PO;imY!!tPgQQCC~DP+ax(_324kTUJ}zOXbU}X9E z`K2H{?d|QKf-KzJ-2C2mmU}z@|NrRd==j%T>dIP`Qd|D?^|vcT-Mv!m*OK|~@Vr=U z`Nz!X*{a)>qV)9i$8?3jF-W_;zWn_B`rO~+xx&w|O6=ptj8j|hVsPy2>|A1H^MsG> zLfIuL>&u~zW5I2hXQ~&@1{7FPXRCoc+mjinw zK@f(o*SxOb+GcFqIoq~v`|dwqFO%*?W;T2uZYA|iPid<6?Oilhof*oQbykf!Z<`JQ z1Jc=)dTR}OsEgj9RpM_z&=6$U(A}tqrs$2$Pj80}u{U`SlLZuDF*VE_0!1LrX8aii z)_)TUCIl)#HF3~dKou4?7aQd7Ky5ae`T>@M3lXT2X+H`qbVcdeCniNv?5T>8AL$OZ zCaL;op5E0?T#`^FRrsAw(Jx|H7eNFil0sLqOK2AfnI2e2M?@^JAP7Px4JDAa_5fl9 zAq50lg6Ni@k3dBrEo4MNh@?889zDs3K>m8UCJHuak;;tHL5t|h0ti|JmAeR9rqokb zV31`Q2nx*BN(iPM7~jf65nqtwxS$UxSThv_v)h4-B!D1uC77qxH=BzB#D8`4!t8uW z!NZk^14RRKQD6W&{VRldECm3#3P8b_DFF%368B4|{Z1^obM^l-*GvFo;(vDTT#P6< z-0DxTA7lT@x49={e9Rxl(GXW61Qd*!d4EKmzhHKqUoL3YAW~fdt;ukljCV0NBdsR}BOdC7aZ{N9l@Ba8hqHsL?*bM~P z>y5|zy*?MzL0|h}2}s$QXV0gK3J#D%T$N=RYB1D(+Q9wt)$2FIZ%JFcd;fu>=x0xX zwDmr&?r3)S;}A*4CvFW-JXoiZ3=KZ-16k+i@rf^G*M8quDB_a6y$vG3E*OdI_a8qw zLa;XnjWIS}aRSmW;vScw8TMvN*3xh8&tEl57Q5#8xMi2BHIH31L%o|^Rdee7H@|Fe we%;^vg=6zqp3PsnHh=9?fALg*_1%N~2QSd)3Vf6&S^xk507*qoM6N<$f~{qkKmY&$ literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f913.png b/assets/images/emoji/png/1f913.png new file mode 100644 index 0000000000000000000000000000000000000000..87344a96740a207d01676d20fb3545abdfbe8fcf GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!mInBQxB}__chiYM-oBnsPb33X z+Bv(=pAepx<^TC|YFL=}o_XF?#es*{#wI2BK0lT0{ri+{>=Zy!j^D=OW-A}=E+zcNAp|Ns91p%Ldd1V1_y-BV=# z=5+k#Y3~2uZGQgZ#kLJo^z1)b039k&666=m@ZO+dzQBEleuaR7{pa7m=f3s7kb!}z z-_yl0q=ND8_12=#79y+#Q|rMzY7>i4S+ zb9xhcq7ENRUCOS@F6x(EkoU4|bMs=Wv)?SA&gP4IYLeYuZf&vhvTf{dxvZ~#TNc|N zlRWk}-2L3a$T`PupORNA__i)_pR%NOn6B*Z1dk1uNH{;Ktv{dNui`bXv4G|sQ! zoazzJBB&FnP~)jO`O=@|$th)@`^zSKS}n```XGJ@C+pe_Z-tf;&)xg3uk$Q^>c!%E zmfLH>vn@NB6qMvswMu;%cCK`q>F@GDtE8(zCRFPl>k+O{N5Km_jo2Ep*?soz->Yd- z`Fnkt_S)HQeovT~g)cB|Gi3e!X|sxF+R@Vw57*yvK4HF-?W0)6Oa}G_1;)ePTyhIK z76@wY+nF3!enzWlT9Nv{xgyUT92B=qVA_}I;kEGXwJQR*rrl|l`mv>Ho6`RUYl$q0Qw#$o4t6*#vbfC8xK!S2-nO!asEN8_T-9DjQleKD zH3;g~ycA1aD#ED6q?kJKkypJSDv-_v3Rl@9D4ZJfp|6j7PH1@!*TdcPja-xJc%xU8NvH9Gylb*#J`o1P7UQR7? zTFLY$Inz3!|0HLB!k=vIaK_KO*a}!9mfJ0i+82B?;l`dP8vNVdt<*htS;x|#x@m3r z=95wO>Z<2ozfxOWHv9Xd+;?TI@6GOczcqXRR{HGr{L=gTZr1%S`~Q}`Z@YZuEB@Gg l`)_;yKKS`<@%!@6_CZtbSFh7@*b7Xy44$rjF6*2UngBA0wK@O* literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f914.png b/assets/images/emoji/png/1f914.png new file mode 100644 index 0000000000000000000000000000000000000000..46977686a73f649a8e1e05fa5e067dd88c463e0c GIT binary patch literal 1359 zcma)5eKgYx82*Va3D-DRGP(k8_05K<#SY0UpeHS^hju{wm&EG7LU)+^e-ub`%+ zF>@*vy`@>iy(3k~dxQef=;&le2(y;TEOZ^=<*>TDz>Uw0HWnzmrXIsa`|k#)?tpVl zM$4n+&nqM2QgERSoJcJq+RqIo)0-am4-Tq?5lt_vX5Xf2>~2JP%_^13*-0rsYh`({ zsh!i`mDk<&WVp#6{7~Lr>DkUH0hRS@;!E5|-g(Kk_;YY@b#(M?FSso1=_mx%3ibN> zkC;4C~&b`F+Hv1MJ$itM_+`}G93ksQ{WfnqY^SWa~~hNx1HD5TIyayIq;$H zJS{h6WujCmNbGLFaOr2553fqw0_43ZYcfhhL4Me9Y0iR3_S3sE4?GG+n`fh(@d6K8dZe+S=j5+E0MJhHMR*3KXz_Y~|?H0qwm(3cDr`ywB))O@cMLfbFnER-XS;_)e*Rq~m; zD^wrw?5aDlEo$&%T2_zjRaX(xuD0>4@*da1^piT9`zNdskGpWvveZZ|>7L(BT_Tg1 z`^PLR1=f|!&bQ`}u7`F}w~L0v>*|6mF#+qtF3TV2Lub|n>w-DOD=Yec9L7BCfDKTW z++sunglW<0ps3t=rqT3RFO&58d$!~8iepY@&n7<{Fi1Z;VRCKnUosk)E0@K;TDD-Igbxxq?OxeZxa%Okd3UzrZcHZLzWMZ9~#l^h8-PRkIH16gZ%@!G$S>bXv# zTl>Uc%ib$$KLKH^;%UDeJ4H}nFf^uPokK zv0!?lXNk4%x7ft00W-oa0feG9w6SfVBuvhKvcUvi1H*r@d4rrcPoq?$t9Mj5`89+} zGLr7p*Snn?f;U1s^y<>4|vv)!LV4CC+f+ze?mOiXkYiLBvk zH&y4uvoGVykN<2S!tK%9RS%6*iCc6X5d9uGal>A8*k&88PFu*u|Iv2|fT=pzo_-cI<(rBq;MhxCkUTG2(9jPWomsTOuwg$KspQ;W=c4$RS z7@Dj~hJ(IsUG600p-hC+3s)@lfKY(61Q?>d^A zc`4xeM#zRf0OzrOaA)JpVCmtWBR2Qpu(6U%{ZuVmis3p!mr8c`ekbE_TV`f{N_S4h zZpuA;<a^yLQ7iB%0Kap%2$Vh_*H*3B6e0z?cUV8$F3}I2AfM>GNcYrE7x&}Bn z;OFKIW3je6JB$lEZR={-kOV9Sm#UAI`M>eY5lFzrhG=4-i*iJhR=^kOk9gu0nfW*C CB-rQx literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f915.png b/assets/images/emoji/png/1f915.png new file mode 100644 index 0000000000000000000000000000000000000000..e88b48914ae9571dde6106dbbb9d2b6a851c0e6f GIT binary patch literal 1151 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+yeRz{nKf6XFWwo;iQz|J`&50s8zOS^_Wf%&?mT+({LrgY#&)bIoxP+Xk8^@}vbp2dvq97MJXyw;u;{f9 zgXy-jw|GyMwkbPK$car=QknB~&f=TxVrv3Q?`}|av=ig{!9^7}&E^yy=p&;V@{raC@41I)DteSLw2DEys zpMG9GKcg!{y?f6A%Z0c6)}4>Hd-w4CgN97js5hLO_EvYNv_&X2b_E|e<~@P&#HEj& z8y(+YSu1QFG$nlV7M4P-pOQ_5FP!z4vTRO2y}9P`hK=|CGZf177^ckLrmAzOQ+VrE zrqc_BH*Z@LzyGVy3yH%#eoFBI^M$u=cG6Z)dsq8~*Y|^bI)m_4(Fr^OYc5>t+^92a z!A{1*{S#d7F}$`;a1wr@cc8fCKz~Ewp8f-xyc!`cugYcO`9jl}i*9H9d}hDD)uv2y zTgMv(!?vzPYxd6G*nW)d!%xv;E1n4f;so$ow%~|~&r-rHLIWZCKJWH=Fo4os0<%ov; zJNNw5?5*ib&ivhM!0B%)RC@H@zw2H(mv>*CRH=B1U!`ki>(3L3XXB3EUlA=7zPD`0 z9l@~H>;>yrKham6GV|*m&Zk_7A5>%PC-F>mnrgFhlFwBp^WDxxv8Hi1>RR_KxOH-+ z%j0U4R{C`j~ zL<-1;FgmAI0T~b}APEtNGwht*foz}}AOh-zh(ov#HeB}o|C-WyP_3~IzZPv*fTfct&divI`(3miwX>F4#>br|y{J8x3_q9`@NtYfR zPRfoiYslSudTo4E;;s{`o_x8GnwNO+{05*i;!-moeL8#o-tP2*f|`!PJ*QXgI=*Jk zs-AtPHcngIcK7Yckm$t9mi(O3v?G_d9J;u^bwbPH4U=v@xZF9p^V;2WF1tnTfgz(_ z666=ma9zp&itqPjnFuGZhh zs*^+~sH|VS@cfGtQ>%0DPHVlA`io=9w0l{vFID|k*v_P|XVQ6XeQEYE(_as3^$)nj zoRgbcmT;0kU4NPMwUt_m&buxaB$lqrIaFhHl6~?^8wsmPUD2MOz8#KFYYW_G%vEyj z-ap+M)7=%dljLW`xOkL{Zn!sLcZPKOnTf5#fy z?f-A*xG>;IPIyGpbReG>NWXruoI~ zAKTJbr=+EAJM8oSzwG5}oN|$|4^w8Am#$aaDxSxA$UEY3^#-x1Lub`iaYh7la-V z9<(an?$!J9Ur%Q9s)I5mJMuWhW*T3Sc+1`+H6_upwYx2$^R|o86a&>szLy_PQv7j< z)oYjA+^UuL3g>%jZE$Xn=Q)_}7jSCp%H6A0>^?7|dSl_?^KB1St-W$pw~;UR;NP?a z?sq%cw>jkhIM)ZX?a&-$`~K(WLo&EZF6JKn{`hA>2A9&VH`_m*6X3IDs{N?<>7%gd zFV^or>^HD}KeoR`YUY(a-VxJ$*IcZ)oZ@48^T__sEcFNaS=gt2YXT_CfXVd~BG zVP)T5GaSE?%>M6;U`@l6w=5cB<{JWam^LN}XNV)`qM-$lQ;eE9r4w()VIae?eJu5TIF^=~Y-)#VUyY%HpC?BhBpm(lRR zYWc*s(*xhhGfhq7&M?(Ju+SxP$y2LpmKv8S-t(oF6bE&-J!s~r5K!e0e5v0m;^r0k zLT=`k$O%DVHeamvw=jG^CQx(0_Gbb|-Q#(G`Xtsoh+E_0Q&+#^_@8?Bd*c5YzIPsX Ud!v7c4^-NCy85}Sb4q9e0H2#ni~s-t literal 0 HcmV?d00001 diff --git a/assets/images/emoji/png/1f917.png b/assets/images/emoji/png/1f917.png new file mode 100644 index 0000000000000000000000000000000000000000..cb26c2c528d0083af4dd285d65491ca0dd0e5a40 GIT binary patch literal 1289 zcmV+k1@`)hP)^_4|J`S1PA9XLNB@U9HwU;nLg|BQK-dprM^ zcK@Aq|F>`dvT^^SbkDF;?0|6p$ZVyvvb?^Z|H5tK(0TYfx000AcNklDb$PP)B(Nl&_D(L_Ro^^ZA?NDhrumPbqSR@#Hg5Lt zS9=Y*coe809_#8)QRB3_{VSBR43`|&%$C!wBksf(6rv6Eu%7FUGG~yH2$LA zF{G41M1+N_iuqZ_>hCjbNTTQ)Rz7|jjZzQTE8QRF0@{#RbI4eCH2bcW5*sDkyb%Bl zqC&zXz)Gq%`nD*JVGn@0=suWOmSy&+2QF4S{o+SluDW%$oo7C{fzqV7ESX?PQ3!@N zz*;!XO#pM=udjn-=%Lh5F#w;!17LU5N(W^|iiz=%yCJ);^;aL@;VL)6*7kY;o7@{lrT(`de z+latL!WK`qc~{i`aE^feX1hW;?Bs~u0cEw_?A6YXtDmZybMY#zUb)EKtDowJuP9EC zg;8DdCavBm>nO|u2j%MrVORojTSQ9JdgRh7$7`ENDcTrV4(^ZJ{!B@yTJ?69-dDYf zPTAK{5jx>J_(jyI88{{E7^tI8;lp=vbl>0Kt3$0Mk-Y>b)YSdwg!@YaO=J;*>_He= zH0LJ1kw#h;ocSbssq7Q{;4F)@ly9Ol$2{s_IJ`^we!$?EwU~>}u!GFeJd$n#o}*>M z9)z-hXhaB>31}cX;{grGJv9FeFiX^d7E?)C5eHg5e8AId(2fm}jg%Y4hS;87ga=CV zsB`9nD-{=f=gh2C@*p~&$GX%3V-xy(ewEY6qSgU*WRY^OKgP^>E^RJ)b2Qy;W_*rQ zywDOb{~&rF?kxeK$5fmx<`5J&FOj&od6|j;<_mH0VG3TFg~i|sGaxXtvp*h8KM2F* zH#Z){#RE5fPsGsT \ No newline at end of file diff --git a/assets/images/emoji/svg/1f601.svg b/assets/images/emoji/svg/1f601.svg new file mode 100755 index 0000000..4508211 --- /dev/null +++ b/assets/images/emoji/svg/1f601.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f602.svg b/assets/images/emoji/svg/1f602.svg new file mode 100755 index 0000000..5c4b086 --- /dev/null +++ b/assets/images/emoji/svg/1f602.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f603.svg b/assets/images/emoji/svg/1f603.svg new file mode 100755 index 0000000..2a26280 --- /dev/null +++ b/assets/images/emoji/svg/1f603.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f604.svg b/assets/images/emoji/svg/1f604.svg new file mode 100755 index 0000000..047f4e1 --- /dev/null +++ b/assets/images/emoji/svg/1f604.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f605.svg b/assets/images/emoji/svg/1f605.svg new file mode 100755 index 0000000..66a0724 --- /dev/null +++ b/assets/images/emoji/svg/1f605.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f606.svg b/assets/images/emoji/svg/1f606.svg new file mode 100755 index 0000000..551cb14 --- /dev/null +++ b/assets/images/emoji/svg/1f606.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f607.svg b/assets/images/emoji/svg/1f607.svg new file mode 100755 index 0000000..ea77fb6 --- /dev/null +++ b/assets/images/emoji/svg/1f607.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f608.svg b/assets/images/emoji/svg/1f608.svg new file mode 100755 index 0000000..27bd712 --- /dev/null +++ b/assets/images/emoji/svg/1f608.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f609.svg b/assets/images/emoji/svg/1f609.svg new file mode 100755 index 0000000..f596fb8 --- /dev/null +++ b/assets/images/emoji/svg/1f609.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f60a.svg b/assets/images/emoji/svg/1f60a.svg new file mode 100755 index 0000000..3b884ac --- /dev/null +++ b/assets/images/emoji/svg/1f60a.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f60b.svg b/assets/images/emoji/svg/1f60b.svg new file mode 100755 index 0000000..713c0fc --- /dev/null +++ b/assets/images/emoji/svg/1f60b.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f60c.svg b/assets/images/emoji/svg/1f60c.svg new file mode 100755 index 0000000..1965287 --- /dev/null +++ b/assets/images/emoji/svg/1f60c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f60d.svg b/assets/images/emoji/svg/1f60d.svg new file mode 100755 index 0000000..e05ebcc --- /dev/null +++ b/assets/images/emoji/svg/1f60d.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f60e.svg b/assets/images/emoji/svg/1f60e.svg new file mode 100755 index 0000000..8306b98 --- /dev/null +++ b/assets/images/emoji/svg/1f60e.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f60f.svg b/assets/images/emoji/svg/1f60f.svg new file mode 100755 index 0000000..94a9c61 --- /dev/null +++ b/assets/images/emoji/svg/1f60f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f610.svg b/assets/images/emoji/svg/1f610.svg new file mode 100755 index 0000000..5884158 --- /dev/null +++ b/assets/images/emoji/svg/1f610.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f611.svg b/assets/images/emoji/svg/1f611.svg new file mode 100755 index 0000000..f0d6b9c --- /dev/null +++ b/assets/images/emoji/svg/1f611.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f612.svg b/assets/images/emoji/svg/1f612.svg new file mode 100755 index 0000000..214ef7f --- /dev/null +++ b/assets/images/emoji/svg/1f612.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f613.svg b/assets/images/emoji/svg/1f613.svg new file mode 100755 index 0000000..994b9b6 --- /dev/null +++ b/assets/images/emoji/svg/1f613.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f614.svg b/assets/images/emoji/svg/1f614.svg new file mode 100755 index 0000000..6ff03c5 --- /dev/null +++ b/assets/images/emoji/svg/1f614.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f615.svg b/assets/images/emoji/svg/1f615.svg new file mode 100755 index 0000000..6e95232 --- /dev/null +++ b/assets/images/emoji/svg/1f615.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f616.svg b/assets/images/emoji/svg/1f616.svg new file mode 100755 index 0000000..32aa8c9 --- /dev/null +++ b/assets/images/emoji/svg/1f616.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f617.svg b/assets/images/emoji/svg/1f617.svg new file mode 100755 index 0000000..3c7642c --- /dev/null +++ b/assets/images/emoji/svg/1f617.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f618.svg b/assets/images/emoji/svg/1f618.svg new file mode 100755 index 0000000..9825701 --- /dev/null +++ b/assets/images/emoji/svg/1f618.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f619.svg b/assets/images/emoji/svg/1f619.svg new file mode 100755 index 0000000..06efa19 --- /dev/null +++ b/assets/images/emoji/svg/1f619.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f61a.svg b/assets/images/emoji/svg/1f61a.svg new file mode 100755 index 0000000..41b66cb --- /dev/null +++ b/assets/images/emoji/svg/1f61a.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f61b.svg b/assets/images/emoji/svg/1f61b.svg new file mode 100755 index 0000000..4431bef --- /dev/null +++ b/assets/images/emoji/svg/1f61b.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f61c.svg b/assets/images/emoji/svg/1f61c.svg new file mode 100755 index 0000000..e291d3c --- /dev/null +++ b/assets/images/emoji/svg/1f61c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f61d.svg b/assets/images/emoji/svg/1f61d.svg new file mode 100755 index 0000000..57b9d38 --- /dev/null +++ b/assets/images/emoji/svg/1f61d.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f61e.svg b/assets/images/emoji/svg/1f61e.svg new file mode 100755 index 0000000..1ab9fbc --- /dev/null +++ b/assets/images/emoji/svg/1f61e.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f61f.svg b/assets/images/emoji/svg/1f61f.svg new file mode 100755 index 0000000..12a3af0 --- /dev/null +++ b/assets/images/emoji/svg/1f61f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f620.svg b/assets/images/emoji/svg/1f620.svg new file mode 100755 index 0000000..5acf333 --- /dev/null +++ b/assets/images/emoji/svg/1f620.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f621.svg b/assets/images/emoji/svg/1f621.svg new file mode 100755 index 0000000..a8c8e2a --- /dev/null +++ b/assets/images/emoji/svg/1f621.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f622.svg b/assets/images/emoji/svg/1f622.svg new file mode 100755 index 0000000..b40a671 --- /dev/null +++ b/assets/images/emoji/svg/1f622.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f623.svg b/assets/images/emoji/svg/1f623.svg new file mode 100755 index 0000000..070964e --- /dev/null +++ b/assets/images/emoji/svg/1f623.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f624.svg b/assets/images/emoji/svg/1f624.svg new file mode 100755 index 0000000..4c1ef04 --- /dev/null +++ b/assets/images/emoji/svg/1f624.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f625.svg b/assets/images/emoji/svg/1f625.svg new file mode 100755 index 0000000..3194fa0 --- /dev/null +++ b/assets/images/emoji/svg/1f625.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f626.svg b/assets/images/emoji/svg/1f626.svg new file mode 100755 index 0000000..bae8cd6 --- /dev/null +++ b/assets/images/emoji/svg/1f626.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f627.svg b/assets/images/emoji/svg/1f627.svg new file mode 100755 index 0000000..c8e5812 --- /dev/null +++ b/assets/images/emoji/svg/1f627.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f628.svg b/assets/images/emoji/svg/1f628.svg new file mode 100755 index 0000000..dcf7548 --- /dev/null +++ b/assets/images/emoji/svg/1f628.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f629.svg b/assets/images/emoji/svg/1f629.svg new file mode 100755 index 0000000..a169e56 --- /dev/null +++ b/assets/images/emoji/svg/1f629.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f62a.svg b/assets/images/emoji/svg/1f62a.svg new file mode 100755 index 0000000..c74fa3e --- /dev/null +++ b/assets/images/emoji/svg/1f62a.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f62b.svg b/assets/images/emoji/svg/1f62b.svg new file mode 100755 index 0000000..13d66fa --- /dev/null +++ b/assets/images/emoji/svg/1f62b.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f62c.svg b/assets/images/emoji/svg/1f62c.svg new file mode 100755 index 0000000..ace1c3c --- /dev/null +++ b/assets/images/emoji/svg/1f62c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f62d.svg b/assets/images/emoji/svg/1f62d.svg new file mode 100755 index 0000000..ddffc32 --- /dev/null +++ b/assets/images/emoji/svg/1f62d.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f62e.svg b/assets/images/emoji/svg/1f62e.svg new file mode 100755 index 0000000..88fdd32 --- /dev/null +++ b/assets/images/emoji/svg/1f62e.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f62f.svg b/assets/images/emoji/svg/1f62f.svg new file mode 100755 index 0000000..895b15c --- /dev/null +++ b/assets/images/emoji/svg/1f62f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f630.svg b/assets/images/emoji/svg/1f630.svg new file mode 100755 index 0000000..d68e2ba --- /dev/null +++ b/assets/images/emoji/svg/1f630.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f631.svg b/assets/images/emoji/svg/1f631.svg new file mode 100755 index 0000000..b5f772e --- /dev/null +++ b/assets/images/emoji/svg/1f631.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f632.svg b/assets/images/emoji/svg/1f632.svg new file mode 100755 index 0000000..58f83d3 --- /dev/null +++ b/assets/images/emoji/svg/1f632.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f633.svg b/assets/images/emoji/svg/1f633.svg new file mode 100755 index 0000000..cb21ceb --- /dev/null +++ b/assets/images/emoji/svg/1f633.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f634.svg b/assets/images/emoji/svg/1f634.svg new file mode 100755 index 0000000..408ebe2 --- /dev/null +++ b/assets/images/emoji/svg/1f634.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f635.svg b/assets/images/emoji/svg/1f635.svg new file mode 100755 index 0000000..3ed3525 --- /dev/null +++ b/assets/images/emoji/svg/1f635.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f636.svg b/assets/images/emoji/svg/1f636.svg new file mode 100755 index 0000000..6a07bac --- /dev/null +++ b/assets/images/emoji/svg/1f636.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f637.svg b/assets/images/emoji/svg/1f637.svg new file mode 100755 index 0000000..80a2c6c --- /dev/null +++ b/assets/images/emoji/svg/1f637.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f638.svg b/assets/images/emoji/svg/1f638.svg new file mode 100755 index 0000000..f92e756 --- /dev/null +++ b/assets/images/emoji/svg/1f638.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f639.svg b/assets/images/emoji/svg/1f639.svg new file mode 100755 index 0000000..86b16f3 --- /dev/null +++ b/assets/images/emoji/svg/1f639.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f640.svg b/assets/images/emoji/svg/1f640.svg new file mode 100755 index 0000000..42210ac --- /dev/null +++ b/assets/images/emoji/svg/1f640.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f641.svg b/assets/images/emoji/svg/1f641.svg new file mode 100755 index 0000000..1beb89c --- /dev/null +++ b/assets/images/emoji/svg/1f641.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f642.svg b/assets/images/emoji/svg/1f642.svg new file mode 100755 index 0000000..23b1e7e --- /dev/null +++ b/assets/images/emoji/svg/1f642.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f643.svg b/assets/images/emoji/svg/1f643.svg new file mode 100755 index 0000000..fc78562 --- /dev/null +++ b/assets/images/emoji/svg/1f643.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f644.svg b/assets/images/emoji/svg/1f644.svg new file mode 100755 index 0000000..94c7269 --- /dev/null +++ b/assets/images/emoji/svg/1f644.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f910.svg b/assets/images/emoji/svg/1f910.svg new file mode 100755 index 0000000..2c2e27b --- /dev/null +++ b/assets/images/emoji/svg/1f910.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f911.svg b/assets/images/emoji/svg/1f911.svg new file mode 100755 index 0000000..9c47904 --- /dev/null +++ b/assets/images/emoji/svg/1f911.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f912.svg b/assets/images/emoji/svg/1f912.svg new file mode 100755 index 0000000..dcb6ea7 --- /dev/null +++ b/assets/images/emoji/svg/1f912.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f913.svg b/assets/images/emoji/svg/1f913.svg new file mode 100755 index 0000000..c6ea98b --- /dev/null +++ b/assets/images/emoji/svg/1f913.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f914.svg b/assets/images/emoji/svg/1f914.svg new file mode 100755 index 0000000..4ff8721 --- /dev/null +++ b/assets/images/emoji/svg/1f914.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f915.svg b/assets/images/emoji/svg/1f915.svg new file mode 100755 index 0000000..d40a8a4 --- /dev/null +++ b/assets/images/emoji/svg/1f915.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f916.svg b/assets/images/emoji/svg/1f916.svg new file mode 100755 index 0000000..ec03572 --- /dev/null +++ b/assets/images/emoji/svg/1f916.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/emoji/svg/1f917.svg b/assets/images/emoji/svg/1f917.svg new file mode 100755 index 0000000..505de9e --- /dev/null +++ b/assets/images/emoji/svg/1f917.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/loader.gif b/assets/images/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..c48e97e6f9a7cb7e717cee4b7c2a5fd751b4f78d GIT binary patch literal 743 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 literal 0 HcmV?d00001 diff --git a/assets/images/nophoto.jpg b/assets/images/nophoto.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f7cfe24bc765044d42c722654b0d605a33f25f06 GIT binary patch literal 3003 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 5) delay = 500; + if (zira_autocomplete.iterator >= 10) delay = 1000; + zira_autocomplete.timer = window.setTimeout(zira_bind(this, function(){ + zira_autocomplete.inprogress = true; + zira_autocomplete.iterator++; + $.post(zira_autocomplete.url,{ + 'text': zira_autocomplete.text, + 'token': zira_autocomplete.token + },zira_bind(this, function(response){ + zira_autocomplete.inprogress = false; + if (!response) return; + if (typeof(response.error)!="undefined") { + zira_error(response.error); + } else if (typeof(response.items)!="undefined") { + zira_autocomplete.items = response.items; + zira_autocomplete_open.call(this, response.items); + } + if ($(this).val() != zira_autocomplete.text) { + zira_autocomplete.call(this); + } + }),'json'); + }), delay); + + $(this).data('autocomplete_id',null); + $(this).data('autocomplete_text',null); + }; + + zira_autocomplete_focus = function() { + if (typeof(zira_autocomplete.inprogress)!="undefined" && zira_autocomplete.inprogress) return; + if (typeof(zira_autocomplete.text)!="undefined" && zira_autocomplete.text==$(this).val() && + typeof(zira_autocomplete.url)!="undefined" && zira_autocomplete.url==$(this).data('url') && + typeof(zira_autocomplete.token)!="undefined" && zira_autocomplete.token==$(this).data('token') && + typeof(zira_autocomplete.items)!="undefined" + ) { + zira_autocomplete_open.call(this, zira_autocomplete.items); + } + }; + + zira_autocomplete_open = function(items) { + zira_autocomplete_close.call(this); + $('body').append('

    '); + for (var i in items) { + $('.zira-autocomplete-wnd').append('
  • '+items[i]+'
  • '); + } + $('.zira-autocomplete-wnd').css({ + 'position': 'absolute', + 'top': $(this).offset().top + $(this).outerHeight(), + 'left': $(this).offset().left + }); + zira_autocomplete_click.input = this; + $('body').mousedown(zira_autocomplete_click); + $('body').keyup(zira_autocomplete_press); + $('.zira-autocomplete-wnd a').click(zira_autocomplete_select); + $(this).parents('form').submit(zira_autocomplete_prevent_submit); + }; + + zira_autocomplete_close = function() { + $('.zira-autocomplete-wnd').remove(); + $('body').unbind('click',zira_autocomplete_click); + $('body').unbind('keyup',zira_autocomplete_press); + $(this).parents('form').unbind('submit',zira_autocomplete_prevent_submit); + }; + + zira_autocomplete_click = function(e) { + if (typeof(e.originalEvent)=="undefined" || typeof(e.originalEvent.target)=="undefined") return; + if ($(e.originalEvent.target).parents('.zira-autocomplete-wnd').length==0 && + !$(e.originalEvent.target).is(zira_autocomplete_click.input) + ) { + zira_autocomplete_close.call(zira_autocomplete_click.input); + } + }; + + zira_autocomplete_select = function(e) { + var text = $(this).text(); + var id = $(this).data('id'); + $(zira_autocomplete_click.input).val(text); + $(zira_autocomplete_click.input).data('autocomplete_id',id); + $(zira_autocomplete_click.input).data('autocomplete_text',text); + zira_autocomplete_close.call(zira_autocomplete_click.input); + }; + + zira_autocomplete_press = function(e) { + if (e.keyCode == 40) { // arrow down + e.stopPropagation(); + e.preventDefault(); + var active = $('.zira-autocomplete-wnd li a.active'); + if ($(active).length==0) { + $('.zira-autocomplete-wnd li:first-child a').addClass('active'); + } else { + $(active).removeClass('active'); + var next = $(active).parent('li').next('li'); + if ($(next).length==0) { + $('.zira-autocomplete-wnd li:first-child a').addClass('active'); + } else { + $(next).children('a').addClass('active'); + } + } + } else if (e.keyCode == 38) { // arrow up + e.stopPropagation(); + e.preventDefault(); + var active = $('.zira-autocomplete-wnd li a.active'); + if ($(active).length==0) { + $('.zira-autocomplete-wnd li:last-child a').addClass('active'); + } else { + $(active).removeClass('active'); + var prev = $(active).parent('li').prev('li'); + if ($(prev).length==0) { + $('.zira-autocomplete-wnd li:last-child a').addClass('active'); + } else { + $(prev).children('a').addClass('active'); + } + } + } else if (e.keyCode == 13 || e.keyCode == 39) { // enter or arrow right + var active = $('.zira-autocomplete-wnd li a.active'); + if ($(active).length!=0) { + e.stopPropagation(); + e.preventDefault(); + zira_autocomplete_select.call($(active)); + } + } + }; + + zira_autocomplete_prevent_submit = function(e) { + e.stopPropagation(); + e.preventDefault(); + e.keyCode = 13; + zira_autocomplete_press.call(this, e); + }; +})(jQuery); \ No newline at end of file diff --git a/assets/js/bootstrap-datetimepicker.min.js b/assets/js/bootstrap-datetimepicker.min.js new file mode 100644 index 0000000..db3d085 --- /dev/null +++ b/assets/js/bootstrap-datetimepicker.min.js @@ -0,0 +1,9 @@ +/*! version : 4.17.37 + ========================================================= + bootstrap-datetimejs + https://github.com/Eonasdan/bootstrap-datetimepicker + Copyright (c) 2015 Jonathan Peterson + ========================================================= + */ +!function(a){"use strict";if("function"==typeof define&&define.amd)define(["jquery","moment"],a);else if("object"==typeof exports)a(require("jquery"),require("moment"));else{if("undefined"==typeof jQuery)throw"bootstrap-datetimepicker requires jQuery to be loaded first";if("undefined"==typeof moment)throw"bootstrap-datetimepicker requires Moment.js to be loaded first";a(jQuery,moment)}}(function(a,b){"use strict";if(!b)throw new Error("bootstrap-datetimepicker requires Moment.js to be loaded first");var c=function(c,d){var e,f,g,h,i,j,k,l={},m=!0,n=!1,o=!1,p=0,q=[{clsName:"days",navFnc:"M",navStep:1},{clsName:"months",navFnc:"y",navStep:1},{clsName:"years",navFnc:"y",navStep:10},{clsName:"decades",navFnc:"y",navStep:100}],r=["days","months","years","decades"],s=["top","bottom","auto"],t=["left","right","auto"],u=["default","top","bottom"],v={up:38,38:"up",down:40,40:"down",left:37,37:"left",right:39,39:"right",tab:9,9:"tab",escape:27,27:"escape",enter:13,13:"enter",pageUp:33,33:"pageUp",pageDown:34,34:"pageDown",shift:16,16:"shift",control:17,17:"control",space:32,32:"space",t:84,84:"t","delete":46,46:"delete"},w={},x=function(a){var c,e,f,g,h,i=!1;return void 0!==b.tz&&void 0!==d.timeZone&&null!==d.timeZone&&""!==d.timeZone&&(i=!0),void 0===a||null===a?c=i?b().tz(d.timeZone).startOf("d"):b().startOf("d"):i?(e=b().tz(d.timeZone).utcOffset(),f=b(a,j,d.useStrict).utcOffset(),f!==e?(g=b().tz(d.timeZone).format("Z"),h=b(a,j,d.useStrict).format("YYYY-MM-DD[T]HH:mm:ss")+g,c=b(h,j,d.useStrict).tz(d.timeZone)):c=b(a,j,d.useStrict).tz(d.timeZone)):c=b(a,j,d.useStrict),c},y=function(a){if("string"!=typeof a||a.length>1)throw new TypeError("isEnabled expects a single character string parameter");switch(a){case"y":return-1!==i.indexOf("Y");case"M":return-1!==i.indexOf("M");case"d":return-1!==i.toLowerCase().indexOf("d");case"h":case"H":return-1!==i.toLowerCase().indexOf("h");case"m":return-1!==i.indexOf("m");case"s":return-1!==i.indexOf("s");default:return!1}},z=function(){return y("h")||y("m")||y("s")},A=function(){return y("y")||y("M")||y("d")},B=function(){var b=a("").append(a("").append(a("").addClass("prev").attr("data-action","previous").append(a("").addClass(d.icons.previous))).append(a("").addClass("picker-switch").attr("data-action","pickerSwitch").attr("colspan",d.calendarWeeks?"6":"5")).append(a("").addClass("next").attr("data-action","next").append(a("").addClass(d.icons.next)))),c=a("").append(a("").append(a("").attr("colspan",d.calendarWeeks?"8":"7")));return[a("
    ").addClass("datepicker-days").append(a("").addClass("table-condensed").append(b).append(a(""))),a("
    ").addClass("datepicker-months").append(a("
    ").addClass("table-condensed").append(b.clone()).append(c.clone())),a("
    ").addClass("datepicker-years").append(a("
    ").addClass("table-condensed").append(b.clone()).append(c.clone())),a("
    ").addClass("datepicker-decades").append(a("
    ").addClass("table-condensed").append(b.clone()).append(c.clone()))]},C=function(){var b=a(""),c=a(""),e=a("");return y("h")&&(b.append(a(""}var d,e,f,g,h,k,l,m=this,n=m._id,o=0;for(d=c(),d.push({text:tinymce.translate("No color"),color:"transparent"}),f='
    ").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.incrementHour}).addClass("btn").attr("data-action","incrementHours").append(a("").addClass(d.icons.up)))),c.append(a("").append(a("").addClass("timepicker-hour").attr({"data-time-component":"hours",title:d.tooltips.pickHour}).attr("data-action","showHours"))),e.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.decrementHour}).addClass("btn").attr("data-action","decrementHours").append(a("").addClass(d.icons.down))))),y("m")&&(y("h")&&(b.append(a("").addClass("separator")),c.append(a("").addClass("separator").html(":")),e.append(a("").addClass("separator"))),b.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.incrementMinute}).addClass("btn").attr("data-action","incrementMinutes").append(a("").addClass(d.icons.up)))),c.append(a("").append(a("").addClass("timepicker-minute").attr({"data-time-component":"minutes",title:d.tooltips.pickMinute}).attr("data-action","showMinutes"))),e.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.decrementMinute}).addClass("btn").attr("data-action","decrementMinutes").append(a("").addClass(d.icons.down))))),y("s")&&(y("m")&&(b.append(a("").addClass("separator")),c.append(a("").addClass("separator").html(":")),e.append(a("").addClass("separator"))),b.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.incrementSecond}).addClass("btn").attr("data-action","incrementSeconds").append(a("").addClass(d.icons.up)))),c.append(a("").append(a("").addClass("timepicker-second").attr({"data-time-component":"seconds",title:d.tooltips.pickSecond}).attr("data-action","showSeconds"))),e.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.decrementSecond}).addClass("btn").attr("data-action","decrementSeconds").append(a("").addClass(d.icons.down))))),h||(b.append(a("").addClass("separator")),c.append(a("").append(a("").addClass("separator"))),a("
    ").addClass("timepicker-picker").append(a("").addClass("table-condensed").append([b,c,e]))},D=function(){var b=a("
    ").addClass("timepicker-hours").append(a("
    ").addClass("table-condensed")),c=a("
    ").addClass("timepicker-minutes").append(a("
    ").addClass("table-condensed")),d=a("
    ").addClass("timepicker-seconds").append(a("
    ").addClass("table-condensed")),e=[C()];return y("h")&&e.push(b),y("m")&&e.push(c),y("s")&&e.push(d),e},E=function(){var b=[];return d.showTodayButton&&b.push(a("\s*$/g,ra={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"
    ").append(a("").attr({"data-action":"today",title:d.tooltips.today}).append(a("").addClass(d.icons.today)))),!d.sideBySide&&A()&&z()&&b.push(a("").append(a("").attr({"data-action":"togglePicker",title:d.tooltips.selectTime}).append(a("").addClass(d.icons.time)))),d.showClear&&b.push(a("").append(a("").attr({"data-action":"clear",title:d.tooltips.clear}).append(a("").addClass(d.icons.clear)))),d.showClose&&b.push(a("").append(a("").attr({"data-action":"close",title:d.tooltips.close}).append(a("").addClass(d.icons.close)))),a("").addClass("table-condensed").append(a("").append(a("").append(b)))},F=function(){var b=a("
    ").addClass("bootstrap-datetimepicker-widget dropdown-menu"),c=a("
    ").addClass("datepicker").append(B()),e=a("
    ").addClass("timepicker").append(D()),f=a("
      ").addClass("list-unstyled"),g=a("
    • ").addClass("picker-switch"+(d.collapse?" accordion-toggle":"")).append(E());return d.inline&&b.removeClass("dropdown-menu"),h&&b.addClass("usetwentyfour"),y("s")&&!h&&b.addClass("wider"),d.sideBySide&&A()&&z()?(b.addClass("timepicker-sbs"),"top"===d.toolbarPlacement&&b.append(g),b.append(a("
      ").addClass("row").append(c.addClass("col-md-6")).append(e.addClass("col-md-6"))),"bottom"===d.toolbarPlacement&&b.append(g),b):("top"===d.toolbarPlacement&&f.append(g),A()&&f.append(a("
    • ").addClass(d.collapse&&z()?"collapse in":"").append(c)),"default"===d.toolbarPlacement&&f.append(g),z()&&f.append(a("
    • ").addClass(d.collapse&&A()?"collapse":"").append(e)),"bottom"===d.toolbarPlacement&&f.append(g),b.append(f))},G=function(){var b,e={};return b=c.is("input")||d.inline?c.data():c.find("input").data(),b.dateOptions&&b.dateOptions instanceof Object&&(e=a.extend(!0,e,b.dateOptions)),a.each(d,function(a){var c="date"+a.charAt(0).toUpperCase()+a.slice(1);void 0!==b[c]&&(e[a]=b[c])}),e},H=function(){var b,e=(n||c).position(),f=(n||c).offset(),g=d.widgetPositioning.vertical,h=d.widgetPositioning.horizontal;if(d.widgetParent)b=d.widgetParent.append(o);else if(c.is("input"))b=c.after(o).parent();else{if(d.inline)return void(b=c.append(o));b=c,c.children().first().after(o)}if("auto"===g&&(g=f.top+1.5*o.height()>=a(window).height()+a(window).scrollTop()&&o.height()+c.outerHeight()a(window).width()?"right":"left"),"top"===g?o.addClass("top").removeClass("bottom"):o.addClass("bottom").removeClass("top"),"right"===h?o.addClass("pull-right"):o.removeClass("pull-right"),"relative"!==b.css("position")&&(b=b.parents().filter(function(){return"relative"===a(this).css("position")}).first()),0===b.length)throw new Error("datetimepicker component should be placed within a relative positioned container");o.css({top:"top"===g?"auto":e.top+c.outerHeight(),bottom:"top"===g?e.top+c.outerHeight():"auto",left:"left"===h?b===c?0:e.left:"auto",right:"left"===h?"auto":b.outerWidth()-c.outerWidth()-(b===c?0:e.left)})},I=function(a){"dp.change"===a.type&&(a.date&&a.date.isSame(a.oldDate)||!a.date&&!a.oldDate)||c.trigger(a)},J=function(a){"y"===a&&(a="YYYY"),I({type:"dp.update",change:a,viewDate:f.clone()})},K=function(a){o&&(a&&(k=Math.max(p,Math.min(3,k+a))),o.find(".datepicker > div").hide().filter(".datepicker-"+q[k].clsName).show())},L=function(){var b=a("
    "),c=f.clone().startOf("w").startOf("d");for(d.calendarWeeks===!0&&b.append(a(""),d.calendarWeeks&&c.append('"),k.push(c)),g="",b.isBefore(f,"M")&&(g+=" old"),b.isAfter(f,"M")&&(g+=" new"),b.isSame(e,"d")&&!m&&(g+=" active"),Q(b,"d")||(g+=" disabled"),b.isSame(x(),"d")&&(g+=" today"),(0===b.day()||6===b.day())&&(g+=" weekend"),c.append('"),b.add(1,"d");i.find("tbody").empty().append(k),S(),T(),U()}},W=function(){var b=o.find(".timepicker-hours table"),c=f.clone().startOf("d"),d=[],e=a("");for(f.hour()>11&&!h&&c.hour(12);c.isSame(f,"d")&&(h||f.hour()<12&&c.hour()<12||f.hour()>11);)c.hour()%4===0&&(e=a(""),d.push(e)),e.append('"),c.add(1,"h");b.empty().append(d)},X=function(){for(var b=o.find(".timepicker-minutes table"),c=f.clone().startOf("h"),e=[],g=a(""),h=1===d.stepping?5:d.stepping;f.isSame(c,"h");)c.minute()%(4*h)===0&&(g=a(""),e.push(g)),g.append('"),c.add(h,"m");b.empty().append(e)},Y=function(){for(var b=o.find(".timepicker-seconds table"),c=f.clone().startOf("m"),d=[],e=a("");f.isSame(c,"m");)c.second()%20===0&&(e=a(""),d.push(e)),e.append('"),c.add(5,"s");b.empty().append(d)},Z=function(){var a,b,c=o.find(".timepicker span[data-time-component]");h||(a=o.find(".timepicker [data-action=togglePeriod]"),b=e.clone().add(e.hours()>=12?-12:12,"h"),a.text(e.format("A")),Q(b,"h")?a.removeClass("disabled"):a.addClass("disabled")),c.filter("[data-time-component=hours]").text(e.format(h?"HH":"hh")),c.filter("[data-time-component=minutes]").text(e.format("mm")),c.filter("[data-time-component=seconds]").text(e.format("ss")),W(),X(),Y()},$=function(){o&&(V(),Z())},_=function(a){var b=m?null:e;return a?(a=a.clone().locale(d.locale),1!==d.stepping&&a.minutes(Math.round(a.minutes()/d.stepping)*d.stepping%60).seconds(0),void(Q(a)?(e=a,f=e.clone(),g.val(e.format(i)),c.data("date",e.format(i)),m=!1,$(),I({type:"dp.change",date:e.clone(),oldDate:b})):(d.keepInvalid||g.val(m?"":e.format(i)),I({type:"dp.error",date:a})))):(m=!0,g.val(""),c.data("date",""),I({type:"dp.change",date:!1,oldDate:b}),void $())},aa=function(){var b=!1;return o?(o.find(".collapse").each(function(){var c=a(this).data("collapse");return c&&c.transitioning?(b=!0,!1):!0}),b?l:(n&&n.hasClass("btn")&&n.toggleClass("active"),o.hide(),a(window).off("resize",H),o.off("click","[data-action]"),o.off("mousedown",!1),o.remove(),o=!1,I({type:"dp.hide",date:e.clone()}),g.blur(),l)):l},ba=function(){_(null)},ca={next:function(){var a=q[k].navFnc;f.add(q[k].navStep,a),V(),J(a)},previous:function(){var a=q[k].navFnc;f.subtract(q[k].navStep,a),V(),J(a)},pickerSwitch:function(){K(1)},selectMonth:function(b){var c=a(b.target).closest("tbody").find("span").index(a(b.target));f.month(c),k===p?(_(e.clone().year(f.year()).month(f.month())),d.inline||aa()):(K(-1),V()),J("M")},selectYear:function(b){var c=parseInt(a(b.target).text(),10)||0;f.year(c),k===p?(_(e.clone().year(f.year())),d.inline||aa()):(K(-1),V()),J("YYYY")},selectDecade:function(b){var c=parseInt(a(b.target).data("selection"),10)||0;f.year(c),k===p?(_(e.clone().year(f.year())),d.inline||aa()):(K(-1),V()),J("YYYY")},selectDay:function(b){var c=f.clone();a(b.target).is(".old")&&c.subtract(1,"M"),a(b.target).is(".new")&&c.add(1,"M"),_(c.date(parseInt(a(b.target).text(),10))),z()||d.keepOpen||d.inline||aa()},incrementHours:function(){var a=e.clone().add(1,"h");Q(a,"h")&&_(a)},incrementMinutes:function(){var a=e.clone().add(d.stepping,"m");Q(a,"m")&&_(a)},incrementSeconds:function(){var a=e.clone().add(1,"s");Q(a,"s")&&_(a)},decrementHours:function(){var a=e.clone().subtract(1,"h");Q(a,"h")&&_(a)},decrementMinutes:function(){var a=e.clone().subtract(d.stepping,"m");Q(a,"m")&&_(a)},decrementSeconds:function(){var a=e.clone().subtract(1,"s");Q(a,"s")&&_(a)},togglePeriod:function(){_(e.clone().add(e.hours()>=12?-12:12,"h"))},togglePicker:function(b){var c,e=a(b.target),f=e.closest("ul"),g=f.find(".in"),h=f.find(".collapse:not(.in)");if(g&&g.length){if(c=g.data("collapse"),c&&c.transitioning)return;g.collapse?(g.collapse("hide"),h.collapse("show")):(g.removeClass("in"),h.addClass("in")),e.is("span")?e.toggleClass(d.icons.time+" "+d.icons.date):e.find("span").toggleClass(d.icons.time+" "+d.icons.date)}},showPicker:function(){o.find(".timepicker > div:not(.timepicker-picker)").hide(),o.find(".timepicker .timepicker-picker").show()},showHours:function(){o.find(".timepicker .timepicker-picker").hide(),o.find(".timepicker .timepicker-hours").show()},showMinutes:function(){o.find(".timepicker .timepicker-picker").hide(),o.find(".timepicker .timepicker-minutes").show()},showSeconds:function(){o.find(".timepicker .timepicker-picker").hide(),o.find(".timepicker .timepicker-seconds").show()},selectHour:function(b){var c=parseInt(a(b.target).text(),10);h||(e.hours()>=12?12!==c&&(c+=12):12===c&&(c=0)),_(e.clone().hours(c)),ca.showPicker.call(l)},selectMinute:function(b){_(e.clone().minutes(parseInt(a(b.target).text(),10))),ca.showPicker.call(l)},selectSecond:function(b){_(e.clone().seconds(parseInt(a(b.target).text(),10))),ca.showPicker.call(l)},clear:ba,today:function(){var a=x();Q(a,"d")&&_(a)},close:aa},da=function(b){return a(b.currentTarget).is(".disabled")?!1:(ca[a(b.currentTarget).data("action")].apply(l,arguments),!1)},ea=function(){var b,c={year:function(a){return a.month(0).date(1).hours(0).seconds(0).minutes(0)},month:function(a){return a.date(1).hours(0).seconds(0).minutes(0)},day:function(a){return a.hours(0).seconds(0).minutes(0)},hour:function(a){return a.seconds(0).minutes(0)},minute:function(a){return a.seconds(0)}};return g.prop("disabled")||!d.ignoreReadonly&&g.prop("readonly")||o?l:(void 0!==g.val()&&0!==g.val().trim().length?_(ga(g.val().trim())):d.useCurrent&&m&&(g.is("input")&&0===g.val().trim().length||d.inline)&&(b=x(),"string"==typeof d.useCurrent&&(b=c[d.useCurrent](b)),_(b)),o=F(),L(),R(),o.find(".timepicker-hours").hide(),o.find(".timepicker-minutes").hide(),o.find(".timepicker-seconds").hide(),$(),K(),a(window).on("resize",H),o.on("click","[data-action]",da),o.on("mousedown",!1),n&&n.hasClass("btn")&&n.toggleClass("active"),o.show(),H(),d.focusOnShow&&!g.is(":focus")&&g.focus(),I({type:"dp.show"}),l)},fa=function(){return o?aa():ea()},ga=function(a){return a=void 0===d.parseInputDate?b.isMoment(a)||a instanceof Date?b(a):x(a):d.parseInputDate(a),a.locale(d.locale),a},ha=function(a){var b,c,e,f,g=null,h=[],i={},j=a.which,k="p";w[j]=k;for(b in w)w.hasOwnProperty(b)&&w[b]===k&&(h.push(b),parseInt(b,10)!==j&&(i[b]=!0));for(b in d.keyBinds)if(d.keyBinds.hasOwnProperty(b)&&"function"==typeof d.keyBinds[b]&&(e=b.split(" "),e.length===h.length&&v[j]===e[e.length-1])){for(f=!0,c=e.length-2;c>=0;c--)if(!(v[e[c]]in i)){f=!1;break}if(f){g=d.keyBinds[b];break}}g&&(g.call(l,o),a.stopPropagation(),a.preventDefault())},ia=function(a){w[a.which]="r",a.stopPropagation(),a.preventDefault()},ja=function(b){var c=a(b.target).val().trim(),d=c?ga(c):null;return _(d),b.stopImmediatePropagation(),!1},ka=function(){g.on({change:ja,blur:d.debug?"":aa,keydown:ha,keyup:ia,focus:d.allowInputToggle?ea:""}),c.is("input")?g.on({focus:ea}):n&&(n.on("click",fa),n.on("mousedown",!1))},la=function(){g.off({change:ja,blur:blur,keydown:ha,keyup:ia,focus:d.allowInputToggle?aa:""}),c.is("input")?g.off({focus:ea}):n&&(n.off("click",fa),n.off("mousedown",!1))},ma=function(b){var c={};return a.each(b,function(){var a=ga(this);a.isValid()&&(c[a.format("YYYY-MM-DD")]=!0)}),Object.keys(c).length?c:!1},na=function(b){var c={};return a.each(b,function(){c[this]=!0}),Object.keys(c).length?c:!1},oa=function(){var a=d.format||"L LT";i=a.replace(/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,function(a){var b=e.localeData().longDateFormat(a)||a;return b.replace(/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,function(a){return e.localeData().longDateFormat(a)||a})}),j=d.extraFormats?d.extraFormats.slice():[],j.indexOf(a)<0&&j.indexOf(i)<0&&j.push(i),h=i.toLowerCase().indexOf("a")<1&&i.replace(/\[.*?\]/g,"").indexOf("h")<1,y("y")&&(p=2),y("M")&&(p=1),y("d")&&(p=0),k=Math.max(p,k),m||_(e)};if(l.destroy=function(){aa(),la(),c.removeData("DateTimePicker"),c.removeData("date")},l.toggle=fa,l.show=ea,l.hide=aa,l.disable=function(){return aa(),n&&n.hasClass("btn")&&n.addClass("disabled"),g.prop("disabled",!0),l},l.enable=function(){return n&&n.hasClass("btn")&&n.removeClass("disabled"),g.prop("disabled",!1),l},l.ignoreReadonly=function(a){if(0===arguments.length)return d.ignoreReadonly;if("boolean"!=typeof a)throw new TypeError("ignoreReadonly () expects a boolean parameter");return d.ignoreReadonly=a,l},l.options=function(b){if(0===arguments.length)return a.extend(!0,{},d);if(!(b instanceof Object))throw new TypeError("options() options parameter should be an object");return a.extend(!0,d,b),a.each(d,function(a,b){if(void 0===l[a])throw new TypeError("option "+a+" is not recognized!");l[a](b)}),l},l.date=function(a){if(0===arguments.length)return m?null:e.clone();if(!(null===a||"string"==typeof a||b.isMoment(a)||a instanceof Date))throw new TypeError("date() parameter must be one of [null, string, moment or Date]");return _(null===a?null:ga(a)),l},l.format=function(a){if(0===arguments.length)return d.format;if("string"!=typeof a&&("boolean"!=typeof a||a!==!1))throw new TypeError("format() expects a sting or boolean:false parameter "+a);return d.format=a,i&&oa(),l},l.timeZone=function(a){return 0===arguments.length?d.timeZone:(d.timeZone=a,l)},l.dayViewHeaderFormat=function(a){if(0===arguments.length)return d.dayViewHeaderFormat;if("string"!=typeof a)throw new TypeError("dayViewHeaderFormat() expects a string parameter");return d.dayViewHeaderFormat=a,l},l.extraFormats=function(a){if(0===arguments.length)return d.extraFormats;if(a!==!1&&!(a instanceof Array))throw new TypeError("extraFormats() expects an array or false parameter");return d.extraFormats=a,j&&oa(),l},l.disabledDates=function(b){if(0===arguments.length)return d.disabledDates?a.extend({},d.disabledDates):d.disabledDates;if(!b)return d.disabledDates=!1,$(),l;if(!(b instanceof Array))throw new TypeError("disabledDates() expects an array parameter");return d.disabledDates=ma(b),d.enabledDates=!1,$(),l},l.enabledDates=function(b){if(0===arguments.length)return d.enabledDates?a.extend({},d.enabledDates):d.enabledDates;if(!b)return d.enabledDates=!1,$(),l;if(!(b instanceof Array))throw new TypeError("enabledDates() expects an array parameter");return d.enabledDates=ma(b),d.disabledDates=!1,$(),l},l.daysOfWeekDisabled=function(a){if(0===arguments.length)return d.daysOfWeekDisabled.splice(0);if("boolean"==typeof a&&!a)return d.daysOfWeekDisabled=!1,$(),l;if(!(a instanceof Array))throw new TypeError("daysOfWeekDisabled() expects an array parameter");if(d.daysOfWeekDisabled=a.reduce(function(a,b){return b=parseInt(b,10),b>6||0>b||isNaN(b)?a:(-1===a.indexOf(b)&&a.push(b),a)},[]).sort(),d.useCurrent&&!d.keepInvalid){for(var b=0;!Q(e,"d");){if(e.add(1,"d"),7===b)throw"Tried 7 times to find a valid date";b++}_(e)}return $(),l},l.maxDate=function(a){if(0===arguments.length)return d.maxDate?d.maxDate.clone():d.maxDate;if("boolean"==typeof a&&a===!1)return d.maxDate=!1,$(),l;"string"==typeof a&&("now"===a||"moment"===a)&&(a=x());var b=ga(a);if(!b.isValid())throw new TypeError("maxDate() Could not parse date parameter: "+a);if(d.minDate&&b.isBefore(d.minDate))throw new TypeError("maxDate() date parameter is before options.minDate: "+b.format(i));return d.maxDate=b,d.useCurrent&&!d.keepInvalid&&e.isAfter(a)&&_(d.maxDate),f.isAfter(b)&&(f=b.clone().subtract(d.stepping,"m")),$(),l},l.minDate=function(a){if(0===arguments.length)return d.minDate?d.minDate.clone():d.minDate;if("boolean"==typeof a&&a===!1)return d.minDate=!1,$(),l;"string"==typeof a&&("now"===a||"moment"===a)&&(a=x());var b=ga(a);if(!b.isValid())throw new TypeError("minDate() Could not parse date parameter: "+a);if(d.maxDate&&b.isAfter(d.maxDate))throw new TypeError("minDate() date parameter is after options.maxDate: "+b.format(i));return d.minDate=b,d.useCurrent&&!d.keepInvalid&&e.isBefore(a)&&_(d.minDate),f.isBefore(b)&&(f=b.clone().add(d.stepping,"m")),$(),l},l.defaultDate=function(a){if(0===arguments.length)return d.defaultDate?d.defaultDate.clone():d.defaultDate;if(!a)return d.defaultDate=!1,l;"string"==typeof a&&("now"===a||"moment"===a)&&(a=x());var b=ga(a);if(!b.isValid())throw new TypeError("defaultDate() Could not parse date parameter: "+a);if(!Q(b))throw new TypeError("defaultDate() date passed is invalid according to component setup validations");return d.defaultDate=b,(d.defaultDate&&d.inline||""===g.val().trim())&&_(d.defaultDate),l},l.locale=function(a){if(0===arguments.length)return d.locale;if(!b.localeData(a))throw new TypeError("locale() locale "+a+" is not loaded from moment locales!");return d.locale=a,e.locale(d.locale),f.locale(d.locale),i&&oa(),o&&(aa(),ea()),l},l.stepping=function(a){return 0===arguments.length?d.stepping:(a=parseInt(a,10),(isNaN(a)||1>a)&&(a=1),d.stepping=a,l)},l.useCurrent=function(a){var b=["year","month","day","hour","minute"];if(0===arguments.length)return d.useCurrent;if("boolean"!=typeof a&&"string"!=typeof a)throw new TypeError("useCurrent() expects a boolean or string parameter");if("string"==typeof a&&-1===b.indexOf(a.toLowerCase()))throw new TypeError("useCurrent() expects a string parameter of "+b.join(", "));return d.useCurrent=a,l},l.collapse=function(a){if(0===arguments.length)return d.collapse;if("boolean"!=typeof a)throw new TypeError("collapse() expects a boolean parameter");return d.collapse===a?l:(d.collapse=a,o&&(aa(),ea()),l)},l.icons=function(b){if(0===arguments.length)return a.extend({},d.icons);if(!(b instanceof Object))throw new TypeError("icons() expects parameter to be an Object");return a.extend(d.icons,b),o&&(aa(),ea()),l},l.tooltips=function(b){if(0===arguments.length)return a.extend({},d.tooltips);if(!(b instanceof Object))throw new TypeError("tooltips() expects parameter to be an Object");return a.extend(d.tooltips,b),o&&(aa(),ea()),l},l.useStrict=function(a){if(0===arguments.length)return d.useStrict;if("boolean"!=typeof a)throw new TypeError("useStrict() expects a boolean parameter");return d.useStrict=a,l},l.sideBySide=function(a){if(0===arguments.length)return d.sideBySide;if("boolean"!=typeof a)throw new TypeError("sideBySide() expects a boolean parameter");return d.sideBySide=a,o&&(aa(),ea()),l},l.viewMode=function(a){if(0===arguments.length)return d.viewMode;if("string"!=typeof a)throw new TypeError("viewMode() expects a string parameter");if(-1===r.indexOf(a))throw new TypeError("viewMode() parameter must be one of ("+r.join(", ")+") value");return d.viewMode=a,k=Math.max(r.indexOf(a),p),K(),l},l.toolbarPlacement=function(a){if(0===arguments.length)return d.toolbarPlacement;if("string"!=typeof a)throw new TypeError("toolbarPlacement() expects a string parameter");if(-1===u.indexOf(a))throw new TypeError("toolbarPlacement() parameter must be one of ("+u.join(", ")+") value");return d.toolbarPlacement=a,o&&(aa(),ea()),l},l.widgetPositioning=function(b){if(0===arguments.length)return a.extend({},d.widgetPositioning);if("[object Object]"!=={}.toString.call(b))throw new TypeError("widgetPositioning() expects an object variable");if(b.horizontal){if("string"!=typeof b.horizontal)throw new TypeError("widgetPositioning() horizontal variable must be a string");if(b.horizontal=b.horizontal.toLowerCase(),-1===t.indexOf(b.horizontal))throw new TypeError("widgetPositioning() expects horizontal parameter to be one of ("+t.join(", ")+")");d.widgetPositioning.horizontal=b.horizontal}if(b.vertical){if("string"!=typeof b.vertical)throw new TypeError("widgetPositioning() vertical variable must be a string");if(b.vertical=b.vertical.toLowerCase(),-1===s.indexOf(b.vertical))throw new TypeError("widgetPositioning() expects vertical parameter to be one of ("+s.join(", ")+")");d.widgetPositioning.vertical=b.vertical}return $(),l},l.calendarWeeks=function(a){if(0===arguments.length)return d.calendarWeeks;if("boolean"!=typeof a)throw new TypeError("calendarWeeks() expects parameter to be a boolean value");return d.calendarWeeks=a,$(),l},l.showTodayButton=function(a){if(0===arguments.length)return d.showTodayButton;if("boolean"!=typeof a)throw new TypeError("showTodayButton() expects a boolean parameter");return d.showTodayButton=a,o&&(aa(),ea()),l},l.showClear=function(a){if(0===arguments.length)return d.showClear;if("boolean"!=typeof a)throw new TypeError("showClear() expects a boolean parameter");return d.showClear=a,o&&(aa(),ea()),l},l.widgetParent=function(b){if(0===arguments.length)return d.widgetParent;if("string"==typeof b&&(b=a(b)),null!==b&&"string"!=typeof b&&!(b instanceof a))throw new TypeError("widgetParent() expects a string or a jQuery object parameter");return d.widgetParent=b,o&&(aa(),ea()),l},l.keepOpen=function(a){if(0===arguments.length)return d.keepOpen;if("boolean"!=typeof a)throw new TypeError("keepOpen() expects a boolean parameter");return d.keepOpen=a,l},l.focusOnShow=function(a){if(0===arguments.length)return d.focusOnShow;if("boolean"!=typeof a)throw new TypeError("focusOnShow() expects a boolean parameter");return d.focusOnShow=a,l},l.inline=function(a){if(0===arguments.length)return d.inline;if("boolean"!=typeof a)throw new TypeError("inline() expects a boolean parameter");return d.inline=a,l},l.clear=function(){return ba(),l},l.keyBinds=function(a){return d.keyBinds=a,l},l.getMoment=function(a){return x(a)},l.debug=function(a){if("boolean"!=typeof a)throw new TypeError("debug() expects a boolean parameter");return d.debug=a,l},l.allowInputToggle=function(a){if(0===arguments.length)return d.allowInputToggle;if("boolean"!=typeof a)throw new TypeError("allowInputToggle() expects a boolean parameter");return d.allowInputToggle=a,l},l.showClose=function(a){if(0===arguments.length)return d.showClose;if("boolean"!=typeof a)throw new TypeError("showClose() expects a boolean parameter");return d.showClose=a,l},l.keepInvalid=function(a){if(0===arguments.length)return d.keepInvalid;if("boolean"!=typeof a)throw new TypeError("keepInvalid() expects a boolean parameter");return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length)return d.datepickerInput;if("string"!=typeof a)throw new TypeError("datepickerInput() expects a string parameter");return d.datepickerInput=a,l},l.parseInputDate=function(a){if(0===arguments.length)return d.parseInputDate; +if("function"!=typeof a)throw new TypeError("parseInputDate() sholud be as function");return d.parseInputDate=a,l},l.disabledTimeIntervals=function(b){if(0===arguments.length)return d.disabledTimeIntervals?a.extend({},d.disabledTimeIntervals):d.disabledTimeIntervals;if(!b)return d.disabledTimeIntervals=!1,$(),l;if(!(b instanceof Array))throw new TypeError("disabledTimeIntervals() expects an array parameter");return d.disabledTimeIntervals=b,$(),l},l.disabledHours=function(b){if(0===arguments.length)return d.disabledHours?a.extend({},d.disabledHours):d.disabledHours;if(!b)return d.disabledHours=!1,$(),l;if(!(b instanceof Array))throw new TypeError("disabledHours() expects an array parameter");if(d.disabledHours=na(b),d.enabledHours=!1,d.useCurrent&&!d.keepInvalid){for(var c=0;!Q(e,"h");){if(e.add(1,"h"),24===c)throw"Tried 24 times to find a valid date";c++}_(e)}return $(),l},l.enabledHours=function(b){if(0===arguments.length)return d.enabledHours?a.extend({},d.enabledHours):d.enabledHours;if(!b)return d.enabledHours=!1,$(),l;if(!(b instanceof Array))throw new TypeError("enabledHours() expects an array parameter");if(d.enabledHours=na(b),d.disabledHours=!1,d.useCurrent&&!d.keepInvalid){for(var c=0;!Q(e,"h");){if(e.add(1,"h"),24===c)throw"Tried 24 times to find a valid date";c++}_(e)}return $(),l},l.viewDate=function(a){if(0===arguments.length)return f.clone();if(!a)return f=e.clone(),l;if(!("string"==typeof a||b.isMoment(a)||a instanceof Date))throw new TypeError("viewDate() parameter must be one of [string, moment or Date]");return f=ga(a),J(),l},c.is("input"))g=c;else if(g=c.find(d.datepickerInput),0===g.size())g=c.find("input");else if(!g.is("input"))throw new Error('CSS class "'+d.datepickerInput+'" cannot be applied to non input element');if(c.hasClass("input-group")&&(n=0===c.find(".datepickerbutton").size()?c.find(".input-group-addon"):c.find(".datepickerbutton")),!d.inline&&!g.is("input"))throw new Error("Could not initialize DateTimePicker without an input element");return e=x(),f=e.clone(),a.extend(!0,d,G()),l.options(d),oa(),ka(),g.prop("disabled")&&l.disable(),g.is("input")&&0!==g.val().trim().length?_(ga(g.val().trim())):d.defaultDate&&void 0===g.attr("placeholder")&&_(d.defaultDate),d.inline&&ea(),l};a.fn.datetimepicker=function(b){return this.each(function(){var d=a(this);d.data("DateTimePicker")||(b=a.extend(!0,{},a.fn.datetimepicker.defaults,b),d.data("DateTimePicker",c(d,b)))})},a.fn.datetimepicker.defaults={timeZone:"Etc/UTC",format:!1,dayViewHeaderFormat:"MMMM YYYY",extraFormats:!1,stepping:1,minDate:!1,maxDate:!1,useCurrent:!0,collapse:!0,locale:b.locale(),defaultDate:!1,disabledDates:!1,enabledDates:!1,icons:{time:"glyphicon glyphicon-time",date:"glyphicon glyphicon-calendar",up:"glyphicon glyphicon-chevron-up",down:"glyphicon glyphicon-chevron-down",previous:"glyphicon glyphicon-chevron-left",next:"glyphicon glyphicon-chevron-right",today:"glyphicon glyphicon-screenshot",clear:"glyphicon glyphicon-trash",close:"glyphicon glyphicon-remove"},tooltips:{today:"Go to today",clear:"Clear selection",close:"Close the picker",selectMonth:"Select Month",prevMonth:"Previous Month",nextMonth:"Next Month",selectYear:"Select Year",prevYear:"Previous Year",nextYear:"Next Year",selectDecade:"Select Decade",prevDecade:"Previous Decade",nextDecade:"Next Decade",prevCentury:"Previous Century",nextCentury:"Next Century",pickHour:"Pick Hour",incrementHour:"Increment Hour",decrementHour:"Decrement Hour",pickMinute:"Pick Minute",incrementMinute:"Increment Minute",decrementMinute:"Decrement Minute",pickSecond:"Pick Second",incrementSecond:"Increment Second",decrementSecond:"Decrement Second",togglePeriod:"Toggle Period",selectTime:"Select Time"},useStrict:!1,sideBySide:!1,daysOfWeekDisabled:!1,calendarWeeks:!1,viewMode:"days",toolbarPlacement:"default",showTodayButton:!1,showClear:!1,showClose:!1,widgetPositioning:{horizontal:"auto",vertical:"auto"},widgetParent:null,ignoreReadonly:!1,keepOpen:!1,focusOnShow:!0,inline:!1,keepInvalid:!1,datepickerInput:".datepickerinput",keyBinds:{up:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")?this.date(b.clone().subtract(7,"d")):this.date(b.clone().add(this.stepping(),"m"))}},down:function(a){if(!a)return void this.show();var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")?this.date(b.clone().add(7,"d")):this.date(b.clone().subtract(this.stepping(),"m"))},"control up":function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")?this.date(b.clone().subtract(1,"y")):this.date(b.clone().add(1,"h"))}},"control down":function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")?this.date(b.clone().add(1,"y")):this.date(b.clone().subtract(1,"h"))}},left:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")&&this.date(b.clone().subtract(1,"d"))}},right:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")&&this.date(b.clone().add(1,"d"))}},pageUp:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")&&this.date(b.clone().subtract(1,"M"))}},pageDown:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")&&this.date(b.clone().add(1,"M"))}},enter:function(){this.hide()},escape:function(){this.hide()},"control space":function(a){a.find(".timepicker").is(":visible")&&a.find('.btn[data-action="togglePeriod"]').click()},t:function(){this.date(this.getMoment())},"delete":function(){this.clear()}},debug:!1,allowInputToggle:!1,disabledTimeIntervals:!1,disabledHours:!1,enabledHours:!1,viewDate:!1}}); \ No newline at end of file diff --git a/assets/js/bootstrap.min.js b/assets/js/bootstrap.min.js new file mode 100644 index 0000000..133aeec --- /dev/null +++ b/assets/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under the MIT license + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.5",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.5",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.5",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.5",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.5",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
    ',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.5",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.5",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.5",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/assets/js/bxslider.min.js b/assets/js/bxslider.min.js new file mode 100644 index 0000000..dc338f7 --- /dev/null +++ b/assets/js/bxslider.min.js @@ -0,0 +1,10 @@ +/** + * BxSlider v4.1.2 - Fully loaded, responsive content slider + * http://bxslider.com + * + * Copyright 2014, Steven Wanderski - http://stevenwanderski.com - http://bxcreative.com + * Written while drinking Belgian ales and listening to jazz + * + * Released under the MIT license - http://opensource.org/licenses/MIT + */ +!function(t){var e={},s={mode:"horizontal",slideSelector:"",infiniteLoop:!0,hideControlOnEnd:!1,speed:500,easing:null,slideMargin:0,startSlide:0,randomStart:!1,captions:!1,ticker:!1,tickerHover:!1,adaptiveHeight:!1,adaptiveHeightSpeed:500,video:!1,useCSS:!0,preloadImages:"visible",responsive:!0,slideZIndex:50,touchEnabled:!0,swipeThreshold:50,oneToOneTouch:!0,preventDefaultSwipeX:!0,preventDefaultSwipeY:!1,pager:!0,pagerType:"full",pagerShortSeparator:" / ",pagerSelector:null,buildPager:null,pagerCustom:null,controls:!0,nextText:"Next",prevText:"Prev",nextSelector:null,prevSelector:null,autoControls:!1,startText:"Start",stopText:"Stop",autoControlsCombine:!1,autoControlsSelector:null,auto:!1,pause:4e3,autoStart:!0,autoDirection:"next",autoHover:!1,autoDelay:0,minSlides:1,maxSlides:1,moveSlides:0,slideWidth:0,onSliderLoad:function(){},onSlideBefore:function(){},onSlideAfter:function(){},onSlideNext:function(){},onSlidePrev:function(){},onSliderResize:function(){}};t.fn.bxSlider=function(n){if(0==this.length)return this;if(this.length>1)return this.each(function(){t(this).bxSlider(n)}),this;var o={},r=this;e.el=this;var a=t(window).width(),l=t(window).height(),d=function(){o.settings=t.extend({},s,n),o.settings.slideWidth=parseInt(o.settings.slideWidth),o.children=r.children(o.settings.slideSelector),o.children.length1||o.settings.maxSlides>1,o.carousel&&(o.settings.preloadImages="all"),o.minThreshold=o.settings.minSlides*o.settings.slideWidth+(o.settings.minSlides-1)*o.settings.slideMargin,o.maxThreshold=o.settings.maxSlides*o.settings.slideWidth+(o.settings.maxSlides-1)*o.settings.slideMargin,o.working=!1,o.controls={},o.interval=null,o.animProp="vertical"==o.settings.mode?"top":"left",o.usingCSS=o.settings.useCSS&&"fade"!=o.settings.mode&&function(){var t=document.createElement("div"),e=["WebkitPerspective","MozPerspective","OPerspective","msPerspective"];for(var i in e)if(void 0!==t.style[e[i]])return o.cssPrefix=e[i].replace("Perspective","").toLowerCase(),o.animProp="-"+o.cssPrefix+"-transform",!0;return!1}(),"vertical"==o.settings.mode&&(o.settings.maxSlides=o.settings.minSlides),r.data("origStyle",r.attr("style")),r.children(o.settings.slideSelector).each(function(){t(this).data("origStyle",t(this).attr("style"))}),c()},c=function(){r.wrap('
    '),o.viewport=r.parent(),o.loader=t('
    '),o.viewport.prepend(o.loader),r.css({width:"horizontal"==o.settings.mode?100*o.children.length+215+"%":"auto",position:"relative"}),o.usingCSS&&o.settings.easing?r.css("-"+o.cssPrefix+"-transition-timing-function",o.settings.easing):o.settings.easing||(o.settings.easing="swing"),f(),o.viewport.css({width:"100%",overflow:"hidden",position:"relative"}),o.viewport.parent().css({maxWidth:p()}),o.settings.pager||o.viewport.parent().css({margin:"0 auto 0px"}),o.children.css({"float":"horizontal"==o.settings.mode?"left":"none",listStyle:"none",position:"relative"}),o.children.css("width",u()),"horizontal"==o.settings.mode&&o.settings.slideMargin>0&&o.children.css("marginRight",o.settings.slideMargin),"vertical"==o.settings.mode&&o.settings.slideMargin>0&&o.children.css("marginBottom",o.settings.slideMargin),"fade"==o.settings.mode&&(o.children.css({position:"absolute",zIndex:0,display:"none"}),o.children.eq(o.settings.startSlide).css({zIndex:o.settings.slideZIndex,display:"block"})),o.controls.el=t('
    '),o.settings.captions&&P(),o.active.last=o.settings.startSlide==x()-1,o.settings.video&&r.fitVids();var e=o.children.eq(o.settings.startSlide);"all"==o.settings.preloadImages&&(e=o.children),o.settings.ticker?o.settings.pager=!1:(o.settings.pager&&T(),o.settings.controls&&C(),o.settings.auto&&o.settings.autoControls&&E(),(o.settings.controls||o.settings.autoControls||o.settings.pager)&&o.viewport.after(o.controls.el)),g(e,h)},g=function(e,i){var s=e.find("img, iframe").length;if(0==s)return i(),void 0;var n=0;e.find("img, iframe").each(function(){t(this).one("load",function(){++n==s&&i()}).each(function(){this.complete&&t(this).load()})})},h=function(){if(o.settings.infiniteLoop&&"fade"!=o.settings.mode&&!o.settings.ticker){var e="vertical"==o.settings.mode?o.settings.minSlides:o.settings.maxSlides,i=o.children.slice(0,e).clone().addClass("bx-clone"),s=o.children.slice(-e).clone().addClass("bx-clone");r.append(i).prepend(s)}o.loader.remove(),S(),"vertical"==o.settings.mode&&(o.settings.adaptiveHeight=!0),o.viewport.height(v()),r.redrawSlider(),o.settings.onSliderLoad(o.active.index),o.initialized=!0,o.settings.responsive&&t(window).bind("resize",Z),o.settings.auto&&o.settings.autoStart&&H(),o.settings.ticker&&L(),o.settings.pager&&q(o.settings.startSlide),o.settings.controls&&W(),o.settings.touchEnabled&&!o.settings.ticker&&O()},v=function(){var e=0,s=t();if("vertical"==o.settings.mode||o.settings.adaptiveHeight)if(o.carousel){var n=1==o.settings.moveSlides?o.active.index:o.active.index*m();for(s=o.children.eq(n),i=1;i<=o.settings.maxSlides-1;i++)s=n+i>=o.children.length?s.add(o.children.eq(i-1)):s.add(o.children.eq(n+i))}else s=o.children.eq(o.active.index);else s=o.children;return"vertical"==o.settings.mode?(s.each(function(){e+=t(this).outerHeight()}),o.settings.slideMargin>0&&(e+=o.settings.slideMargin*(o.settings.minSlides-1))):e=Math.max.apply(Math,s.map(function(){return t(this).outerHeight(!1)}).get()),e},p=function(){var t="100%";return o.settings.slideWidth>0&&(t="horizontal"==o.settings.mode?o.settings.maxSlides*o.settings.slideWidth+(o.settings.maxSlides-1)*o.settings.slideMargin:o.settings.slideWidth),t},u=function(){var t=o.settings.slideWidth,e=o.viewport.width();return 0==o.settings.slideWidth||o.settings.slideWidth>e&&!o.carousel||"vertical"==o.settings.mode?t=e:o.settings.maxSlides>1&&"horizontal"==o.settings.mode&&(e>o.maxThreshold||e0)if(o.viewport.width()o.maxThreshold)t=o.settings.maxSlides;else{var e=o.children.first().width();t=Math.floor(o.viewport.width()/e)}else"vertical"==o.settings.mode&&(t=o.settings.minSlides);return t},x=function(){var t=0;if(o.settings.moveSlides>0)if(o.settings.infiniteLoop)t=o.children.length/m();else for(var e=0,i=0;e0&&o.settings.moveSlides<=f()?o.settings.moveSlides:f()},S=function(){if(o.children.length>o.settings.maxSlides&&o.active.last&&!o.settings.infiniteLoop){if("horizontal"==o.settings.mode){var t=o.children.last(),e=t.position();b(-(e.left-(o.viewport.width()-t.width())),"reset",0)}else if("vertical"==o.settings.mode){var i=o.children.length-o.settings.minSlides,e=o.children.eq(i).position();b(-e.top,"reset",0)}}else{var e=o.children.eq(o.active.index*m()).position();o.active.index==x()-1&&(o.active.last=!0),void 0!=e&&("horizontal"==o.settings.mode?b(-e.left,"reset",0):"vertical"==o.settings.mode&&b(-e.top,"reset",0))}},b=function(t,e,i,s){if(o.usingCSS){var n="vertical"==o.settings.mode?"translate3d(0, "+t+"px, 0)":"translate3d("+t+"px, 0, 0)";r.css("-"+o.cssPrefix+"-transition-duration",i/1e3+"s"),"slide"==e?(r.css(o.animProp,n),r.bind("transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd",function(){r.unbind("transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd"),D()})):"reset"==e?r.css(o.animProp,n):"ticker"==e&&(r.css("-"+o.cssPrefix+"-transition-timing-function","linear"),r.css(o.animProp,n),r.bind("transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd",function(){r.unbind("transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd"),b(s.resetValue,"reset",0),N()}))}else{var a={};a[o.animProp]=t,"slide"==e?r.animate(a,i,o.settings.easing,function(){D()}):"reset"==e?r.css(o.animProp,t):"ticker"==e&&r.animate(a,speed,"linear",function(){b(s.resetValue,"reset",0),N()})}},w=function(){for(var e="",i=x(),s=0;i>s;s++){var n="";o.settings.buildPager&&t.isFunction(o.settings.buildPager)?(n=o.settings.buildPager(s),o.pagerEl.addClass("bx-custom-pager")):(n=s+1,o.pagerEl.addClass("bx-default-pager")),e+='"}o.pagerEl.html(e)},T=function(){o.settings.pagerCustom?o.pagerEl=t(o.settings.pagerCustom):(o.pagerEl=t('
    '),o.settings.pagerSelector?t(o.settings.pagerSelector).html(o.pagerEl):o.controls.el.addClass("bx-has-pager").append(o.pagerEl),w()),o.pagerEl.on("click","a",I)},C=function(){o.controls.next=t(''+o.settings.nextText+""),o.controls.prev=t(''+o.settings.prevText+""),o.controls.next.bind("click",y),o.controls.prev.bind("click",z),o.settings.nextSelector&&t(o.settings.nextSelector).append(o.controls.next),o.settings.prevSelector&&t(o.settings.prevSelector).append(o.controls.prev),o.settings.nextSelector||o.settings.prevSelector||(o.controls.directionEl=t('
    '),o.controls.directionEl.append(o.controls.prev).append(o.controls.next),o.controls.el.addClass("bx-has-controls-direction").append(o.controls.directionEl))},E=function(){o.controls.start=t('"),o.controls.stop=t('"),o.controls.autoEl=t('
    '),o.controls.autoEl.on("click",".bx-start",k),o.controls.autoEl.on("click",".bx-stop",M),o.settings.autoControlsCombine?o.controls.autoEl.append(o.controls.start):o.controls.autoEl.append(o.controls.start).append(o.controls.stop),o.settings.autoControlsSelector?t(o.settings.autoControlsSelector).html(o.controls.autoEl):o.controls.el.addClass("bx-has-controls-auto").append(o.controls.autoEl),A(o.settings.autoStart?"stop":"start")},P=function(){o.children.each(function(){var e=t(this).find("img:first").attr("title");void 0!=e&&(""+e).length&&t(this).append('
    '+e+"
    ")})},y=function(t){o.settings.auto&&r.stopAuto(),r.goToNextSlide(),t.preventDefault()},z=function(t){o.settings.auto&&r.stopAuto(),r.goToPrevSlide(),t.preventDefault()},k=function(t){r.startAuto(),t.preventDefault()},M=function(t){r.stopAuto(),t.preventDefault()},I=function(e){o.settings.auto&&r.stopAuto();var i=t(e.currentTarget),s=parseInt(i.attr("data-slide-index"));s!=o.active.index&&r.goToSlide(s),e.preventDefault()},q=function(e){var i=o.children.length;return"short"==o.settings.pagerType?(o.settings.maxSlides>1&&(i=Math.ceil(o.children.length/o.settings.maxSlides)),o.pagerEl.html(e+1+o.settings.pagerShortSeparator+i),void 0):(o.pagerEl.find("a").removeClass("active"),o.pagerEl.each(function(i,s){t(s).find("a").eq(e).addClass("active")}),void 0)},D=function(){if(o.settings.infiniteLoop){var t="";0==o.active.index?t=o.children.eq(0).position():o.active.index==x()-1&&o.carousel?t=o.children.eq((x()-1)*m()).position():o.active.index==o.children.length-1&&(t=o.children.eq(o.children.length-1).position()),t&&("horizontal"==o.settings.mode?b(-t.left,"reset",0):"vertical"==o.settings.mode&&b(-t.top,"reset",0))}o.working=!1,o.settings.onSlideAfter(o.children.eq(o.active.index),o.oldIndex,o.active.index)},A=function(t){o.settings.autoControlsCombine?o.controls.autoEl.html(o.controls[t]):(o.controls.autoEl.find("a").removeClass("active"),o.controls.autoEl.find("a:not(.bx-"+t+")").addClass("active"))},W=function(){1==x()?(o.controls.prev.addClass("disabled"),o.controls.next.addClass("disabled")):!o.settings.infiniteLoop&&o.settings.hideControlOnEnd&&(0==o.active.index?(o.controls.prev.addClass("disabled"),o.controls.next.removeClass("disabled")):o.active.index==x()-1?(o.controls.next.addClass("disabled"),o.controls.prev.removeClass("disabled")):(o.controls.prev.removeClass("disabled"),o.controls.next.removeClass("disabled")))},H=function(){o.settings.autoDelay>0?setTimeout(r.startAuto,o.settings.autoDelay):r.startAuto(),o.settings.autoHover&&r.hover(function(){o.interval&&(r.stopAuto(!0),o.autoPaused=!0)},function(){o.autoPaused&&(r.startAuto(!0),o.autoPaused=null)})},L=function(){var e=0;if("next"==o.settings.autoDirection)r.append(o.children.clone().addClass("bx-clone"));else{r.prepend(o.children.clone().addClass("bx-clone"));var i=o.children.first().position();e="horizontal"==o.settings.mode?-i.left:-i.top}b(e,"reset",0),o.settings.pager=!1,o.settings.controls=!1,o.settings.autoControls=!1,o.settings.tickerHover&&!o.usingCSS&&o.viewport.hover(function(){r.stop()},function(){var e=0;o.children.each(function(){e+="horizontal"==o.settings.mode?t(this).outerWidth(!0):t(this).outerHeight(!0)});var i=o.settings.speed/e,s="horizontal"==o.settings.mode?"left":"top",n=i*(e-Math.abs(parseInt(r.css(s))));N(n)}),N()},N=function(t){speed=t?t:o.settings.speed;var e={left:0,top:0},i={left:0,top:0};"next"==o.settings.autoDirection?e=r.find(".bx-clone").first().position():i=o.children.first().position();var s="horizontal"==o.settings.mode?-e.left:-e.top,n="horizontal"==o.settings.mode?-i.left:-i.top,a={resetValue:n};b(s,"ticker",speed,a)},O=function(){o.touch={start:{x:0,y:0},end:{x:0,y:0}},o.viewport.bind("touchstart",X)},X=function(t){if(o.working)t.preventDefault();else{o.touch.originalPos=r.position();var e=t.originalEvent;o.touch.start.x=e.changedTouches[0].pageX,o.touch.start.y=e.changedTouches[0].pageY,o.viewport.bind("touchmove",Y),o.viewport.bind("touchend",V)}},Y=function(t){var e=t.originalEvent,i=Math.abs(e.changedTouches[0].pageX-o.touch.start.x),s=Math.abs(e.changedTouches[0].pageY-o.touch.start.y);if(3*i>s&&o.settings.preventDefaultSwipeX?t.preventDefault():3*s>i&&o.settings.preventDefaultSwipeY&&t.preventDefault(),"fade"!=o.settings.mode&&o.settings.oneToOneTouch){var n=0;if("horizontal"==o.settings.mode){var r=e.changedTouches[0].pageX-o.touch.start.x;n=o.touch.originalPos.left+r}else{var r=e.changedTouches[0].pageY-o.touch.start.y;n=o.touch.originalPos.top+r}b(n,"reset",0)}},V=function(t){o.viewport.unbind("touchmove",Y);var e=t.originalEvent,i=0;if(o.touch.end.x=e.changedTouches[0].pageX,o.touch.end.y=e.changedTouches[0].pageY,"fade"==o.settings.mode){var s=Math.abs(o.touch.start.x-o.touch.end.x);s>=o.settings.swipeThreshold&&(o.touch.start.x>o.touch.end.x?r.goToNextSlide():r.goToPrevSlide(),r.stopAuto())}else{var s=0;"horizontal"==o.settings.mode?(s=o.touch.end.x-o.touch.start.x,i=o.touch.originalPos.left):(s=o.touch.end.y-o.touch.start.y,i=o.touch.originalPos.top),!o.settings.infiniteLoop&&(0==o.active.index&&s>0||o.active.last&&0>s)?b(i,"reset",200):Math.abs(s)>=o.settings.swipeThreshold?(0>s?r.goToNextSlide():r.goToPrevSlide(),r.stopAuto()):b(i,"reset",200)}o.viewport.unbind("touchend",V)},Z=function(){var e=t(window).width(),i=t(window).height();(a!=e||l!=i)&&(a=e,l=i,r.redrawSlider(),o.settings.onSliderResize.call(r,o.active.index))};return r.goToSlide=function(e,i){if(!o.working&&o.active.index!=e)if(o.working=!0,o.oldIndex=o.active.index,o.active.index=0>e?x()-1:e>=x()?0:e,o.settings.onSlideBefore(o.children.eq(o.active.index),o.oldIndex,o.active.index),"next"==i?o.settings.onSlideNext(o.children.eq(o.active.index),o.oldIndex,o.active.index):"prev"==i&&o.settings.onSlidePrev(o.children.eq(o.active.index),o.oldIndex,o.active.index),o.active.last=o.active.index>=x()-1,o.settings.pager&&q(o.active.index),o.settings.controls&&W(),"fade"==o.settings.mode)o.settings.adaptiveHeight&&o.viewport.height()!=v()&&o.viewport.animate({height:v()},o.settings.adaptiveHeightSpeed),o.children.filter(":visible").fadeOut(o.settings.speed).css({zIndex:0}),o.children.eq(o.active.index).css("zIndex",o.settings.slideZIndex+1).fadeIn(o.settings.speed,function(){t(this).css("zIndex",o.settings.slideZIndex),D()});else{o.settings.adaptiveHeight&&o.viewport.height()!=v()&&o.viewport.animate({height:v()},o.settings.adaptiveHeightSpeed);var s=0,n={left:0,top:0};if(!o.settings.infiniteLoop&&o.carousel&&o.active.last)if("horizontal"==o.settings.mode){var a=o.children.eq(o.children.length-1);n=a.position(),s=o.viewport.width()-a.outerWidth()}else{var l=o.children.length-o.settings.minSlides;n=o.children.eq(l).position()}else if(o.carousel&&o.active.last&&"prev"==i){var d=1==o.settings.moveSlides?o.settings.maxSlides-m():(x()-1)*m()-(o.children.length-o.settings.maxSlides),a=r.children(".bx-clone").eq(d);n=a.position()}else if("next"==i&&0==o.active.index)n=r.find("> .bx-clone").eq(o.settings.maxSlides).position(),o.active.last=!1;else if(e>=0){var c=e*m();n=o.children.eq(c).position()}if("undefined"!=typeof n){var g="horizontal"==o.settings.mode?-(n.left-s):-n.top;b(g,"slide",o.settings.speed)}}},r.goToNextSlide=function(){if(o.settings.infiniteLoop||!o.active.last){var t=parseInt(o.active.index)+1;r.goToSlide(t,"next")}},r.goToPrevSlide=function(){if(o.settings.infiniteLoop||0!=o.active.index){var t=parseInt(o.active.index)-1;r.goToSlide(t,"prev")}},r.startAuto=function(t){o.interval||(o.interval=setInterval(function(){"next"==o.settings.autoDirection?r.goToNextSlide():r.goToPrevSlide()},o.settings.pause),o.settings.autoControls&&1!=t&&A("stop"))},r.stopAuto=function(t){o.interval&&(clearInterval(o.interval),o.interval=null,o.settings.autoControls&&1!=t&&A("start"))},r.getCurrentSlide=function(){return o.active.index},r.getCurrentSlideElement=function(){return o.children.eq(o.active.index)},r.getSlideCount=function(){return o.children.length},r.redrawSlider=function(){o.children.add(r.find(".bx-clone")).outerWidth(u()),o.viewport.css("height",v()),o.settings.ticker||S(),o.active.last&&(o.active.index=x()-1),o.active.index>=x()&&(o.active.last=!0),o.settings.pager&&!o.settings.pagerCustom&&(w(),q(o.active.index))},r.destroySlider=function(){o.initialized&&(o.initialized=!1,t(".bx-clone",this).remove(),o.children.each(function(){void 0!=t(this).data("origStyle")?t(this).attr("style",t(this).data("origStyle")):t(this).removeAttr("style")}),void 0!=t(this).data("origStyle")?this.attr("style",t(this).data("origStyle")):t(this).removeAttr("style"),t(this).unwrap().unwrap(),o.controls.el&&o.controls.el.remove(),o.controls.next&&o.controls.next.remove(),o.controls.prev&&o.controls.prev.remove(),o.pagerEl&&o.settings.controls&&o.pagerEl.remove(),t(".bx-caption",this).remove(),o.controls.autoEl&&o.controls.autoEl.remove(),clearInterval(o.interval),o.settings.responsive&&t(window).unbind("resize",Z))},r.reloadSlider=function(t){void 0!=t&&(n=t),r.destroySlider(),d()},d(),this}}(jQuery); \ No newline at end of file diff --git a/assets/js/cropper.js b/assets/js/cropper.js new file mode 100644 index 0000000..36dd510 --- /dev/null +++ b/assets/js/cropper.js @@ -0,0 +1,424 @@ +/** + * Zira project. + * Image cropper + * (c)2015 http://dro1d.ru + * + * Usage: + * $(document).ready(function(){ + * $('img').cropper([options]); + * }); + */ + +(function($){ + Cropper = function(element, options) { + this.container_class = 'image-cropper'; + this.selector_class = 'image-cropper-selector'; + this.resizer_class = 'image-cropper-resizer'; + this.previewer_class = 'image-cropper-preview'; + this.custom_previewer_class = 'image-cropper-preview-custom'; + this.body_on_resize_class = 'image-cropper-resizing'; + this.body_on_dragging_class = 'image-cropper-dragging'; + this.events = {}; + this.disabled = false; + + var defaults = { + 'src_w': null, // source image container width + 'src_h': null, // source image container height + 'dst_w': 100, // preview image container width + 'dst_h': 100, // preview image container height + 'sel_w': null, // cropping box width on start + 'sel_h': null, // cropping box height on start + 'sel_mw': null, // cropping box min width + 'sel_mh': null, // cropping box min height + 'res_s': 10, // resizing box size + 'fixed': true, // keep aspect ratio + 'preview': true, // preview result image + 'preview_m': 7, // preview box margin + 'previewer': null, // custom preview container id + 'input_x': null, // x-offset storage input id + 'input_y': null, // y-offset storage input id + 'input_w': null, // width storage input id + 'input_h': null, // height storage input id + 'block_mode': false + }; + if(typeof(options)!="undefined") { + this.options = $.extend(defaults, options); + } else { + this.options = defaults; + } + + var src = $(element).attr('src'); + if (!this.options.src_w) this.options.src_w = $(element).width(); + if (!this.options.src_h) this.options.src_h = $(element).height(); + if (!this.options.block_mode) { + $(element).after('
    '); + this.container = $(element).next('.'+this.container_class); + $(this.container).children('img').load(this.bind(this,this.initialize)); + $(this.container).children('img').css({ + 'width': this.options.src_w, + 'height': this.options.src_h + }); + this.source = $(this.container).children('img'); + $(element).remove(); + $(this.container).children('img').attr('src',src); + } else { + if ($(element).parent().css('position')=='static') $(element).parent().css('position','relative'); + $(element).after('
    '); + this.container = $(element).next('.'+this.container_class); + $(this.container).css({ + 'position': 'absolute', + 'left': $(element).offset().left - $(element).parent().offset().left, + 'top': $(element).offset().top - $(element).parent().offset().top + }); + this.source = $(element); + this.initialize(); + } + }; + + Cropper.prototype.initialize = function() { + $(this.container).css({ + 'width':this.options.src_w, + 'height':this.options.src_h + }); + this.container_x = $(this.container).offset().left; + this.container_y = $(this.container).offset().top; + + if (!this.options.sel_w) this.options.sel_w = this.options.dst_w; + if (!this.options.sel_h) this.options.sel_h = this.options.dst_h; + if (!this.options.sel_mw) this.options.sel_mw = this.options.sel_w; + if (!this.options.sel_mh) this.options.sel_mh = this.options.sel_h; + if (this.options.sel_w>this.options.src_w) this.options.sel_w = this.options.src_w; + if (this.options.sel_h>this.options.src_h) this.options.sel_h = this.options.src_h; + if (this.options.sel_mw>this.options.sel_w) this.options.sel_mw = this.options.sel_w; + if (this.options.sel_mh>this.options.sel_h) this.options.sel_mh = this.options.sel_h; + $(this.container).append('
    '); + this.selector = $(this.container).children('.'+this.selector_class); + $(this.selector).css({ + 'width':this.options.sel_w, + 'height':this.options.sel_h, + 'left': (this.options.src_w-this.options.sel_w)/2, + 'top': (this.options.src_h-this.options.sel_h)/2 + }); + this.selector_w = this.options.sel_w; + this.selector_h = this.options.sel_h; + + if (this.options.input_w && + this.options.input_h && + this.options.input_x && + this.options.input_y + ) { + var input_w = $('#'+this.options.input_w).val(); + var input_h = $('#'+this.options.input_h).val(); + var input_x = $('#'+this.options.input_x).val(); + var input_y = $('#'+this.options.input_y).val(); + if (input_w.length && input_h.length && input_x.length && input_y.length) { + input_w = parseFloat(input_w) * this.options.src_w / 100; + input_h = parseFloat(input_h) * this.options.src_h / 100; + input_x = parseFloat(input_x) * this.options.src_w / 100; + input_y = parseFloat(input_y) * this.options.src_h / 100; + $(this.selector).css({ + 'width':input_w, + 'height':input_h, + 'left': input_x, + 'top': input_y + }); + this.selector_w = input_w; + this.selector_h = input_h; + } + } + this.selector_x = $(this.selector).offset().left; + this.selector_y = $(this.selector).offset().top; + + $(this.selector).append('
    '); + this.resizer = $(this.selector).children('.'+this.resizer_class); + this.resizer_w = this.options.res_s; + this.resizer_h = this.options.res_s; + $(this.resizer).css({ + 'width': this.resizer_w, + 'height': this.resizer_h, + 'right': -(this.resizer_w/2), + 'bottom': -(this.resizer_h/2) + }); + this.resizer_x = $(this.resizer).offset().left; + this.resizer_y = $(this.resizer).offset().top; + + if (this.options.preview) { + if (!this.options.previewer) { + $(this.container).append('
    '); + this.previewer = $(this.container).children('.'+this.previewer_class); + $(this.previewer).css({ + 'width':this.options.dst_w, + 'height':this.options.dst_h, + 'right': -this.options.dst_w-this.options.preview_m, + 'top': 0 + }); + } else { + this.previewer = $('#'+this.options.previewer); + $(this.previewer).addClass(this.custom_previewer_class).html(''); + $(this.previewer).css({ + 'width':this.options.dst_w, + 'height':this.options.dst_h + }); + if ($(this.previewer).css('position') == 'static') { + $(this.previewer).css('position','relative'); + } + } + + $(this.previewer).children('img').load(this.bind(this,this.update)); + $(this.previewer).children('img').attr('src',$(this.source).attr('src')); + } else { + this.previewer = null; + } + + this.dragging = false; + this.resizing = false; + this.dragX = 0; + this.dragY = 0; + + this.touchesEnabled = false; + this.bindEvents(); + }; + + Cropper.prototype.updateOffsets = function() { + this.container_x = $(this.container).offset().left; + this.container_y = $(this.container).offset().top; + this.selector_x = $(this.selector).offset().left; + this.selector_y = $(this.selector).offset().top; + this.resizer_x = $(this.resizer).offset().left; + this.resizer_y = $(this.resizer).offset().top; + }; + + Cropper.prototype.onTouchStartEvent = function(e) { + this.touchesEnabled = true; + e.pageX = e.originalEvent.touches[0].pageX; + e.pageY = e.originalEvent.touches[0].pageY; + this.onMouseDown(e); + }; + + Cropper.prototype.onTouchMoveEvent = function(e) { + e.pageX = e.originalEvent.touches[0].pageX; + e.pageY = e.originalEvent.touches[0].pageY; + this.onMouseMove(e); + }; + + Cropper.prototype.onTouchEndEvent = function(e) { + this.onMouseUp(e); + }; + + Cropper.prototype.onMouseDownEvent = function(e) { + if (this.touchesEnabled) return; + this.onMouseDown(e); + }; + + Cropper.prototype.onMouseMoveEvent = function(e) { + if (this.touchesEnabled) return; + this.onMouseMove(e); + }; + + Cropper.prototype.onMouseUpEvent = function(e) { + if (this.touchesEnabled) return; + this.onMouseUp(e); + }; + + Cropper.prototype.onMouseLeaveEvent = function(e) { + $('body').trigger('mouseup'); + }; + + Cropper.prototype.bindEvents = function() { + this.events['touchstart'] = this.bind(this, this.onTouchStartEvent); + this.events['touchmove'] = this.bind(this, this.onTouchMoveEvent); + this.events['touchend'] = this.bind(this, this.onTouchEndEvent); + this.events['mousedown'] = this.bind(this, this.onMouseDownEvent); + this.events['mousemove'] = this.bind(this, this.onMouseMoveEvent); + this.events['mouseup'] = this.bind(this, this.onMouseUpEvent); + this.events['mouseleave'] = this.bind(this, this.onMouseLeaveEvent); + + $('body').bind('touchstart', this.events['touchstart']); + $('body').bind('touchmove', this.events['touchmove']); + $('body').bind('touchend', this.events['touchend']); + $('body').mousedown(this.events['mousedown']); + $('body').mousemove(this.events['mousemove']); + $('body').mouseup(this.events['mouseup']); + $('body').mouseleave(this.events['mouseleave']); + }; + + Cropper.prototype.unbindEvents = function() { + $('body').unbind('touchstart', this.events['touchstart']); + $('body').unbind('touchmove', this.events['touchmove']); + $('body').unbind('touchend', this.events['touchend']); + $('body').unbind('mousedown', this.events['mousedown']); + $('body').unbind('mousemove', this.events['mousemove']); + $('body').unbind('mouseup', this.events['mouseup']); + $('body').unbind('mouseleave', this.events['mouseleave']); + }; + + Cropper.prototype.bind = function(object, method) { + return function(arg) { + return method.call(object,arg); + } + }; + + Cropper.prototype.onMouseDown = function(e) { + if (this.disabled) return; + this.updateOffsets(); + if ( + e.pageX > this.resizer_x && + e.pageX < this.resizer_x + this.resizer_w && + e.pageY > this.resizer_y && + e.pageY < this.resizer_y + this.resizer_h + ) { + this.resizing = true; + this.dragging = false; + this.dragX = e.pageX; + this.dragY = e.pageY; + e.stopPropagation(); + e.preventDefault(); + $('body').addClass(this.body_on_resize_class); + }else if ( + e.pageX > this.selector_x && + e.pageX < this.selector_x + this.selector_w && + e.pageY > this.selector_y && + e.pageY < this.selector_y + this.selector_h + ) { + this.dragging = true; + this.resizing = false; + this.dragX = e.pageX; + this.dragY = e.pageY; + e.stopPropagation(); + e.preventDefault(); + $('body').addClass(this.body_on_dragging_class); + } else if ( + e.pageX > this.container_x && + e.pageX < this.container_x + this.options.src_w && + e.pageY > this.container_y && + e.pageY < this.container_y + this.options.src_h + ) { + this.dragging = false; + this.resizing = false; + e.stopPropagation(); + e.preventDefault(); + } else { + this.dragging = false; + } + }; + + Cropper.prototype.onMouseMove = function(e) { + if (this.dragging || this.resizing) { + var dx = e.pageX - this.dragX; + var dy = e.pageY - this.dragY; + if (this.dragging) { + this.moveSelector(dx, dy); + } else if (this.resizing) { + this.resizeSelector(dx, dy); + } + this.dragX += dx; + this.dragY += dy; + } + }; + + Cropper.prototype.onMouseUp = function(e) { + if (this.dragging || this.resizing) { + this.resizer_x = $(this.resizer).offset().left; + this.resizer_y = $(this.resizer).offset().top; + this.dragging = false; + this.resizing = false; + $('body').removeClass(this.body_on_resize_class); + } + }; + + Cropper.prototype.moveSelector = function(dx, dy) { + var x = this.selector_x - this.container_x + dx; + var y = this.selector_y - this.container_y + dy; + + if (x<0) x=0; + if (y<0) y=0; + if (x>this.options.src_w-this.selector_w) x=this.options.src_w-this.selector_w; + if (y>this.options.src_h-this.selector_h) y=this.options.src_h-this.selector_h; + + $(this.selector).css({ + 'left': x, + 'top': y + }); + + this.selector_x = x + this.container_x; + this.selector_y = y + this.container_y; + + this.update(); + }; + + Cropper.prototype.resizeSelector = function(dx, dy) { + this.selector_w += dx; + this.selector_h += dy; + + if (this.selector_wthis.container_x+this.options.src_w) { + this.selector_w = this.container_x+this.options.src_w-this.selector_x; + } + if (this.selector_y+this.selector_h>this.container_y+this.options.src_h) { + this.selector_h = this.container_y+this.options.src_h-this.selector_y; + } + + if (this.options.fixed) { + var selector_w = this.selector_h * this.options.sel_w / this.options.sel_h; + var selector_h = this.selector_h; + if (this.selector_x+selector_w>this.container_x+this.options.src_w) { + selector_h = this.selector_w * this.options.sel_h / this.options.sel_w; + selector_w = this.selector_w; + } + this.selector_w = selector_w; + this.selector_h = selector_h; + } + + $(this.selector).css({ + 'width': this.selector_w, + 'height': this.selector_h + }); + + this.update(); + }; + + Cropper.prototype.getRect = function() { + return { + x: ((this.selector_x - this.container_x) / this.options.src_w * 100).toFixed(2), + y: ((this.selector_y - this.container_y) / this.options.src_h * 100).toFixed(2), + w: (this.selector_w / this.options.src_w * 100).toFixed(2), + h: (this.selector_h / this.options.src_h * 100).toFixed(2) + }; + }; + + Cropper.prototype.update = function() { + var rect = this.getRect(); + if (this.options.input_w) $('#'+this.options.input_w).val(rect.w); + if (this.options.input_h) $('#'+this.options.input_h).val(rect.h); + if (this.options.input_x) $('#'+this.options.input_x).val(rect.x); + if (this.options.input_y) $('#'+this.options.input_y).val(rect.y); + if (this.options.preview) this.preview(rect); + }; + + Cropper.prototype.preview = function(rect) { + var width = Math.round(this.options.dst_w * 100 / rect.w); + var height = Math.round(this.options.dst_h * 100 / rect.h); + var left = -Math.round(rect.x * width / 100); + var top = -Math.round(rect.y * height / 100); + + $(this.previewer).children('img').css({ + 'width': width, + 'height': height, + 'left': left, + 'top': top + }); + }; + + Cropper.prototype.destroy = function() { + $(this.container).remove(); + this.unbindEvents(); + }; + + $.fn.cropper = function(options) { + if (!$(this).attr('src')) { + throw 'Cropper should be attached to image'; + } + return new Cropper($(this), options); + }; +})(jQuery); \ No newline at end of file diff --git a/assets/js/dash.js b/assets/js/dash.js new file mode 100644 index 0000000..92acae3 --- /dev/null +++ b/assets/js/dash.js @@ -0,0 +1,249 @@ +(function($) { + function radians(degrees) { + return (Math.PI/180)*degrees; + } + function drawClock(ctx, canvas_size, unix_timestamp) { + ctx.clearRect(0, 0, canvas_size, canvas_size); + + var centerX = canvas_size / 2; + var centerY = canvas_size / 2; + var offset = canvas_size / 40; + var radius = Math.min(centerX, centerY) - offset; + + var grd=ctx.createRadialGradient(centerX, centerY,0,centerX, centerY, radius); + grd.addColorStop(0,"#ffffff"); + grd.addColorStop(1,"#E6E6E8"); + + ctx.beginPath(); + ctx.strokeStyle = "#F8F4F4"; + ctx.lineWidth = 1; + ctx.fillStyle = grd; + ctx.arc(centerX, centerY, canvas_size / 2 - 2, 0, Math.PI*2, false); + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + + ctx.beginPath(); + ctx.strokeStyle = "#dedede"; + ctx.lineWidth = 1; + ctx.arc(centerX, centerY, canvas_size / 2 - 1, 0, Math.PI*2, false); + ctx.closePath(); + ctx.stroke(); + + ctx.fillStyle = "#444444"; + ctx.font = "16px Arial"; + for (var i=0; i<12; i++) { + var a = i * 360 / 12; + var size = radius - (canvas_size / 12); + var x = centerX + size * Math.sin(radians(a)); + var y = centerY - size * Math.cos(radians(a)); + var txt = i>0 ? i.toString() : 12; + var txt_w = ctx.measureText(txt).width; + ctx.moveTo(x,y); + ctx.fillText(txt, x - txt_w/2, y+8); + } + + drawArrows(ctx, canvas_size, unix_timestamp); + } + + function drawArrows(ctx, canvas_size, unix_timestamp) { + var centerX = canvas_size / 2; + var centerY = canvas_size / 2; + var offset = canvas_size / 40; + var radius = Math.min(centerX, centerY) - offset; + + var grd=ctx.createRadialGradient(centerX, centerY,0,centerX, centerY, radius); + grd.addColorStop(0,"#ffffff"); + grd.addColorStop(1,"#E6E6E6"); + + ctx.beginPath(); + ctx.fillStyle = grd; + ctx.arc(centerX, centerY, radius - canvas_size / 7, 0, Math.PI*2, false); + ctx.closePath(); + ctx.fill(); + + var h = unix_timestamp%86400/3600; + var _h = h % 12; + var m = unix_timestamp%3600/60; + var s = unix_timestamp%60; + + var f_h = 9; + var digitsY = centerY - radius / 3 + f_h; + if (_h<=3 || _h>=9) digitsY = centerY + radius / 3; + + ctx.font = "12px Arial"; + var t_h = Math.floor(h).toString(); + var t_m = Math.floor(m).toString(); + var t_s = Math.floor(s).toString(); + if (t_h.length==1) t_h = '0'+t_h; + if (t_m.length==1) t_m = '0'+t_m; + if (t_s.length==1) t_s = '0'+t_s; + var txt = t_h+':'+t_m+':'+t_s; + //var txt_w = ctx.measureText(txt).width; + var txt_w = 47; + ctx.fillStyle = "#789789"; + ctx.fillText(txt,centerX - txt_w / 2,digitsY); + + var logoY = centerY - radius / 3 + f_h; + if (_h>3 && _h<9) logoY = centerY + radius / 3; + + ctx.font = "10px Arial"; + var logo = 'Z'+' '+'i'+' '+'r'+' '+'a'; + var logo_w = ctx.measureText(logo).width; + ctx.fillStyle = "#789944"; + ctx.fillText(logo,centerX - logo_w / 2,logoY); + + var a1 = _h * 360 / 12; + var a2 = m * 360 / 60; + var a3 = s * 360 / 60; + + var offset1 = canvas_size / 3.5; + var offset2 = canvas_size / 4.5; + var offset3 = canvas_size / 6; + var size1 = radius - offset1; + var size2 = radius - offset2; + var size3 = radius - offset3; + var x1 = centerX + size1 * Math.sin(radians(a1)); + var y1 = centerY - size1 * Math.cos(radians(a1)); + var x2 = centerX + size2 * Math.sin(radians(a2)); + var y2 = centerY - size2 * Math.cos(radians(a2)); + var x3 = centerX + size3 * Math.sin(radians(a3)); + var y3 = centerY - size3 * Math.cos(radians(a3)); + + ctx.beginPath(); + ctx.strokeStyle = "#777777"; + ctx.lineWidth = canvas_size / 18; + ctx.lineWidth = 4; + ctx.lineCap="round"; + ctx.moveTo(centerX, centerY); + ctx.lineTo(x1, y1); + ctx.moveTo(centerX, centerY); + ctx.closePath(); + ctx.stroke(); + + ctx.beginPath(); + ctx.strokeStyle = "#98008B"; + ctx.lineWidth = canvas_size / 26; + ctx.lineWidth = 3; + ctx.lineCap="round"; + ctx.moveTo(centerX, centerY); + ctx.lineTo(x2, y2); + ctx.moveTo(centerX, centerY); + ctx.closePath(); + ctx.stroke(); + + ctx.beginPath(); + ctx.lineWidth = 1; + ctx.strokeStyle = "#028BEA"; + ctx.moveTo(centerX, centerY); + ctx.lineTo(x3, y3); + ctx.moveTo(centerX, centerY); + ctx.closePath(); + ctx.stroke(); + + ctx.beginPath(); + ctx.lineWidth = canvas_size / 75; + ctx.strokeStyle = "#028BEA"; + ctx.fillStyle = "#A1D4F8"; + ctx.arc(centerX, centerY, radius / 10, 0, Math.PI*2, false); + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + } + + dashboard_local_clock = function(update) { + var canvas = $('#dashboard_local_clock').get(0); + + if (typeof(dashboard_local_clock.ctx)=="undefined") { + if (!canvas.getContext) dashboard_local_clock.ctx = null; + dashboard_local_clock.ctx = canvas.getContext('2d'); + } + if (!dashboard_local_clock.ctx) return; + + var canvas_size = Math.min(canvas.width, canvas.height); + + var date = new Date(); + var unix_timestamp = date.getTime() / 1000; + var timezone_offset = date.getTimezoneOffset() * 60; + var local_timestamp = Math.floor(unix_timestamp - timezone_offset); + + if (typeof(update)=="undefined" || !update) { + drawClock(dashboard_local_clock.ctx, canvas_size, local_timestamp); + } else { + drawArrows(dashboard_local_clock.ctx, canvas_size, local_timestamp); + } + }; + + dashboard_remote_clock = function(update) { + if (typeof(dashboard_remote_clock.start_timestamp)=="undefined") return; + if (typeof(dashboard_remote_clock.remote_timestamp)=="undefined") return; + + var canvas = $('#dashboard_remote_clock').get(0); + + if (typeof(dashboard_remote_clock.ctx)=="undefined") { + if (!canvas.getContext) dashboard_remote_clock.ctx = null; + dashboard_remote_clock.ctx = canvas.getContext('2d'); + } + if (!dashboard_remote_clock.ctx) return; + + var canvas_size = Math.min(canvas.width, canvas.height); + + var date = new Date(); + var unix_timestamp = Math.floor(date.getTime() / 1000); + var remote_timestamp = Math.floor(dashboard_remote_clock.remote_timestamp + unix_timestamp - dashboard_remote_clock.start_timestamp); + + if (typeof(update)=="undefined" || !update) { + drawClock(dashboard_remote_clock.ctx, canvas_size, remote_timestamp); + } else { + drawArrows(dashboard_remote_clock.ctx, canvas_size, remote_timestamp); + } + }; + + dashboard_clock = function() { + if (typeof(dashboard_clock.update)=="undefined") { + dashboard_clock.update = false; + } + //dashboard_local_clock(dashboard_clock.update); + dashboard_remote_clock(dashboard_clock.update); + dashboard_clock.update = true; + }; + + dashboard_notification = function(message, callback) { + var last = $('.dashboard-notification:last-child'); + $('body').append('
    '+message+'
    '); + + var t = 60; + if ($(last).length>0) { + t = $(last).offset().top + $(last).outerHeight() + 10; + } + + var dn = $('.dashboard-notification:last-child'); + $(dn).css({ + 'top': t, + 'left': ($(window).width() - $(dn).outerWidth()) / 2 + //'left': $(window).width() - $(dn).outerWidth() - $('#dashboard-sidebar').outerWidth() - 20 + }).fadeIn(); + + $(dn).click(function() { + desk_call(callback); + $(dn).children('.dashboard-notification-close').trigger('click'); + }); + + $(dn).children('.dashboard-notification-close').click(function(e){ + e.stopPropagation(); + e.preventDefault(); + $(this).parent('.dashboard-notification').fadeOut(200, function(){ + $(this).remove(); + }); + }); + + $(window).unbind('resize',dashboard_notification_update_position).resize(dashboard_notification_update_position); + }; + + dashboard_notification_update_position = function() { + $('.dashboard-notification').css({ + 'left': ($(window).width() - $('.dashboard-notification').outerWidth()) / 2 + //'left': $(window).width() - $('.dashboard-notification').outerWidth() - $('#dashboard-sidebar').outerWidth() - 20 + }); + } +})(jQuery); \ No newline at end of file diff --git a/assets/js/dash/blocks.js b/assets/js/dash/blocks.js new file mode 100644 index 0000000..b218070 --- /dev/null +++ b/assets/js/dash/blocks.js @@ -0,0 +1,43 @@ +var dash_blocks_install = function() { + var selected = desk_window_selected(this); + if (selected && typeof(selected.items)!="undefined" && selected.items.length>0) { + desk_window_request(this, url('dash/system/blocks'),{'blocks':selected.items}); + } +}; + +var dash_blocks_select = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length>0) { + this.disableItemsByProperty('typo','install'); + for (var i=0; i0) { + $(this.element).find('.cache-infobar').append('
    '+t('Information')+':
    '); + $(this.element).find('.cache-infobar').append('
    '); + for (var i=0; i'+response[i]+'
    '); + } + } + })); + }),1000); + } +}; + +var dash_cache_clear = function() { + desk_window_request(this, url('dash/system/cache'), {}); +}; \ No newline at end of file diff --git a/assets/js/dash/comments.js b/assets/js/dash/comments.js new file mode 100644 index 0000000..76bd7a0 --- /dev/null +++ b/assets/js/dash/comments.js @@ -0,0 +1,75 @@ +var dash_comments_select = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length>0) { + this.disableItemsByProperty('typo','activate'); + for (var i=0; i0) { + $(this.element).find('.comment-infobar').append('
    '+t('Information')+':
    '); + $(this.element).find('.comment-infobar').append('
    '); + for (var i=0; i'+response[i]+'
    '); + } + } + })); + }),1000); + } +}; + +var dash_comments_preview = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1) { + desk_message(t('Comment')+':
    '+selected[0].title.replace(/\r\n/g,'
    ')+'
    '); + } +}; + +var dash_comments_activate = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length>0) { + desk_window_request(this, url('dash/comments/activate'), desk_window_selected(this)); + } +}; + +var dash_comments_edit = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1) { + desk_multi_prompt(t('Comment'), this.bind(this, function(comment){ desk_window_request(this, url('dash/comments/edit'),{'comment':comment, 'item':selected[0].data}); })); $('#zira-multi-prompt-dialog textarea[name=modal-input]').val(selected[0].title); + } +}; + +var dash_comments_open = function() { + var selected = this.getSelectedContentItems(); + if (selected.length==1 && typeof(selected[0].page)!="undefined") { + window.location.href=url(selected[0].page); + } +}; + +var dash_comments_view = function() { + var selected = this.getSelectedContentItems(); + if (selected.length==1 && typeof(selected[0].page)!="undefined") { + var data = {'url':[selected[0].page]}; + desk_call(dash_comments_web, null, {'data':data}); + } +}; + +var dash_comments_load = function() { + for (var i=0; i'+t('Initialization')+' ... 
    '); + // keydown event + $(this.content).find('#dashboard-console').keydown(this.bind(this,function(e){ + if (this.isDisabled() || this.isMinimized()) return; + if (!this.keys.ctrl_pressed && (e.keyCode==37 || e.keyCode==38 || e.keyCode==39 || e.keyCode==40 || e.keyCode==8 || e.keyCode==13)) { + e.stopPropagation();e.preventDefault(); + } + var cmd_prefix = $(this.content).find('#dashboard-console-line .dashboard-console-cmd-prefix'); + var cmd_suffix = $(this.content).find('#dashboard-console-line .dashboard-console-cmd-suffix'); + var txt_prefix = $(cmd_prefix).text(); + var txt_suffix = $(cmd_suffix).text(); + if (e.keyCode!=90 && e.keyCode!=17 && e.keyCode!=37 && e.keyCode!=39) { + this.captured_prefix = null; + this.captured_suffix = null; + } + // ctrl+z + if (!this.hide_input && e.keyCode==90 && this.keys.ctrl_pressed) { + if (this.captured_prefix!==null && this.captured_suffix!==null) { + $(cmd_prefix).html(this.captured_prefix); + $(cmd_suffix).html(this.captured_suffix); + this.captured_prefix = null; + this.captured_suffix = null; + } + // arrow left + } else if (!this.hide_input && e.keyCode==37 && txt_prefix.length>0) { + var c = txt_prefix.substr(-1); + $(cmd_suffix).prepend(c); + $(cmd_prefix).text(txt_prefix.substr(0,txt_prefix.length-1)); + // arrow right + } else if (!this.hide_input && e.keyCode==39 && txt_suffix.length>0) { + var c = txt_suffix.substr(0,1); + $(cmd_prefix).append(c); + $(cmd_suffix).text(txt_suffix.substr(1)); + // arrow up + } else if (!this.hide_input && e.keyCode==38 && this.execs.length>0 && this.execs.length>this.exec_index) { + this.exec_index++; + $(cmd_prefix).text(this.execs[this.execs.length-this.exec_index]); + $(cmd_suffix).text(''); + // arrow down + } else if (!this.hide_input && e.keyCode==40 && this.execs.length>0 && this.exec_index>1) { + this.exec_index--; + $(cmd_prefix).text(this.execs[this.execs.length-this.exec_index]); + $(cmd_suffix).text(''); + // backspace and delete (check selected text first) + } else if (e.keyCode==8 || e.keyCode==46) { + try { // delete selected text + if (this.hide_input) throw 'ignore'; + if (!window.getSelection().isCollapsed){ + var range = window.getSelection().getRangeAt(0); + if ($(range.startContainer).parents('.dashboard-console-cmd-prefix').length>0 || $(range.startContainer).parents('.dashboard-console-cmd-suffix').length>0 || $(range.endContainer).parents('.dashboard-console-cmd-prefix').length>0 || $(range.endContainer).parents('.dashboard-console-cmd-suffix').length>0){ + var startRange = range.cloneRange(); + var endRange = range.cloneRange(); + startRange.collapse(true); + endRange.collapse(false); + startRange.insertNode($('').get(0)); + endRange.insertNode($('').get(0)); + window.getSelection().removeAllRanges(); + var marker1 = $(this.content).find('#dashboard-console-line #dashboard-console-range-marker-start'); + var marker2 = $(this.content).find('#dashboard-console-line #dashboard-console-range-marker-end'); + if ($(marker1).parents('#dashboard-console-caret').length>0) $(marker1).appendTo(cmd_prefix); + if ($(marker2).parents('#dashboard-console-caret').length>0) $(marker2).appendTo(cmd_prefix); + if (txt_suffix.length>0){ + $(cmd_prefix).append($(cmd_suffix).html()); + $(cmd_suffix).html(''); + this.exec_index=0; + } + var p1 = $(cmd_prefix).html().indexOf(''); + if (p1<0) p1=0; + $(this.content).find('#dashboard-console-line #dashboard-console-range-marker-start').remove(); + var p2 = $(cmd_prefix).html().indexOf(''); + $(this.content).find('#dashboard-console-line #dashboard-console-range-marker-end').remove(); + var html_prefix = $(cmd_prefix).html(); + if (p2<0) p2 = html_prefix.length; + var html1 = html_prefix.substr(0,p1); + var html2 = html_prefix.substr(p2); + $(cmd_prefix).html(html1+html2); + } + return; + } + } catch(err) {} + // backspace if text is not selected + if (e.keyCode==8 && txt_prefix.length>0) $(cmd_prefix).text(txt_prefix.substr(0,txt_prefix.length-1)); + if (this.hide_input && e.keyCode==8 && this.hidden_input.length>0) this.hidden_input=this.hidden_input.substr(0,this.hidden_input.length-1); + // delete if text is not selected + else if (e.keyCode==46 && txt_suffix.length>0) $(cmd_suffix).text(txt_suffix.substr(1)); + // enter + } else if (e.keyCode==13) { + var dir = ''; + if (typeof(this.options.data.mode)!="undefined" && this.options.data.mode!='sh') dir = this.options.data.mode; + else if (typeof(this.options.data.cd)!="undefined" && this.options.data.cd!==null) dir = this.options.data.cd; + var _dir = dir.split('/').slice(-1).toString(); + if (_dir.length==0) _dir='/'; + var sign = '$'; + if (typeof(this.options.data.mode)!="undefined" && this.options.data.mode!='sh') sign = '>'; + if (!this.hide_input) $(this.content).find('#dashboard-console-line').before('
    '+_dir+' '+sign+' '+txt_prefix+txt_suffix+'
    '); + $(cmd_prefix).text(''); + $(cmd_suffix).text(''); + var cons = $(this.content).find('#dashboard-console'); + $(cons).scrollTop($(cons).get(0).scrollHeight); + if (!this.hide_input) { + this.options.data.exec=(txt_prefix+txt_suffix); + this.exec = this.options.data.exec; + this.options.data.secret = dash_console_encrypt(this.options.data.exec+this.options.data.mode+this.secret); + } else { + this.options.data.exec = dash_console_encrypt(this.hidden_input); + this.options.data.code = 'password'; + } + if (this.options.data.exec.length>0) { + $(this.content).find('#dashboard-console #dashboard-console-line').hide(); + if (this.exec_index>0 && this.execs[this.execs.length-1]!=this.options.data.exec) this.exec_index--; + if (this.exec_index>0) this.execs = this.execs.slice(0,this.execs.length-this.exec_index); + if (!this.hide_input && (this.execs.length==0 || this.execs[this.execs.length-1]!=this.options.data.exec)) this.execs.push(this.options.data.exec); + this.exec_index=0; + this.hidden_input=''; + this.loadBody(); + } + // ctrl + v + } else if (this.keys.ctrl_pressed && e.keyCode==86 && $(this.content).find('#dashboard-console #dashboard-console-clipboard').length==0) { + $(this.content).find('#dashboard-console').append(''); + $(this.content).find('#dashboard-console #dashboard-console-clipboard').focus(); + } + })); + // keypress event + $(this.content).find('#dashboard-console').keypress(this.bind(this,function(e){ + if (this.isDisabled() || this.isMinimized()) return; + if (e.which!=99 && e.which!=118) { e.stopPropagation();e.preventDefault(); } + if (e.altKey || e.ctrlKey) return; + var cmd_prefix = $(this.content).find('#dashboard-console-line .dashboard-console-cmd-prefix'); + var cmd_suffix = $(this.content).find('#dashboard-console-line .dashboard-console-cmd-suffix'); + var txt_prefix = $(cmd_prefix).text(); + var txt_suffix = $(cmd_suffix).text(); + if (e.which>0 && e.which!=13 && e.which!=8){ + var c = String.fromCharCode(e.which); + if (!this.hide_input) $(cmd_prefix).append(c); + else { this.hidden_input+=c; $(cmd_prefix).append('*'); } + var cons = $(this.content).find('#dashboard-console'); + $(cons).scrollTop($(cons).get(0).scrollHeight); + } + })); + // paste event + $(this.content).find('#dashboard-console').bind('paste',this.bind(this,function(e){ + this.captured_prefix = $(this.content).find('#dashboard-console-line .dashboard-console-cmd-prefix').html(); + this.captured_suffix = $(this.content).find('#dashboard-console-line .dashboard-console-cmd-suffix').html(); + var clipboard = $(this.content).find('#dashboard-console #dashboard-console-clipboard'); + if ($(clipboard).length>0){ + try { + var c = e.originalEvent.clipboardData.getData('text/plain'); + if (!this.hide_input) $(this.content).find('#dashboard-console-line .dashboard-console-cmd-prefix').append(c); + else { this.hidden_input+=c; $(this.content).find('#dashboard-console-line .dashboard-console-cmd-prefix').append('*'.repeat(c.length));} + var cons = $(this.content).find('#dashboard-console'); + $(cons).scrollTop($(cons).get(0).scrollHeight); + } catch(err){} + $(clipboard).remove(); + } + $(this.content).find('#dashboard-console').focus(); + })); +}; + +var dash_console_load = function() { + if (typeof(this.options.data.code)!="undefined" && this.options.data.code=='secret') { + this.secret = this.options.data.result; + this.options.data.exec = this.exec; + this.options.data.secret = dash_console_encrypt(this.options.data.exec+this.options.data.mode+this.secret); + this.options.data.result=null; + this.options.data.code=null; + this.hidden_input=''; + this.loadBody(); + } else if (typeof(this.options.data.code)!="undefined" && this.options.data.code=='password') { + $(this.content).find('#dashboard-console #dashboard-console-line').show(); + $(this.content).find('#dashboard-console #dashboard-console-caret').css('visibility','visible'); + this.hide_input = true; + $(this.content).find('#dashboard-console #dashboard-console-line .dashboard-console-dir').attr('title','').text(t('Password')); + $(this.content).find('#dashboard-console #dashboard-console-line .dashboard-console-sign').text(':'); + } else { + $(this.content).find('#dashboard-console #dashboard-console-line').show(); + $(this.content).find('#dashboard-console #dashboard-console-caret').css('visibility','visible'); + this.hide_input = false; + $(this.content).find('#dashboard-console #dashboard-console-line .dashboard-console-dir').text(''); + $(this.content).find('#dashboard-console #dashboard-console-line .dashboard-console-sign').text(''); + if (typeof(this.options.data.cd)!="undefined" && this.options.data.cd!==null){ + var _dir = this.options.data.cd.split('/').slice(-1).toString(); + if (_dir.length==0) _dir='/'; + $(this.content).find('#dashboard-console #dashboard-console-line .dashboard-console-dir').attr('title',this.options.data.cd).text(_dir); + } + if (typeof(this.options.data.result)!="undefined" && this.options.data.result!==null){ + $(this.content).find('#dashboard-console-line').before('
    '+this.options.data.result+'
    '); + } + if (typeof(this.options.data.mode)!="undefined" && this.options.data.mode!='sh'){ + $(this.content).find('#dashboard-console #dashboard-console-line .dashboard-console-sign').text('>'); + $(this.content).find('#dashboard-console #dashboard-console-line .dashboard-console-dir').text(this.options.data.mode); + $(this.content).find('#dashboard-console #dashboard-console-line .dashboard-console-dir').attr('title',this.options.data.mode); + } else { + $(this.content).find('#dashboard-console #dashboard-console-line .dashboard-console-sign').text('$'); + } + } + if (typeof(this.options.data.code)!="undefined" && this.options.data.code=='exit'){ + this.getCloseButton().trigger('click'); + } else { + var cons = $(this.content).find('#dashboard-console'); + $(cons).scrollTop($(cons).get(0).scrollHeight); + this.options.data.result=null; + } + this.options.data.code=null; + this.hidden_input=''; +}; + +var dash_console_focus = function() { + $(this.content).find('#dashboard-console #dashboard-console-caret').css('visibility','visible'); + $(this.content).find('#dashboard-console').focus(); +}; + +var dash_console_blur = function() { + $(this.content).find('#dashboard-console #dashboard-console-caret').css('visibility','hidden'); + $(this.content).find('#dashboard-console').blur(); +}; + +var dash_console_encrypt = function(str) { + return md5(encodeURIComponent(str).replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\!/g, '%21').replace(/\*/g, '%2A')); +} \ No newline at end of file diff --git a/assets/js/dash/contacts.js b/assets/js/dash/contacts.js new file mode 100644 index 0000000..aa9de66 --- /dev/null +++ b/assets/js/dash/contacts.js @@ -0,0 +1,13 @@ +var dash_contacts_load = function() { + desk_window_form_init(this); + $(this.content).find('input.picture_option').parent().append(''); + $(this.content).find('input.picture_option').parent().children('.glyphicon').click(this.bind(this, function(){ + desk_file_selector(function(selected){ + if (selected && selected.length>0 && typeof(selected[0].type)!="undefined" && selected[0].type=='image') { + var src = selected[0].data; + var regexp = new RegExp('\\'+desk_ds, 'g'); + $(this.content).find('input.picture_option').val(src.replace(regexp,'/')); + } + }, this); + })); +}; \ No newline at end of file diff --git a/assets/js/dash/cron.js b/assets/js/dash/cron.js new file mode 100644 index 0000000..69c0501 --- /dev/null +++ b/assets/js/dash/cron.js @@ -0,0 +1,12 @@ +var dash_cron_open = function() { + desk_window_request(this, url('cron'), {}, this.bind(this, function(response){ + var output = ''; + if (response && response.length>0) { + for (var i=0; i'; + } + } + this.clearBodyContent(); + this.appendBodyContent(output); + })); +}; \ No newline at end of file diff --git a/assets/js/dash/editor.js b/assets/js/dash/editor.js new file mode 100644 index 0000000..fc2171e --- /dev/null +++ b/assets/js/dash/editor.js @@ -0,0 +1,162 @@ +var dash_editor_text_focus = function() { + $(this.content).find('textarea').focus(); +}; + +var dash_editor_text_load = function() { + this.contentModified = false; + $(this.content).find('textarea').focus(); + $(this.content).find('textarea').eq(0).keyup(this.bind(this, function(){ + var val = $(this.content).find('textarea').eq(0).val(); + this.resetFooterContent(); + this.appendFooterContent(val.length); + this.contentModified = true; + })); + var val = $(this.content).find('textarea').eq(0).val(); + this.resetFooterContent(); + this.appendFooterContent(val.length); +}; + +var dash_editor_html_focus = function() { + var l=''; + if (typeof(this.editor)!="undefined") { + this.editor.focus(); + l = this.editor.getContent().replace(/ /g,'').replace(/<[\s\S]*?>/g,'').length; + } + this.resetFooterContent(); + this.appendFooterContent(l); +}; + +var dash_editor_html_blur = function() { + try { + this.editor.iframeElement.blur(); + } catch(err) {} +}; + +var dash_editor_html_resize = function() { + if (typeof(this.editor)=="undefined") return; + var content_height = $(this.content).height(); + var editor_panel_height = $(this.content).find('.mce-toolbar[role=toolbar]').eq(0).parents('.mce-panel').outerHeight(); + this.editor.theme.resizeTo('100%',content_height-editor_panel_height); +}; + +var dash_editor_html_update = function() { + if (typeof(this.editor)=="undefined") return; + $(this.content).find('textarea[name=content]').val(this.editor.getContent()); +}; + +var dash_editor_html_drop = function(element) { + if (typeof(this.editor)=="undefined") return; + if (element instanceof FileList) return; + if (typeof(element)!="object" || typeof(element.type)=="undefined" || typeof(element.data)=="undefined" || typeof(element.title)=="undefined") return; + if (typeof(element.parent)=="undefined") return; + var html = ''; + if (element.parent=='files' && element.type=='image') { + var width = ''; + var height = ''; + if (typeof(element.image_width)!="undefined") width=element.image_width; + if (typeof(element.image_height)!="undefined") height=element.image_height; + var regexp = new RegExp('\\'+desk_ds, 'g'); + html=''+element.title+''; + } else if (element.parent=='files' && element.type!='folder') { + html=''+element.title+''; + } else if (element.parent=='record' && typeof(element.typo)!="undefined" && element.typo=='record' && typeof(element.page)!="undefined") { + var language = ''; + if (typeof(element.language)!="undefined" && element.language!==null) language = element.language + '/'; + var page = url(language+element.page); + var title = element.tooltip && element.tooltip.length>0 ? element.tooltip : element.title; + html=''+title+''; + } + if (html.length>0){ + this.editor.execCommand('mceInsertContent', false, html); + } +}; + +var dash_editor_html_load = function() { + this.contentModified = false; + tinymce.init({ + selector:'#'+$(this.content).find('.editable').attr('id') , + plugins: 'paste, advlist, link, image, media, table, hr, pagebreak, code, contextmenu', + toolbar: ['desk_save | undo redo | table | bullist numlist | desk_file_selector image media link | outdent indent | hr pagebreak | code', 'styleselect | bold italic underline removeformat | aligncenter alignleft alignright alignjustify '], + menubar: false, + language: dash_editor_language, + paste_word_valid_elements: 'b,strong,i,em,h1,h2,h3,h4,h5,h6,p,ul,ol,li,hr,br,table,tr,td', + paste_filter_drop: false, + convert_urls: false, + statusbar: false, + auto_focus: true, + init_instance_callback: this.bind(this, function (editor) { + this.editor = editor; + this.onResize(); + window.setTimeout(this.bind(this, this.onResize),1000); + var openDialog = editor.windowManager.open; + editor.windowManager.open = function(args, params){ + Desk.disableEvents(); + var modal = openDialog.call(this, args, params); + modal.on('close', function(){ + window.setTimeout(Desk.bind(Desk,Desk.enableEvents,500)); + }); + return modal; + }; + editor.on('focus', this.bind({'desk':Desk,'wnd':this},function(){ + this.desk.focusWindow(this.wnd); + this.wnd.onResize(); + if (this.wnd.isMenuDropdownOpened()) this.wnd.hideMenuDropdown(); + })); + $(editor.getBody()).keydown(this.bind(Desk, function(e){ + if (e.shiftKey && e.keyCode==9) { + this.shift_pressed = true; this.keys_pressed = 1; this.onKeyDown(e); this.keys_pressed = 1; this.onKeyUp(e); + } else if (e.ctrlKey && (e.keyCode==37 || e.keyCode==38 || e.keyCode==39 || e.keyCode==40)) { + this.ctrl_pressed = true; this.keys_pressed = 1; this.onKeyDown(e); this.onKeyUp(e); + } else if (e.ctrlKey && e.keyCode==83) { + this.ctrl_pressed = true; this.keys_pressed = 1; this.onKeyDown(e); this.onKeyUp(e); + } else if (!e.ctrlKey && !e.shiftKe && e.keyCode==27) { + this.keys_pressed = 0; this.onKeyDown(e); this.onKeyUp(e); + } + })); + $(editor.getBody()).keyup(this.bind(this, function(e){ + if (!this.isInitialized() || this.isDisabled() || this.isMinimized()) { + e.stopPropagation(); e.preventDefault(); + } + var l=''; + if (typeof(this.editor)!="undefined") { + l = this.editor.getContent().replace(/ /g,'').replace(/<[\s\S]*?>/g,'').length; + } + this.resetFooterContent(); + this.appendFooterContent(l); + this.contentModified = true; + })); + $(this.editor.getDoc()).unbind('dragover').bind('dragover',this.bind({'desk':Desk,'wnd':this}, function(e){this.desk.focusWindow(this.wnd);})); + $(this.editor.getDoc()).unbind('drop').bind('drop',this.bind(Desk, function(e){this.onDrop(e);})); + }), + content_css: dash_editor_css, + setup: this.bind(this,function(editor){ + editor.addButton('desk_save',{ 'icon': 'save', 'title':t('Save'), 'onclick': this.bind(this,function(){ + desk_window_save(this); + })}); + editor.addButton('desk_file_selector',{ 'icon': 'browse', 'title':t('File manager'), 'onclick': this.bind(this,function(){ + desk_file_selector(this.bind(this,function(elements){ + for (var i=0; i0) html+= ' '; + if (element.type=='image') { + var width = ''; + var height = ''; + if (typeof(element.image_width)!="undefined") width=element.image_width; + if (typeof(element.image_height)!="undefined") height=element.image_height; + var regexp = new RegExp('\\'+desk_ds, 'g'); + html+=''+element.title+''; + } else if (element.type!='folder') html+=''+element.title+''; + if (html.length>0){ + this.editor.execCommand('mceInsertContent', false, html); + } + } + })); + })}); + }) + }); +}; \ No newline at end of file diff --git a/assets/js/dash/files.js b/assets/js/dash/files.js new file mode 100644 index 0000000..e056d6e --- /dev/null +++ b/assets/js/dash/files.js @@ -0,0 +1,206 @@ +var dash_files_load = function() { + $(this.element).find('.filemanager-infobar').html(''); + var item = this.findToolbarItemByProperty('action','level'); + var root = this.options.data.root.split(desk_ds).slice(0,-1); + if (root.length>0) { + this.enableToolbarItem(item); + } else { + this.disableToolbarItem(item); + } +}; + +var dash_files_open = function() { + if (typeof(this.options.data)!="undefined" && typeof(this.options.data.max_upload_size)!="undefined") this.max_upload_size=this.options.data.max_upload_size; else this.max_upload_size=null; + $(this.element).find('.dashwindow-upload-form input[type=file]').change(this.bind(this, function(){ + var root = this.options.data.root; + desk_upload(token(),url('dash/files/xhrupload'), root, $(this.element).find('.dashwindow-upload-form input[type=file]').get(0).files, null, this.max_upload_size, this.className); + })); + this.disableItemsByProperty('action','call'); +}; + +var dash_files_drop = function(element) { + if (element instanceof FileList) { + var root = this.options.data.root; desk_upload(token(),url('dash/files/xhrupload'), root, element, null, this.max_upload_size, this.className); + } else if (typeof(element.parent)!="undefined" && element.parent=='files') { + desk_window_request(this, url('dash/files/copy'),{'path':this.options.data.root, 'file':element.data}); + } +}; + +var dash_files_select = function() { + var selected = this.getSelectedContentItems(); + if (!selected || selected.length!=1) this.disableItemsByProperty('action','call'); + else this.enableItemsByProperty('action','call'); + if (!selected || selected.length!=1 || typeof(selected[0].type)=="undefined" || selected[0].type=='folder') { + this.disableItemsByProperty('typo','download'); + } + if (!selected || selected.length!=1 || typeof(selected[0].type)=="undefined" || selected[0].type!='archive') { + this.disableItemsByProperty('typo','archive'); + } + if (!selected || selected.length!=1 || typeof(selected[0].type)=="undefined" || (selected[0].type!='image' && selected[0].type!='txt' && selected[0].type!='html')) { + this.disableItemsByProperty('action','edit'); + } + if (!selected || selected.length!=1 || typeof(selected[0].type)=="undefined" || selected[0].type=='folder' || selected[0].type=='image'|| selected[0].type=='archive') { + this.disableItemsByProperty('typo','notepad'); + } + if (!selected || selected.length!=1 || typeof(selected[0].type)=="undefined" || selected[0].type!='image') { + this.disableItemsByProperty('typo','show_image'); + } + if (selected && selected.length && selected.length==1 && (typeof(this.info_last_item)=="undefined" || this.info_last_item!=selected[0].data || $(this.element).find('.filemanager-infobar').html().length==0)) { + this.info_last_item = selected[0].data; + $(this.element).find('.filemanager-infobar').html(''); + try { window.clearTimeout(this.timer); } catch(err) {}; + this.timer = window.setTimeout(this.bind(this,function(){ + $(this.element).find('.filemanager-infobar').html(''); + var selected = this.getSelectedContentItems(); + if (!selected || !selected.length || selected.length!=1) return; + desk_post(url('dash/files/info'),{'dirroot':this.options.data.root,'file':selected[0].data, 'token':token()}, this.bind(this, function(response){ + if (response && response.length>0) { + $(this.element).find('.filemanager-infobar').append('
    '+t('Information')+':
    '); + $(this.element).find('.filemanager-infobar').append('
    '); + for (var i=0; i'+response[i]+'
    '); + } + } + })); + }),1000); + } +}; + +var dash_files_up = function() { + var root = this.options.data.root.split(desk_ds).slice(0,-1); + if (root.length>0) { + this.options.data.root=root.join(desk_ds); + this.options.data.page=1; + desk_window_reload(this); + } +}; + +var dash_files_mkdir = function() { + desk_prompt(t('Enter name'), this.bind(this, function(name){ + var root = this.options.data.root; + desk_window_request(this, url('dash/files/mkdir'),{'name':name, 'root':root}); + })); +}; + +var dash_files_new_text_file = function() { + desk_prompt(t('Enter name'), this.bind(this, function(name){ + var root = this.options.data.root; + desk_window_request(this, url('dash/files/textfile'),{'name':name, 'root':root}); + })); +}; + +var dash_files_new_html_file = function() { + desk_prompt(t('Enter name'), this.bind(this, function(name){ + var root = this.options.data.root; + desk_window_request(this, url('dash/files/htmlfile'),{'name':name, 'root':root}); + })); +}; + +var dash_files_rename = function() { + var selected = desk_window_selected(this); + if (typeof(selected.items)!="undefined" && selected.items.length==1) { + desk_prompt(t('Enter name'), this.bind(this, function(name){ + desk_window_request(this, url('dash/files/rename'),{'name':name, 'file':selected.items[0]}); + })); + $('#zira-prompt-dialog input[name=modal-input]').val(selected.items[0].split(desk_ds).slice(-1)[0]); + } +}; + +var dash_files_upload_url = function() { + desk_prompt(t('Enter URL address'),this.bind(this, function(address) { + var root = this.options.data.root; + if (address.length>0) { + desk_window_request(this, url('dash/files/xhruploadsrc'), {'dirroot': root, 'url': address}); + } + })); +}; + +var dash_files_download = function() { + var selected = this.getSelectedContentItems(); + if (selected.length==1 && typeof(selected[0].type)!="undefined" && selected[0].type!='folder') { + var a=document.createElement('a'); + var regexp = new RegExp('\\'+desk_ds, 'g'); + a.href=baseUrl(selected[0].data.replace(regexp, '/')); + a.download=selected[0].data.split(desk_ds).slice(-1)[0]; + document.body.appendChild(a); + HTMLElementClick.call(a); + document.body.removeChild(a); + } +}; + +var dash_files_copy = function() { + var selected = desk_window_selected(this); + if (typeof(selected.items)!="undefined" && selected.items.length==1) { + desk_prompt(t('Enter folder path'), this.bind(this, function(path){ + desk_window_request(this, url('dash/files/copy'),{'path':path, 'file':selected.items[0]}); + })); + $('#zira-prompt-dialog input[name=modal-input]').val(selected.items[0].split(desk_ds).slice(0,-1).join(desk_ds)); + } +}; + +var dash_files_move = function() { + var selected = desk_window_selected(this); + if (typeof(selected.items)!="undefined" && selected.items.length==1) { + desk_prompt(t('Enter folder path'), this.bind(this, function(path){ + desk_window_request(this, url('dash/files/move'),{'path':path, 'file':selected.items[0]}); + })); + $('#zira-prompt-dialog input[name=modal-input]').val(selected.items[0].split(desk_ds).slice(0,-1).join(desk_ds)); + } +}; + +var dash_files_pack = function() { + var selected = desk_window_selected(this); + if (typeof(selected.items)!="undefined" && selected.items.length>0) { + desk_prompt(t('Enter archive name'), this.bind(this, function(name){ + var root = this.options.data.root; + desk_window_request(this, url('dash/files/pack'),{'name':name, 'files':selected.items, 'dirroot': root}); + })); + $('#zira-prompt-dialog input[name=modal-input]').val(selected.items[0].split(desk_ds).slice(-1)[0].split('.')[0]); + } +}; + +var dash_files_unpack = function() { + var selected = this.getSelectedContentItems(); + if (selected.length==1 && typeof(selected[0].type)!="undefined" && selected[0].type=='archive') { + desk_prompt(t('Enter folder path'), this.bind(this, function(path){ + desk_window_request(this, url('dash/files/unpack'),{'dirroot':path, 'file':selected[0].data}); + })); + $('#zira-prompt-dialog input[name=modal-input]').val(this.options.data.root); + } +}; + +var dash_files_notepad = function() { + var selected = this.getSelectedContentItems(); + if (!selected || selected.length!=1) return; + var data=selected[0].data; + desk_text_editor(data); +}; + +var dash_files_show_image = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1 && typeof(selected[0].image_url)!="undefined" && selected[0].image_url.length>0) { + $('body').append(''); + $('#dashwindow-filemanager-zoomer-lightbox').trigger('click'); + $('#dashwindow-filemanager-zoomer-lightbox').remove(); + } +}; + +var dash_files_edit = function() { + try { window.clearTimeout(this.timer); } catch(err) {}; + var selected = this.getSelectedContentItems(); + if (!selected || selected.length!=1) return; + var data=selected[0].data; + if (typeof(selected[0].type)!="undefined" && selected[0].type=='folder') { + this.options.data.root=data; + this.options.data.page=1; + desk_window_reload(this); + } else if (typeof(selected[0].type)!="undefined" && selected[0].type=='archive') { + desk_call(dash_files_unpack, this); + } else if (typeof(selected[0].type)!="undefined" && selected[0].type=='txt') { + desk_text_editor(data); + } else if (typeof(selected[0].type)!="undefined" && selected[0].type=='html') { + desk_html_editor(data); + } else if (typeof(selected[0].type)!="undefined" && selected[0].type=='image') { + desk_image_editor(data); + } +}; \ No newline at end of file diff --git a/assets/js/dash/groups.js b/assets/js/dash/groups.js new file mode 100644 index 0000000..c68a593 --- /dev/null +++ b/assets/js/dash/groups.js @@ -0,0 +1,85 @@ +var dash_groups_load = function() { + for (var i=0; i0) { + desk_window_request(this, url('dash/groups/deactivate'),{'groups':selected.items}); + } +}; + +var dash_groups_activate = function() { + var selected = desk_window_selected(this); + if (selected && typeof(selected.items)!="undefined" && selected.items.length>0) { + desk_window_request(this, url('dash/groups/activate'),{'groups':selected.items}); + } +}; + +var dash_groups_select = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length>0) { + this.disableItemsByProperty('typo','deactivate'); + for (var i=0; i
    '); + this.options.data.image=$(this.content).find('img'); + $(this.options.data.image).parent('div').css({'display':'table-cell','height':'100%','textAlign':'center','verticalAlign':'middle'}); + $(this.options.data.image).parent('div').parent('div').css({'display':'table-row'}); + $(this.options.data.image).parent('div').parent('div').parent('div').css({'display':'table','width':'100%','height':'100%'}); + this.enableItemsByProperty('action','zoom'); + this.enableItemsByProperty('action','resize'); + this.enableItemsByProperty('action','reload'); + this.enableItemsByProperty('action','crop'); + this.enableItemsByProperty('action','save'); + this.enableItemsByProperty('action','watermark'); + this.updateTitle(this.options.data.file); + this.resetFooterContent(); + this.appendFooterContent(this.options.data.image_width+'x'+this.options.data.image_height+'px'); + }); + var regexp = new RegExp('\\'+desk_ds, 'g'); + this.options.data.image.src=baseUrl(this.options.data.file.replace(regexp,'/'))+'?t='+(new Date().getTime()); + })); +}; + +var dash_image_close = function() { + if (typeof(this.options.data)=="undefined" || typeof(this.options.data.file)=="undefined") return; + desk_window_request(this,url('dash/image/close'),{'file':this.options.data.file}); +}; + +var dash_image_resize = function() { + if (typeof(this.cropper)!="undefined" && this.cropper!=null) { + this.cropper.destroy(); + this.cropper = null; + this.disableItemsByProperty('action','cut'); + this.disableItemsByProperty('action','ratio'); + } +}; + +var dash_image_focus = function() { + if (typeof(this.cropper)=="undefined" || this.cropper===null) return; + this.cropper.disabled = false; +}; + +var dash_image_blur = function() { + if (typeof(this.cropper)=="undefined" || this.cropper===null) return; + this.cropper.disabled = true; +}; + +var dash_image_save = function() { + desk_confirm(t('Replace image ?'), this.bind(this, function(){ + desk_window_request(this, url('dash/image/save'), {'file': this.options.data.file}, this.bind(this, function(response){ + if (!response || !response.message) return; + desk_window_reload_all(dash_image_files_wnd); + })); + })); +}; + +var dash_image_zoom_in = function() { + if (typeof(this.cropper)!="undefined" && this.cropper!=null) { + this.cropper.destroy(); + this.cropper = null; + this.disableItemsByProperty('action','cut'); + this.disableItemsByProperty('action','ratio'); + } + var width = $(this.options.data.image).width(); + var height = $(this.options.data.image).height(); + $(this.options.data.image).css({'width':width*2,'height':height*2}); +}; + +var dash_image_zoom_out = function() { + if (typeof(this.cropper)!="undefined" && this.cropper!=null) { + this.cropper.destroy(); + this.cropper = null; + this.disableItemsByProperty('action','cut'); + this.disableItemsByProperty('action','ratio'); + } + var width = $(this.options.data.image).width(); + var height = $(this.options.data.image).height(); + if (width<10 || height<10) return; + $(this.options.data.image).css({'width':width/2,'height':height/2}); +}; + +var dash_image_change_width = function() { + if (typeof(this.cropper)!="undefined" && this.cropper!=null) { + this.cropper.destroy(); + this.cropper = null; + this.disableItemsByProperty('action','cut'); + this.disableItemsByProperty('action','ratio'); + } + desk_prompt(t('Image width'), this.bind(this, function(width){ + var _width = parseInt(width); + if (_width<=0) return; + desk_window_request(this, url('dash/image/width'),{'width':_width, 'file':this.options.data.file}, this.bind(this, function(response){ + if (!response || !response.width || !response.height) return; + this.options.data.image_width=response.width; + this.options.data.image_height=response.height; + $(this.options.data.image).css({'width':response.width,'height':response.height}); + if (response.src) $(this.options.data.image).attr('src',response.src); + this.resetFooterContent(); + this.appendFooterContent(this.options.data.image_width+'x'+this.options.data.image_height+'px'); + }), function(){ + desk_error(t('An error occurred')); + }); + })); + $('#zira-prompt-dialog input[name=modal-input]').val(this.options.data.image_width); +}; + +var dash_image_change_height = function() { + if (typeof(this.cropper)!="undefined" && this.cropper!=null) { + this.cropper.destroy(); + this.cropper = null; + this.disableItemsByProperty('action','cut'); + this.disableItemsByProperty('action','ratio'); + } + desk_prompt(t('Image height'), this.bind(this, function(height){ + var _height = parseInt(height); + if (_height<=0) return; + desk_window_request(this, url('dash/image/height'),{'height':_height, 'file':this.options.data.file}, this.bind(this, function(response){ + if (!response || !response.width || !response.height) return; + this.options.data.image_width=response.width; + this.options.data.image_height=response.height; + $(this.options.data.image).css({'width':response.width,'height':response.height}); + if (response.src) $(this.options.data.image).attr('src',response.src); + this.resetFooterContent(); + this.appendFooterContent(this.options.data.image_width+'x'+this.options.data.image_height+'px'); + }), function(){ + desk_error(t('An error occurred')); + }); + })); + $('#zira-prompt-dialog input[name=modal-input]').val(this.options.data.image_height); +}; + +var dash_image_crop_width = function() { + if (typeof(this.cropper)!="undefined" && this.cropper!=null) { + this.cropper.destroy(); + this.cropper = null; + this.disableItemsByProperty('action','cut'); + this.disableItemsByProperty('action','ratio'); + } + desk_prompt(t('Image width'), this.bind(this, function(width){ + var _width = parseInt(width); + if (_width<=0) return; + desk_window_request(this, url('dash/image/cropwidth'),{'width':_width, 'file':this.options.data.file}, this.bind(this, function(response){ + if (!response || !response.width || !response.height) return; + this.options.data.image_width=response.width; + this.options.data.image_height=response.height; + $(this.options.data.image).css({'width':response.width,'height':response.height}); + if (response.src) $(this.options.data.image).attr('src',response.src); + this.resetFooterContent(); + this.appendFooterContent(this.options.data.image_width+'x'+this.options.data.image_height+'px'); + }), function(){ + desk_error(t('An error occurred')); + }); + })); + $('#zira-prompt-dialog input[name=modal-input]').val(this.options.data.image_width); +}; + +var dash_image_crop_height = function() { + if (typeof(this.cropper)!="undefined" && this.cropper!=null) { + this.cropper.destroy(); + this.cropper = null; + this.disableItemsByProperty('action','cut'); + this.disableItemsByProperty('action','ratio'); + } + desk_prompt(t('Image height'), this.bind(this, function(height){ + var _height = parseInt(height); + if (_height<=0) return; + desk_window_request(this, url('dash/image/cropheight'),{'height':_height, 'file':this.options.data.file}, this.bind(this, function(response){ + if (!response || !response.width || !response.height) return; + this.options.data.image_width=response.width; + this.options.data.image_height=response.height; + $(this.options.data.image).css({'width':response.width,'height':response.height}); + if (response.src) $(this.options.data.image).attr('src',response.src); + this.resetFooterContent(); + this.appendFooterContent(this.options.data.image_width+'x'+this.options.data.image_height+'px'); + }), function(){ + desk_error(t('An error occurred')); + }); + })); + $('#zira-prompt-dialog input[name=modal-input]').val(this.options.data.image_height); +}; + +var dash_image_reload = function() { + if (typeof(this.cropper)!="undefined" && this.cropper!=null) { + this.cropper.destroy(); + this.cropper = null; + this.disableItemsByProperty('action','cut'); + this.disableItemsByProperty('action','ratio'); + } + desk_window_request(this, url('dash/image/open'), {'file':this.options.data.file}, this.bind(this, function(response){ + if (!response || !response.width || !response.height || !response.src) return; + this.options.data.image_width=response.width; + this.options.data.image_height=response.height; + $(this.options.data.image).css({'width':response.width,'height':response.height}); + $(this.options.data.image).attr('src',response.src); + this.resetFooterContent(); + this.appendFooterContent(this.options.data.image_width+'x'+this.options.data.image_height+'px'); + })); +}; + +var dash_image_crop = function() { + if (typeof(this.cropper)!="undefined" && this.cropper!=null) { + this.cropper.destroy(); + this.cropper = null; + this.disableItemsByProperty('action','cut'); + this.disableItemsByProperty('action','ratio'); + } else { + this.enableItemsByProperty('action','cut'); + this.enableItemsByProperty('action','ratio'); + this.disableItemsByProperty('typo','0_0'); + this.cropper = $(this.options.data.image).cropper({'preview':false,'block_mode':true,'fixed':false,'sel_w':$(this.options.data.image).width()/2,'sel_h':$(this.options.data.image).height()/2,'sel_mw':10,'sel_mh':10}); + $(this.content).unbind('dblclick').on('dblclick','.image-cropper-selector',this.bind(this, function(){ + desk_call(dash_image_cut, this); + })); + } +}; + +var dash_image_aspect_ratio = function(element) { + if (!this.cropper) return; + this.cropper.destroy(); + var id = $(element).attr('id'); + var item = this.findToolbarItemByProperty('id',id); + if (!item.typo) return; + var ratio=item.typo.split('_'); + if (ratio.length!=2) return; + ratio[0]=parseInt(ratio[0]); + ratio[1]=parseInt(ratio[1]); + this.enableItemsByProperty('action','ratio'); + this.disableItemsByProperty('typo',item.typo); + if (!ratio[0] || !ratio[1]) { + this.cropper = $(this.options.data.image).cropper({'preview':false,'block_mode':true,'fixed':false,'sel_w':$(this.options.data.image).width()/2,'sel_h':$(this.options.data.image).height()/2,'sel_mw':10,'sel_mh':10}); + } else { + var w, h; + if (this.options.data.image_width/this.options.data.image_height > ratio[0]/ratio[1]) { + h = $(this.options.data.image).height()/2; + w = (h * ratio[0]) / ratio[1]; + } else { + w = $(this.options.data.image).width()/2; + h = (w * ratio[1]) / ratio[0]; + } + this.cropper = $(this.options.data.image).cropper({'preview':false,'block_mode':true,'fixed':true,'sel_w':w,'sel_h':h,'sel_mw':10,'sel_mh':10}); + } +}; + +var dash_image_cut = function() { + if (!this.cropper) return; + var rect = this.cropper.getRect(); + this.cropper.destroy(); + this.cropper = null; + this.disableItemsByProperty('action','cut'); + this.disableItemsByProperty('action','ratio'); + desk_window_request(this, url('dash/image/crop'), {'file': this.options.data.file, 'width': rect.w, 'height': rect.h, 'left': rect.x, 'top': rect.y}, this.bind(this, function(response){ + if (!response || !response.width || !response.height || !response.src) return; + this.options.data.image_width=response.width; + this.options.data.image_height=response.height; + $(this.options.data.image).css({'width':response.width,'height':response.height}); + $(this.options.data.image).attr('src',response.src); + this.resetFooterContent(); + this.appendFooterContent(this.options.data.image_width+'x'+this.options.data.image_height+'px'); + })); +}; + +var dash_image_save_as = function() { + desk_prompt(t('Enter name'), this.bind(this, function(name){ + if (!name || name.length==0) return; + desk_window_request(this, url('dash/image/saveas'), {'file': this.options.data.file, 'name': name}, this.bind(this, function(response){ + if (!response || !response.message) return; + desk_window_reload_all(dash_image_files_wnd); + })); + })); + $('#zira-prompt-dialog input[name=modal-input]').val(this.options.data.file.split(desk_ds).slice(-1)[0].split('.').slice(0)[0]); +}; + +var dash_image_watermark = function() { + desk_window_request(this, url('dash/image/watermark'), {'file': this.options.data.file}, this.bind(this, function(response){ + if (!response || !response.width || !response.height || !response.src) return; + this.options.data.image_width=response.width; + this.options.data.image_height=response.height; + $(this.options.data.image).css({'width':response.width,'height':response.height}); + $(this.options.data.image).attr('src',response.src); + this.resetFooterContent(); + this.appendFooterContent(this.options.data.image_width+'x'+this.options.data.image_height+'px'); + })); +}; + +var desk_image_editor = function(file) { + try { + var data = {'file':file}; + desk_call(dash_image_wnd, null, {'data':data}); + } catch(e) { + desk_error(t('An error occurred')); + } +}; \ No newline at end of file diff --git a/assets/js/dash/languages.js b/assets/js/dash/languages.js new file mode 100644 index 0000000..5860b2c --- /dev/null +++ b/assets/js/dash/languages.js @@ -0,0 +1,75 @@ +var dash_languages_load = function() { + for (var i=0; i0) { + $(this.element).find('.logs-infobar').append('
    '+t('Information')+':
    '); + $(this.element).find('.logs-infobar').append('
    '); + for (var i=0; i'+response[i]+''); + } + } + })); + }),1000); + } +}; \ No newline at end of file diff --git a/assets/js/dash/mailing.js b/assets/js/dash/mailing.js new file mode 100644 index 0000000..3e72b56 --- /dev/null +++ b/assets/js/dash/mailing.js @@ -0,0 +1,80 @@ +var dash_mailing_load = function() { + desk_window_form_init(this); + var users = this.findToolbarItemByProperty('action','users'); + if (users) { + $(users.element).text(t('Message')+' ('+this.options.data.users+')'); + } + var subscribers = this.findToolbarItemByProperty('action','subscribers'); + if (subscribers) { + $(subscribers.element).text(t('Email')+' ('+this.options.data.subscribers+')'); + } + var type = $(this.content).find('.dash-mailing-type').eq(0).val(); + if (type == 'email') { + this.enableItemsByProperty('action','users'); + } else if (type == 'message') { + this.enableItemsByProperty('action','subscribers'); + } + $(this.content).find('.dash-mailing-subject').unbind('keyup').keyup(this.bind(this,function(e){ + var subject_l = $(this.content).find('.dash-mailing-subject').eq(0).val().length; + var message_l = $(this.content).find('.dash-mailing-message').eq(0).val().length; + if (subject_l>0 && message_l>0){ + this.enableItemsByProperty('action','mail'); + } else { + this.disableItemsByProperty('action','mail'); + } + })); + $(this.content).find('.dash-mailing-message').unbind('keyup').keyup(this.bind(this,function(e){ + var subject_l = $(this.content).find('.dash-mailing-subject').eq(0).val().length; + var message_l = $(this.content).find('.dash-mailing-message').eq(0).val().length; + if (subject_l>0 && message_l>0){ + this.enableItemsByProperty('action','mail'); + } else { + this.disableItemsByProperty('action','mail'); + } + $(this.content).find('.dash-mailing-message').eq(0).parent().children('.help-block').text(message_l); + })); + this.mail = function(){ + $(this.content).find('.dash-mailing-offset').eq(0).val(this.options.data.offset); + var data = desk_window_content(this); + desk_window_request(this, url('dash/system/mailing'), data, this.bind(this, function(response){ + if (!response || typeof(response.error)!="undefined") { + desk_modal_progress_hide(); + return; + } + if (response.left>0){ + this.options.data.offset = ++response.offset; + desk_modal_progress_update(Math.round((response.sent / response.total)*100)); + desk_window_request.finish_callback = this.bind(this, this.mail); + } else { + this.options.data.offset = 0; + desk_modal_progress_hide(); + if (response.type=='email'){ + desk_message(t('Successfully finished. Emails sent:')+' '+response.sent); + } else if (response.type=='message'){ + desk_message(t('Successfully finished. Messages sent:')+' '+response.sent); + } + } + })); + }; +}; + +var dash_mailing_type_email = function() { + this.enableItemsByProperty('action','users'); + this.disableItemsByProperty('action','subscribers'); + $(this.content).find('.dash-mailing-type').eq(0).val('email'); +}; + +var dash_mailing_type_message = function() { + this.enableItemsByProperty('action','subscribers'); + this.disableItemsByProperty('action','users'); + $(this.content).find('.dash-mailing-type').eq(0).val('message'); +}; + +var dash_mialing_send = function() { + var subject = $(this.content).find('.dash-mailing-subject').eq(0).val(); + var message = $(this.content).find('.dash-mailing-message').eq(0).val(); + if (subject.length>0 && message.length>0) { + desk_modal_progress(); + this.mail(); + } +}; \ No newline at end of file diff --git a/assets/js/dash/menu.js b/assets/js/dash/menu.js new file mode 100644 index 0000000..6f77075 --- /dev/null +++ b/assets/js/dash/menu.js @@ -0,0 +1,239 @@ +var dash_menu_open = function() { + this.nested_level = 0; + this.previous = []; + desk_call(dash_menu_drag, this); +}; + +var dash_menu_load = function() { + var sidebarItem; + var menu = this.options.data.menu; + if (menu == dash_menu_primary_id || menu == dash_menu_secondary_id) { + sidebarItem = this.findSidebarItemByProperty('typo','topmenu'); + } else if (menu == dash_menu_footer_id) { + sidebarItem = this.findSidebarItemByProperty('typo','bottommenu'); + } + if (sidebarItem) { + $(sidebarItem.element).addClass('active'); + } + if (this.options.data.parent) { + this.enableItemsByProperty('action','level'); + } else { + this.disableItemsByProperty('action','level'); + } + for (var i=0; i this.dragStartY) { + $(this.content).find('#'+this.dragOverItem).parent('li').after(tmp); + } else { + $(this.content).find('#'+this.dragOverItem).parent('li').before(tmp); + } + $(this.content).find('li.tmp-drag-widget-item').replaceWith($(this.content).find('#'+this.dragStartItem).parent('li')); + this.dragReplaced = true; + } + })); + $(this.content).bind('drop',this.bind(this,function(e){ + if (this.isDisabled()) return; + var dragged = []; + var orders = []; + for (var i=0; i1 && orders.length>1) { + desk_window_request(this, url('dash/menu/drag'),{'items':dragged,'orders':orders}); + } + })); + $(this.content).bind('dragend',this.bind(this,function(e){ + $(this.content).find('#'+this.dragStartItem).parent('li').css('opacity',1); + this.isContentDragging = false; + this.dragStartY = null; + this.dragStartItem = null; + this.dragOverItem = null; + this.dragReplaced = false; + $(this.content).find('li.tmp-drag-widget-item').remove(); + })); +}; + +var dash_menu_drop = function(element) { + if (!(element instanceof FileList) && typeof(element.parent)!="undefined" && (element.parent=='record' || element.parent=='category')) { + var data = {'type':element.parent, 'item':element.data, 'menu':this.options.data.menu, 'parent':this.options.data.parent}; + desk_window_request(this, url('dash/menu/drop'),data); + } +}; + +var dash_menu_child = function() { + if (this.nested_level) return; + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1) { + this.previous.push(this.options.data.parent); + this.options.data.parent = selected[0].data; + desk_window_reload(this); + this.nested_level++; + } +}; + +var dash_menu_secondary = function() { + if (this.options.data.menu != dash_menu_primary_id) return; + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1) { + this.options.data.menu = dash_menu_secondary_id; + this.previous.push(this.options.data.parent); + this.options.data.parent = selected[0].data; + this.nested_level = 0; + desk_window_reload(this); + } +}; + +var dash_menu_up = function() { + if (this.previous.length==0) return; + if (this.options.data.menu == dash_menu_secondary_id && !this.nested_level) { + this.options.data.menu=dash_menu_primary_id; + } else { + this.nested_level--; + } + this.options.data.parent=this.previous.pop(); + if (this.options.data.menu == dash_menu_primary_id && this.options.data.parent) { + this.nested_level++; + } + desk_window_reload(this); +}; + +var dash_menu_page = function() { + var selected = this.getSelectedContentItems(); + if (selected.length==1 && typeof(selected[0].url)!="undefined" && selected[0].url.indexOf('#')!=0 && selected[0].url!='javascript:void(0)') { + window.location.href=selected[0].url; + } +}; + +var dash_menu_view = function() { + var selected = this.getSelectedContentItems(); + if (selected.length==1 && typeof(selected[0].url)!="undefined" && selected[0].url.indexOf('#')!=0 && selected[0].url.indexOf('http')!=0 && selected[0].url!='javascript:void(0)') { + var data = {'url':[selected[0].url]}; + desk_call(dash_menu_web_wnd, null, {'data':data}) + } +}; \ No newline at end of file diff --git a/assets/js/dash/meta.js b/assets/js/dash/meta.js new file mode 100644 index 0000000..0b5e63c --- /dev/null +++ b/assets/js/dash/meta.js @@ -0,0 +1,13 @@ +var dash_meta_load = function() { + desk_window_form_init(this); + $(this.content).find('input.logo_option').parent().append(''); + $(this.content).find('input.logo_option').parent().children('.glyphicon').click(this.bind(this, function(){ + desk_file_selector(function(selected){ + if (selected && selected.length>0 && typeof(selected[0].type)!="undefined" && selected[0].type=='image') { + var src = selected[0].data; + var regexp = new RegExp('\\'+desk_ds, 'g'); + $(this.content).find('input.logo_option').val(src.replace(regexp,'/')); + } + }, this); + })); +}; \ No newline at end of file diff --git a/assets/js/dash/modules.js b/assets/js/dash/modules.js new file mode 100644 index 0000000..ea773cb --- /dev/null +++ b/assets/js/dash/modules.js @@ -0,0 +1,61 @@ +var dash_modules_select = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1) { + this.disableItemsByProperty('typo','deactivate'); + if (typeof(selected[0].activated)!="undefined" && selected[0].activated) { + this.enableItemsByProperty('typo','deactivate'); + } + this.disableItemsByProperty('typo','activate'); + this.disableItemsByProperty('typo','install'); + this.disableItemsByProperty('typo','uninstall'); + if (typeof(selected[0].activated)!="undefined" && !selected[0].activated) { + if (typeof(selected[0].installable)=="undefined" || !selected[0].installable || typeof(selected[0].installed)=="undefined" || selected[0].installed) this.enableItemsByProperty('typo','activate'); + if (typeof(selected[0].installable)!="undefined" && selected[0].installable) { + if (typeof(selected[0].installed)!="undefined" && !selected[0].installed) this.enableItemsByProperty('typo','install'); + if (typeof(selected[0].installed)!="undefined" && selected[0].installed) this.enableItemsByProperty('typo','uninstall'); + } + } + } +}; + +var dash_modules_load = function() { + for (var i=0; i'); + $(this.content).find('input.watermark_option').parent().children('.glyphicon').click(this.bind(this, function(){ + desk_file_selector(function(selected){ + if (selected && selected.length>0 && typeof(selected[0].type)!="undefined" && selected[0].type=='image') { + var src = selected[0].data; + var regexp = new RegExp('\\'+desk_ds, 'g'); + $(this.content).find('input.watermark_option').val(src.replace(regexp,'/')); + } + }, this); + })); +}; \ No newline at end of file diff --git a/assets/js/dash/recordhtml.js b/assets/js/dash/recordhtml.js new file mode 100644 index 0000000..899bbec --- /dev/null +++ b/assets/js/dash/recordhtml.js @@ -0,0 +1,42 @@ +var dash_recordhtml_load = function() { + this.draftContent = $(this.content).find('textarea[name=content]').val(); + this.saveDraft = function(){ + if (typeof(this.editor)=="undefined") return; + if (typeof(this.contentModified)!="undefined" && !this.contentModified) return; + var content = this.editor.getContent(); + if (content.length==0) return; + if (content == this.draftContent) return; + this.draftContent = content; + this.setTitle('glyphicon glyphicon-floppy-open'); + desk_post(url('dash/records/savedraft'),{'item':this.options.data.items[0],'content':content, 'token':token()}, this.bind(this, function(response){ + if (response && typeof(response.success)!="undefined" && response.success) { + if ($(this.content).length==0) return; + this.setTitle(); + var l=''; + if (typeof(this.editor)!="undefined") { + l = this.editor.getContent().replace(/ /g,'').replace(/<[\s\S]*?>/g,'').length; + } + this.resetFooterContent(); + this.appendFooterContent(l+''+t('saved to drafts')+''); + $('#dashpanel-container nav').removeClass('disabled'); + } + }), function(){ + $('#dashpanel-container nav').addClass('disabled'); + }); + }; + this.timer = window.setInterval(this.bind(this, this.saveDraft),dash_record_draft_interval); + if (this.options.data.draft) { + window.setTimeout(this.bind(this, function(){ + desk_confirm(t('Load saved draft ?'), this.bind(this,function(){ + desk_window_request(this,url('dash/records/draft'),{'item':this.options.data.draft}, this.bind(this, function(response){ + if (response && typeof(response.draft)!="undefined") { + $(this.content).find('textarea[name=content]').val(response.draft); + this.draftContent = response.draft; + if (typeof(this.editor)=="undefined") return; + this.editor.setContent(response.draft); + } + })); + })); + }), 1000); + } +}; \ No newline at end of file diff --git a/assets/js/dash/recordimages.js b/assets/js/dash/recordimages.js new file mode 100644 index 0000000..eec0744 --- /dev/null +++ b/assets/js/dash/recordimages.js @@ -0,0 +1,32 @@ +var dash_recordimages_desc = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1 && typeof(selected[0].description)!="undefined") { + desk_prompt(t('Enter description'), this.bind(this, function(desc){ + desk_window_request(this,url('dash/records/imagedesc'),{'description':desc, 'item':selected[0].data}); + })); + $('#zira-prompt-dialog input[name=modal-input]').val(selected[0].description); + } +}; + +var dash_recordimages_drop = function(element) { + if (element instanceof FileList) return; + if (typeof(element.parent)=="undefined" || element.parent!='files') return; + if (typeof(element)!="object" || typeof(element.type)=="undefined" || element.type!='image' || typeof(element.data)=="undefined") return; + desk_window_request(this, url('dash/records/addimage'),{'images':[element.data], 'item':this.options.data.items[0]}); +}; + +var dash_recordimages_add = function() { + desk_file_selector(this.bind(this,function(elements){ + if (!elements || elements.length==0) return; + var images = []; + for (var i=0; i0) { + this.enableToolbarItem(item); + } else { + this.disableToolbarItem(item); + } + for (var i=0; i0) { + $(this.element).find('.record-infobar').append('
    '+t('Information')+':
    '); + $(this.element).find('.record-infobar').append('
    '); + for (var i=0; i'+response[i]+''); + } + } + })); + }),1000); + } +}; + +var dash_records_drop = function(element) { + if (element instanceof FileList) return; + if (typeof(element.parent)!="undefined" && element.parent=='record') { + desk_window_request(this, url('dash/records/copy'),{'root':this.options.data.root, 'item':element.data}); + } +}; + +var dash_records_up = function() { + var root = this.options.data.root.split('/').slice(0,-1); + if (root.length>0) { + this.options.data.root=root.join('/'); + this.options.data.search=''; + desk_window_reload(this); + this.options.data.page=1; + } +}; + +var dash_records_edit = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1 && typeof(selected[0].typo)!="undefined") { + if (selected[0].typo == 'category') { + var data = { + 'data':desk_window_selected(this,1), + 'reload': this.className, + 'onClose':function(){ + desk_window_reload_all(this.options.reload); + } + }; + data.data.root = this.options.data.root; + desk_call(dash_records_category_wnd, null, data); + } else if (selected[0].typo == 'record') { + desk_call(dash_records_open_record, this); + } + } +}; + +var dash_records_delete = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length>0) { + var data = {'items':[],'types':[]}; + for (var i=0; i0 && name.substr(0,1)!='/') name = '/'+name; + if (name == this.options.data.root) return; + desk_window_request(this, url('dash/records/move'),{'root':name, 'item':selected[0].data}); + })); + var root = this.options.data.root; + if (root.substr(0,1)=='/') root = root.substr(1); + $('#zira-prompt-dialog input[name=modal-input]').val(root); + } +}; + +var dash_records_create_record = function() { + var data = { + data:{}, + 'reload': this.className, + 'onClose':function(){ + desk_window_reload_all(this.options.reload); + } + }; + data.data.root = this.options.data.root; + data.data.language = this.options.data.language; + desk_call(dash_records_record_wnd, null, data); +}; + +var dash_records_create_category = function() { + var data = { + data:{}, + 'reload': this.className, + 'onClose':function(){ + desk_window_reload_all(this.options.reload); + } + }; + data.data.root = this.options.data.root; + desk_call(dash_records_category_wnd, null, data); +}; + +var dash_records_open_category = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1 && typeof(selected[0].category)!="undefined") { + this.options.data.root = this.options.data.root+'/'+selected[0].category; + this.options.data.search=''; + this.options.data.page=1; + this.loadBody(); + } +}; + +var dash_records_category_settings = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1 && typeof(selected[0].typo)!="undefined" && selected[0].typo == 'category') { + var data = {'data':desk_window_selected(this,1)}; + desk_call(dash_records_category_settings_wnd, null, data); + } +}; + +var dash_records_category_widget = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1 && typeof(selected[0].typo)!="undefined" && selected[0].typo == 'category') { + desk_window_request(this, url('dash/records/widget'),{'item':selected[0].data}); + } +}; + +var dash_records_open_record = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1 && typeof(selected[0].typo)!="undefined" && selected[0].typo=='record') { + var data = { + data:{}, + 'reload': this.className, + 'onClose':function(){ + desk_window_reload_all(this.options.reload); + } + }; + data.data.root = this.options.data.root; + data.data.language = this.options.data.language; + data.data.items = desk_window_selected(this,1); + desk_call(dash_records_record_wnd, null, data); + } +}; + +var dash_records_record_text = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1 && typeof(selected[0].typo)!="undefined" && selected[0].typo=='record') { + var data = {'items':[selected[0].data]}; + desk_call(dash_records_record_text_wnd, null, {'data':data}); + } +}; + +var dash_records_record_html = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1 && typeof(selected[0].typo)!="undefined" && selected[0].typo=='record') { + var data = {'items':[selected[0].data]}; + desk_call(dash_records_record_html_wnd, null, {'data':data}); + } +}; + +var dash_records_desc = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1 && typeof(selected[0].description)!="undefined" && typeof(selected[0].typo)!="undefined") { + if (selected[0].typo == 'category') { + desk_prompt(t('Enter description'), this.bind(this, function(desc){ + desk_window_request(this, url('dash/system/description'),{'type': 'category', 'description':desc, 'item':selected[0].data}); + })); + $('#zira-prompt-dialog input[name=modal-input]').val(selected[0].description); + } else if (selected[0].typo == 'record') { + desk_multi_prompt(t('Enter description'), this.bind(this, function(desc){ + desk_window_request(this, url('dash/records/description'),{'description':desc, 'item':selected[0].data}); + })); + $('#zira-multi-prompt-dialog textarea[name=modal-input]').val(selected[0].description); + } + } +}; + +var dash_records_record_image = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1 && typeof(selected[0].typo)!="undefined" && selected[0].typo=='record') { + desk_file_selector(this.bind(this,function(elements){ + if (!elements || elements.length==0) return; + var element = elements[0]; + if (element instanceof FileList) return; + if (typeof(element)!="object" || typeof(element.type)=="undefined" || element.type!='image' || typeof(element.data)=="undefined") return; + if (typeof(element.parent)=="undefined" || element.parent!='files') return; + desk_window_request(this, url('dash/records/image'),{'image':element.data, 'item':selected[0].data}); + })); + } +}; + +var dash_records_seo = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1 && typeof(selected[0].typo)!="undefined") { + var data = {'items':[selected[0].data]}; + if (selected[0].typo == 'category') { + desk_call(dash_records_category_meta_wnd, null, { + 'data':data, + 'reload': this.className, + 'onClose':function(){ + desk_window_reload_all(this.options.reload); + } + }); + } else if (selected[0].typo == 'record') { + desk_call(dash_records_record_meta_wnd, null, { + 'data':data, + 'reload': this.className, + 'onClose':function(){ + desk_window_reload_all(this.options.reload); + } + }); + } + } +}; + +var dash_records_record_page = function() { + var selected = this.getSelectedContentItems(); + if (selected.length==1 && typeof(selected[0].typo)!="undefined" && selected[0].typo=='record' && typeof(selected[0].page)!="undefined") { + var language = ''; + if (typeof(selected[0].language)!="undefined" && selected[0].language!==null) language = selected[0].language + '/'; + window.location.href=url(language+selected[0].page); + } +}; + +var dash_records_record_view = function() { + var selected = this.getSelectedContentItems(); + if (selected.length==1 && typeof(selected[0].typo)!="undefined" && selected[0].typo=='record' && typeof(selected[0].page)!="undefined") { + var language = ''; + if (typeof(selected[0].language)!="undefined" && selected[0].language!==null) language = selected[0].language + '/'; + var data = {'url':[language+selected[0].page]}; + desk_call(dash_records_web_wnd, null, {'data':data}); + } +}; + +var dash_records_record_publish = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1 && typeof(selected[0].typo)!="undefined" && selected[0].typo=='record') { + var data = {'item':selected[0].data}; + desk_window_request(this, url('dash/records/publish'), data); + } +}; + +var dash_records_record_front = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1 && typeof(selected[0].typo)!="undefined" && selected[0].typo=='record') { + var data = {'item':selected[0].data}; + desk_window_request(this, url('dash/records/frontpage'), data); + } +}; + +var dash_records_record_gallery = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1 && typeof(selected[0].typo)!="undefined" && selected[0].typo=='record') { + var data = {'items':[selected[0].data]}; + desk_call(dash_records_record_images_wnd, null, {'data':data}); + } +}; + +var dash_records_record_slider = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1 && typeof(selected[0].typo)!="undefined" && selected[0].typo=='record') { + var data = {'items':[selected[0].data]}; + desk_call(dash_records_record_slides_wnd, null, {'data':data}); + } +}; + +var dash_records_language = function(element) { + var language = this.options.data.language; + var id = $(element).attr('id'); + var item = this.findMenuItemByProperty('id',id); + if (item && typeof(item.language)!="undefined") { + if (item.language!=language) { + this.options.data.language=item.language; + desk_window_reload(this); + $(element).parents('ul').find('.glyphicon-ok').removeClass('glyphicon-ok').addClass('glyphicon-filter'); + $(element).find('.glyphicon').removeClass('glyphicon-filter').addClass('glyphicon-ok'); + } else { + this.options.data.language=''; + desk_window_reload(this); + $(element).parents('ul').find('.glyphicon-ok').removeClass('glyphicon-ok').addClass('glyphicon-filter'); + } + } +}; \ No newline at end of file diff --git a/assets/js/dash/recordslides.js b/assets/js/dash/recordslides.js new file mode 100644 index 0000000..58f3657 --- /dev/null +++ b/assets/js/dash/recordslides.js @@ -0,0 +1,32 @@ +var dash_recordslides_desc = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1 && typeof(selected[0].description)!="undefined") { + desk_prompt(t('Enter description'), this.bind(this, function(desc){ + desk_window_request(this, url('dash/records/slidedesc'),{'description':desc, 'item':selected[0].data}); + })); + $('#zira-prompt-dialog input[name=modal-input]').val(selected[0].description); + } +}; + +var dash_recordslides_drop = function(element) { + if (element instanceof FileList) return; + if (typeof(element.parent)=="undefined" || element.parent!='files') return; + if (typeof(element)!="object" || typeof(element.type)=="undefined" || element.type!='image' || typeof(element.data)=="undefined") return; + desk_window_request(this, url('dash/records/addslide'),{'images':[element.data], 'item':this.options.data.items[0]}); +}; + +var dash_recordslides_add = function() { + desk_file_selector(this.bind(this,function(elements){ + if (!elements || elements.length==0) return; + var images = []; + for (var i=0; i'+t('saved to drafts')+''); + $('#dashpanel-container nav').removeClass('disabled'); + } + }), function(){ + $('#dashpanel-container nav').addClass('disabled'); + }); + }; + this.timer = window.setInterval(this.bind(this, this.saveDraft),dash_record_draft_interval); + if (this.options.data.draft) { + desk_confirm(t('Load saved draft ?'), this.bind(this,function(){ + desk_window_request(this,url('dash/records/draft'),{'item':this.options.data.draft}, this.bind(this, function(response){ + if (response && typeof(response.draft)!="undefined") { + $(this.content).find('textarea[name=content]').val(response.draft); + this.draftContent = response.draft; + } + })); + })); + } +}; \ No newline at end of file diff --git a/assets/js/dash/selector.js b/assets/js/dash/selector.js new file mode 100644 index 0000000..602945a --- /dev/null +++ b/assets/js/dash/selector.js @@ -0,0 +1,54 @@ +var dash_selector_body_item_callback = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1 && typeof(selected[0].type)!="undefined" && selected[0].type=='folder') { + desk_window_edit_item(this); + } else { + desk_window_close(this); + } +}; + +var dash_selector_select = function() { + var selected = this.getSelectedContentItems(); + this.disableItemsByProperty('action','select'); + if (selected && selected.length>0) { + for (var i=0; i0 && typeof(callback)!="undefined") { + if (typeof(object) == "undefined") object = this; + callback.call(object, selected); + if ((object instanceof DashWindow) && object != this) { + object.focus(); + object.setZ(this.getZ()); + } + } + } + }; + desk_call(dash_selector_wnd, null, data); + } catch(e) { + desk_error(t('An error occurred')); + } +}; \ No newline at end of file diff --git a/assets/js/dash/system.js b/assets/js/dash/system.js new file mode 100644 index 0000000..af25f25 --- /dev/null +++ b/assets/js/dash/system.js @@ -0,0 +1,41 @@ +var dash_system_dump = function() { + var a=document.createElement('a'); + a.href=url('dash/system/dump'); + document.body.appendChild(a); + HTMLElementClick.call(a); + document.body.removeChild(a); +}; + +var dash_system_cache = function() { + desk_window_request(this, url('dash/system/cache'), {}); +}; + +var dash_system_files = function() { + desk_window_request(this, url('dash/system/tree'),{},this.bind(this, function(response){ + if (response && response.length>0) { + var content = '
      '; + for (var i=0; i'+response[i]+''; + } + content += '
    '; + if ($(this.content).find('.system-options-list').length==0) { + this.clearBodyContent(); + this.appendBodyContent(content); + } else { + $(this.content).find('.system-options-list').replaceWith(content); + } + } + })); +}; + +var dash_system_load = function() { + $.get(baseUrl('dash/index/ping'),{}, this.bind(this, function(){ + $(this.content).find('#sys-info-clean-url-option').parent().children('.glyphicon').removeClass('glyphicon-question-sign').addClass('glyphicon-ok-sign system-ok'); + $(this.content).find('#sys-info-clean-url-option').text(t('supported')); + }),'json').fail(this.bind(this, function(){ + $(this.content).find('#sys-info-clean-url-option').parent().children('.glyphicon').removeClass('glyphicon-question-sign').addClass('glyphicon-warning-sign system-warning'); + $(this.content).find('#sys-info-clean-url-option').text(t('not supported')); + })); +}; \ No newline at end of file diff --git a/assets/js/dash/text.js b/assets/js/dash/text.js new file mode 100644 index 0000000..71e59b1 --- /dev/null +++ b/assets/js/dash/text.js @@ -0,0 +1,12 @@ +var dash_text_load = function() { + this.updateTitle(this.options.data.file); +}; + +var desk_text_editor = function(file) { + try { + var data = {'file':file}; + desk_call(dash_text_wnd, null, {'data':data}); + } catch(e) { + desk_error(t('An error occurred')); + } +}; \ No newline at end of file diff --git a/assets/js/dash/themes.js b/assets/js/dash/themes.js new file mode 100644 index 0000000..4295959 --- /dev/null +++ b/assets/js/dash/themes.js @@ -0,0 +1,29 @@ +var dash_themes_select = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1) { + this.disableItemsByProperty('typo','activate'); + if (typeof(selected[0].activated)!="undefined" && !selected[0].activated) { + this.enableItemsByProperty('typo','activate'); + } + this.disableItemsByProperty('typo','preview'); + if (typeof(selected[0].src)!="undefined" && selected[0].src.length>0 && selected[0].src.indexOf(dash_themes_blank_src)!=0) { + this.enableItemsByProperty('typo','preview'); + } + } +}; + +var dash_themes_activate = function() { + var selected = desk_window_selected(this); + if (selected && typeof(selected.items)!="undefined" && selected.items.length==1) { + desk_window_request(this, url('dash/system/theme'),{'theme':selected.items[0]}); + } +}; + +var dash_themes_preview = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1 && typeof(selected[0].src)!="undefined" && selected[0].src.length>0 && selected[0].src.indexOf(dash_themes_blank_src)!=0) { + $('body').append(''); + $('#dashwindow-theme-preview-lightbox').trigger('click'); + $('#dashwindow-theme-preview-lightbox').remove(); + } +}; \ No newline at end of file diff --git a/assets/js/dash/translates.js b/assets/js/dash/translates.js new file mode 100644 index 0000000..025ca4b --- /dev/null +++ b/assets/js/dash/translates.js @@ -0,0 +1,19 @@ +var dash_translates_create = function() { + desk_multi_prompt(t('Enter string to translate'),this.bind(this, function(str) { + if (str.length>0) { + desk_window_request(this, url('dash/languages/addstring'), {'string': str,'language': this.options.data.items[0]}); + } + })); +}; + +var dash_translates_edit = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1) { + desk_multi_prompt(t('Enter translate'),this.bind(this, function(str) { + if (str.length>0) { + desk_window_request(this, url('dash/languages/translate'), {'strid': selected[0].data,'translate': str,'language': this.options.data.items[0]}); + } + })); + $('#zira-multi-prompt-dialog textarea[name=modal-input]').val(selected[0].tooltip); + } +}; \ No newline at end of file diff --git a/assets/js/dash/user.js b/assets/js/dash/user.js new file mode 100644 index 0000000..ae946bc --- /dev/null +++ b/assets/js/dash/user.js @@ -0,0 +1,75 @@ +var dash_user_load = function() { + desk_window_form_init(this); + zira_datepicker($(this.content).find('.dash-datepicker')); + $(this.sidebar).find('.dashwindow-userthumb-selector').click(this.bind(this,function(){ + desk_call(dash_user_image_select, this); + })); + if ($(this.content).find('input.dashwindow-user-image').val().length>0) { + $(this.sidebar).find('.dashwindow-userthumb-delete').removeClass('disabled'); + this.enableItemsByProperty('action','noimage'); + } + $(this.sidebar).find('.dashwindow-userthumb-delete').click(this.bind(this,function(){ + desk_call(dash_user_delete_image, this); + })); + if ($(this.content).find('input.dashwindow-user-verified').val()==dash_user_status_verified) { + var verified = this.findToolbarItemByProperty('action','verified'); + if (verified) $(verified.element).addClass('active').children('.glyphicon').removeClass('glyphicon-ban-circle').addClass('glyphicon-ok'); + } + if ($(this.content).find('input.dashwindow-user-active').val()==dash_user_status_active) { + var active = this.findToolbarItemByProperty('action','active'); + if (active) $(active.element).addClass('active').children('.glyphicon').removeClass('glyphicon-ban-circle').addClass('glyphicon-ok'); + } +}; + +var dash_user_drop = function(element) { + if (!(element instanceof FileList) && typeof(element.parent)!="undefined" && element.parent=='files' && typeof(element.type)!="undefined" && element.type=='image') { + var src = element.data; + var regexp = new RegExp('\\'+desk_ds, 'g'); + $(this.sidebar).find('.dashwindow-userthumb-selector').attr('src',baseUrl(src.replace(regexp,'/'))); + $(this.content).find('input.dashwindow-user-image').val(src); + $(this.sidebar).find('.dashwindow-userthumb-delete').removeClass('disabled'); + this.enableItemsByProperty('action','noimage'); + } +}; + +var dash_user_image_select = function() { + desk_file_selector(function(selected){ + if (selected && selected.length>0 && typeof(selected[0].type)!="undefined" && selected[0].type=='image') { + var src = selected[0].data; + var regexp = new RegExp('\\'+desk_ds, 'g'); + $(this.element).find('.dashwindow-userthumb-selector').attr('src',baseUrl(src.replace(regexp,'/')).replace(desk_ds,'/')); + $(this.content).find('input.dashwindow-user-image').val(src); + $(this.sidebar).find('.dashwindow-userthumb-delete').removeClass('disabled'); + this.enableItemsByProperty('action','noimage'); + } + }, this); +}; + +var dash_user_verified = function() { + var verified = this.findToolbarItemByProperty('action','verified'); + if ($(this.content).find('input.dashwindow-user-verified').val()==dash_user_status_verified) { + if (verified) $(verified.element).removeClass('active').children('.glyphicon').removeClass('glyphicon-ok').addClass('glyphicon-ban-circle'); + $(this.content).find('input.dashwindow-user-verified').val(dash_user_status_not_verified); + } else { + if (verified) $(verified.element).addClass('active').children('.glyphicon').removeClass('glyphicon-ban-circle').addClass('glyphicon-ok'); + $(this.content).find('input.dashwindow-user-verified').val(dash_user_status_verified); + } +}; + +var dash_user_active = function() { + var active = this.findToolbarItemByProperty('action','active'); + if ($(this.content).find('input.dashwindow-user-active').val()==dash_user_status_active) { + if (active) $(active.element).removeClass('active').children('.glyphicon').removeClass('glyphicon-ok').addClass('glyphicon-ban-circle'); + $(this.content).find('input.dashwindow-user-active').val(dash_user_status_not_active); + } else { + if (active) $(active.element).addClass('active').children('.glyphicon').removeClass('glyphicon-ban-circle').addClass('glyphicon-ok'); + $(this.content).find('input.dashwindow-user-active').val(dash_user_status_active); + } +}; + +var dash_user_delete_image = function() { + $(this.sidebar).find('.dashwindow-userthumb-selector').attr('src',dash_user_profile_nophoto_src); + $(this.content).find('input.dashwindow-user-image').val(''); + $(this.sidebar).find('.dashwindow-userthumb-delete').addClass('disabled'); + this.disableItemsByProperty('action','noimage'); +}; \ No newline at end of file diff --git a/assets/js/dash/users.js b/assets/js/dash/users.js new file mode 100644 index 0000000..8a37c05 --- /dev/null +++ b/assets/js/dash/users.js @@ -0,0 +1,121 @@ +var dash_users_delete_image = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1 && typeof(selected[0].data)!="undefined") { + desk_window_request(this, url('dash/users/noimage'),{'user_id':selected[0].data}); + } +}; + +var dash_users_deactivate = function() { + var selected = desk_window_selected(this); + if (selected && typeof(selected.items)!="undefined" && selected.items.length>0) { + desk_window_request(this, url('dash/users/deactivate'),{'users':selected.items}); + } +}; + +var dash_users_activate = function() { + var selected = desk_window_selected(this); + if (selected && typeof(selected.items)!="undefined" && selected.items.length>0) { + desk_window_request(this, url('dash/users/activate'),{'users':selected.items}); + } +}; + +var dash_users_select = function() { + var selected = this.getSelectedContentItems(); + if (!selected || selected.length!=1 || typeof(selected[0].src)=="undefined" || selected[0].src==dash_user_profile_nophoto_src) { + this.disableItemsByProperty('typo','noimage'); + } + if (!selected || selected.length!=1 || typeof(selected[0].avatar)=="undefined" || selected[0].avatar.length==0) { + this.disableItemsByProperty('typo','show_avatar'); + } + if (!selected || selected.length!=1 || typeof(selected[0].activated)=="undefined" || selected[0].activated!=dash_user_status_active) { + this.disableItemsByProperty('typo','view_profile'); + } + if (selected && selected.length>0) { + this.disableItemsByProperty('typo','deactivate'); + for (var i=0; i0) { + $(this.element).find('.user-infobar').append('
    '+t('Information')+':
    '); + $(this.element).find('.user-infobar').append('
    '); + for (var i=0; i'+response[i]+''); + } + } + })); + }),1000); + } +}; + +var dash_users_show_avatar = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1 && typeof(selected[0].avatar)!="undefined" && selected[0].avatar.length>0) { + $('body').append(''); + $('#dashwindow-user-avatar-lightbox').trigger('click'); + $('#dashwindow-user-avatar-lightbox').remove(); + } +}; + +var dash_users_edit = function() { + try { window.clearTimeout(this.timer); } catch(err) {}; + desk_window_edit_item(this); +}; + +var dash_users_groups = function() { + desk_call(dash_users_group_wnd, null); +}; + +var dash_users_group_filter = function(element) { + var group_id = this.options.data.group_id; + var id = $(element).attr('id'); + var item = this.findMenuItemByProperty('id',id); + if (item && typeof(item.group_id)!="undefined") { + if (item.group_id!=group_id) { + this.options.data.group_id=item.group_id; + desk_window_reload(this); + $(element).parents('ul').find('.glyphicon-ok').removeClass('glyphicon-ok').addClass('glyphicon-filter'); + $(element).find('.glyphicon').removeClass('glyphicon-filter').addClass('glyphicon-ok'); + } else { + this.options.data.group_id=0; + desk_window_reload(this); + $(element).parents('ul').find('.glyphicon-ok').removeClass('glyphicon-ok').addClass('glyphicon-filter'); + } + } +}; + +var dash_users_view_profile = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1) { + window.location.href=url('user/'+selected[0].data); + } +}; + +var dash_users_load = function() { + $(this.element).find('.user-infobar').html(''); + for (var i=0; i0) { + desk_window_request(this, url('dash/widgets/deactivate'),{'widgets':selected.items}); + } +}; + +var dash_widgets_activate = function() { + var selected = desk_window_selected(this); + if (selected && typeof(selected.items)!="undefined" && selected.items.length>0) { + desk_window_request(this, url('dash/widgets/activate'),{'widgets':selected.items}); + } +}; + +var dash_widgets_select = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length>0) { + this.disableItemsByProperty('typo','copy'); + this.disableItemsByProperty('action','delete'); + for (var i=0; i0) { + changed = this.options.bodyItems[i-1]; + break; + } + } + if (!changed) return; + var sorted_widgets = [selected_item.data, changed.data]; + desk_window_request(this, url('dash/widgets/sort'),{'widgets':sorted_widgets}); + } +}; + +var dash_widgets_down = function() { + var selected = this.getSelectedContentItems(); + if (selected && selected.length==1) { + var selected_item = selected[0]; + var changed = false; + for (var i=0; i this.dragStartY) { + $(this.content).find('#'+this.dragOverItem).parent('li').after(tmp); + } else { + $(this.content).find('#'+this.dragOverItem).parent('li').before(tmp); + } + $(this.content).find('li.tmp-drag-widget-item').replaceWith($(this.content).find('#'+this.dragStartItem).parent('li')); + this.dragReplaced = true; + } + })); + $(this.content).bind('drop',this.bind(this,function(e){ + if (this.isDisabled()) return; + var dragged = []; + var orders = []; + for (var i=0; i1 && orders.length>1) { + desk_window_request(this, url('dash/widgets/drag'),{'widgets':dragged,'orders':orders}); + } + })); + $(this.content).bind('dragend',this.bind(this,function(e){ + $(this.content).find('#'+this.dragStartItem).parent('li').css('opacity',1); + this.isContentDragging = false; + this.dragStartY = null; + this.dragStartItem = null; + this.dragOverItem = null; + this.dragReplaced = false; + $(this.content).find('li.tmp-drag-widget-item').remove(); + })); +}; + +var dash_widgets_drop = function(element) { + if (!(element instanceof FileList) && typeof(element.parent)!="undefined" && element.parent=='files' && typeof(element.type)!="undefined" && (element.type=='txt' || element.type=='html' || element.type=='image')) { + var path = element.data; + desk_window_request(this, url('dash/widgets/block'),{'path':path}); + } +}; \ No newline at end of file diff --git a/assets/js/desk-window.js b/assets/js/desk-window.js new file mode 100644 index 0000000..d08bc37 --- /dev/null +++ b/assets/js/desk-window.js @@ -0,0 +1,2943 @@ +var DashWindow = function(id, className, options) { + this.window_class = 'dashboard-window'; + this.header_class = 'dashboard-window-header'; + this.footer_class = 'dashboard-window-footer'; + this.sidebar_class = 'dashboard-window-sidebar'; + this.content_class = 'dashboard-window-content'; + this.menu_class = 'dashboard-window-menu'; + this.menu_list_class = 'dashboard-window-menu-list'; + this.menu_list_item_class = 'dashboard-window-menu-list-item'; + this.menu_list_item_link_class = 'dashboard-window-menu-list-item-link'; + this.window_resizer_class = 'dashboard-window-resizer'; + this.sidebar_resizer_class = 'dashboard-sidebar-resizer'; + this.close_button_class = 'dashboard-window-close-button'; + this.maximize_button_class = 'dashboard-window-maximize-button'; + this.minimize_button_class = 'dashboard-window-minimize-button'; + this.maximized_window_class = 'dashboard-window-maximized'; + this.minimized_window_class = 'dashboard-window-minimized'; + this.focused_window_class = 'dashboard-window-focused'; + this.animating_window_class = 'dashboard-window-animating'; + this.nosidebar_window_class = 'dashboard-window-nosidebar'; + this.title_text_class = 'dashboard-window-title'; + this.toolbar_class = 'dashboard-window-toolbar'; + this.notoolbar_window_class = 'dashboard-window-notoolbar'; + this.noresize_window_class = 'dashboard-window-noresize'; + this.sidebar_content_wrapper_class = 'dashboard-sidebar-content-wrapper'; + this.body_content_wrapper_class = 'dashboard-body-content-wrapper'; + this.body_full_content_wrapper_class = 'dashboard-body-full-content-wrapper'; + this.footer_content_wrapper_class = 'dashboard-footer-content-wrapper'; + this.dashwindow_content_icon_class = 'dashwindow-content-icon'; + this.dashwindow_content_icon_folder_class = 'dashwindow-content-icon-folder'; + this.dashwindow_content_icon_file_class = 'dashwindow-content-icon-file'; + this.dashwindow_content_icon_archive_class = 'dashwindow-content-icon-archive'; + this.dashwindow_content_icon_txt_class = 'dashwindow-content-icon-txt'; + this.dashwindow_content_icon_html_class = 'dashwindow-content-icon-html'; + this.dashwindow_content_icon_blank_class = 'dashwindow-content-icon-blank'; + this.dashwindow_content_list_class = 'dashwindow-content-list'; + this.dashwindow_content_grid_class = 'dashwindow-content-grid'; + this.disabled_window_class = 'dashboard-window-disabled'; + this.loading_window_class = 'dashboard-window-loading'; + this.loader_class = 'dashboard-window-loader'; + this.context_menu_class = 'dashboard-window-contextmenu'; + this.highlight_class = 'dashboard-window-highlight'; + this.blink_class = 'dashboard-window-blink'; + this.body_item_images_class = 'dashboard-window-body-item-image'; + this.dashwindow_content_noselect_class = 'dashboard-window-noselect-content'; + this.moving_window_class = 'dashboard-window-moving'; + + this.id = id; + this.className = className; + this.initialized = false; + this.maximized = false; + this.minimized = false; + this.disabled = false; + this.touchesEnabled = false; + this.loading = false; + + var defaults = { + 'container': 'body', + 'edge_top': 0, + 'edge_bottom': 0, + 'edge_left': 0, + 'edge_right': 0, + 'top': null, + 'left': null, + 'right': null, + 'bottom': null, + 'width': null, + 'height': null, + 'auto': false, + 'auto_ratio': 4/3, + 'auto_margin': 50, + 'auto_min_width': 640, + 'auto_min_height': 480, + 'auto_max_width': 800, + 'auto_max_height': 600, + 'resize': true, + 'resize_min_width': 400, + 'resize_min_height': 300, + 'min_options_to_window': true, + 'sidebar_resize_min_width': 100, + 'minimized_width': 250, + 'animate': true, + 'animation_duration': 100, + 'maximized': false, + 'sidebar': true, + 'sidebar_width': null, + 'toolbar': true, + 'viewSwitcher': false, + 'bodyViewList': false, + 'maximize_on_move': true, + 'maximize_top_offset': 50, + 'maximize_left_offset': 5, + 'maximize_right_offset': 5, + 'icon_class': 'glyphicon glyphicon-th-large', + 'title': null, + 'menuItems': [], + 'toolbarItems': [], + 'toolbarContent': '', + 'sidebarItems': [], + 'sidebarContent': '', + 'bodyItems': [], + 'bodyContent': '', + 'bodyFullContent': '', + 'footerContent': '', + 'contextMenuItems': [], + 'onOpen': null, + 'onLoad': null, + 'onFocus': null, + 'onSelect': null, + 'onClose': null, + 'onBlur': null, + 'onDrop': null, + 'onResize': null, + 'load': null, + 'data': null, + 'nocache': false, + 'help_url': null + }; + + if(typeof(options)!="undefined") { + this.options = $.extend(defaults, options); + } else { + this.options = defaults; + } + + this.setWindowScroll(); + this.setWindowRect(); + this.checkSizeOptions(); + + if (this.options.width!==null) { + if (this.options.auto_min_width>this.options.width) { + this.options.auto_min_width=this.options.width; + } + if (this.options.resize_min_width>this.options.width) { + this.options.resize_min_width=this.options.width; + } + } + if (this.options.height!==null) { + if (this.options.auto_min_height>this.options.height) { + this.options.auto_min_height=this.options.height; + } + if (this.options.resize_min_height>this.options.height) { + this.options.resize_min_height=this.options.height; + } + } + + this.create(); + this.createMenu(); + this.body_view_list = this.options.bodyViewList; + if (this.toolbar!==null) { + this.createToolbar(); + this.appendToolbarContent(this.options.toolbarContent); + } + if (this.sidebar!==null) { + this.createSidebarItems(this.options.sidebarItems); + this.appendSidebarContent(this.options.sidebarContent); + this.updateSidebarResizerPosition(); + } + this.createBodyItems(this.options.bodyItems); + this.appendBodyContent(this.options.bodyContent); + this.appendBodyFullContent(this.options.bodyFullContent); + this.appendFooterContent(this.options.footerContent); + this.createContextMenu(); + + if (this.options.bodyItems.length>0 && this.options.bodyContent.length==0 && this.options.bodyFullContent.length==0) { + $(this.content).addClass(this.dashwindow_content_noselect_class); + } + + this.clicked = false; + this.moving = false; + this.window_resizing = false; + this.sidebar_resizing = false; + this.z = 0; + this.selected = []; + this.content_clicked = false; + this.item_clicked = false; + this.minimized_array = null; + this.menu_clicked = false; + this.menu_opened = false; + this.context_menu_opened = false; + this.focusedElement = null; + this.keys = null; + + if (this.options.maximized) { + this.initialized = true; + this.maximize(true, false, this.onInitialize); + } else if (!this.options.animate) { + this.initialized = true; + this.onInitialize(); + } else { + this.animateOpening(); + } +}; + +DashWindow.prototype.bind = function(object, method) { + return function(arg) { + return method.call(object,arg); + } +}; + +DashWindow.prototype.getId = function() { + return this.id; +}; + +DashWindow.prototype.getClass = function() { + return this.className; +}; + +DashWindow.prototype.setClicked = function(clicked) { + this.clicked = clicked; +}; + +DashWindow.prototype.setMoving = function(moving) { + this.moving = moving; + $(this.element).removeClass(this.moving_window_class); + if (this.moving) { + $(this.element).addClass(this.moving_window_class); + } +}; + +DashWindow.prototype.setWindowResizing = function(resizing) { + this.window_resizing = resizing; +}; + +DashWindow.prototype.setSidebarResizing = function(resizing) { + this.sidebar_resizing = resizing; +}; + +DashWindow.prototype.setZ = function(z) { + this.z = z; + this.updateZ(); +}; + +DashWindow.prototype.getZ = function() { + return this.z +}; + +DashWindow.prototype.updateZ = function() { + $(this.element).css('zIndex', this.z); +}; + +DashWindow.prototype.setContentClicked = function(clicked) { + this.content_clicked = clicked; +}; + +DashWindow.prototype.isContentClicked = function() { + return this.content_clicked; +}; + +DashWindow.prototype.setItemClicked = function(clicked) { + this.item_clicked = clicked; +}; + +DashWindow.prototype.isItemClicked = function() { + return this.item_clicked; +}; + +DashWindow.prototype.setKeysArr = function(keys) { + this.keys = keys; +}; + +DashWindow.prototype.focus = function() { + if (!this.focused && this.options.onFocus !== null) { + this.options.onFocus.call(this); + } + this.focused = true; + $(this.element).addClass(this.focused_window_class); + if (this.focusedElement!==null) $(this.focusedElement).focus(); +}; + +DashWindow.prototype.isFocused = function() { + return this.focused; +}; + +DashWindow.prototype.blur = function(exec_callback) { + if (typeof(exec_callback)=="undefined") exec_callback = false; + this.focused = false; + $(this.element).removeClass(this.focused_window_class); + if (exec_callback) { + if (this.options.onBlur !== null) this.options.onBlur.call(this); + if (this.options.bodyItems.length==0 && (this.options.bodyContent.length>0 || this.options.bodyFullContent.length>0)) { + var focusedElement = $(this.content).find(':focus'); + if ($(focusedElement).length > 0) this.focusedElement = focusedElement; + } + } +}; + +DashWindow.prototype.disableWindow = function() { + this.disabled = true; + $(this.element).addClass(this.disabled_window_class); +}; + +DashWindow.prototype.enableWindow = function() { + this.disabled = false; + $(this.element).removeClass(this.disabled_window_class); +}; + +DashWindow.prototype.setTouchesEnabled = function(enabled) { + this.touchesEnabled = enabled; +}; + +DashWindow.prototype.setMinimizedArray = function(arr) { + this.minimized_array = arr; +}; + +DashWindow.prototype.isInitialized = function() { + return this.initialized; +}; + +DashWindow.prototype.isTouchesEnabled = function() { + return this.touchesEnabled; +}; + +DashWindow.prototype.isMinimized = function() { + return this.minimized; +}; + +DashWindow.prototype.isMaximized = function() { + return this.maximized; +}; + +DashWindow.prototype.isDisabled = function() { + return this.disabled; +}; + +DashWindow.prototype.highlightWindow = function() { + $(this.element).addClass(this.highlight_class); +}; + +DashWindow.prototype.unhighlightWindow = function() { + $(this.element).removeClass(this.highlight_class); +}; + +DashWindow.prototype.blinkWindow = function(iter) { + if (typeof(iter)=="undefined") iter=0; + if (iter%2==0) { + $(this.element).addClass(this.blink_class) + } else { + $(this.element).removeClass(this.blink_class); + } + if (iter>=5) { + $(this.element).removeClass(this.blink_class); + return; + } + window.setTimeout(this.bind(this, function(){ + this.blinkWindow(++iter); + }),this.options.animation_duration); +}; + +DashWindow.prototype.setWindowScroll = function() { + this.window_scroll_left = $(window).scrollLeft(); + this.window_scroll_top = $(window).scrollTop(); +}; + +DashWindow.prototype.setWindowRect = function() { + this.window_width = $(window).width(); + this.window_height = $(window).height(); + this.window_top = this.options.edge_top; + this.window_bottom = this.options.edge_bottom; + this.window_left = this.options.edge_left; + this.window_right = this.options.edge_right; + this.window_inner_width = this.window_width - this.window_left - this.window_right; + this.window_inner_height = this.window_height - this.window_top - this.window_bottom; +}; + +DashWindow.prototype.checkSizeOptions = function() { + if (!this.options.min_options_to_window) return; + if (this.options.auto_min_width>this.window_width-2*this.options.auto_margin) { + this.options.auto_min_width=this.window_width-2*this.options.auto_margin; + } + if (this.options.auto_min_height>this.window_height-2*this.options.auto_margin) { + this.options.auto_min_height=this.window_height-2*this.options.auto_margin; + } + if (this.options.resize_min_width>this.window_width) { + this.options.resize_min_width=this.window_width; + } + if (this.options.resize_min_height>this.window_height) { + this.options.resize_min_height=this.window_height; + } + if (this.options.sidebar_resize_min_width>this.window_width/2) { + this.options.sidebar_resize_min_width=this.window_width/2; + } +}; + +DashWindow.prototype.create = function() { + $(this.options.container).append('
    '); + this.element = $('#'+this.id); + if (this.options.auto) { + this.autoSize(); + this.autoPosition(); + } + if (!this.options.resize) { + $(this.element).addClass(this.noresize_window_class); + } + this.updateOuterSize(); + this.updatePosition(); + $(this.element).append('
    '); + $(this.element).append('
    '); + if (this.options.toolbar) { + $(this.element).append('
    '); + this.toolbar = $(this.element).children('.'+this.toolbar_class); + this.options.toolbar_height = $(this.toolbar).outerHeight(); + } else { + this.toolbar = null; + $(this.element).addClass(this.notoolbar_window_class); + this.options.toolbar_height = 0; + } + if (this.options.sidebar) { + $(this.element).append('
    '); + this.sidebar = $(this.element).children('.'+this.sidebar_class); + } else { + this.sidebar = null; + $(this.element).addClass(this.nosidebar_window_class); + } + $(this.element).append('
    '); + $(this.element).append('
    '); + this.header = $(this.element).children('.'+this.header_class); + this.menu = $(this.element).children('.'+this.menu_class); + this.content = $(this.element).children('.'+this.content_class); + this.footer = $(this.element).children('.'+this.footer_class); + $(this.header).append(''); + $(this.header).append(''); + $(this.header).append(''); + this.close_button = $(this.header).children('.'+this.close_button_class); + this.minimize_button = $(this.header).children('.'+this.minimize_button_class); + this.maximize_button = $(this.header).children('.'+this.maximize_button_class); + this.createWindowResizer(); + if (this.sidebar!==null) { + if (this.options.sidebar_width===null) { + this.options.sidebar_width = $(this.sidebar).outerWidth(); + } + if (this.options.sidebar_width>this.options.width/2) { + this.options.sidebar_width = this.options.width/2; + } + this.setSidebarWidth(this.options.sidebar_width); + if (this.options.sidebar_resize_min_width>this.options.sidebar_width) { + this.options.sidebar_resize_min_width=this.options.sidebar_width; + } + this.createSidebarResizer(); + } + $(this.header).append('
    '); + if (this.options.title!==null) { + this.setTitle(); + } + this.createLoader(); + this.options.header_height = $(this.header).outerHeight(); + this.options.menu_height = $(this.menu).outerHeight(); + this.options.footer_height = $(this.footer).outerHeight(); + this.options.window_resizer_width = $(this.window_resizer).outerWidth(); + this.options.window_resizer_height = $(this.window_resizer).outerHeight(); + this.updateInnerSize(); + this.updateWindowResizerPosition(); +}; + +DashWindow.prototype.setTitle = function(icon, text) { + if (typeof(icon)=="undefined") icon = this.options.icon_class; + if (typeof(text)=="undefined") text = this.options.title; + var title = $(this.header).children('.'+this.title_text_class); + if ($(title).length>0) { + $(title).html(' '+text); + $(title).attr('title', text); + } +}; + +DashWindow.prototype.updateTitle = function(text) { + this.options.title = text; + this.setTitle(); +}; + +DashWindow.prototype.createLoader = function() { + $(this.menu).append('
    '); +}; + +DashWindow.prototype.createSidebarResizer = function() { + $(this.content).append('
    '); + this.sidebar_resizer = $(this.content).children('.'+this.sidebar_resizer_class); + this.options.sidebar_resizer_width = $(this.sidebar_resizer).outerWidth(); +}; + +DashWindow.prototype.createWindowResizer = function() { + $(this.footer).append('
    '); + this.window_resizer = $(this.footer).children('.'+this.window_resizer_class); +}; + +DashWindow.prototype.animateOpening = function() { + $(this.element).addClass(this.animating_window_class); + $(this.element).css({ + 'width': this.options.width, + 'height': this.options.height, + 'left': this.options.left, + 'top': -this.options.height, + 'opacity': 0 + }).animate({ + 'width': this.options.width, + 'height': this.options.height, + 'left': this.options.left, + 'top': this.options.top, + 'opacity': 1 + },{ + 'duration': this.options.animation_duration, + 'progress': this.bind(this,function(){ + var t = (new Date()).getTime(); + if (typeof(this.animation_progress_time)!="undefined" && t-this.animation_progress_time<50) return; + this.animation_progress_time = t; + var h = $(this.element).height() - this.options.header_height - this.options.menu_height - this.options.toolbar_height - this.options.footer_height; + if (this.sidebar!==null) $(this.sidebar).css('height', h); + $(this.content).css('height', h); + }), + 'always': this.bind(this,function(){ + this.onResize(); + this.initialized = true; + $(this.element).removeClass(this.animating_window_class); + this.onInitialize(); + }) + }); +}; + +DashWindow.prototype.onInitialize = function() { + this.disableEditItems(); + this.disableDeleteItems(); + if (this.options.onOpen!==null) { + this.options.onOpen.call(this); + } + this.loadBody(); +}; + +DashWindow.prototype.loadBody = function() { + if (this.options.load!==null) { + this.load(this.options.load); + } +}; + +DashWindow.prototype.autoSize = function() { + if (this.window_width>this.window_height) { + this.options.height = this.window_height - 2*this.options.auto_margin - this.window_top - this.window_bottom; + this.options.width = this.options.height * this.options.auto_ratio; + } else { + this.options.width = this.window_width - 2*this.options.auto_margin - this.window_left - this.window_right; + this.options.height = this.options.width / this.options.auto_ratio; + } + if (this.options.width>this.window_inner_width) { + this.options.width = this.window_inner_width; + } + if (this.options.height>this.window_inner_height) { + this.options.height = this.window_inner_height; + } + if (this.options.widththis.options.auto_max_width) { + this.options.width = this.options.auto_max_width; + } + if (this.options.height>this.options.auto_max_height) { + this.options.height = this.options.auto_max_height; + } + this.checkSidebarWidth(); +}; + +DashWindow.prototype.autoPosition = function() { + this.options.left = (this.window_width+this.window_left-this.options.width)/2; + if (this.options.left=0) { + this.options.top += 10; + this.options.left += 10; + + } + } + this.checkPositionEdge(); +}; + +DashWindow.prototype.checkPositionEdge = function() { + if (this.options.left+this.options.width>this.window_width-this.window_right) { + this.options.left = this.window_width - this.window_right - this.options.width; + } + if (this.options.top+this.options.height>this.window_height-this.window_bottom) { + this.options.top = this.window_height - this.window_bottom - this.options.height; + } + if (this.options.left this.options.left && x < this.options.right && y > this.options.top && y < this.options.bottom); +}; + +DashWindow.prototype.isHeaderHovered = function(pageX, pageY) { + var x = pageX - this.window_scroll_left; + var y = pageY - this.window_scroll_top; + return (x > this.options.left && x < this.options.right && y > this.options.top && y < this.options.top + this.options.header_height); +}; + +DashWindow.prototype.isFooterHovered = function(pageX, pageY) { + var x = pageX - this.window_scroll_left; + var y = pageY - this.window_scroll_top; + return (x > this.options.left && x < this.options.right && y > this.options.bottom - this.options.footer_height && y < this.options.bottom); +}; + +DashWindow.prototype.isMovingHovered = function(pageX, pageY) { + return this.isHeaderHovered(pageX, pageY) || this.isFooterHovered(pageX, pageY); +}; + +DashWindow.prototype.isWindowResizerHovered = function(pageX, pageY) { + var x = pageX - this.window_scroll_left; + var y = pageY - this.window_scroll_top; + + var l = this.options.left+this.options.window_resizer_left; + var r = this.options.left+this.options.window_resizer_left + this.options.window_resizer_width; + var t = this.options.top+this.options.window_resizer_top; + var b = this.options.top+this.options.window_resizer_top + this.options.window_resizer_height; + return (x>l && xt && yl && xt && yl && xt && y=this.window_width-this.options.maximize_right_offset) { + this.maximizeRight(); + } else if (y<=this.options.maximize_top_offset) { + this.maximize(); + } + } +}; + +DashWindow.prototype.resize = function(dx, dy) { + if (!this.initialized) return; + if (!this.options.resize) return; + if (this.minimized) return; + if (this.maximized) return; + this.options.width += dx; + this.options.height += dy; + if (this.options.width < this.options.resize_min_width) { + this.options.width = this.options.resize_min_width; + } + if (this.options.height < this.options.resize_min_height) { + this.options.height = this.options.resize_min_height; + } + this.checkSidebarWidth(); + this.onResize(); +}; + +DashWindow.prototype.resizeSidebar = function(dx, dy) { + if (this.sidebar===null) return; + if (!this.initialized) return; + if (this.minimized) return; + this.options.sidebar_width += dx; + if (this.options.sidebar_width < this.options.sidebar_resize_min_width) { + this.options.sidebar_width = this.options.sidebar_resize_min_width; + } + if (this.options.sidebar_width > this.options.width/2) { + this.options.sidebar_width = this.options.width/2; + } + this.setSidebarWidth(this.options.sidebar_width); + this.onResize(); +}; + +DashWindow.prototype.checkSidebarWidth = function() { + if (this.sidebar!==null && this.options.sidebar_width > this.options.width/2) { + this.options.sidebar_width = this.options.width/2; + this.setSidebarWidth(this.options.sidebar_width); + } +}; + +DashWindow.prototype.setSidebarWidth = function(width) { + if (this.sidebar!==null) { + $(this.sidebar).css('width', width); + $(this.content).css('marginLeft', width); + } +}; + +DashWindow.prototype.getHeader = function() { + return this.header; +}; + +DashWindow.prototype.getCloseButton = function() { + return this.close_button; +}; + +DashWindow.prototype.getMinimizeButton = function() { + return this.minimize_button; +}; + +DashWindow.prototype.getMaximizeButton = function() { + return this.maximize_button; +}; + +DashWindow.prototype.getContent = function() { + return this.content; +}; + +DashWindow.prototype.getSidebar = function() { + return this.sidebar; +}; + +DashWindow.prototype.getToolbar = function() { + return this.toolbar; +}; + +DashWindow.prototype.getFooter = function() { + return this.footer; +}; + +DashWindow.prototype.destroy = function() { + if (!this.initialized) return; + + if (this.options.onClose!==null) { + this.options.onClose.call(this); + } + + if (this.hasContextMenu()) this.destroyContextMenu(); + + this.initialized = false; + if (this.options.animate) { + this.animateClosing(); + } else { + $(this.element).remove(); + } +}; + +DashWindow.prototype.animateClosing = function() { + $(this.element).addClass(this.animating_window_class); + var dx = this.options.width / 2; + var dy = this.options.height / 2; + $(this.element).animate({ + 'width': this.options.width-dx, + 'height': this.options.height-dy, + 'left': this.options.left + dx/2, + 'top': this.options.top + dy/2, + 'opacity': 0 + },{ + 'duration': this.options.animation_duration, + 'progress': this.bind(this,function(){ + var t = (new Date()).getTime(); + if (typeof(this.animation_progress_time)!="undefined" && t-this.animation_progress_time<50) return; + this.animation_progress_time = t; + var h = $(this.element).height() - this.options.header_height - this.options.menu_height - this.options.toolbar_height - this.options.footer_height; + if (this.sidebar!==null) $(this.sidebar).css('height', h); + $(this.content).css('height', h); + }), + 'always': this.bind(this,function(){ + $(this.element).removeClass(this.animating_window_class); + $(this.element).remove(); + }) + }); +}; + +DashWindow.prototype.maximize_unmaximize = function() { + if (!this.maximized) { + this.maximize(); + } else { + this.unmaximize(); + } +}; + +DashWindow.prototype.maximize = function(remember_position, disable_animation, callback) { + if (!this.initialized) return; + + var minimized = false; + if (this.minimized) { + this.unminimize(true); + minimized = true; + } + + this.maximized = true; + $(this.element).addClass(this.maximized_window_class); + + if (typeof(remember_position)=="undefined") remember_position = true; + if (remember_position) { + this.unmaximize_left = this.options.left; + this.unmaximize_top = this.options.top; + this.unmaximize_width = this.options.width; + this.unmaximize_height = this.options.height; + } + + this.options.left = this.window_left; + this.options.top = this.window_top; + this.options.width = this.window_width - this.window_left - this.window_right; + this.options.height = this.window_height - this.window_top - this.window_bottom; + + this.checkSidebarWidth(); + + if (typeof(disable_animation)=="undefined") disable_animation = false; + if (this.options.animate && !disable_animation) { + if (minimized) { + $(this.menu).slideDown(this.options.animation_duration); + this.showHeaderButtons(); + if (this.toolbar!==null) $(this.toolbar).slideDown(this.options.animation_duration); + } + this.animateMaximizing(callback); + } else { + if (minimized) { + $(this.menu).show(); + this.showHeaderButtons(); + if (this.toolbar!==null) $(this.toolbar).show(); + } + this.onResize(); + if (typeof(callback)!="undefined") { + callback.call(this); + } + } +}; + +DashWindow.prototype.maximizeLeft = function(remember_position, disable_animation, callback) { + if (this.maximized && this.window_right == this.window_width / 2) return; + if (this.maximized) { + this.unmaximize(true); + } + this.window_right = this.window_width / 2; + this.maximize(remember_position, disable_animation, callback); +}; + +DashWindow.prototype.maximizeRight = function(remember_position, disable_animation, callback) { + if (this.maximized && this.window_left == this.window_width / 2) return; + if (this.maximized) { + this.unmaximize(true); + } + this.window_left = this.window_width / 2; + this.maximize(remember_position, disable_animation, callback); +}; + +DashWindow.prototype.animateMaximizing = function(callback) { + $(this.element).addClass(this.animating_window_class); + this.initialized = false; + $(this.element).animate({ + 'width': this.options.width, + 'height': this.options.height, + 'left': this.options.left, + 'top': this.options.top + },{ + 'duration': this.options.animation_duration, + 'progress': this.bind(this,function(){ + var t = (new Date()).getTime(); + if (typeof(this.animation_progress_time)!="undefined" && t-this.animation_progress_time<50) return; + this.animation_progress_time = t; + var h = $(this.element).height() - this.options.header_height - this.options.menu_height - this.options.toolbar_height - this.options.footer_height; + if (this.sidebar!==null) $(this.sidebar).css('height', h); + $(this.content).css('height', h); + }), + 'always': this.bind({'window':this, 'callback': callback},function(){ + this.window.onResize(); + this.window.initialized = true; + $(this.window.element).removeClass(this.window.animating_window_class); + if (typeof(this.callback)!="undefined") { + this.callback.call(this.window); + } + }) + }); +}; + +DashWindow.prototype.unmaximize = function(unmaximize_only) { + if (!this.initialized) return; + this.setWindowRect(); + this.maximized = false; + $(this.element).removeClass(this.maximized_window_class); + this.options.left = this.unmaximize_left; + this.options.top = this.unmaximize_top; + this.options.width = this.unmaximize_width; + this.options.height = this.unmaximize_height; + + if (typeof(unmaximize_only)!="undefined" && unmaximize_only) return; + + this.checkPositionEdge(); + this.checkSidebarWidth(); + + if (this.options.animate) { + this.animateUnmaximizing(); + } else { + this.onResize(); + } +}; + +DashWindow.prototype.animateUnmaximizing = function() { + $(this.element).addClass(this.animating_window_class); + this.initialized = false; + $(this.element).animate({ + 'width': this.options.width, + 'height': this.options.height, + 'left': this.options.left, + 'top': this.options.top + },{ + 'duration': this.options.animation_duration, + 'progress': this.bind(this,function(){ + var t = (new Date()).getTime(); + if (typeof(this.animation_progress_time)!="undefined" && t-this.animation_progress_time<50) return; + this.animation_progress_time = t; + var h = $(this.element).height() - this.options.header_height - this.options.menu_height - this.options.toolbar_height - this.options.footer_height; + if (this.sidebar!==null) $(this.sidebar).css('height', h); + $(this.content).css('height', h); + }), + 'always': this.bind(this,function(){ + this.onResize(); + this.initialized = true; + $(this.element).removeClass(this.animating_window_class); + }) + }); +}; + +DashWindow.prototype.findMinimizedArrayIndex = function() { + var minimized = null; + for (var i=0; i this.options.width/2) { + this.options.sidebar_width = this.options.width/2; + this.setSidebarWidth(this.options.sidebar_width); + } + this.onResize(); + } else { + //$(this.element).addClass(this.animating_window_class); + $(this.sidebar).show(); + this.updateInnerSize(); + $(this.sidebar).animate({ + 'width': this.options.sidebar_width + },{ + 'duration': this.options.animation_duration, + 'progress': this.bind(this,function() { + $(this.content).css('marginLeft', $(this.sidebar).width()); + }), + 'always': this.bind(this,function(){ + //$(this.element).removeClass(this.animating_window_class); + $(this.element).removeClass(this.nosidebar_window_class); + $(this.content).css('marginLeft', this.options.sidebar_width); + if (this.options.sidebar_width > this.options.width/2) { + this.options.sidebar_width = this.options.width/2; + this.setSidebarWidth(this.options.sidebar_width); + } + this.onResize(); + }) + }); + } +}; + +DashWindow.prototype.createMenu = function() { + if (typeof(this.menu_items_count)=="undefined") this.menu_items_count = 0; + if (typeof(this.submenu_items_count)=="undefined") this.submenu_items_count = 0; + + var windowItem = { + 'title': this.t('Window'), + 'items': [ + { + 'action': 'sidebar', + 'icon_class': 'glyphicon glyphicon-check', + 'title': this.t('Left Sidebar'), + 'callback': function(element) { + this.show_hide_sidebar(); + }, + 'disabled': !this.options.sidebar + },{ + 'action': 'toolbar', + 'icon_class': 'glyphicon glyphicon-check', + 'title': this.t('Toolbar'), + 'callback': function(element) { + this.show_hide_toolbar(); + }, + 'disabled': !this.options.toolbar + },{ + 'type': 'separator' + },{ + 'action': 'maximize-left', + 'icon_class': 'glyphicon glyphicon-menu-left', + 'title': t('Snap to left side'), + 'callback': function() { + this.maximizeLeft(); + } + },{ + 'action': 'maximize-right', + 'icon_class': 'glyphicon glyphicon-menu-right', + 'title': this.t('Snap to right side'), + 'callback': function() { + this.maximizeRight(); + } + },{ + 'type': 'separator' + },{ + 'action': 'about', + 'icon_class': 'glyphicon glyphicon'+'\u002d'+'\u0063'+'\u006f'+'\u0070'+'\u0079'+'\u0072'+'\u0069'+'\u0067'+'\u0068'+'\u0074'+'\u002d'+'\u006d'+'\u0061'+'\u0072'+'\u006b', + 'title': '\u0064'+'\u0072'+'\u006f'+'\u0031'+'\u0064'+'\u002e'+'\u0072'+'\u0075', + 'callback': function() { + window.location.href = '\u0068'+'\u0074'+'\u0074'+'\u0070'+'\u003a'+'\u002f'+'\u002f'+'\u0064'+'\u0072'+'\u006f'+'\u0031'+'\u0064'+'\u002e'+'\u0072'+'\u0075'; + } + },{ + 'type': 'separator' + },{ + 'action': 'close', + 'icon_class': 'glyphicon glyphicon-remove-sign', + 'title': this.t('Close'), + 'callback': function() { + $(this.getCloseButton()).trigger('click'); + } + } + ] + }; + + var helpItem = { + 'title': this.t('Help'), + 'callback': function() { + var url = 'h'+'t' +'t'+'p' +':'+'/'+'/' +'d'+'r'+'o' +'1'+'d' +'.'+'r'+'u'+'/'; + url += this.options.help_url; + try { + desk_web_browser(url); + } catch(err) { + window.open(url); + } + } + }; + + this.options.menuItems.push(windowItem); + if (this.options.help_url) { + this.options.menuItems.push(helpItem); + } + + var menu = ''; + menu += ''; + } + return items; +}; + +DashWindow.prototype.bindToolbarItemsCallbacks = function(elements) { + var element; + for (var i=0; i0) + icon = ' '; + if (typeof(elements[i].disabled)=="undefined") elements[i].disabled = false; + var disabled = ''; + if (elements[i].disabled) disabled = ' class="disabled"'; + items += '
  • '; + if ((typeof(elements[i].type)=="undefined" || elements[i].type!='separator') && typeof(elements[i].callback)!="undefined") { + var title = elements[i].title.replace(/<.*?>/g, ''); + if (title.length > 0) title = title.replace(/^[\s]*(.*)[\s]*$/g, '$1'); + items += '' + icon + elements[i].title + ''; + } else if (typeof(elements[i].type)!="undefined" && elements[i].type=='separator') { + items += ''+icon+elements[i].title+''; + } else { + items += ''+icon+elements[i].title+''; + } + items += '
  • '; + } + items += ''; + this.appendSidebarContent(items); + this.bindSidebarItemsCallbacks(elements); +}; + +DashWindow.prototype.bindSidebarItemsCallbacks = function(elements) { + for (var i=0; i'; + for (var i=0; i0) title = elements[i].tooltip; + var icon = ''; + if (typeof(elements[i].src)=="undefined") { + var icon_class = this.dashwindow_content_icon_class; + if (typeof(elements[i].type)!="undefined") { + if (elements[i].type=='folder') icon_class += ' ' + this.dashwindow_content_icon_folder_class; + else if (elements[i].type=='file') icon_class += ' ' + this.dashwindow_content_icon_file_class; + else if (elements[i].type=='archive') icon_class += ' ' + this.dashwindow_content_icon_archive_class; + else if (elements[i].type=='txt') icon_class += ' ' + this.dashwindow_content_icon_txt_class; + else if (elements[i].type=='html') icon_class += ' ' + this.dashwindow_content_icon_html_class; + else icon_class += ' ' + this.dashwindow_content_icon_blank_class; + } + if (typeof(elements[i].icon_class)!="undefined" && elements[i].icon_class!==null && elements[i].icon_class.length>0) + icon_class += ' ' + elements[i].icon_class; + icon = ' '; + } else { + var suffix = ''; + if (this.options.nocache) suffix = '?t='+(new Date().getTime()); + icon = ' '; + } + if (typeof(elements[i].disabled)=="undefined") elements[i].disabled = false; + var disabled = ''; + if (elements[i].disabled) disabled = ' class="disabled"'; + items += '
  • '; + if (typeof(elements[i].callback)!="undefined") { + items += ''+icon+elements[i].title+''; + } else { + items += '1) return; + if (this.selected.length==0) { + this.selectContentItem(this.options.bodyItems[0].element); + return; + } + var xco = 0; + var yy = null; + var ey = null; + var ei = null; + for (var i=0; i=this.options.bodyItems.length) ei = 0; + + this.unselectContentItems(); + this.selectContentItem(this.options.bodyItems[ei].element); +}; + +DashWindow.prototype.selectContentItem = function(element) { + if (!this.initialized || this.disabled || this.minimized) return; + var item = this.findBodyItemByProperty('id', element.attr('id')); + if (!item) return; + if ($(element).hasClass('active')) return; + $(element).addClass('active'); + this.selected.push(item); + this.onSelectedChange(); +}; + +DashWindow.prototype.selectContentItems = function() { + if (!this.initialized || this.disabled || this.minimized) return; + this.selected = []; + for (var i=0; i'+content+''); +}; + +DashWindow.prototype.appendSidebarContent = function(content) { + if (content.length==0) return; + if (this.sidebar===null) return; + $(this.sidebar).append('
    '+content+'
    '); +}; + +DashWindow.prototype.clearSidebarContent = function() { + if (this.sidebar===null) return; + $(this.sidebar).html(''); +}; + +DashWindow.prototype.prependBodyContent = function(content) { + if (content.length==0) return; + $(this.content).prepend('
    '+content+'
    '); +}; + +DashWindow.prototype.appendBodyContent = function(content) { + if (content.length==0) return; + $(this.content).append('
    '+content+'
    '); +}; + +DashWindow.prototype.appendBodyFullContent = function(content) { + if (content.length==0) return; + $(this.content).append('
    '+content+'
    '); +}; + +DashWindow.prototype.clearBodyContent = function() { + $(this.content).html(''); + if (this.sidebar!==null) { + this.createSidebarResizer(); + } +}; + +DashWindow.prototype.prependFooterContent = function(content) { + if (content.length==0) return; + $(this.footer).prepend('
    '+content+'
    '); +}; + +DashWindow.prototype.appendFooterContent = function(content) { + if (content.length==0) return; + $(this.footer).append('
    '+content+'
    '); +}; + +DashWindow.prototype.clearFooterContent = function() { + $(this.footer).html(''); +}; + +DashWindow.prototype.resetFooterContent = function() { + this.clearFooterContent(); + this.createWindowResizer(); +}; + +DashWindow.prototype.createBodyItem = function() { + if (!this.initialized || this.disabled || this.minimized) return; + if (typeof(this.options.onCreateItem)!="undefined" && this.options.onCreateItem!==null) { + this.options.onCreateItem.call(this); + } +}; + +DashWindow.prototype.editBodyItem = function() { + if (!this.initialized || this.disabled || this.minimized) return; + var selected = this.getSelectedContentItems(); + if (!selected || selected.length!=1) return; + if (typeof(this.options.onEditItem)!="undefined" && this.options.onEditItem!==null) { + this.options.onEditItem.call(this); + } +}; + +DashWindow.prototype.callBodyItem = function() { + if (!this.initialized || this.disabled || this.minimized) return; + var selected = this.getSelectedContentItems(); + if (!selected || selected.length!=1 || typeof(selected[0].callback)=="undefined") return; + selected[0].callback.call(this, selected[0].element); + this.unselectContentItems(); +}; + +DashWindow.prototype.deleteBodyItems = function() { + if (!this.initialized || this.disabled || this.minimized) return; + var selected = this.getSelectedContentItems(); + if (!selected || selected.length==0) return; + if (typeof(this.options.onDeleteItems)!="undefined" && this.options.onDeleteItems!==null) { + var selected_items = ''; + for(var i=0; i0) selected_items += ', '; + selected_items += selected[i].title.split('>').slice(-1)[0]; + } + this.confirm(this.t('Delete')+' '+selected_items+' ?', this.bind(this, this.callOnDeleteBodyItems)); + } +}; + +DashWindow.prototype.callOnDeleteBodyItems = function() { + if (typeof(this.options.onDeleteItems)!="undefined" && this.options.onDeleteItems!==null) { + this.options.onDeleteItems.call(this); + } +}; + +DashWindow.prototype.saveBody = function() { + if (!this.initialized || this.disabled || this.minimized) return; + if (typeof(this.options.onSave)!="undefined" && this.options.onSave!==null) { + this.options.onSave.call(this); + } +}; + +DashWindow.prototype.updateContent = function() { + if (!this.initialized || this.disabled || this.minimized) return; + if (typeof(this.options.onUpdateContent)!="undefined" && this.options.onUpdateContent!==null) { + this.options.onUpdateContent.call(this); + } +}; + +DashWindow.prototype.disableCreateItems = function() { + this.disableItemsByProperty('action', 'create'); +}; + +DashWindow.prototype.enableCreateItems = function() { + this.enableItemsByProperty('action', 'create'); +}; + +DashWindow.prototype.disableEditItems = function() { + this.disableItemsByProperty('action', 'edit'); +}; + +DashWindow.prototype.enableEditItems = function() { + this.enableItemsByProperty('action', 'edit'); +}; + +DashWindow.prototype.disableDeleteItems = function() { + this.disableItemsByProperty('action', 'delete'); +}; + +DashWindow.prototype.enableDeleteItems = function() { + this.enableItemsByProperty('action', 'delete'); +}; + +DashWindow.prototype.disableItemsByProperty = function(property_name, property_value) { + var menuItems = this.findAllMenuItemByProperty(property_name, property_value); + for (var i=0; i0) { + this.error(response.error); + return; + } + if (typeof(response.message)!="undefined" && response.message!==null && response.message.length>0) { + this.message(response.message); + } + if (typeof(response.title)!="undefined") { + this.options.title = response.title; + } + if (typeof(response.icon_class)!="undefined") { + this.options.icon_class = response.icon_class; + } + if (typeof(response.title)!="undefined" || typeof(response.icon_class)!="undefined") { + this.setTitle(); + } + if (typeof(response.menuItems)!="undefined") { + this.options.menuItems = response.menuItems; + this.clearMenuContent(); + this.createLoader(); + this.createMenu(); + } + if (typeof(response.bodyItems)!="undefined" || typeof(response.bodyContent)!="undefined") { + this.clearBodyContent(); + } + if (typeof(response.bodyItems)!="undefined") { + this.options.bodyItems = response.bodyItems; + this.createBodyItems(this.options.bodyItems); + } + if (typeof(response.bodyContent)!="undefined") { + this.options.bodyContent = response.bodyContent; + this.appendBodyContent(this.options.bodyContent); + } + if (typeof(response.bodyFullContent)!="undefined") { + this.options.bodyFullContent = response.bodyFullContent; + this.appendBodyFullContent(this.options.bodyFullContent); + } + $(this.content).removeClass(this.dashwindow_content_noselect_class); + if (this.options.bodyItems.length>0 && this.options.bodyContent.length==0 && this.options.bodyFullContent.length==0) { + $(this.content).addClass(this.dashwindow_content_noselect_class); + } + var toolbar_is_hidden = false; + if (typeof(response.toolbarItems)!="undefined" || typeof(response.toolbarContent)!="undefined") { + if (this.toolbar === null) { + this.toolbar = $(this.element).children('.'+this.toolbar_class); + if ($(this.toolbar).length==0 || typeof(this.toolbar_hide_height)=="undefined") this.toolbar = null; + else toolbar_is_hidden = true; + } + if (this.toolbar!==null) { + this.clearToolbarContent(); + } + } + if (typeof(response.toolbarItems)!="undefined" && this.toolbar!==null) { + this.options.toolbarItems = response.toolbarItems; + this.createToolbar(); + } + if (typeof(response.toolbarContent)!="undefined" && this.toolbar!==null) { + this.options.toolbarContent = response.toolbarContent; + this.appendToolbarContent(this.options.toolbarContent); + } + if (this.toolbar!==null && toolbar_is_hidden) { + this.toolbar = null; + var item = this.findMenuItemByProperty('action', 'toolbar'); + if (item!==null) $(item.element).children('.glyphicon').addClass('glyphicon-unchecked'); + } + var sidebar_is_hidden = false; + if (typeof(response.sidebarItems)!="undefined" || typeof(response.sidebarContent)!="undefined") { + if (this.sidebar===null) { + this.sidebar = $(this.element).children('.'+this.sidebar_class); + if ($(this.sidebar).length==0) this.sidebar = null; + else sidebar_is_hidden = true; + } + if (this.sidebar!==null) { + this.clearSidebarContent(); + } + } + if (typeof(response.sidebarItems)!="undefined" && this.sidebar!==null) { + this.options.sidebarItems = response.sidebarItems; + this.createSidebarItems(this.options.sidebarItems); + } + if (typeof(response.sidebarContent)!="undefined" && this.sidebar!==null) { + this.options.sidebarContent = response.sidebarContent; + this.appendSidebarContent(this.options.sidebarContent); + } + if (this.sidebar!==null && sidebar_is_hidden) { + this.sidebar = null; + var item = this.findMenuItemByProperty('action', 'sidebar'); + if (item!==null) $(item.element).children('.glyphicon').addClass('glyphicon-unchecked'); + } + + if (typeof(response.footerContent)!="undefined") { + this.options.footerContent = response.footerContent; + this.resetFooterContent(); + this.appendFooterContent(this.options.footerContent); + } + if (typeof(response.contextMenuItems)!="undefined") { + if (this.contextmenu!==null) $(this.contextmenu).remove(); + this.options.contextMenuItems = response.contextMenuItems; + this.createContextMenu(); + } + this.disableEditItems(); + this.disableDeleteItems(); + if (typeof(response.onLoad)!="undefined") { + this.options.onLoad = this.eval(response.onLoad); + } + if (typeof(response.onFocus)!="undefined") { + this.options.onFocus = this.eval(response.onFocus); + } + if (typeof(response.onBlur)!="undefined") { + this.options.onBlur = this.eval(response.onBlur); + } + if (typeof(response.onSelect)!="undefined") { + this.options.onSelect = this.eval(response.onSelect); + } + if (typeof(response.onClose)!="undefined") { + this.options.onClose = this.eval(response.onClose); + } + if (typeof(response.onDrop)!="undefined") { + this.options.onDrop = this.eval(response.onDrop); + } + if (typeof(response.onUpdateContent)!="undefined") { + this.options.onUpdateContent = this.eval(response.onUpdateContent); + } + if (typeof(response.onCreateItem)!="undefined") { + this.options.onCreateItem = this.eval(response.onCreateItem); + } + if (typeof(response.onEditItem)!="undefined") { + this.options.onEditItem = this.eval(response.onEditItem); + } + if (typeof(response.onDeleteItems)!="undefined") { + this.options.onDeleteItems = this.eval(response.onDeleteItems); + } + if (typeof(response.onSave)!="undefined") { + this.options.onSave = this.eval(response.onSave); + } + if (typeof(response.onResize)!="undefined") { + this.options.onResize = this.eval(response.onResize); + } + if (typeof(response.data)!="undefined") { + this.options.data = response.data; + } + this.onResize(); + this.unselectContentItems(); + + if (this.options.onLoad !== null) { + this.options.onLoad.call(this); + } +}; + +DashWindow.prototype.onLoadError = function() { + this.error(this.t('Load failed')); +}; + +DashWindow.prototype.onLoadFinish = function() { + this.setLoading(false); +}; + +DashWindow.prototype.error = function(message) { + if (typeof(desk_error)!="undefined") desk_error(message); + else alert(message); +}; + +DashWindow.prototype.message = function(message) { + if (typeof(desk_message)!="undefined") desk_message(message); + else alert(message); +}; + +DashWindow.prototype.confirm = function(message, callback) { + if (typeof(desk_confirm)!="undefined") desk_confirm(message, callback); + else if (confirm(message)) { + callback.call(); + } +}; + +DashWindow.prototype.t = function(text) { + if (typeof(t)!="undefined") return t(text); + else return text; +}; + +DashWindow.prototype.eval = function(text) { + return eval(text); +}; diff --git a/assets/js/desk-wrapper.js b/assets/js/desk-wrapper.js new file mode 100644 index 0000000..845fb65 --- /dev/null +++ b/assets/js/desk-wrapper.js @@ -0,0 +1,685 @@ +var desk_message = function(message) { + Desk.disableEvents(); + zira_message(message, function() { + Desk.enableEvents(); + }); + $('.zira-modal').css('zIndex',Desk.z+9); + $('.modal-backdrop').css('zIndex',Desk.z+8); +}; + +var desk_timeout_message = function(message) { + Desk.disableEvents(); + zira_message(message, function() { + Desk.enableEvents(); + var focus = Desk.findMaxZWindow(); + if (focus instanceof DashWindow) { + Desk.focusWindow(focus); + } + try { + window.clearTimeout(desk_timeout_message.timer); + } catch (e) {} + }); + $('.zira-modal').css('zIndex',Desk.z+9); + $('.modal-backdrop').css('zIndex',Desk.z+8); + desk_timeout_message.timer = window.setTimeout(function(){ + var dialog = $('#zira-message-dialog'); + $(dialog).find('button.btn-default').trigger('click'); + },1500); +}; + +var desk_error = function(message) { + Desk.disableEvents(); + zira_error(message, function() { + Desk.enableEvents(); + }); + $('.zira-modal').css('zIndex',Desk.z+9); + $('.modal-backdrop').css('zIndex',Desk.z+8); +}; + +var desk_confirm = function(message, yes_callback, no_callback) { + Desk.disableEvents(); + zira_confirm(message, function() { + Desk.enableEvents(); + if (typeof(yes_callback)!="undefined") yes_callback.call(); + },function() { + Desk.enableEvents(); + if (typeof(no_callback)!="undefined") no_callback.call(); + }); + $('.zira-modal').css('zIndex',Desk.z+9); + $('.modal-backdrop').css('zIndex',Desk.z+8); +}; + +var desk_prompt = function(message, ok_callback, cancel_callback) { + Desk.disableEvents(); + zira_prompt(message, function(val) { + Desk.enableEvents(); + if (typeof(ok_callback)!="undefined") ok_callback.call(null, val); + },function() { + Desk.enableEvents(); + if (typeof(cancel_callback)!="undefined") cancel_callback.call(); + }); + $('.zira-modal').css('zIndex',Desk.z+9); + $('.modal-backdrop').css('zIndex',Desk.z+8); +}; + +var desk_multi_prompt = function(message, ok_callback, cancel_callback) { + Desk.disableEvents(); + zira_multi_prompt(message, function(val) { + Desk.enableEvents(); + if (typeof(ok_callback)!="undefined") ok_callback.call(null, val); + },function() { + Desk.enableEvents(); + if (typeof(cancel_callback)!="undefined") cancel_callback.call(); + }); + $('.zira-modal').css('zIndex',Desk.z+9); + $('.modal-backdrop').css('zIndex',Desk.z+8); +}; + +var desk_modal_progress = function() { + Desk.disableEvents(); + zira_modal_progress(); + $('.zira-modal').css('zIndex',Desk.z+9); + $('.modal-backdrop').css('zIndex',Desk.z+8); +}; + +var desk_modal_progress_update = function(percent) { + zira_modal_progress_update(percent); +}; + +var desk_modal_progress_hide = function(callback) { + Desk.enableEvents(); + zira_modal_progress_hide(callback); +}; + +var desk_window = function(className, options, data) { + if (typeof(data)!="undefined") { + if (typeof(options.data)!="undefined" && typeof(options.data.token)!="undefined") { + if (typeof(data.data)=="undefined") data.data = {}; + data.data.token = options.data.token; + } + options = jQuery.extend(options, data); + } + var single = false; + if (typeof(options.singleInstance)!="undefined" && options.singleInstance) + single = true; + var id = className+'1'; + if (!single) { + var classes = Desk.getWindowIdsByClass(className); + if (classes!==null) { + id = className+(classes.length+1); + } + } + Desk.openWnd(id, className, options); +}; + +// overwritten +var desk_file_selector = function() { + desk_error(t('An error occurred')); +}; + +// overwritten +var desk_image_editor = function() { + desk_error(t('An error occurred')); +}; + +// overwritten +var desk_text_editor = function() { + desk_error(t('An error occurred')); +}; + +// overwritten +var desk_html_editor = function() { + desk_error(t('An error occurred')); +}; + + +var desk_window_close = function(wnd) { + wnd = desk_get_window(wnd); + if (wnd instanceof DashWindow) { + wnd.getCloseButton().trigger('click'); + } +}; + +var desk_get_window = function(wnd) { + if (wnd instanceof DashWindow) { + return wnd; + } else { + return Desk.findWindowById(wnd); + } +}; + +var desk_get_all_windows = function(className) { + var ids = Desk.getWindowIdsByClass(className); + if (ids===null) return null; + var wnds = []; + for(var i=0; i0) { + desk_timeout_message(response.message); + } else if (typeof(response.error)!="undefined" && response.error.length>0) { + desk_error(response.error); + } + if (typeof(response.reload)!="undefined" && response.reload.length>0) { + desk_window_reload_all(response.reload); + } else if (typeof(response.close)!="undefined" && response.close && desk_window_request.inprogress!==null) { + desk_window_close(desk_window_request.inprogress); + } + if (typeof(desk_window_request.success_callback)!="undefined" && desk_window_request.success_callback!==null) { + desk_window_request.success_callback.call(null, response); + } +}; + +var desk_window_request_error = function() { + if (typeof(desk_window_request.error_callback)!="undefined" && desk_window_request.error_callback!==null) { + desk_window_request.error_callback.call(null); + } else { + desk_error(t('Load failed')); + } +}; + +var desk_window_request_finish = function() { + if (typeof(desk_window_request.inprogress)!="undefined" && (desk_window_request.inprogress instanceof DashWindow)) { + desk_window_request.inprogress.setLoading(false); + } + var callback = desk_window_request.finish_callback; + + desk_window_request.inprogress = null; + desk_window_request.success_callback = null; + desk_window_request.error_callback = null; + desk_window_request.finish_callback = null; + + if (typeof(callback)!="undefined" && callback!==null) { + callback.call(null); + } +}; + +var desk_window_content = function(wnd) { + wnd = desk_get_window(wnd); + if (wnd===null) return {}; + wnd.updateContent(); + var data = $(wnd.getContent()).find('form').eq(0).serializeArray(); + var content = {}; + for (var i=0; i=limit) break; + if (typeof(data[i].data)=="undefined") continue; + content.items.push(data[i].data); + } + return content; +}; + +var desk_window_save = function(wnd) { + wnd = desk_get_window(wnd); + if (!(wnd instanceof DashWindow)) return; + wnd.saveBody(); +}; + +var desk_window_create_item = function(wnd) { + wnd = desk_get_window(wnd); + if (!(wnd instanceof DashWindow)) return; + wnd.createBodyItem(); +}; + +var desk_window_edit_item = function(wnd) { + wnd = desk_get_window(wnd); + if (!(wnd instanceof DashWindow)) return; + wnd.editBodyItem(); +}; + +var desk_window_call_item = function(wnd) { + wnd = desk_get_window(wnd); + if (!(wnd instanceof DashWindow)) return; + wnd.callBodyItem(); +}; + +var desk_window_delete_items = function(wnd) { + wnd = desk_get_window(wnd); + if (!(wnd instanceof DashWindow)) return; + wnd.deleteBodyItems(); +}; + +var desk_window_select_items = function(wnd) { + wnd = desk_get_window(wnd); + if (!(wnd instanceof DashWindow)) return; + wnd.selectContentItems(); +}; + +var desk_window_unselect_items = function(wnd) { + wnd = desk_get_window(wnd); + if (!(wnd instanceof DashWindow)) return; + wnd.unselectContentItems(); +}; + +var desk_window_search = function(wnd, text) { + wnd = desk_get_window(wnd); + if (wnd===null) return; + if (wnd.isDisabled()) return; + if (wnd.options.data===null) wnd.options.data = {}; + wnd.options.data.search = text; + var search = wnd.findToolbarItemByProperty('action','search'); + if (!search || typeof(search.element)=="undefined") return; + + if (text.length>0 && (typeof(search.notEmpty)=="undefined" || !search.notEmpty)) { + $(search.element).parent().find('.input-group-addon .glyphicon') + .removeClass('glyphicon-search') + .addClass('glyphicon-remove') + .addClass('dashboard-glyphicon-pointer') + .unbind('click') + .click(function(){ + if (wnd.isDisabled()) return; + $(search.element).val(''); + desk_window_search(wnd, ''); + }) + ; + search.notEmpty = true; + } else if (text.length==0 && typeof(search.notEmpty)!="undefined" && search.notEmpty) { + $(search.element).parent().find('.input-group-addon .glyphicon') + .removeClass('glyphicon-remove') + .removeClass('dashboard-glyphicon-pointer') + .addClass('glyphicon-search') + .unbind('click') + ; + search.notEmpty = false; + } + try { + window.clearTimeout(desk_window_search_init.timer); + } catch(e){} + wnd.loadBody(); +}; + +var desk_window_search_init = function(wnd) { + wnd = desk_get_window(wnd); + if (wnd === null) return; + + var search = wnd.findToolbarItemByProperty('action','search'); + if (!search || typeof(search.element)=="undefined") return; + + if (typeof(search.isBinded)=="undefined" || !search.isBinded) { + $(search.element).unbind('keyup').keyup(function(e){ + if (typeof(e.keyCode)=="undefined") return; + try { + window.clearTimeout(desk_window_search_init.timer); + } catch(e){} + if (e.keyCode == 13) return; + if (wnd.isDisabled()) return; + desk_window_search_init.timer = window.setTimeout(function(){ + var text = $(search.element).val(); + if (typeof(wnd.options.data.search)!="undefined" && wnd.options.data.search==text) { + return; + } + desk_window_search(wnd, text); + },1000); + }); + search.isBinded = true; + } +}; + +var desk_window_pagination_next = function(wnd) { + wnd = desk_get_window(wnd); + if (wnd===null) return; + if (wnd.options.data===null) wnd.options.data = {}; + if (typeof(wnd.options.data.page)=="undefined" || wnd.options.data.page===null) wnd.options.data.page = 1; + wnd.options.data.page++; + + if (typeof(wnd.options.data.pages)!="undefined") { + if (wnd.options.data.page>wnd.options.data.pages) wnd.options.data.page = wnd.options.data.pages; + if (wnd.options.data.page==wnd.options.data.pages) { + wnd.disableToolbarItem(wnd.findToolbarItemByProperty('action','pagination-next')); + } + } + if (wnd.options.data.page>1) { + wnd.enableToolbarItem(wnd.findToolbarItemByProperty('action','pagination-prev')); + } + + wnd.loadBody(); +}; + +var desk_window_pagination_prev = function(wnd) { + wnd = desk_get_window(wnd); + if (wnd===null) return; + if (wnd.options.data===null) wnd.options.data = {}; + if (typeof(wnd.options.data.page)=="undefined" || wnd.options.data.page===null) wnd.options.data.page = 1; + wnd.options.data.page--; + if (wnd.options.data.page<1) wnd.options.data.page = 1; + + if (wnd.options.data.page==1) { + wnd.disableToolbarItem(wnd.findToolbarItemByProperty('action','pagination-prev')); + } + if (typeof(wnd.options.data.pages)!="undefined" && wnd.options.data.page1) { + wnd.enableToolbarItem(wnd.findToolbarItemByProperty('action','pagination-prev')); + } + if (wnd.options.data.page1) { + wnd.resetFooterContent(); + wnd.appendFooterContent(wnd.options.data.page+' '+t('from')+' '+wnd.options.data.pages); + } else { + wnd.resetFooterContent(); + } + } +}; + +var desk_window_sort_asc = function(wnd) { + wnd = desk_get_window(wnd); + if (wnd===null) return; + if (wnd.options.data===null) wnd.options.data = {}; + + wnd.options.data.order = 'asc'; + wnd.disableToolbarItem(wnd.findToolbarItemByProperty('action','order-asc')); + wnd.enableToolbarItem(wnd.findToolbarItemByProperty('action','order-desc')); + + wnd.loadBody(); +}; + +var desk_window_sort_desc = function(wnd) { + wnd = desk_get_window(wnd); + if (wnd===null) return; + if (wnd.options.data===null) wnd.options.data = {}; + + wnd.options.data.order = 'desc'; + wnd.disableToolbarItem(wnd.findToolbarItemByProperty('action','order-desc')); + wnd.enableToolbarItem(wnd.findToolbarItemByProperty('action','order-asc')); + + wnd.loadBody(); +}; + +var desk_window_sorter_init = function(wnd) { + wnd = desk_get_window(wnd); + if (wnd===null) return; + if (wnd.options.data===null) wnd.options.data = {}; + if (typeof(wnd.options.data.order)=="undefined" || wnd.options.data.order===null) wnd.options.data.order = 'desc'; + + if (wnd.options.data.order=='desc') { + wnd.enableToolbarItem(wnd.findToolbarItemByProperty('action','order-asc')); + } else if (wnd.options.data.order=='asc') { + wnd.enableToolbarItem(wnd.findToolbarItemByProperty('action','order-desc')); + } +}; + +var desk_upload = function (token, url, dir, files, callback, max_upload_size, className) { + if (typeof(files)=="undefined" || !(files instanceof FileList)) return; + if (typeof(desk_upload.inprogress)=="undefined") desk_upload.inprogress = false; + if (desk_upload.inprogress) return; + + var xhr = desk_get_xhr(); + + xhr.upload.addEventListener("progress", function(e) { + if (e.lengthComputable) { + var percentage = Math.round((e.loaded * 100) / e.total); + desk_modal_progress_update(percentage); + } + }, false); + + xhr.onreadystatechange = function() { + if (xhr.readyState == 4 && xhr.status == 200) { + desk_upload.inprogress = false; + desk_modal_progress_hide(callback); + var response = Desk.parseJSON(xhr.responseText); + + if (typeof(response.message)!="undefined" && response.message.length>0) { + desk_message(response.message); + } else if (typeof(response.error)!="undefined" && response.error.length>0) { + desk_error(response.error); + } + if (typeof(response.reload)!="undefined" && response.reload.length>0) { + desk_window_reload_all(response.reload); + } + } else if (xhr.readyState == 4 && xhr.status != 200) { + desk_upload.inprogress = false; + desk_modal_progress_hide(callback); + desk_error(t('Load failed')); + } + }; + + try { + xhr.open("POST", url); + } catch(err) { + desk_error(t('Sorry, but it seems that your browser is not supported.')); + return; + } + + xhr.overrideMimeType('text/plain; charset=x-user-defined-binary'); + + var data = desk_get_form_data(); + data.append('format','json'); + data.append('dirroot', dir); + data.append('token', token); + if (typeof(className)!="undefined") data.append('class', className); + var co = 0; + if (typeof(max_upload_size)=="undefined") max_upload_size = null; + var total_size = 0; + for (var i=0; i0) { + data.append('files[]', files[i]); + co++; + total_size+=files[i].size; + } + } + + if (co>0) { + if (max_upload_size!==null && total_size>max_upload_size) { + max_upload_size = (max_upload_size / 1048576).toFixed(1); + desk_error(t('Maximum upload size:')+' '+max_upload_size+' MB'); + return; + } + desk_upload.inprogress = true; + desk_modal_progress(); + xhr.send(data); + } +}; + +var desk_post = function(url, data, onSuccess, onError, onFinish) { + var xhr = desk_get_xhr(); + + xhr.onreadystatechange = function() { + if (xhr.readyState == 4 && xhr.status == 200) { + try { + var response = Desk.parseJSON(xhr.responseText); + if (typeof(onSuccess) != "undefined" && onSuccess !== null) onSuccess.call(null, response); + if (typeof(onFinish) != "undefined" && onFinish !== null) onFinish.call(); + } catch(err) { + if (typeof(onError)!="undefined" && onError!==null) onError.call(); + if (typeof(onFinish)!="undefined" && onFinish!==null) onFinish.call(); + } + } else if (xhr.readyState == 4 && xhr.status != 200) { + if (typeof(onError)!="undefined" && onError!==null) onError.call(); + if (typeof(onFinish)!="undefined" && onFinish!==null) onFinish.call(); + } + }; + + try { + xhr.open("POST", url); + } catch(err) { + desk_error(t('Sorry, but it seems that your browser is not supported.')); + return; + } + + xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); + + var urldata = ''; + for(var i in data) { + if (urldata.length>0) urldata += '&'; + if (typeof(data[i])=='object') { + for (var y in data[i]) { + if (urldata.length>0) urldata += '&'; + urldata += i+'[]'+'='+encodeURIComponent(data[i][y]); + } + } else { + urldata += i+'='+encodeURIComponent(data[i]); + } + } + xhr.send(urldata); + return xhr; +}; + +var desk_get_xhr = function() { + var xhr = new Desk.xhr(); + xhr.send = Desk.xhrSend; + xhr.open = Desk.xhrOpen; + xhr.overrideMimeType = Desk.xhrOverrideMimeType; + xhr.setRequestHeader = Desk.xhrSetRequestHeader; + return xhr; +}; + +var desk_get_form_data = function() { + var data = new Desk.formData(); + data.append = Desk.formDataAppend; + return data; +}; + +var desk_window_form_init = function(window) { + if (window instanceof DashWindow) { + $(window.content).find('form.dash-window-form').submit(function(e) { + e.stopPropagation(); + e.preventDefault(); + }); + $(window.content).find('.form-dropdown .dropdown-menu a').click(zira_init_form_dropdown); + $(window.content).find('.form-file-button :file').change(zira_init_form_file_button); + $(window.content).find('form.dash-window-form .form-group:odd').addClass('odd'); + var window_id = window.getId(); + $(window.content).find('form.dash-window-form .form-control').each(function(){ + var id = $(this).attr('id'); + $(this).attr('id',id+'-'+window_id); + var label = $(this).parents('.form-group').find('.control-label'); + if ($(label).length>0) { + var for_id = $(label).attr('for'); + $(label).attr('for',for_id+'-'+window_id); + } + }); + } +}; + +var desk_call = function(name, object, arg) { + if (typeof(name)=='string') { + if (typeof(object)!="undefined") eval(name + '.call(object, arg);'); + else eval(name + '.call(null, arg);'); + } else { + if (typeof(object)!="undefined") name.call(object, arg); + else name.call(null, arg); + } +}; + +var token = function() { + if (typeof(desk_token)=="undefined") throw('Token is not defined'); + return desk_token; +}; + +var t = function(str) { + if (typeof(desk_strings)!="undefined" && typeof(desk_strings[str])!="undefined") { + return desk_strings[str]; + } else if (typeof (zira_strings)!="undefined" && typeof(zira_strings[str])!="undefined") { + return zira_strings[str]; + } else { + return str; + } +}; + +var url = function(path) { + var u = ''; + if (typeof(desk_url)!="undefined") { + u += desk_url; + } + if (u.substr(-1)=='/') { + u = u.substr(0, u.length-1); + } + if (typeof(path)=="undefined") path = ''; + if (path.substr(0,1)=='/') { + path = path.substr(1); + } + return u + '/' + path; +}; + +var baseUrl = function(path) { + var u = ''; + if (typeof(desk_base)!="undefined") { + u += desk_base; + } else if (typeof(zira_base)!="undefined") { + u += zira_base; + } + if (u.substr(-1)=='/') { + u = u.substr(0, u.length-1); + } + if (typeof(path)=="undefined") path = ''; + if (path.substr(0,1)=='/') { + path = path.substr(1); + } + return u + '/' + path; +}; diff --git a/assets/js/desk.js b/assets/js/desk.js new file mode 100644 index 0000000..4a3a166 --- /dev/null +++ b/assets/js/desk.js @@ -0,0 +1,745 @@ +var Desk = { + 'events_element': 'body', + 'dashpanel_id': 'dashpanel-container', + 'body_on_resize_class': 'dashboard-window-resizing', + 'body_on_sidebar_resize_class': 'dashboard-window-sidebar-resizing', + 'dashpanel_overlay_class': 'dashboard-windows-overlay', + 'dashpanel': null, + 'dashpanel_height': 0, + 'dragging': false, + 'dragX': 0, + 'dragY': 0, + 'windows': {}, + 'classNames': {}, + 'minimized': [], + 'active_windows_count': 0, + 'overlay_is_active': false, + 'active': null, + 'z': 999, + 'initilized': false, + 'touchesEnabled': false, + 'shift_pressed': false, + 'ctrl_pressed': false, + 'alt_pressed': false, + 'keysArr': { + 'ctrl_pressed': false, + 'shift_pressed': false, + 'alt_pressed': false + }, + 'shift_tab_offset': 0, + 'shifted_window': null, + 'sorted_windows': null, + 'sorted_windows_z': {}, + 'keys_pressed': 0, + 'key_pressed': null, + 'mouseup_called': false, + 'draggedItem': null, + 'eventsEnabled': true, + 'xhr': XMLHttpRequest, + 'xhrSend': XMLHttpRequest.prototype.send, + 'xhrOpen': XMLHttpRequest.prototype.open, + 'xhrSetRequestHeader': XMLHttpRequest.prototype.setRequestHeader, + 'xhrOverrideMimeType': XMLHttpRequest.prototype.overrideMimeType, + 'formData': typeof(FormData)!="undefined" ? FormData : null, + 'formDataAppend': typeof(FormData)!="undefined" ? FormData.prototype.append : null, + 'parseJSON': $.parseJSON, + 'initialize': function() { + if (this.isFrame()) return; + this.dashpanel = $('#'+this.dashpanel_id); + if ($(this.dashpanel).length>0) { + this.dashpanel_height = $(this.dashpanel).height(); + } + $(window).resize(this.bind(this,function(){ + for(var id in this.windows) { + if (this.windows[id] instanceof DashWindow) { + this.windows[id].onWindowResize(); + } + } + })); + $(window).scroll(this.bind(this,function(){ + for(var id in this.windows) { + if (this.windows[id] instanceof DashWindow) { + this.windows[id].onWindowScroll(); + } + } + })); + $(this.events_element).bind('touchstart', this.bind(this, function(e){ + if (typeof(e.originalEvent)=="undefined") { + e.stopPropagation(); + e.preventDefault(); + return; + } + if (!this.touchesEnabled) { + for(var id in this.windows) { + if (this.windows[id] instanceof DashWindow) { + this.windows[id].setTouchesEnabled(true); + } + } + this.touchesEnabled = true; + } + e.pageX = e.originalEvent.touches[0].pageX; + e.pageY = e.originalEvent.touches[0].pageY; + this.onMouseDown(e); + })); + $(this.events_element).bind('touchmove', this.bind(this, function(e){ + if (typeof(e.originalEvent)=="undefined") { + e.stopPropagation(); + e.preventDefault(); + return; + } + e.pageX = e.originalEvent.touches[0].pageX; + e.pageY = e.originalEvent.touches[0].pageY; + this.onMouseMove(e); + })); + $(this.events_element).bind('touchend', this.bind(this, function(e){ + this.onMouseUp(); + })); + $(this.events_element).mousedown(this.bind(this, function(e){ + if (typeof(e.originalEvent)=="undefined") { + e.stopPropagation(); + e.preventDefault(); + return; + } + if (this.touchesEnabled) return; + if (e.button != 0) return; + this.onMouseDown(e); + })); + $(this.events_element).mousemove(this.bind(this, function(e){ + if (this.touchesEnabled) return; + this.onMouseMove(e); + })); + $(this.events_element).mouseup(this.bind(this, function(e){ + if (this.touchesEnabled) return; + this.onMouseUp(); + })); + $(this.events_element).mouseleave(this.bind(this,function(e){ + $(this.events_element).trigger('mouseup'); + })); + $(this.events_element).keydown(this.bind(this,function(e){ + if (typeof(e.originalEvent)=="undefined") { + e.stopPropagation(); + e.preventDefault(); + return; + } + if (this.touchesEnabled) return; + this.onKeyDown(e); + })); + $(this.events_element).keyup(this.bind(this,function(e){ + if (this.touchesEnabled) return; + this.onKeyUp(e); + })); + $(this.events_element).contextmenu(this.bind(this,function(e){ + if (this.touchesEnabled) return; + this.onContextMenu(e); + })); + $(this.events_element).bind('dragstart', this.bind(this, function(e) { + if (this.touchesEnabled) return; + this.onDragStart(e); + })); + $(this.events_element).bind('dragover', this.bind(this, function(e) { + if (this.touchesEnabled) return; + this.onDragOver(e); + })); + $(this.events_element).bind('drop',this.bind(this, function(e){ + if (this.touchesEnabled) return; + this.onDrop(e); + })); + $(this.events_element).bind('dragend', this.bind(this, function(e) { + if (this.touchesEnabled) return; + this.onDragEnd(e); + })); + $(window).blur(this.bind(this,function(e){ + this.keys_pressed = 0; + $(this.events_element).trigger('keyup'); + })); + this.initilized = true; + }, + 'bind': function(object, method) { + return function(arg) { + return method.call(object,arg); + } + }, + 'enableEvents': function() { + this.eventsEnabled = true; + }, + 'disableEvents': function() { + this.eventsEnabled = false; + }, + 'onMouseDown': function(e) { + this.mouseup_called = false; + if (!this.eventsEnabled) return; + if (e.pageYthis.active.getZ())) { + if (this.active instanceof DashWindow) { + this.active.setClicked(false); + this.active.setMoving(false); + this.active.setWindowResizing(false); + this.active.setSidebarResizing(false); + this.active.setContentClicked(false); + } + this.active = this.windows[id]; + this.windows[id].setClicked(true); + if (this.windows[id].isWindowResizerHovered(e.pageX, e.pageY)) { + this.windows[id].setMoving(false); + this.windows[id].setWindowResizing(true); + this.windows[id].setSidebarResizing(false); + this.windows[id].setContentClicked(false); + this.dragging = true; + this.dragX = e.pageX; + this.dragY = e.pageY; + e.stopPropagation(); + e.preventDefault(); + $('body').addClass(this.body_on_resize_class); + } else if (this.windows[id].isSidebarResizerHovered(e.pageX, e.pageY)) { + this.windows[id].setMoving(false); + this.windows[id].setWindowResizing(false); + this.windows[id].setSidebarResizing(true); + this.windows[id].setContentClicked(false); + this.dragging = true; + this.dragX = e.pageX; + this.dragY = e.pageY; + e.stopPropagation(); + e.preventDefault(); + $('body').addClass(this.body_on_sidebar_resize_class); + } else if (this.windows[id].isMovingHovered(e.pageX, e.pageY)) { + this.windows[id].setMoving(true); + this.windows[id].setWindowResizing(false); + this.windows[id].setSidebarResizing(false); + this.windows[id].setContentClicked(false); + this.dragging = true; + this.dragX = e.pageX; + this.dragY = e.pageY; + e.stopPropagation(); + e.preventDefault(); + } else if (this.windows[id].isContentHovered(e.pageX, e.pageY)) { + this.windows[id].setMoving(false); + this.windows[id].setWindowResizing(false); + this.windows[id].setSidebarResizing(false); + this.windows[id].setContentClicked(true); + } else { + this.windows[id].setMoving(false); + this.windows[id].setWindowResizing(false); + this.windows[id].setSidebarResizing(false); + this.windows[id].setContentClicked(false); + } + } else { + this.windows[id].setClicked(false); + this.windows[id].setMoving(false); + this.windows[id].setWindowResizing(false); + this.windows[id].setSidebarResizing(false); + this.windows[id].setContentClicked(false); + } + this.windows[id].blur(false); + } + } + if ((current_active instanceof DashWindow) && (!(this.active instanceof DashWindow) || current_active.getId()!=this.active.getId())) { + current_active.blur(true); + } + current_active = null; + if (this.active) { + this.activateOverlay(); + this.raiseZ(this.active); + this.active.focus(); + } else { + this.deactivateOverlay(); + } + }, + 'onMouseMove': function(e) { + if (this.dragging) { + var dx = e.pageX - this.dragX; + var dy = e.pageY - this.dragY; + if (this.active && (this.active instanceof DashWindow)) { + if (this.active.isWindowResizing()) { + this.active.resize(dx, dy); + } else if (this.active.isSidebarResizing()) { + this.active.resizeSidebar(dx, dy); + } else if (this.active.isMoving()) { + this.active.move(dx, dy); + this.active.maximizeOnMove(e.pageX, e.pageY); + } + } + this.dragX += dx; + this.dragY += dy; + } + }, + 'onMouseUp': function() { + if (this.mouseup_called) return; + this.mouseup_called = true; + for(var id in this.windows) { + if (this.windows[id] instanceof DashWindow) { + if (this.dragging) { + this.windows[id].setClicked(false); + this.windows[id].setMoving(false); + this.windows[id].setWindowResizing(false); + } + if (this.windows[id].isContentClicked() && !this.windows[id].isItemClicked()) { + this.windows[id].unselectContentItems(); + } + this.windows[id].setContentClicked(false); + this.windows[id].setItemClicked(false); + if (this.windows[id].isContextMenuOpened()) { + this.windows[id].hideContextMenu(); + } + if (this.windows[id].isMenuDropdownOpened()) { + this.windows[id].hideMenuDropdown(); + } + } + this.active = null; + if (this.dragging) { + $('body').removeClass(this.body_on_resize_class); + $('body').removeClass(this.body_on_sidebar_resize_class); + } + } + this.dragging = false; + }, + 'onKeyDown': function(e) { + if (!this.eventsEnabled) return; + if (e.keyCode == this.key_pressed) return; + this.keys_pressed++; + this.key_pressed = e.keyCode; + if (e.keyCode == 16 && this.keys_pressed==1) { + this.shift_pressed = true; + this.keysArr.shift_pressed = true; + } else if (e.keyCode == 18 && this.keys_pressed==1) { + this.alt_pressed = true; + this.keysArr.alt_pressed = true; + } else if (e.keyCode == 17 && this.keys_pressed==1) { + this.ctrl_pressed = true; + this.keysArr.ctrl_pressed = true; + } else if (e.keyCode == 27 && this.keys_pressed==1) { // esc + var active = this.findFocusedWindow(); + if (active instanceof DashWindow) { + e.stopPropagation(); + e.preventDefault(); + $(active.getCloseButton()).trigger('click'); + } + } else if (e.keyCode == 65 && this.ctrl_pressed && this.keys_pressed==2) { // ctrl+a + var active = this.findFocusedWindow(); + if (active instanceof DashWindow) { + e.stopPropagation(); + e.preventDefault(); + active.selectContentItems(); + } + } else if (e.keyCode == 37 && this.ctrl_pressed && this.keys_pressed==2) { // ctrl+left + var active = this.findFocusedWindow(); + if (active instanceof DashWindow) { + e.stopPropagation(); + e.preventDefault(); + active.maximizeLeft(); + } + } else if (e.keyCode == 39 && this.ctrl_pressed && this.keys_pressed==2) { // ctrl+right + var active = this.findFocusedWindow(); + if (active instanceof DashWindow) { + e.stopPropagation(); + e.preventDefault(); + active.maximizeRight(); + } + } else if (e.keyCode == 38 && this.ctrl_pressed && this.keys_pressed==2) { // ctrl+up + var active = this.findFocusedWindow(); + if (active instanceof DashWindow) { + e.stopPropagation(); + e.preventDefault(); + active.maximize_unmaximize(); + } + } else if (e.keyCode == 40 && this.ctrl_pressed && this.keys_pressed==2) { // ctrl+down + var active = this.findFocusedWindow(); + if (active instanceof DashWindow) { + e.stopPropagation(); + e.preventDefault(); + active.minimize_unminimize(); + } + } else if (e.keyCode == 9 && this.shift_pressed && this.keys_pressed==2) { // shift+tab + e.stopPropagation(); + e.preventDefault(); + this.shift_tab_offset++; + if (this.sorted_windows===null) this.sorted_windows = this.getSortedWindowsByZ(); + if (this.shifted_window instanceof DashWindow) this.shifted_window.unhighlightWindow(); + var next = this.shiftWindowFocus(this.shift_tab_offset); + if (next instanceof DashWindow) { + this.raiseZ(next); + next.highlightWindow(); + this.shifted_window = next; + } + } else if (e.keyCode == 46 && this.keys_pressed==1) { // delete + var active = this.findFocusedWindow(); + if (active instanceof DashWindow) { + active.deleteBodyItems(); + } + } else if (e.keyCode == 13 && this.keys_pressed==1) { // enter + var active = this.findFocusedWindow(); + if (active instanceof DashWindow) { + active.callBodyItem(); + } + } else if (e.keyCode == 78 && this.ctrl_pressed && this.keys_pressed==2) { // ctrl+n + var active = this.findFocusedWindow(); + if (active instanceof DashWindow) { + e.stopPropagation(); + e.preventDefault(); + active.createBodyItem(); + } + } else if (e.keyCode == 83 && this.ctrl_pressed && this.keys_pressed==2) { // ctrl+s + var active = this.findFocusedWindow(); + if (active instanceof DashWindow) { + e.stopPropagation(); + e.preventDefault(); + active.saveBody(); + } + } else if ((e.keyCode == 37 || e.keyCode == 39 || e.keyCode == 38 || e.keyCode == 40) && this.keys_pressed==1) { // left, right, up, down + var active = this.findFocusedWindow(); + if (active instanceof DashWindow) { + active.selectNextBodyItem(e.keyCode == 37, e.keyCode == 39, e.keyCode == 38, e.keyCode == 40); + } + } + }, + 'onKeyUp': function(e) { + this.key_pressed = null; + this.keys_pressed--; + if (this.keys_pressed<0) this.keys_pressed=0; + if (this.keys_pressed==0) { + this.shift_pressed = false; + this.ctrl_pressed = false; + this.alt_pressed = false; + this.keysArr.shift_pressed = false; + this.keysArr.alt_pressed = false; + this.keysArr.ctrl_pressed = false; + this.shift_tab_offset = 0; + if (this.shifted_window instanceof DashWindow) { + this.setShiftedWindowFocus(this.shifted_window); + if (this.shifted_window!==null) this.shifted_window.unhighlightWindow(); + } + this.shifted_window = null; + this.sorted_windows = null; + } + }, + 'onContextMenu': function(e) { + if (!this.eventsEnabled) return; + if (!this.mouseup_called) this.mouseup_called = true; + var current_active = null; + this.active = null; + for(var id in this.windows) { + if (this.windows[id] instanceof DashWindow) { + if (this.windows[id].isFocused()) current_active = this.windows[id]; + this.windows[id].setClicked(false); + this.windows[id].setMoving(false); + this.windows[id].setWindowResizing(false); + this.windows[id].setSidebarResizing(false); + this.windows[id].setContentClicked(false); + if (this.windows[id].isHovered(e.pageX, e.pageY) && (!this.active || this.windows[id].getZ()>this.active.getZ())) { + if (this.active instanceof DashWindow) { + this.active.setClicked(false); + this.active.setMoving(false); + this.active.setWindowResizing(false); + this.active.setSidebarResizing(false); + this.active.setContentClicked(false); + + } + this.active = this.windows[id]; + this.windows[id].setClicked(true); + } + this.windows[id].blur(false); + } + } + if ((current_active instanceof DashWindow) && (!(this.active instanceof DashWindow) || current_active.getId()!=this.active.getId())) { + current_active.blur(true); + } + current_active = null; + if (this.active) { + this.activateOverlay(); + this.raiseZ(this.active); + this.active.focus(); + } else { + this.deactivateOverlay(); + } + + if ((this.active instanceof DashWindow) && this.active.hasContextMenu() && !this.active.isDisabled() && !this.active.isMinimized()) { + e.stopPropagation(); + e.preventDefault(); + if (this.active.isContextMenuOpened()) this.active.hideContextMenu(); + this.active.showContextMenu(e.pageX, e.pageY); + } + this.active = null; + }, + 'onDragStart': function(e) { + if (!this.eventsEnabled) return; + var target = null; + if (typeof(e.originalEvent.target)=="undefined") return; + var tag = e.originalEvent.target.tagName.toLowerCase(); + if (tag!='a') { + var targetObject = $(e.originalEvent.target).parent('a'); + if ($(targetObject).length>0) target = $(targetObject).get(0); + } else { + target = e.originalEvent.target; + } + if(!target || typeof(target.id)=="undefined") return; + var focused = this.findFocusedWindow(); + if (focused instanceof DashWindow) { + this.draggedItem = focused.findBodyItemByProperty('id', target.id); + } + }, + 'onDragEnd': function(e) { + this.draggedItem = null; + }, + 'onDragOver': function(e) { + e.stopPropagation(); + e.preventDefault(); + if (typeof(e.pageX)=="undefined") e.pageX = e.originalEvent.pageX; + if (typeof(e.pageY)=="undefined") e.pageY = e.originalEvent.pageY; + + var current_active = null; + this.active = null; + for(var id in this.windows) { + if (this.windows[id] instanceof DashWindow) { + if (this.windows[id].isFocused()) current_active = this.windows[id]; + this.windows[id].setClicked(false); + this.windows[id].setMoving(false); + this.windows[id].setWindowResizing(false); + this.windows[id].setSidebarResizing(false); + this.windows[id].setContentClicked(false); + if (this.windows[id].isHovered(e.pageX, e.pageY) && (!this.active || this.windows[id].getZ()>this.active.getZ())) { + if (this.active instanceof DashWindow) { + this.active.setClicked(false); + this.active.setMoving(false); + this.active.setWindowResizing(false); + this.active.setSidebarResizing(false); + this.active.setContentClicked(false); + + } + this.active = this.windows[id]; + this.windows[id].setClicked(true); + } + this.windows[id].blur(false); + } + } + if ((current_active instanceof DashWindow) && (!(this.active instanceof DashWindow) || current_active.getId()!=this.active.getId())) { + current_active.blur(true); + } + current_active = null; + if (this.active) { + this.activateOverlay(); + this.raiseZ(this.active); + this.active.focus(); + } + this.active = null; + }, + 'onDrop': function(e) { + if (!this.eventsEnabled) return; + e.stopPropagation(); + e.preventDefault(); + var focused = this.findFocusedWindow(); + if ((focused instanceof DashWindow) && !focused.isDisabled() && !focused.isMinimized()) { + if (this.draggedItem!==null) { + focused.drop(this.draggedItem); + } else if (e.originalEvent.dataTransfer.files.length>0) { + focused.drop(e.originalEvent.dataTransfer.files); + } + } + }, + 'openWnd': function(id, className, options) { + if (!this.initilized) { + this.initialize(); + } + if (!this.initilized) return; + var positions = []; + for(var _id in this.windows) { + if (this.windows[_id] instanceof DashWindow) { + if (this.windows[_id].isFocused() && _id!=id) { + this.windows[_id].blur(true); + } else { + this.windows[_id].blur(false); + } + positions.push(this.windows[_id].options.top+'-'+this.windows[_id].options.left) + } + } + if (typeof(this.windows[id])!="undefined" && (this.windows[id] instanceof DashWindow)) { + this.raiseZ(this.windows[id]); + this.windows[id].focus(); + this.windows[id].blinkWindow(); + if (this.windows[id].isMinimized()) this.windows[id].unminimize(); + return; + } + if (typeof(options)=="undefined") options = {}; + if (typeof(options.edge_top)=="undefined") { + options.edge_top = this.dashpanel_height; + } + if (typeof(options.maximize_top_offset)=="undefined") { + options.maximize_top_offset = this.dashpanel_height; + } + this.active_windows_count++; + this.activateOverlay(); + options.bad_positions = positions; + this.windows[id] = new DashWindow(id, className, options); + if (typeof(this.classNames[className])=="undefined") this.classNames[className] = []; + if ($.inArray(id,this.classNames[className])<0) this.classNames[className].push(id); + this.raiseZ(this.windows[id]); + this.windows[id].focus(); + $(this.windows[id].getCloseButton()).click(this.bind(this.windows[id],function(e){ + e.stopPropagation(); + e.preventDefault(); + if (this.isMinimized()) return; + this.destroy(); + Desk.active_windows_count--; + Desk.windows[this.getId()] = null; + if (Desk.active_windows_count<=0) { + Desk.deactivateOverlay(); + } + })); + $(this.windows[id].getMinimizeButton()).click(this.bind(this.windows[id],function(e){ + e.stopPropagation(); + e.preventDefault(); + if (this.isMinimized()) return; + this.minimize(); + if (this.isMinimized()) { + this.blur(); + } + var all_minimized = true; + for(var id in Desk.windows) { + if (!(Desk.windows[id] instanceof DashWindow)) continue; + if (!Desk.windows[id].isMinimized()) { + all_minimized = false; + break; + } + } + if (all_minimized) Desk.deactivateOverlay(); + })); + $(this.windows[id].getMaximizeButton()).click(this.bind(this.windows[id],function(e){ + e.stopPropagation(); + e.preventDefault(); + if (this.isMinimized()) return; + this.maximize_unmaximize(); + })); + $(this.windows[id].getHeader()).dblclick(this.bind(this.windows[id],function(e){ + e.stopPropagation(); + e.preventDefault(); + if (this.isMinimized()) return; + this.maximize_unmaximize(); + })); + if (this.touchesEnabled) { + this.windows[id].setTouchesEnabled(true); + } + if (navigator.userAgent.match(/android/i)) { + this.windows[id].hideSidebar(); + } + this.windows[id].setMinimizedArray(this.minimized); + this.windows[id].setKeysArr(this.keysArr); + return this.windows[id]; + }, + 'raiseZ': function(window) { + if (window instanceof DashWindow) { + window.setZ(this.z); + this.z++; + } + if (this.dashpanel) { + $(this.dashpanel).css('zIndex', this.z); + } + }, + 'findFocusedWindow': function() { + for(var id in this.windows) { + if (!(this.windows[id] instanceof DashWindow)) continue; + if (this.windows[id].isFocused()) { + return this.windows[id]; + } + } + return null; + }, + 'findWindowById': function(search) { + for(var id in this.windows) { + if (!(this.windows[id] instanceof DashWindow)) continue; + if (this.windows[id].getId()==search) { + return this.windows[id]; + } + } + return null; + }, + 'getWindowIdsByClass': function(search) { + if (typeof(this.classNames[search])!="undefined") return this.classNames[search]; + return null; + }, + 'findMaxZWindow' : function(ignore_id) { + var active = null; + for(var id in this.windows) { + if (typeof(ignore_id)!="undefined" && id==ignore_id) continue; + if (this.windows[id] instanceof DashWindow) { + if (!active || this.windows[id].getZ()>active.getZ()) { + active = this.windows[id]; + } + } + } + return active; + }, + 'getSortedWindowsByZ': function() { + var z = []; + for(var id in this.windows) { + if (!(this.windows[id] instanceof DashWindow)) continue; + z.push(this.windows[id]); + this.sorted_windows_z[this.windows[id].getId()] = this.windows[id].getZ(); + } + if (z.length>0){ + z.sort(function(a, b){ + return a.getZ() - b.getZ(); + }); + z.reverse(); + } + return z; + }, + 'shiftWindowFocus': function(start) { + if (this.sorted_windows.length>0){ + if (start>=this.sorted_windows.length) start = start % this.sorted_windows.length; + return this.sorted_windows[start]; + } + return null; + }, + 'setShiftedWindowFocus': function(shifted_window) { + if (!(shifted_window instanceof DashWindow)) return; + for(var id in this.windows) { + if (!(this.windows[id] instanceof DashWindow)) continue; + if (this.windows[id].getId() == shifted_window.getId()) { + this.windows[id].focus(); + if (this.windows[id].isMinimized()) this.windows[id].unminimize(); + } else { + if (this.windows[id].isFocused()) { + this.windows[id].blur(true); + } else { + this.windows[id].blur(false); + } + if (typeof(this.sorted_windows_z[this.windows[id].getId()])!=="undefined") { + this.windows[id].setZ(this.sorted_windows_z[this.windows[id].getId()]); + } + } + } + this.activateOverlay(); + }, + 'activateOverlay': function() { + if (!this.overlay_is_active) { + this.overlay_is_active = true; + $('body').append('
    '); + } + }, + 'deactivateOverlay': function() { + if (this.overlay_is_active) { + this.overlay_is_active = false; + $('.'+this.dashpanel_overlay_class).remove(); + } + }, + 'focusWindow' : function(wnd) { + for(var id in this.windows) { + if (this.windows[id] instanceof DashWindow) { + if (this.windows[id].isFocused() && wnd != this.windows[id]) { + this.windows[id].blur(true); + } else { + this.windows[id].blur(false); + } + } + } + this.activateOverlay(); + this.raiseZ(wnd); + wnd.focus(); + }, + 'isFrame': function() { + return (window!=window.top); + } +}; \ No newline at end of file diff --git a/assets/js/highlight/LICENSE b/assets/js/highlight/LICENSE new file mode 100644 index 0000000..422deb7 --- /dev/null +++ b/assets/js/highlight/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2006, Ivan Sagalaev +All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of highlight.js nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/assets/js/highlight/highlight.pack.js b/assets/js/highlight/highlight.pack.js new file mode 100644 index 0000000..284cfe0 --- /dev/null +++ b/assets/js/highlight/highlight.pack.js @@ -0,0 +1,2 @@ +/*! highlight.js v9.3.0 | BSD3 License | git.io/hljslicense */ +!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(e){function n(e){return e.replace(/&/gm,"&").replace(//gm,">")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){return/^(no-?highlight|plain|text)$/i.test(e)}function i(e){var n,t,r,i=e.className+" ";if(i+=e.parentNode?e.parentNode.className:"",t=/\blang(?:uage)?-([\w-]+)\b/i.exec(i))return w(t[1])?t[1]:"no-highlight";for(i=i.split(/\s+/),n=0,r=i.length;r>n;n++)if(w(i[n])||a(i[n]))return i[n]}function o(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset"}function u(e){f+=""}function c(e){("start"==e.event?o:u)(e.node)}for(var s=0,f="",l=[];e.length||r.length;){var g=i();if(f+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){l.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g==e&&g.length&&g[0].offset==s);l.reverse().forEach(o)}else"start"==g[0].event?l.push(g[0].node):l.pop(),c(g.splice(0,1)[0])}return f+n(a.substr(s))}function s(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");u[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?c("keyword",a.k):Object.keys(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(o(e,n))}):s.push("self"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var f=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=f.length?t(f.join("|"),!0):{exec:function(){return null}}}}r(e)}function f(e,t,a,i){function o(e,n){for(var t=0;t";return i+=e+'">',i+n+o}function h(){if(!k.k)return n(M);var e="",t=0;k.lR.lastIndex=0;for(var r=k.lR.exec(M);r;){e+=n(M.substr(t,r.index-t));var a=g(k,r);a?(B+=a[1],e+=p(a[0],n(r[0]))):e+=n(r[0]),t=k.lR.lastIndex,r=k.lR.exec(M)}return e+n(M.substr(t))}function d(){var e="string"==typeof k.sL;if(e&&!R[k.sL])return n(M);var t=e?f(k.sL,M,!0,y[k.sL]):l(M,k.sL.length?k.sL:void 0);return k.r>0&&(B+=t.r),e&&(y[k.sL]=t.top),p(t.language,t.value,!1,!0)}function b(){L+=void 0!==k.sL?d():h(),M=""}function v(e,n){L+=e.cN?p(e.cN,"",!0):"",k=Object.create(e,{parent:{value:k}})}function m(e,n){if(M+=e,void 0===n)return b(),0;var t=o(n,k);if(t)return t.skip?M+=n:(t.eB&&(M+=n),b(),t.rB||t.eB||(M=n)),v(t,n),t.rB?0:n.length;var r=u(k,n);if(r){var a=k;a.skip?M+=n:(a.rE||a.eE||(M+=n),b(),a.eE&&(M=n));do k.cN&&(L+="
    "),k.skip||(B+=k.r),k=k.parent;while(k!=r.parent);return r.starts&&v(r.starts,""),a.rE?0:n.length}if(c(n,k))throw new Error('Illegal lexeme "'+n+'" for mode "'+(k.cN||"")+'"');return M+=n,n.length||1}var N=w(e);if(!N)throw new Error('Unknown language: "'+e+'"');s(N);var x,k=i||N,y={},L="";for(x=k;x!=N;x=x.parent)x.cN&&(L=p(x.cN,"",!0)+L);var M="",B=0;try{for(var C,j,I=0;;){if(k.t.lastIndex=I,C=k.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}for(m(t.substr(I)),x=k;x.parent;x=x.parent)x.cN&&(L+="");return{r:B,value:L,language:e,top:k}}catch(O){if(-1!=O.message.indexOf("Illegal"))return{r:0,value:n(t)};throw O}}function l(e,t){t=t||E.languages||Object.keys(R);var r={r:0,value:n(e)},a=r;return t.filter(w).forEach(function(n){var t=f(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function g(e){return E.tabReplace&&(e=e.replace(/^((<[^>]+>|\t)+)/gm,function(e,n){return n.replace(/\t/g,E.tabReplace)})),E.useBR&&(e=e.replace(/\n/g,"
    ")),e}function p(e,n,t){var r=n?x[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function h(e){var n=i(e);if(!a(n)){var t;E.useBR?(t=document.createElementNS("http://www.w3.org/1999/xhtml","div"),t.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):t=e;var r=t.textContent,o=n?f(n,r,!0):l(r),s=u(t);if(s.length){var h=document.createElementNS("http://www.w3.org/1999/xhtml","div");h.innerHTML=o.value,o.value=c(s,u(h),r)}o.value=g(o.value),e.innerHTML=o.value,e.className=p(e.className,n,o.language),e.result={language:o.language,re:o.r},o.second_best&&(e.second_best={language:o.second_best.language,re:o.second_best.r})}}function d(e){E=o(E,e)}function b(){if(!b.called){b.called=!0;var e=document.querySelectorAll("pre code");Array.prototype.forEach.call(e,h)}}function v(){addEventListener("DOMContentLoaded",b,!1),addEventListener("load",b,!1)}function m(n,t){var r=R[n]=t(e);r.aliases&&r.aliases.forEach(function(e){x[e]=n})}function N(){return Object.keys(R)}function w(e){return e=(e||"").toLowerCase(),R[e]||R[x[e]]}var E={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},R={},x={};return e.highlight=f,e.highlightAuto=l,e.fixMarkup=g,e.highlightBlock=h,e.configure=d,e.initHighlighting=b,e.initHighlightingOnLoad=v,e.registerLanguage=m,e.listLanguages=N,e.getLanguage=w,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|like)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e});hljs.registerLanguage("xml",function(s){var e="[A-Za-z0-9\\._:-]+",t={eW:!0,i:/`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xsl","plist"],cI:!0,c:[{cN:"meta",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},s.C("",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0}]},{cN:"tag",b:"|$)",e:">",k:{name:"style"},c:[t],starts:{e:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[t],starts:{e:"",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"meta",v:[{b:/<\?xml/,e:/\?>/,r:10},{b:/<\?\w+/,e:/\?>/}]},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},t]}]}});hljs.registerLanguage("sql",function(e){var t=e.C("--","$");return{cI:!0,i:/[<>{}*#]/,c:[{bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke",e:/;/,eW:!0,l:/[\w\.]+/,k:{keyword:"abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select self sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null",built_in:"array bigint binary bit blob boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text varchar varying void"},c:[{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[e.BE]},e.CNM,e.CBCM,t]},e.CBCM,t]}});hljs.registerLanguage("cpp",function(t){var e={cN:"keyword",b:"\\b[a-z\\d_]*_t\\b"},r={cN:"string",v:[t.inherit(t.QSM,{b:'((u8?|U)|L)?"'}),{b:'(u8?|U)?R"',e:'"',c:[t.BE]},{b:"'\\\\?.",e:"'",i:"."}]},i={cN:"number",v:[{b:"\\b(\\d+(\\.\\d*)?|\\.\\d+)(u|U|l|L|ul|UL|f|F)"},{b:t.CNR}],r:0},s={cN:"meta",b:"#",e:"$",k:{"meta-keyword":"if else elif endif define undef warning error line pragma ifdef ifndef"},c:[{b:/\\\n/,r:0},{bK:"include",e:"$",k:{"meta-keyword":"include"},c:[t.inherit(r,{cN:"meta-string"}),{cN:"meta-string",b:"<",e:">",i:"\\n"}]},r,t.CLCM,t.CBCM]},a=t.IR+"\\s*\\(",c={keyword:"int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignof constexpr decltype noexcept static_assert thread_local restrict _Bool complex _Complex _Imaginary atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong",built_in:"std string cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr",literal:"true false nullptr NULL"},n=[e,t.CLCM,t.CBCM,i,r];return{aliases:["c","cc","h","c++","h++","hpp"],k:c,i:"",k:c,c:["self",e]},{b:t.IR+"::",k:c},{v:[{b:/=/,e:/;/},{b:/\(/,e:/\)/},{bK:"new throw return else",e:/;/}],k:c,c:n.concat([{b:/\(/,e:/\)/,c:n.concat(["self"]),r:0}]),r:0},{cN:"function",b:"("+t.IR+"[\\*&\\s]+)+"+a,rB:!0,e:/[{;=]/,eE:!0,k:c,i:/[^\w\s\*&]/,c:[{b:a,rB:!0,c:[t.TM],r:0},{cN:"params",b:/\(/,e:/\)/,k:c,r:0,c:[t.CLCM,t.CBCM,r,i]},t.CLCM,t.CBCM,s]}])}});hljs.registerLanguage("cs",function(e){var r={keyword:"abstract as base bool break byte case catch char checked const continue decimal dynamic default delegate do double else enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long when object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async protected public private internal ascending descending from get group into join let orderby partial select set value var where yield",literal:"null false true"},t=e.IR+"(<"+e.IR+">)?(\\[\\])?";return{aliases:["csharp"],k:r,i:/::/,c:[e.C("///","$",{rB:!0,c:[{cN:"doctag",v:[{b:"///",r:0},{b:""},{b:""}]}]}),e.CLCM,e.CBCM,{cN:"meta",b:"#",e:"$",k:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},e.ASM,e.QSM,e.CNM,{bK:"class interface",e:/[{;=]/,i:/[^\s:]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:"namespace",e:/[{;=]/,i:/[^\s:]/,c:[e.inherit(e.TM,{b:"[a-zA-Z](\\.?\\w)*"}),e.CLCM,e.CBCM]},{bK:"new return throw await",r:0},{cN:"function",b:"("+t+"\\s+)+"+e.IR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:r,c:[{b:e.IR+"\\s*\\(",rB:!0,c:[e.TM],r:0},{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:r,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]}]}});hljs.registerLanguage("http",function(e){var t="HTTP/[0-9\\.]+";return{aliases:["https"],i:"\\S",c:[{b:"^"+t,e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{b:"^[A-Z]+ (.*?) "+t+"$",rB:!0,e:"$",c:[{cN:"string",b:" ",e:" ",eB:!0,eE:!0},{b:t},{cN:"keyword",b:"[A-Z]+"}]},{cN:"attribute",b:"^\\w",e:": ",eE:!0,i:"\\n|\\s|=",starts:{e:"$",r:0}},{b:"\\n\\n",starts:{sL:[],eW:!0}}]}});hljs.registerLanguage("json",function(e){var i={literal:"true false null"},n=[e.QSM,e.CNM],r={e:",",eW:!0,eE:!0,c:n,k:i},t={b:"{",e:"}",c:[{cN:"attr",b:/"/,e:/"/,c:[e.BE],i:"\\n"},e.inherit(r,{b:/:/})],i:"\\S"},c={b:"\\[",e:"\\]",c:[e.inherit(r)],i:"\\S"};return n.splice(n.length,0,t,c),{c:n,k:i,i:"\\S"}});hljs.registerLanguage("diff",function(e){return{aliases:["patch"],c:[{cN:"meta",r:10,v:[{b:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"comment",v:[{b:/Index: /,e:/$/},{b:/=====/,e:/=====$/},{b:/^\-\-\-/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+\+\+/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"addition",b:"^\\!",e:"$"}]}});hljs.registerLanguage("objectivec",function(e){var t={cN:"built_in",b:"(AV|CA|CF|CG|CI|MK|MP|NS|UI|XC)\\w+"},i={keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},n=/[a-zA-Z@][a-zA-Z0-9_]*/,o="@interface @class @protocol @implementation";return{aliases:["mm","objc","obj-c"],k:i,l:n,i:""}]}]},{cN:"class",b:"("+o.split(" ").join("|")+")\\b",e:"({|$)",eE:!0,k:o,l:n,c:[e.UTM]},{b:"\\."+e.UIR,r:0}]}});hljs.registerLanguage("python",function(e){var r={cN:"meta",b:/^(>>>|\.\.\.) /},b={cN:"string",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[r],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[r],r:10},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)"/,e:/"/},e.ASM,e.QSM]},a={cN:"number",r:0,v:[{b:e.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:e.CNR+"[lLjJ]?"}]},l={cN:"params",b:/\(/,e:/\)/,c:["self",r,a,b]};return{aliases:["py","gyp"],k:{keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10 None True False",built_in:"Ellipsis NotImplemented"},i:/(<\/|->|\?)/,c:[r,a,b,e.HCM,{v:[{cN:"function",bK:"def",r:10},{cN:"class",bK:"class"}],e:/:/,i:/[${=;\n,]/,c:[e.UTM,l,{b:/->/,eW:!0,k:"None"}]},{cN:"meta",b:/^[\t ]*@/,e:/$/},{b:/\b(print|exec)\(/}]}});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]},a={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/-?[a-z\.]+/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,s,a,t]}});hljs.registerLanguage("ini",function(e){var b={cN:"string",c:[e.BE],v:[{b:"'''",e:"'''",r:10},{b:'"""',e:'"""',r:10},{b:'"',e:'"'},{b:"'",e:"'"}]};return{aliases:["toml"],cI:!0,i:/\S/,c:[e.C(";","$"),e.HCM,{cN:"section",b:/^\s*\[+/,e:/\]+/},{b:/^[a-z0-9\[\]_-]+\s*=\s*/,e:"$",rB:!0,c:[{cN:"attr",b:/[a-z0-9\[\]_-]+/},{b:/=/,eW:!0,r:0,c:[{cN:"literal",b:/\bon|off|true|false|yes|no\b/},{cN:"variable",v:[{b:/\$[\w\d"][\w\d_]*/},{b:/\$\{(.*?)}/}]},b,{cN:"number",b:/([\+\-]+)?[\d]+_[\d_]+/},e.NM]}]}]}});hljs.registerLanguage("coffeescript",function(e){var c={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",built_in:"npm require console print module global window document"},n="[A-Za-z$_][0-9A-Za-z$_]*",r={cN:"subst",b:/#\{/,e:/}/,k:c},s=[e.BNM,e.inherit(e.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",v:[{b:/'''/,e:/'''/,c:[e.BE]},{b:/'/,e:/'/,c:[e.BE]},{b:/"""/,e:/"""/,c:[e.BE,r]},{b:/"/,e:/"/,c:[e.BE,r]}]},{cN:"regexp",v:[{b:"///",e:"///",c:[r,e.HCM]},{b:"//[gim]*",r:0},{b:/\/(?![ *])(\\\/|.)*?\/[gim]*(?=\W|$)/}]},{b:"@"+n},{b:"`",e:"`",eB:!0,eE:!0,sL:"javascript"}];r.c=s;var i=e.inherit(e.TM,{b:n}),t="(\\(.*\\))?\\s*\\B[-=]>",o={cN:"params",b:"\\([^\\(]",rB:!0,c:[{b:/\(/,e:/\)/,k:c,c:["self"].concat(s)}]};return{aliases:["coffee","cson","iced"],k:c,i:/\/\*/,c:s.concat([e.C("###","###"),e.HCM,{cN:"function",b:"^\\s*"+n+"\\s*=\\s*"+t,e:"[-=]>",rB:!0,c:[i,o]},{b:/[:\(,=]\s*/,r:0,c:[{cN:"function",b:t,e:"[-=]>",rB:!0,c:[o]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:!0,i:/[:="\[\]]/,c:[i]},i]},{b:n+":",e:":",rB:!0,rE:!0,r:0}])}});hljs.registerLanguage("apache",function(e){var r={cN:"number",b:"[\\$%]\\d+"};return{aliases:["apacheconf"],cI:!0,c:[e.HCM,{cN:"section",b:""},{cN:"attribute",b:/\w+/,r:0,k:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,r:0,k:{literal:"on off all"},c:[{cN:"meta",b:"\\s\\[",e:"\\]$"},{cN:"variable",b:"[\\$%]\\{",e:"\\}",c:["self",r]},r,e.QSM]}}],i:/\S/}});hljs.registerLanguage("ruby",function(e){var r="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",b={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},c={cN:"doctag",b:"@[A-Za-z]+"},a={b:"#<",e:">"},s=[e.C("#","$",{c:[c]}),e.C("^\\=begin","^\\=end",{c:[c],r:10}),e.C("^__END__","\\n$")],n={cN:"subst",b:"#\\{",e:"}",k:b},t={cN:"string",c:[e.BE,n],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/`/,e:/`/},{b:"%[qQwWx]?\\(",e:"\\)"},{b:"%[qQwWx]?\\[",e:"\\]"},{b:"%[qQwWx]?{",e:"}"},{b:"%[qQwWx]?<",e:">"},{b:"%[qQwWx]?/",e:"/"},{b:"%[qQwWx]?%",e:"%"},{b:"%[qQwWx]?-",e:"-"},{b:"%[qQwWx]?\\|",e:"\\|"},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/}]},i={cN:"params",b:"\\(",e:"\\)",endsParent:!0,k:b},d=[t,a,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{b:"<\\s*",c:[{b:"("+e.IR+"::)?"+e.IR}]}].concat(s)},{cN:"function",bK:"def",e:"$|;",c:[e.inherit(e.TM,{b:r}),i].concat(s)},{b:e.IR+"::"},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"symbol",b:":(?!\\s)",c:[t,{b:r}],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{cN:"params",b:/\|/,e:/\|/,k:b},{b:"("+e.RSR+")\\s*",c:[a,{cN:"regexp",c:[e.BE,n],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}].concat(s),r:0}].concat(s);n.c=d,i.c=d;var l="[>?]>",o="[\\w#]+\\(\\w+\\):\\d+:\\d+>",u="(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>",w=[{b:/^\s*=>/,starts:{e:"$",c:d}},{cN:"meta",b:"^("+l+"|"+o+"|"+u+")",starts:{e:"$",c:d}}];return{aliases:["rb","gemspec","podspec","thor","irb"],k:b,i:/\/\*/,c:s.concat(w).concat(d)}});hljs.registerLanguage("css",function(e){var c="[a-zA-Z-][a-zA-Z0-9_-]*",t={b:/[A-Z\_\.\-]+\s*:/,rB:!0,e:";",eW:!0,c:[{cN:"attribute",b:/\S/,e:":",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\w-]+\(/,rB:!0,c:[{cN:"built_in",b:/[\w-]+/},{b:/\(/,e:/\)/,c:[e.ASM,e.QSM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"number",b:"#[0-9A-Fa-f]+"},{cN:"meta",b:"!important"}]}}]};return{cI:!0,i:/[=\/|'\$]/,c:[e.CBCM,{cN:"selector-id",b:/#[A-Za-z0-9_-]+/},{cN:"selector-class",b:/\.[A-Za-z0-9_-]+/},{cN:"selector-attr",b:/\[/,e:/\]/,i:"$"},{cN:"selector-pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{b:"@",e:"[{;]",i:/:/,c:[{cN:"keyword",b:/\w+/},{b:/\s/,eW:!0,eE:!0,r:0,c:[e.ASM,e.QSM,e.CSSNM]}]},{cN:"selector-tag",b:c,r:0},{b:"{",e:"}",i:/\S/,c:[e.CBCM,t]}]}});hljs.registerLanguage("perl",function(e){var t="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when",r={cN:"subst",b:"[$@]\\{",e:"\\}",k:t},s={b:"->{",e:"}"},n={v:[{b:/\$\d/},{b:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{b:/[\$%@][^\s\w{]/,r:0}]},i=[e.BE,r,n],o=[n,e.HCM,e.C("^\\=\\w","\\=cut",{eW:!0}),s,{cN:"string",c:i,v:[{b:"q[qwxr]?\\s*\\(",e:"\\)",r:5},{b:"q[qwxr]?\\s*\\[",e:"\\]",r:5},{b:"q[qwxr]?\\s*\\{",e:"\\}",r:5},{b:"q[qwxr]?\\s*\\|",e:"\\|",r:5},{b:"q[qwxr]?\\s*\\<",e:"\\>",r:5},{b:"qw\\s+q",e:"q",r:5},{b:"'",e:"'",c:[e.BE]},{b:'"',e:'"'},{b:"`",e:"`",c:[e.BE]},{b:"{\\w+}",c:[],r:0},{b:"-?\\w+\\s*\\=\\>",c:[],r:0}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\/\\/|"+e.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[e.HCM,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[e.BE],r:0}]},{cN:"function",bK:"sub",e:"(\\s*\\(.*?\\))?[;{]",eE:!0,r:5,c:[e.TM]},{b:"-\\w\\b",r:0},{b:"^__DATA__$",e:"^__END__$",sL:"mojolicious",c:[{b:"^@@.*",e:"$",cN:"comment"}]}];return r.c=o,s.c=o,{aliases:["pl","pm"],l:/[\w\.]+/,k:t,c:o}});hljs.registerLanguage("javascript",function(e){return{aliases:["js","jsx"],k:{keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},c:[{cN:"meta",r:10,b:/^\s*['"]use (strict|asm)['"]/},{cN:"meta",b:/^#!/,e:/$/},e.ASM,e.QSM,{cN:"string",b:"`",e:"`",c:[e.BE,{cN:"subst",b:"\\$\\{",e:"\\}"}]},e.CLCM,e.CBCM,{cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{b://,sL:"xml",c:[{b:/<\w+\s*\/>/,skip:!0},{b:/<\w+/,e:/(\/\w+|\w+\/)>/,skip:!0,c:["self"]}]}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:[e.CLCM,e.CBCM]}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor",e:/\{/,eE:!0}],i:/#(?!!)/}});hljs.registerLanguage("markdown",function(e){return{aliases:["md","mkdown","mkd"],c:[{cN:"section",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"quote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"^```w*s*$",e:"^```s*$"},{b:"`.+?`"},{b:"^( {4}| )",e:"$",r:0}]},{b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].*?[\\)\\]]",rB:!0,c:[{cN:"string",b:"\\[",e:"\\]",eB:!0,rE:!0,r:0},{cN:"link",b:"\\]\\(",e:"\\)",eB:!0,eE:!0},{cN:"symbol",b:"\\]\\[",e:"\\]",eB:!0,eE:!0}],r:10},{b:"^\\[.+\\]:",rB:!0,c:[{cN:"symbol",b:"\\[",e:"\\]:",eB:!0,eE:!0,starts:{cN:"link",e:"$"}}]}]}});hljs.registerLanguage("nginx",function(e){var r={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+e.UIR}]},b={eW:!0,l:"[a-z/_]+",k:{literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[e.HCM,{cN:"string",c:[e.BE,r],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{b:"([a-z]+):/",e:"\\s",eW:!0,eE:!0,c:[r]},{cN:"regexp",c:[e.BE,r],v:[{b:"\\s\\^",e:"\\s|{|;",rE:!0},{b:"~\\*?\\s+",e:"\\s|{|;",rE:!0},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0},r]};return{aliases:["nginxconf"],c:[e.HCM,{b:e.UIR+"\\s+{",rB:!0,e:"{",c:[{cN:"section",b:e.UIR}],r:0},{b:e.UIR+"\\s",e:";|{",rB:!0,c:[{cN:"attribute",b:e.UIR,starts:b}],r:0}],i:"[^\\s\\}]"}});hljs.registerLanguage("makefile",function(e){var a={cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]};return{aliases:["mk","mak"],c:[e.HCM,{b:/^\w+\s*\W*=/,rB:!0,r:0,starts:{e:/\s*\W*=/,eE:!0,starts:{e:/$/,r:0,c:[a]}}},{cN:"section",b:/^[\w]+:\s*$/},{cN:"meta",b:/^\.PHONY:/,e:/$/,k:{"meta-keyword":".PHONY"},l:/[\.\w]+/},{b:/^\t+/,e:/$/,r:0,c:[e.QSM,a]}]}});hljs.registerLanguage("java",function(e){var t=e.UIR+"(<"+e.UIR+"(\\s*,\\s*"+e.UIR+")*>)?",a="false synchronized int abstract float private char boolean static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports",r="\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",s={cN:"number",b:r,r:0};return{aliases:["jsp"],k:a,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"new throw return else",r:0},{cN:"function",b:"("+t+"\\s+)+"+e.UIR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:a,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,k:a,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},s,{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("php",function(e){var c={b:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},a={cN:"meta",b:/<\?(php)?|\?>/},i={cN:"string",c:[e.BE,a],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},t={v:[e.BNM,e.CNM]};return{aliases:["php3","php4","php5","php6"],cI:!0,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[e.HCM,e.C("//","$",{c:[a]}),e.C("/\\*","\\*/",{c:[{cN:"doctag",b:"@[A-Za-z]+"}]}),e.C("__halt_compiler.+?;",!1,{eW:!0,k:"__halt_compiler",l:e.UIR}),{cN:"string",b:/<<<['"]?\w+['"]?$/,e:/^\w+;?$/,c:[e.BE,{cN:"subst",v:[{b:/\$\w+/},{b:/\{\$/,e:/\}/}]}]},a,c,{b:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{cN:"function",bK:"function",e:/[;{]/,eE:!0,i:"\\$|\\[|%",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",c,e.CBCM,i,t]}]},{cN:"class",bK:"class interface",e:"{",eE:!0,i:/[:\(\$"]/,c:[{bK:"extends implements"},e.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[e.UTM]},{bK:"use",e:";",c:[e.UTM]},{b:"=>"},i,t]}}); \ No newline at end of file diff --git a/assets/js/highlight/styles/agate.css b/assets/js/highlight/styles/agate.css new file mode 100644 index 0000000..8d64547 --- /dev/null +++ b/assets/js/highlight/styles/agate.css @@ -0,0 +1,108 @@ +/*! + * Agate by Taufik Nurrohman + * ---------------------------------------------------- + * + * #ade5fc + * #a2fca2 + * #c6b4f0 + * #d36363 + * #fcc28c + * #fc9b9b + * #ffa + * #fff + * #333 + * #62c8f3 + * #888 + * + */ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #333; + color: white; +} + +.hljs-name, +.hljs-strong { + font-weight: bold; +} + +.hljs-code, +.hljs-emphasis { + font-style: italic; +} + +.hljs-tag { + color: #62c8f3; +} + +.hljs-variable, +.hljs-template-variable, +.hljs-selector-id, +.hljs-selector-class { + color: #ade5fc; +} + +.hljs-string, +.hljs-bullet { + color: #a2fca2; +} + +.hljs-type, +.hljs-title, +.hljs-section, +.hljs-attribute, +.hljs-quote, +.hljs-built_in, +.hljs-builtin-name { + color: #ffa; +} + +.hljs-number, +.hljs-symbol, +.hljs-bullet { + color: #d36363; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal { + color: #fcc28c; +} + +.hljs-comment, +.hljs-deletion, +.hljs-code { + color: #888; +} + +.hljs-regexp, +.hljs-link { + color: #c6b4f0; +} + +.hljs-meta { + color: #fc9b9b; +} + +.hljs-deletion { + background-color: #fc9b9b; + color: #333; +} + +.hljs-addition { + background-color: #a2fca2; + color: #333; +} + +.hljs a { + color: inherit; +} + +.hljs a:focus, +.hljs a:hover { + color: inherit; + text-decoration: underline; +} diff --git a/assets/js/highlight/styles/androidstudio.css b/assets/js/highlight/styles/androidstudio.css new file mode 100644 index 0000000..bc8e473 --- /dev/null +++ b/assets/js/highlight/styles/androidstudio.css @@ -0,0 +1,66 @@ +/* +Date: 24 Fev 2015 +Author: Pedro Oliveira +*/ + +.hljs { + color: #a9b7c6; + background: #282b2e; + display: block; + overflow-x: auto; + padding: 0.5em; +} + +.hljs-number, +.hljs-literal, +.hljs-symbol, +.hljs-bullet { + color: #6897BB; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-deletion { + color: #cc7832; +} + +.hljs-variable, +.hljs-template-variable, +.hljs-link { + color: #629755; +} + +.hljs-comment, +.hljs-quote { + color: #808080; +} + +.hljs-meta { + color: #bbb529; +} + +.hljs-string, +.hljs-attribute, +.hljs-addition { + color: #6A8759; +} + +.hljs-section, +.hljs-title, +.hljs-type { + color: #ffc66d; +} + +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #e8bf6a; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/arduino-light.css b/assets/js/highlight/styles/arduino-light.css new file mode 100644 index 0000000..4b8b7fd --- /dev/null +++ b/assets/js/highlight/styles/arduino-light.css @@ -0,0 +1,88 @@ +/* + +Arduino® Light Theme - Stefania Mellai + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #FFFFFF; +} + +.hljs, +.hljs-subst { + color: #434f54; +} + +.hljs-keyword, +.hljs-attribute, +.hljs-selector-tag, +.hljs-doctag, +.hljs-name { + color: #00979D; +} + +.hljs-built_in, +.hljs-literal, +.hljs-bullet, +.hljs-code, +.hljs-addition { + color: #D35400; +} + +.hljs-regexp, +.hljs-symbol, +.hljs-variable, +.hljs-template-variable, +.hljs-link, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #00979D; +} + +.hljs-type, +.hljs-string, +.hljs-selector-id, +.hljs-selector-class, +.hljs-quote, +.hljs-template-tag, +.hljs-deletion { + color: #005C5F; +} + +.hljs-title, +.hljs-section { + color: #880000; + font-weight: bold; +} + +.hljs-comment { + color: rgba(149,165,166,.8); +} + +.hljs-meta-keyword { + color: #728E00; +} + +.hljs-meta { + color: #728E00; + color: #434f54; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-function { + color: #728E00; +} + +.hljs-number { + color: #8A7B52; +} diff --git a/assets/js/highlight/styles/arta.css b/assets/js/highlight/styles/arta.css new file mode 100644 index 0000000..75ef3a9 --- /dev/null +++ b/assets/js/highlight/styles/arta.css @@ -0,0 +1,73 @@ +/* +Date: 17.V.2011 +Author: pumbur +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #222; +} + +.hljs, +.hljs-subst { + color: #aaa; +} + +.hljs-section { + color: #fff; +} + +.hljs-comment, +.hljs-quote, +.hljs-meta { + color: #444; +} + +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-regexp { + color: #ffcc33; +} + +.hljs-number, +.hljs-addition { + color: #00cc66; +} + +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-template-variable, +.hljs-attribute, +.hljs-link { + color: #32aaee; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #6644aa; +} + +.hljs-title, +.hljs-variable, +.hljs-deletion, +.hljs-template-tag { + color: #bb1166; +} + +.hljs-section, +.hljs-doctag, +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/assets/js/highlight/styles/ascetic.css b/assets/js/highlight/styles/ascetic.css new file mode 100644 index 0000000..48397e8 --- /dev/null +++ b/assets/js/highlight/styles/ascetic.css @@ -0,0 +1,45 @@ +/* + +Original style from softwaremaniacs.org (c) Ivan Sagalaev + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: white; + color: black; +} + +.hljs-string, +.hljs-variable, +.hljs-template-variable, +.hljs-symbol, +.hljs-bullet, +.hljs-section, +.hljs-addition, +.hljs-attribute, +.hljs-link { + color: #888; +} + +.hljs-comment, +.hljs-quote, +.hljs-meta, +.hljs-deletion { + color: #ccc; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-section, +.hljs-name, +.hljs-type, +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/assets/js/highlight/styles/atelier-cave-dark.css b/assets/js/highlight/styles/atelier-cave-dark.css new file mode 100644 index 0000000..65428f3 --- /dev/null +++ b/assets/js/highlight/styles/atelier-cave-dark.css @@ -0,0 +1,83 @@ +/* Base16 Atelier Cave Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Cave Comment */ +.hljs-comment, +.hljs-quote { + color: #7e7887; +} + +/* Atelier-Cave Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-regexp, +.hljs-link, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #be4678; +} + +/* Atelier-Cave Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #aa573c; +} + +/* Atelier-Cave Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #2a9292; +} + +/* Atelier-Cave Blue */ +.hljs-title, +.hljs-section { + color: #576ddb; +} + +/* Atelier-Cave Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #955ae7; +} + +.hljs-deletion, +.hljs-addition { + color: #19171c; + display: inline-block; + width: 100%; +} + +.hljs-deletion { + background-color: #be4678; +} + +.hljs-addition { + background-color: #2a9292; +} + +.hljs { + display: block; + overflow-x: auto; + background: #19171c; + color: #8b8792; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/atelier-cave-light.css b/assets/js/highlight/styles/atelier-cave-light.css new file mode 100644 index 0000000..b419f9f --- /dev/null +++ b/assets/js/highlight/styles/atelier-cave-light.css @@ -0,0 +1,85 @@ +/* Base16 Atelier Cave Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Cave Comment */ +.hljs-comment, +.hljs-quote { + color: #655f6d; +} + +/* Atelier-Cave Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #be4678; +} + +/* Atelier-Cave Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #aa573c; +} + +/* Atelier-Cave Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #2a9292; +} + +/* Atelier-Cave Blue */ +.hljs-title, +.hljs-section { + color: #576ddb; +} + +/* Atelier-Cave Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #955ae7; +} + +.hljs-deletion, +.hljs-addition { + color: #19171c; + display: inline-block; + width: 100%; +} + +.hljs-deletion { + background-color: #be4678; +} + +.hljs-addition { + background-color: #2a9292; +} + +.hljs { + display: block; + overflow-x: auto; + background: #efecf4; + color: #585260; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/atelier-dune-dark.css b/assets/js/highlight/styles/atelier-dune-dark.css new file mode 100644 index 0000000..1684f52 --- /dev/null +++ b/assets/js/highlight/styles/atelier-dune-dark.css @@ -0,0 +1,69 @@ +/* Base16 Atelier Dune Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Dune Comment */ +.hljs-comment, +.hljs-quote { + color: #999580; +} + +/* Atelier-Dune Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #d73737; +} + +/* Atelier-Dune Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #b65611; +} + +/* Atelier-Dune Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #60ac39; +} + +/* Atelier-Dune Blue */ +.hljs-title, +.hljs-section { + color: #6684e1; +} + +/* Atelier-Dune Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #b854d4; +} + +.hljs { + display: block; + overflow-x: auto; + background: #20201d; + color: #a6a28c; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/atelier-dune-light.css b/assets/js/highlight/styles/atelier-dune-light.css new file mode 100644 index 0000000..547719d --- /dev/null +++ b/assets/js/highlight/styles/atelier-dune-light.css @@ -0,0 +1,69 @@ +/* Base16 Atelier Dune Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Dune Comment */ +.hljs-comment, +.hljs-quote { + color: #7d7a68; +} + +/* Atelier-Dune Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #d73737; +} + +/* Atelier-Dune Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #b65611; +} + +/* Atelier-Dune Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #60ac39; +} + +/* Atelier-Dune Blue */ +.hljs-title, +.hljs-section { + color: #6684e1; +} + +/* Atelier-Dune Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #b854d4; +} + +.hljs { + display: block; + overflow-x: auto; + background: #fefbec; + color: #6e6b5e; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/atelier-estuary-dark.css b/assets/js/highlight/styles/atelier-estuary-dark.css new file mode 100644 index 0000000..a5e5071 --- /dev/null +++ b/assets/js/highlight/styles/atelier-estuary-dark.css @@ -0,0 +1,84 @@ +/* Base16 Atelier Estuary Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/estuary) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Estuary Comment */ +.hljs-comment, +.hljs-quote { + color: #878573; +} + +/* Atelier-Estuary Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #ba6236; +} + +/* Atelier-Estuary Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #ae7313; +} + +/* Atelier-Estuary Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #7d9726; +} + +/* Atelier-Estuary Blue */ +.hljs-title, +.hljs-section { + color: #36a166; +} + +/* Atelier-Estuary Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #5f9182; +} + +.hljs-deletion, +.hljs-addition { + color: #22221b; + display: inline-block; + width: 100%; +} + +.hljs-deletion { + background-color: #ba6236; +} + +.hljs-addition { + background-color: #7d9726; +} + +.hljs { + display: block; + overflow-x: auto; + background: #22221b; + color: #929181; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/atelier-estuary-light.css b/assets/js/highlight/styles/atelier-estuary-light.css new file mode 100644 index 0000000..1daee5d --- /dev/null +++ b/assets/js/highlight/styles/atelier-estuary-light.css @@ -0,0 +1,84 @@ +/* Base16 Atelier Estuary Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/estuary) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Estuary Comment */ +.hljs-comment, +.hljs-quote { + color: #6c6b5a; +} + +/* Atelier-Estuary Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #ba6236; +} + +/* Atelier-Estuary Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #ae7313; +} + +/* Atelier-Estuary Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #7d9726; +} + +/* Atelier-Estuary Blue */ +.hljs-title, +.hljs-section { + color: #36a166; +} + +/* Atelier-Estuary Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #5f9182; +} + +.hljs-deletion, +.hljs-addition { + color: #22221b; + display: inline-block; + width: 100%; +} + +.hljs-deletion { + background-color: #ba6236; +} + +.hljs-addition { + background-color: #7d9726; +} + +.hljs { + display: block; + overflow-x: auto; + background: #f4f3ec; + color: #5f5e4e; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/atelier-forest-dark.css b/assets/js/highlight/styles/atelier-forest-dark.css new file mode 100644 index 0000000..0ef4fae --- /dev/null +++ b/assets/js/highlight/styles/atelier-forest-dark.css @@ -0,0 +1,69 @@ +/* Base16 Atelier Forest Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Forest Comment */ +.hljs-comment, +.hljs-quote { + color: #9c9491; +} + +/* Atelier-Forest Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #f22c40; +} + +/* Atelier-Forest Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #df5320; +} + +/* Atelier-Forest Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #7b9726; +} + +/* Atelier-Forest Blue */ +.hljs-title, +.hljs-section { + color: #407ee7; +} + +/* Atelier-Forest Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #6666ea; +} + +.hljs { + display: block; + overflow-x: auto; + background: #1b1918; + color: #a8a19f; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/atelier-forest-light.css b/assets/js/highlight/styles/atelier-forest-light.css new file mode 100644 index 0000000..bbedde1 --- /dev/null +++ b/assets/js/highlight/styles/atelier-forest-light.css @@ -0,0 +1,69 @@ +/* Base16 Atelier Forest Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Forest Comment */ +.hljs-comment, +.hljs-quote { + color: #766e6b; +} + +/* Atelier-Forest Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #f22c40; +} + +/* Atelier-Forest Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #df5320; +} + +/* Atelier-Forest Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #7b9726; +} + +/* Atelier-Forest Blue */ +.hljs-title, +.hljs-section { + color: #407ee7; +} + +/* Atelier-Forest Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #6666ea; +} + +.hljs { + display: block; + overflow-x: auto; + background: #f1efee; + color: #68615e; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/atelier-heath-dark.css b/assets/js/highlight/styles/atelier-heath-dark.css new file mode 100644 index 0000000..fe01ff7 --- /dev/null +++ b/assets/js/highlight/styles/atelier-heath-dark.css @@ -0,0 +1,69 @@ +/* Base16 Atelier Heath Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/heath) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Heath Comment */ +.hljs-comment, +.hljs-quote { + color: #9e8f9e; +} + +/* Atelier-Heath Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #ca402b; +} + +/* Atelier-Heath Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #a65926; +} + +/* Atelier-Heath Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #918b3b; +} + +/* Atelier-Heath Blue */ +.hljs-title, +.hljs-section { + color: #516aec; +} + +/* Atelier-Heath Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #7b59c0; +} + +.hljs { + display: block; + overflow-x: auto; + background: #1b181b; + color: #ab9bab; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/atelier-heath-light.css b/assets/js/highlight/styles/atelier-heath-light.css new file mode 100644 index 0000000..ee43786 --- /dev/null +++ b/assets/js/highlight/styles/atelier-heath-light.css @@ -0,0 +1,69 @@ +/* Base16 Atelier Heath Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/heath) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Heath Comment */ +.hljs-comment, +.hljs-quote { + color: #776977; +} + +/* Atelier-Heath Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #ca402b; +} + +/* Atelier-Heath Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #a65926; +} + +/* Atelier-Heath Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #918b3b; +} + +/* Atelier-Heath Blue */ +.hljs-title, +.hljs-section { + color: #516aec; +} + +/* Atelier-Heath Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #7b59c0; +} + +.hljs { + display: block; + overflow-x: auto; + background: #f7f3f7; + color: #695d69; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/atelier-lakeside-dark.css b/assets/js/highlight/styles/atelier-lakeside-dark.css new file mode 100644 index 0000000..a937d3b --- /dev/null +++ b/assets/js/highlight/styles/atelier-lakeside-dark.css @@ -0,0 +1,69 @@ +/* Base16 Atelier Lakeside Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Lakeside Comment */ +.hljs-comment, +.hljs-quote { + color: #7195a8; +} + +/* Atelier-Lakeside Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #d22d72; +} + +/* Atelier-Lakeside Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #935c25; +} + +/* Atelier-Lakeside Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #568c3b; +} + +/* Atelier-Lakeside Blue */ +.hljs-title, +.hljs-section { + color: #257fad; +} + +/* Atelier-Lakeside Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #6b6bb8; +} + +.hljs { + display: block; + overflow-x: auto; + background: #161b1d; + color: #7ea2b4; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/atelier-lakeside-light.css b/assets/js/highlight/styles/atelier-lakeside-light.css new file mode 100644 index 0000000..6c7e8f9 --- /dev/null +++ b/assets/js/highlight/styles/atelier-lakeside-light.css @@ -0,0 +1,69 @@ +/* Base16 Atelier Lakeside Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Lakeside Comment */ +.hljs-comment, +.hljs-quote { + color: #5a7b8c; +} + +/* Atelier-Lakeside Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #d22d72; +} + +/* Atelier-Lakeside Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #935c25; +} + +/* Atelier-Lakeside Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #568c3b; +} + +/* Atelier-Lakeside Blue */ +.hljs-title, +.hljs-section { + color: #257fad; +} + +/* Atelier-Lakeside Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #6b6bb8; +} + +.hljs { + display: block; + overflow-x: auto; + background: #ebf8ff; + color: #516d7b; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/atelier-plateau-dark.css b/assets/js/highlight/styles/atelier-plateau-dark.css new file mode 100644 index 0000000..3bb0526 --- /dev/null +++ b/assets/js/highlight/styles/atelier-plateau-dark.css @@ -0,0 +1,84 @@ +/* Base16 Atelier Plateau Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/plateau) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Plateau Comment */ +.hljs-comment, +.hljs-quote { + color: #7e7777; +} + +/* Atelier-Plateau Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #ca4949; +} + +/* Atelier-Plateau Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #b45a3c; +} + +/* Atelier-Plateau Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #4b8b8b; +} + +/* Atelier-Plateau Blue */ +.hljs-title, +.hljs-section { + color: #7272ca; +} + +/* Atelier-Plateau Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #8464c4; +} + +.hljs-deletion, +.hljs-addition { + color: #1b1818; + display: inline-block; + width: 100%; +} + +.hljs-deletion { + background-color: #ca4949; +} + +.hljs-addition { + background-color: #4b8b8b; +} + +.hljs { + display: block; + overflow-x: auto; + background: #1b1818; + color: #8a8585; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/atelier-plateau-light.css b/assets/js/highlight/styles/atelier-plateau-light.css new file mode 100644 index 0000000..5f0222b --- /dev/null +++ b/assets/js/highlight/styles/atelier-plateau-light.css @@ -0,0 +1,84 @@ +/* Base16 Atelier Plateau Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/plateau) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Plateau Comment */ +.hljs-comment, +.hljs-quote { + color: #655d5d; +} + +/* Atelier-Plateau Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #ca4949; +} + +/* Atelier-Plateau Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #b45a3c; +} + +/* Atelier-Plateau Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #4b8b8b; +} + +/* Atelier-Plateau Blue */ +.hljs-title, +.hljs-section { + color: #7272ca; +} + +/* Atelier-Plateau Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #8464c4; +} + +.hljs-deletion, +.hljs-addition { + color: #1b1818; + display: inline-block; + width: 100%; +} + +.hljs-deletion { + background-color: #ca4949; +} + +.hljs-addition { + background-color: #4b8b8b; +} + +.hljs { + display: block; + overflow-x: auto; + background: #f4ecec; + color: #585050; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/atelier-savanna-dark.css b/assets/js/highlight/styles/atelier-savanna-dark.css new file mode 100644 index 0000000..38f8314 --- /dev/null +++ b/assets/js/highlight/styles/atelier-savanna-dark.css @@ -0,0 +1,84 @@ +/* Base16 Atelier Savanna Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/savanna) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Savanna Comment */ +.hljs-comment, +.hljs-quote { + color: #78877d; +} + +/* Atelier-Savanna Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #b16139; +} + +/* Atelier-Savanna Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #9f713c; +} + +/* Atelier-Savanna Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #489963; +} + +/* Atelier-Savanna Blue */ +.hljs-title, +.hljs-section { + color: #478c90; +} + +/* Atelier-Savanna Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #55859b; +} + +.hljs-deletion, +.hljs-addition { + color: #171c19; + display: inline-block; + width: 100%; +} + +.hljs-deletion { + background-color: #b16139; +} + +.hljs-addition { + background-color: #489963; +} + +.hljs { + display: block; + overflow-x: auto; + background: #171c19; + color: #87928a; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/atelier-savanna-light.css b/assets/js/highlight/styles/atelier-savanna-light.css new file mode 100644 index 0000000..1ccd7c6 --- /dev/null +++ b/assets/js/highlight/styles/atelier-savanna-light.css @@ -0,0 +1,84 @@ +/* Base16 Atelier Savanna Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/savanna) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Savanna Comment */ +.hljs-comment, +.hljs-quote { + color: #5f6d64; +} + +/* Atelier-Savanna Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #b16139; +} + +/* Atelier-Savanna Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #9f713c; +} + +/* Atelier-Savanna Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #489963; +} + +/* Atelier-Savanna Blue */ +.hljs-title, +.hljs-section { + color: #478c90; +} + +/* Atelier-Savanna Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #55859b; +} + +.hljs-deletion, +.hljs-addition { + color: #171c19; + display: inline-block; + width: 100%; +} + +.hljs-deletion { + background-color: #b16139; +} + +.hljs-addition { + background-color: #489963; +} + +.hljs { + display: block; + overflow-x: auto; + background: #ecf4ee; + color: #526057; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/atelier-seaside-dark.css b/assets/js/highlight/styles/atelier-seaside-dark.css new file mode 100644 index 0000000..df29949 --- /dev/null +++ b/assets/js/highlight/styles/atelier-seaside-dark.css @@ -0,0 +1,69 @@ +/* Base16 Atelier Seaside Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/seaside) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Seaside Comment */ +.hljs-comment, +.hljs-quote { + color: #809980; +} + +/* Atelier-Seaside Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #e6193c; +} + +/* Atelier-Seaside Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #87711d; +} + +/* Atelier-Seaside Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #29a329; +} + +/* Atelier-Seaside Blue */ +.hljs-title, +.hljs-section { + color: #3d62f5; +} + +/* Atelier-Seaside Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #ad2bee; +} + +.hljs { + display: block; + overflow-x: auto; + background: #131513; + color: #8ca68c; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/atelier-seaside-light.css b/assets/js/highlight/styles/atelier-seaside-light.css new file mode 100644 index 0000000..9d960f2 --- /dev/null +++ b/assets/js/highlight/styles/atelier-seaside-light.css @@ -0,0 +1,69 @@ +/* Base16 Atelier Seaside Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/seaside) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Seaside Comment */ +.hljs-comment, +.hljs-quote { + color: #687d68; +} + +/* Atelier-Seaside Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #e6193c; +} + +/* Atelier-Seaside Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #87711d; +} + +/* Atelier-Seaside Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #29a329; +} + +/* Atelier-Seaside Blue */ +.hljs-title, +.hljs-section { + color: #3d62f5; +} + +/* Atelier-Seaside Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #ad2bee; +} + +.hljs { + display: block; + overflow-x: auto; + background: #f4fbf4; + color: #5e6e5e; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/atelier-sulphurpool-dark.css b/assets/js/highlight/styles/atelier-sulphurpool-dark.css new file mode 100644 index 0000000..c2ab793 --- /dev/null +++ b/assets/js/highlight/styles/atelier-sulphurpool-dark.css @@ -0,0 +1,69 @@ +/* Base16 Atelier Sulphurpool Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/sulphurpool) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Sulphurpool Comment */ +.hljs-comment, +.hljs-quote { + color: #898ea4; +} + +/* Atelier-Sulphurpool Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #c94922; +} + +/* Atelier-Sulphurpool Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #c76b29; +} + +/* Atelier-Sulphurpool Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #ac9739; +} + +/* Atelier-Sulphurpool Blue */ +.hljs-title, +.hljs-section { + color: #3d8fd1; +} + +/* Atelier-Sulphurpool Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #6679cc; +} + +.hljs { + display: block; + overflow-x: auto; + background: #202746; + color: #979db4; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/atelier-sulphurpool-light.css b/assets/js/highlight/styles/atelier-sulphurpool-light.css new file mode 100644 index 0000000..96c47d0 --- /dev/null +++ b/assets/js/highlight/styles/atelier-sulphurpool-light.css @@ -0,0 +1,69 @@ +/* Base16 Atelier Sulphurpool Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/sulphurpool) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Sulphurpool Comment */ +.hljs-comment, +.hljs-quote { + color: #6b7394; +} + +/* Atelier-Sulphurpool Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #c94922; +} + +/* Atelier-Sulphurpool Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #c76b29; +} + +/* Atelier-Sulphurpool Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #ac9739; +} + +/* Atelier-Sulphurpool Blue */ +.hljs-title, +.hljs-section { + color: #3d8fd1; +} + +/* Atelier-Sulphurpool Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #6679cc; +} + +.hljs { + display: block; + overflow-x: auto; + background: #f5f7ff; + color: #5e6687; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/brown-paper.css b/assets/js/highlight/styles/brown-paper.css new file mode 100644 index 0000000..f0197b9 --- /dev/null +++ b/assets/js/highlight/styles/brown-paper.css @@ -0,0 +1,64 @@ +/* + +Brown Paper style from goldblog.com.ua (c) Zaripov Yura + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background:#b7a68e url(./brown-papersq.png); +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal { + color:#005599; + font-weight:bold; +} + +.hljs, +.hljs-subst { + color: #363c69; +} + +.hljs-string, +.hljs-title, +.hljs-section, +.hljs-type, +.hljs-attribute, +.hljs-symbol, +.hljs-bullet, +.hljs-built_in, +.hljs-addition, +.hljs-variable, +.hljs-template-tag, +.hljs-template-variable, +.hljs-link, +.hljs-name { + color: #2c009f; +} + +.hljs-comment, +.hljs-quote, +.hljs-meta, +.hljs-deletion { + color: #802022; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-doctag, +.hljs-title, +.hljs-section, +.hljs-type, +.hljs-name, +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/assets/js/highlight/styles/brown-papersq.png b/assets/js/highlight/styles/brown-papersq.png new file mode 100644 index 0000000000000000000000000000000000000000..3813903dbf9fa7b1fb5bd11d9534c06667d9056f GIT binary patch literal 18198 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
    G3S-EN>9CM!{YB*|;6wg-K3V?)eR((z#1 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 literal 0 HcmV?d00001 diff --git a/assets/js/highlight/styles/codepen-embed.css b/assets/js/highlight/styles/codepen-embed.css new file mode 100644 index 0000000..195c4a0 --- /dev/null +++ b/assets/js/highlight/styles/codepen-embed.css @@ -0,0 +1,60 @@ +/* + codepen.io Embed Theme + Author: Justin Perry + Original theme - https://github.com/chriskempson/tomorrow-theme +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #222; + color: #fff; +} + +.hljs-comment, +.hljs-quote { + color: #777; +} + +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-regexp, +.hljs-meta, +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-params, +.hljs-symbol, +.hljs-bullet, +.hljs-link, +.hljs-deletion { + color: #ab875d; +} + +.hljs-section, +.hljs-title, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-type, +.hljs-attribute { + color: #9b869b; +} + +.hljs-string, +.hljs-keyword, +.hljs-selector-tag, +.hljs-addition { + color: #8f9c6c; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/color-brewer.css b/assets/js/highlight/styles/color-brewer.css new file mode 100644 index 0000000..7934d98 --- /dev/null +++ b/assets/js/highlight/styles/color-brewer.css @@ -0,0 +1,71 @@ +/* + +Colorbrewer theme +Original: https://github.com/mbostock/colorbrewer-theme (c) Mike Bostock +Ported by Fabrício Tavares de Oliveira + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #fff; +} + +.hljs, +.hljs-subst { + color: #000; +} + +.hljs-string, +.hljs-meta, +.hljs-symbol, +.hljs-template-tag, +.hljs-template-variable, +.hljs-addition { + color: #756bb1; +} + +.hljs-comment, +.hljs-quote { + color: #636363; +} + +.hljs-number, +.hljs-regexp, +.hljs-literal, +.hljs-bullet, +.hljs-link { + color: #31a354; +} + +.hljs-deletion, +.hljs-variable { + color: #88f; +} + + + +.hljs-keyword, +.hljs-selector-tag, +.hljs-title, +.hljs-section, +.hljs-built_in, +.hljs-doctag, +.hljs-type, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-strong { + color: #3182bd; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-attribute { + color: #e6550d; +} diff --git a/assets/js/highlight/styles/dark.css b/assets/js/highlight/styles/dark.css new file mode 100644 index 0000000..b4724f5 --- /dev/null +++ b/assets/js/highlight/styles/dark.css @@ -0,0 +1,63 @@ +/* + +Dark style from softwaremaniacs.org (c) Ivan Sagalaev + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #444; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-section, +.hljs-link { + color: white; +} + +.hljs, +.hljs-subst { + color: #ddd; +} + +.hljs-string, +.hljs-title, +.hljs-name, +.hljs-type, +.hljs-attribute, +.hljs-symbol, +.hljs-bullet, +.hljs-built_in, +.hljs-addition, +.hljs-variable, +.hljs-template-tag, +.hljs-template-variable { + color: #d88; +} + +.hljs-comment, +.hljs-quote, +.hljs-deletion, +.hljs-meta { + color: #777; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-title, +.hljs-section, +.hljs-doctag, +.hljs-type, +.hljs-name, +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/assets/js/highlight/styles/darkula.css b/assets/js/highlight/styles/darkula.css new file mode 100644 index 0000000..c01f9a7 --- /dev/null +++ b/assets/js/highlight/styles/darkula.css @@ -0,0 +1,74 @@ +/* + +Darkula color scheme from the JetBrains family of IDEs + +*/ + + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #2b2b2b; +} + +.hljs { + color: #bababa; +} + +.hljs-strong, +.hljs-emphasis { + color: #a8a8a2; +} + +.hljs-bullet, +.hljs-quote, +.hljs-link, +.hljs-number, +.hljs-regexp, +.hljs-literal { + color: #6896ba; +} + +.hljs-code, +.hljs-selector-class { + color: #a6e22e; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-section, +.hljs-attribute, +.hljs-name, +.hljs-variable { + color: #cb7832; +} + +.hljs-params { + color: #b9b9b9; +} + +.hljs-string, +.hljs-subst, +.hljs-type, +.hljs-built_in, +.hljs-builtin-name, +.hljs-symbol, +.hljs-selector-id, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-template-tag, +.hljs-template-variable, +.hljs-addition { + color: #e0c46c; +} + +.hljs-comment, +.hljs-deletion, +.hljs-meta { + color: #7f7f7f; +} diff --git a/assets/js/highlight/styles/default.css b/assets/js/highlight/styles/default.css new file mode 100644 index 0000000..f1bfade --- /dev/null +++ b/assets/js/highlight/styles/default.css @@ -0,0 +1,99 @@ +/* + +Original highlight.js style (c) Ivan Sagalaev + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #F0F0F0; +} + + +/* Base color: saturation 0; */ + +.hljs, +.hljs-subst { + color: #444; +} + +.hljs-comment { + color: #888888; +} + +.hljs-keyword, +.hljs-attribute, +.hljs-selector-tag, +.hljs-meta-keyword, +.hljs-doctag, +.hljs-name { + font-weight: bold; +} + + +/* User color: hue: 0 */ + +.hljs-type, +.hljs-string, +.hljs-number, +.hljs-selector-id, +.hljs-selector-class, +.hljs-quote, +.hljs-template-tag, +.hljs-deletion { + color: #880000; +} + +.hljs-title, +.hljs-section { + color: #880000; + font-weight: bold; +} + +.hljs-regexp, +.hljs-symbol, +.hljs-variable, +.hljs-template-variable, +.hljs-link, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #BC6060; +} + + +/* Language color: hue: 90; */ + +.hljs-literal { + color: #78A960; +} + +.hljs-built_in, +.hljs-bullet, +.hljs-code, +.hljs-addition { + color: #397300; +} + + +/* Meta color: hue: 200 */ + +.hljs-meta { + color: #1f7199; +} + +.hljs-meta-string { + color: #4d99bf; +} + + +/* Misc effects */ + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/docco.css b/assets/js/highlight/styles/docco.css new file mode 100644 index 0000000..db366be --- /dev/null +++ b/assets/js/highlight/styles/docco.css @@ -0,0 +1,97 @@ +/* +Docco style used in http://jashkenas.github.com/docco/ converted by Simon Madine (@thingsinjars) +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #000; + background: #f8f8ff; +} + +.hljs-comment, +.hljs-quote { + color: #408080; + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-subst { + color: #954121; +} + +.hljs-number { + color: #40a070; +} + +.hljs-string, +.hljs-doctag { + color: #219161; +} + +.hljs-selector-id, +.hljs-selector-class, +.hljs-section, +.hljs-type { + color: #19469d; +} + +.hljs-params { + color: #00f; +} + +.hljs-title { + color: #458; + font-weight: bold; +} + +.hljs-tag, +.hljs-name, +.hljs-attribute { + color: #000080; + font-weight: normal; +} + +.hljs-variable, +.hljs-template-variable { + color: #008080; +} + +.hljs-regexp, +.hljs-link { + color: #b68; +} + +.hljs-symbol, +.hljs-bullet { + color: #990073; +} + +.hljs-built_in, +.hljs-builtin-name { + color: #0086b3; +} + +.hljs-meta { + color: #999; + font-weight: bold; +} + +.hljs-deletion { + background: #fdd; +} + +.hljs-addition { + background: #dfd; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/dracula.css b/assets/js/highlight/styles/dracula.css new file mode 100644 index 0000000..d591db6 --- /dev/null +++ b/assets/js/highlight/styles/dracula.css @@ -0,0 +1,76 @@ +/* + +Dracula Theme v1.2.0 + +https://github.com/zenorocha/dracula-theme + +Copyright 2015, All rights reserved + +Code licensed under the MIT license +http://zenorocha.mit-license.org + +@author Éverton Ribeiro +@author Zeno Rocha + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #282a36; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-section, +.hljs-link { + color: #8be9fd; +} + +.hljs-function .hljs-keyword { + color: #ff79c6; +} + +.hljs, +.hljs-subst { + color: #f8f8f2; +} + +.hljs-string, +.hljs-title, +.hljs-name, +.hljs-type, +.hljs-attribute, +.hljs-symbol, +.hljs-bullet, +.hljs-addition, +.hljs-variable, +.hljs-template-tag, +.hljs-template-variable { + color: #f1fa8c; +} + +.hljs-comment, +.hljs-quote, +.hljs-deletion, +.hljs-meta { + color: #6272a4; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-title, +.hljs-section, +.hljs-doctag, +.hljs-type, +.hljs-name, +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/assets/js/highlight/styles/far.css b/assets/js/highlight/styles/far.css new file mode 100644 index 0000000..2b3f87b --- /dev/null +++ b/assets/js/highlight/styles/far.css @@ -0,0 +1,71 @@ +/* + +FAR Style (c) MajestiC + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #000080; +} + +.hljs, +.hljs-subst { + color: #0ff; +} + +.hljs-string, +.hljs-attribute, +.hljs-symbol, +.hljs-bullet, +.hljs-built_in, +.hljs-builtin-name, +.hljs-template-tag, +.hljs-template-variable, +.hljs-addition { + color: #ff0; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-section, +.hljs-type, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-variable { + color: #fff; +} + +.hljs-comment, +.hljs-quote, +.hljs-doctag, +.hljs-deletion { + color: #888; +} + +.hljs-number, +.hljs-regexp, +.hljs-literal, +.hljs-link { + color: #0f0; +} + +.hljs-meta { + color: #008080; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-title, +.hljs-section, +.hljs-name, +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/assets/js/highlight/styles/foundation.css b/assets/js/highlight/styles/foundation.css new file mode 100644 index 0000000..f1fe64b --- /dev/null +++ b/assets/js/highlight/styles/foundation.css @@ -0,0 +1,88 @@ +/* +Description: Foundation 4 docs style for highlight.js +Author: Dan Allen +Website: http://foundation.zurb.com/docs/ +Version: 1.0 +Date: 2013-04-02 +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #eee; color: black; +} + +.hljs-link, +.hljs-emphasis, +.hljs-attribute, +.hljs-addition { + color: #070; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong, +.hljs-string, +.hljs-deletion { + color: #d14; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-quote, +.hljs-comment { + color: #998; + font-style: italic; +} + +.hljs-section, +.hljs-title { + color: #900; +} + +.hljs-class .hljs-title, +.hljs-type { + color: #458; +} + +.hljs-variable, +.hljs-template-variable { + color: #336699; +} + +.hljs-bullet { + color: #997700; +} + +.hljs-meta { + color: #3344bb; +} + +.hljs-code, +.hljs-number, +.hljs-literal, +.hljs-keyword, +.hljs-selector-tag { + color: #099; +} + +.hljs-regexp { + background-color: #fff0ff; + color: #880088; +} + +.hljs-symbol { + color: #990073; +} + +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #007700; +} diff --git a/assets/js/highlight/styles/github-gist.css b/assets/js/highlight/styles/github-gist.css new file mode 100644 index 0000000..155f0b9 --- /dev/null +++ b/assets/js/highlight/styles/github-gist.css @@ -0,0 +1,71 @@ +/** + * GitHub Gist Theme + * Author : Louis Barranqueiro - https://github.com/LouisBarranqueiro + */ + +.hljs { + display: block; + background: white; + padding: 0.5em; + color: #333333; + overflow-x: auto; +} + +.hljs-comment, +.hljs-meta { + color: #969896; +} + +.hljs-string, +.hljs-variable, +.hljs-template-variable, +.hljs-strong, +.hljs-emphasis, +.hljs-quote { + color: #df5000; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-type { + color: #a71d5d; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute { + color: #0086b3; +} + +.hljs-section, +.hljs-name { + color: #63a35c; +} + +.hljs-tag { + color: #333333; +} + +.hljs-title, +.hljs-attr, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #795da3; +} + +.hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.hljs-link { + text-decoration: underline; +} diff --git a/assets/js/highlight/styles/github.css b/assets/js/highlight/styles/github.css new file mode 100644 index 0000000..791932b --- /dev/null +++ b/assets/js/highlight/styles/github.css @@ -0,0 +1,99 @@ +/* + +github.com style (c) Vasily Polovnyov + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #333; + background: #f8f8f8; +} + +.hljs-comment, +.hljs-quote { + color: #998; + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-subst { + color: #333; + font-weight: bold; +} + +.hljs-number, +.hljs-literal, +.hljs-variable, +.hljs-template-variable, +.hljs-tag .hljs-attr { + color: #008080; +} + +.hljs-string, +.hljs-doctag { + color: #d14; +} + +.hljs-title, +.hljs-section, +.hljs-selector-id { + color: #900; + font-weight: bold; +} + +.hljs-subst { + font-weight: normal; +} + +.hljs-type, +.hljs-class .hljs-title { + color: #458; + font-weight: bold; +} + +.hljs-tag, +.hljs-name, +.hljs-attribute { + color: #000080; + font-weight: normal; +} + +.hljs-regexp, +.hljs-link { + color: #009926; +} + +.hljs-symbol, +.hljs-bullet { + color: #990073; +} + +.hljs-built_in, +.hljs-builtin-name { + color: #0086b3; +} + +.hljs-meta { + color: #999; + font-weight: bold; +} + +.hljs-deletion { + background: #fdd; +} + +.hljs-addition { + background: #dfd; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/googlecode.css b/assets/js/highlight/styles/googlecode.css new file mode 100644 index 0000000..884ad63 --- /dev/null +++ b/assets/js/highlight/styles/googlecode.css @@ -0,0 +1,89 @@ +/* + +Google Code style (c) Aahan Krish + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: white; + color: black; +} + +.hljs-comment, +.hljs-quote { + color: #800; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-section, +.hljs-title, +.hljs-name { + color: #008; +} + +.hljs-variable, +.hljs-template-variable { + color: #660; +} + +.hljs-string, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-regexp { + color: #080; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-meta, +.hljs-number, +.hljs-link { + color: #066; +} + +.hljs-title, +.hljs-doctag, +.hljs-type, +.hljs-attr, +.hljs-built_in, +.hljs-builtin-name, +.hljs-params { + color: #606; +} + +.hljs-attribute, +.hljs-subst { + color: #000; +} + +.hljs-formula { + background-color: #eee; + font-style: italic; +} + +.hljs-selector-id, +.hljs-selector-class { + color: #9B703F +} + +.hljs-addition { + background-color: #baeeba; +} + +.hljs-deletion { + background-color: #ffc8bd; +} + +.hljs-doctag, +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/assets/js/highlight/styles/grayscale.css b/assets/js/highlight/styles/grayscale.css new file mode 100644 index 0000000..5376f34 --- /dev/null +++ b/assets/js/highlight/styles/grayscale.css @@ -0,0 +1,101 @@ +/* + +grayscale style (c) MY Sun + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #333; + background: #fff; +} + +.hljs-comment, +.hljs-quote { + color: #777; + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-subst { + color: #333; + font-weight: bold; +} + +.hljs-number, +.hljs-literal { + color: #777; +} + +.hljs-string, +.hljs-doctag, +.hljs-formula { + color: #333; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAJ0lEQVQIW2O8e/fufwYGBgZBQUEQxcCIIfDu3Tuwivfv30NUoAsAALHpFMMLqZlPAAAAAElFTkSuQmCC) repeat; +} + +.hljs-title, +.hljs-section, +.hljs-selector-id { + color: #000; + font-weight: bold; +} + +.hljs-subst { + font-weight: normal; +} + +.hljs-class .hljs-title, +.hljs-type, +.hljs-name { + color: #333; + font-weight: bold; +} + +.hljs-tag { + color: #333; +} + +.hljs-regexp { + color: #333; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAICAYAAADA+m62AAAAPUlEQVQYV2NkQAN37979r6yszIgujiIAU4RNMVwhuiQ6H6wQl3XI4oy4FMHcCJPHcDS6J2A2EqUQpJhohQDexSef15DBCwAAAABJRU5ErkJggg==) repeat; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-link { + color: #000; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAKElEQVQIW2NkQAO7d+/+z4gsBhJwdXVlhAvCBECKwIIwAbhKZBUwBQA6hBpm5efZsgAAAABJRU5ErkJggg==) repeat; +} + +.hljs-built_in, +.hljs-builtin-name { + color: #000; + text-decoration: underline; +} + +.hljs-meta { + color: #999; + font-weight: bold; +} + +.hljs-deletion { + color: #fff; + background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAADCAYAAABS3WWCAAAAE0lEQVQIW2MMDQ39zzhz5kwIAQAyxweWgUHd1AAAAABJRU5ErkJggg==) repeat; +} + +.hljs-addition { + color: #000; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAALUlEQVQYV2N89+7dfwYk8P79ewZBQUFkIQZGOiu6e/cuiptQHAPl0NtNxAQBAM97Oejj3Dg7AAAAAElFTkSuQmCC) repeat; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/gruvbox-dark.css b/assets/js/highlight/styles/gruvbox-dark.css new file mode 100644 index 0000000..f563811 --- /dev/null +++ b/assets/js/highlight/styles/gruvbox-dark.css @@ -0,0 +1,108 @@ +/* + +Gruvbox style (dark) (c) Pavel Pertsev (original style at https://github.com/morhetz/gruvbox) + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #282828; +} + +.hljs, +.hljs-subst { + color: #ebdbb2; +} + +/* Gruvbox Red */ +.hljs-deletion, +.hljs-formula, +.hljs-keyword, +.hljs-link, +.hljs-selector-tag { + color: #fb4934; +} + +/* Gruvbox Blue */ +.hljs-built_in, +.hljs-emphasis, +.hljs-name, +.hljs-quote, +.hljs-strong, +.hljs-title, +.hljs-variable { + color: #83a598; +} + +/* Gruvbox Yellow */ +.hljs-attr, +.hljs-params, +.hljs-template-tag, +.hljs-type { + color: #fabd2f; +} + +/* Gruvbox Purple */ +.hljs-builtin-name, +.hljs-doctag, +.hljs-literal, +.hljs-number { + color: #8f3f71; +} + +/* Gruvbox Orange */ +.hljs-code, +.hljs-meta, +.hljs-regexp, +.hljs-selector-id, +.hljs-template-variable { + color: #fe8019; +} + +/* Gruvbox Green */ +.hljs-addition, +.hljs-meta-string, +.hljs-section, +.hljs-selector-attr, +.hljs-selector-class, +.hljs-string, +.hljs-symbol { + color: #b8bb26; +} + +/* Gruvbox Aqua */ +.hljs-attribute, +.hljs-bullet, +.hljs-class, +.hljs-function, +.hljs-function .hljs-keyword, +.hljs-meta-keyword, +.hljs-selector-pseudo, +.hljs-tag { + color: #8ec07c; +} + +/* Gruvbox Gray */ +.hljs-comment { + color: #928374; +} + +/* Gruvbox Purple */ +.hljs-link_label, +.hljs-literal, +.hljs-number { + color: #d3869b; +} + +.hljs-comment, +.hljs-emphasis { + font-style: italic; +} + +.hljs-section, +.hljs-strong, +.hljs-tag { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/gruvbox-light.css b/assets/js/highlight/styles/gruvbox-light.css new file mode 100644 index 0000000..ff45468 --- /dev/null +++ b/assets/js/highlight/styles/gruvbox-light.css @@ -0,0 +1,108 @@ +/* + +Gruvbox style (light) (c) Pavel Pertsev (original style at https://github.com/morhetz/gruvbox) + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #fbf1c7; +} + +.hljs, +.hljs-subst { + color: #3c3836; +} + +/* Gruvbox Red */ +.hljs-deletion, +.hljs-formula, +.hljs-keyword, +.hljs-link, +.hljs-selector-tag { + color: #9d0006; +} + +/* Gruvbox Blue */ +.hljs-built_in, +.hljs-emphasis, +.hljs-name, +.hljs-quote, +.hljs-strong, +.hljs-title, +.hljs-variable { + color: #076678; +} + +/* Gruvbox Yellow */ +.hljs-attr, +.hljs-params, +.hljs-template-tag, +.hljs-type { + color: #b57614; +} + +/* Gruvbox Purple */ +.hljs-builtin-name, +.hljs-doctag, +.hljs-literal, +.hljs-number { + color: #8f3f71; +} + +/* Gruvbox Orange */ +.hljs-code, +.hljs-meta, +.hljs-regexp, +.hljs-selector-id, +.hljs-template-variable { + color: #af3a03; +} + +/* Gruvbox Green */ +.hljs-addition, +.hljs-meta-string, +.hljs-section, +.hljs-selector-attr, +.hljs-selector-class, +.hljs-string, +.hljs-symbol { + color: #79740e; +} + +/* Gruvbox Aqua */ +.hljs-attribute, +.hljs-bullet, +.hljs-class, +.hljs-function, +.hljs-function .hljs-keyword, +.hljs-meta-keyword, +.hljs-selector-pseudo, +.hljs-tag { + color: #427b58; +} + +/* Gruvbox Gray */ +.hljs-comment { + color: #928374; +} + +/* Gruvbox Purple */ +.hljs-link_label, +.hljs-literal, +.hljs-number { + color: #8f3f71; +} + +.hljs-comment, +.hljs-emphasis { + font-style: italic; +} + +.hljs-section, +.hljs-strong, +.hljs-tag { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/hopscotch.css b/assets/js/highlight/styles/hopscotch.css new file mode 100644 index 0000000..32e60d2 --- /dev/null +++ b/assets/js/highlight/styles/hopscotch.css @@ -0,0 +1,83 @@ +/* + * Hopscotch + * by Jan T. Sott + * https://github.com/idleberg/Hopscotch + * + * This work is licensed under the Creative Commons CC0 1.0 Universal License + */ + +/* Comment */ +.hljs-comment, +.hljs-quote { + color: #989498; +} + +/* Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-link, +.hljs-deletion { + color: #dd464c; +} + +/* Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #fd8b19; +} + +/* Yellow */ +.hljs-class .hljs-title { + color: #fdcc59; +} + +/* Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #8fc13e; +} + +/* Aqua */ +.hljs-meta { + color: #149b93; +} + +/* Blue */ +.hljs-function, +.hljs-section, +.hljs-title { + color: #1290bf; +} + +/* Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #c85e7c; +} + +.hljs { + display: block; + background: #322931; + color: #b9b5b8; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/hybrid.css b/assets/js/highlight/styles/hybrid.css new file mode 100644 index 0000000..29735a1 --- /dev/null +++ b/assets/js/highlight/styles/hybrid.css @@ -0,0 +1,102 @@ +/* + +vim-hybrid theme by w0ng (https://github.com/w0ng/vim-hybrid) + +*/ + +/*background color*/ +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #1d1f21; +} + +/*selection color*/ +.hljs::selection, +.hljs span::selection { + background: #373b41; +} + +.hljs::-moz-selection, +.hljs span::-moz-selection { + background: #373b41; +} + +/*foreground color*/ +.hljs { + color: #c5c8c6; +} + +/*color: fg_yellow*/ +.hljs-title, +.hljs-name { + color: #f0c674; +} + +/*color: fg_comment*/ +.hljs-comment, +.hljs-meta, +.hljs-meta .hljs-keyword { + color: #707880; +} + +/*color: fg_red*/ +.hljs-number, +.hljs-symbol, +.hljs-literal, +.hljs-deletion, +.hljs-link { + color: #cc6666 +} + +/*color: fg_green*/ +.hljs-string, +.hljs-doctag, +.hljs-addition, +.hljs-regexp, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #b5bd68; +} + +/*color: fg_purple*/ +.hljs-attribute, +.hljs-code, +.hljs-selector-id { + color: #b294bb; +} + +/*color: fg_blue*/ +.hljs-keyword, +.hljs-selector-tag, +.hljs-bullet, +.hljs-tag { + color: #81a2be; +} + +/*color: fg_aqua*/ +.hljs-subst, +.hljs-variable, +.hljs-template-tag, +.hljs-template-variable { + color: #8abeb7; +} + +/*color: fg_orange*/ +.hljs-type, +.hljs-built_in, +.hljs-builtin-name, +.hljs-quote, +.hljs-section, +.hljs-selector-class { + color: #de935f; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/idea.css b/assets/js/highlight/styles/idea.css new file mode 100644 index 0000000..3bf1892 --- /dev/null +++ b/assets/js/highlight/styles/idea.css @@ -0,0 +1,97 @@ +/* + +Intellij Idea-like styling (c) Vasily Polovnyov + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #000; + background: #fff; +} + +.hljs-subst, +.hljs-title { + font-weight: normal; + color: #000; +} + +.hljs-comment, +.hljs-quote { + color: #808080; + font-style: italic; +} + +.hljs-meta { + color: #808000; +} + +.hljs-tag { + background: #efefef; +} + +.hljs-section, +.hljs-name, +.hljs-literal, +.hljs-keyword, +.hljs-selector-tag, +.hljs-type, +.hljs-selector-id, +.hljs-selector-class { + font-weight: bold; + color: #000080; +} + +.hljs-attribute, +.hljs-number, +.hljs-regexp, +.hljs-link { + font-weight: bold; + color: #0000ff; +} + +.hljs-number, +.hljs-regexp, +.hljs-link { + font-weight: normal; +} + +.hljs-string { + color: #008000; + font-weight: bold; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-formula { + color: #000; + background: #d0eded; + font-style: italic; +} + +.hljs-doctag { + text-decoration: underline; +} + +.hljs-variable, +.hljs-template-variable { + color: #660e7a; +} + +.hljs-addition { + background: #baeeba; +} + +.hljs-deletion { + background: #ffc8bd; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/ir-black.css b/assets/js/highlight/styles/ir-black.css new file mode 100644 index 0000000..bd4c755 --- /dev/null +++ b/assets/js/highlight/styles/ir-black.css @@ -0,0 +1,73 @@ +/* + IR_Black style (c) Vasily Mikhailitchenko +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #000; + color: #f8f8f8; +} + +.hljs-comment, +.hljs-quote, +.hljs-meta { + color: #7c7c7c; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-tag, +.hljs-name { + color: #96cbfe; +} + +.hljs-attribute, +.hljs-selector-id { + color: #ffffb6; +} + +.hljs-string, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-addition { + color: #a8ff60; +} + +.hljs-subst { + color: #daefa3; +} + +.hljs-regexp, +.hljs-link { + color: #e9c062; +} + +.hljs-title, +.hljs-section, +.hljs-type, +.hljs-doctag { + color: #ffffb6; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-variable, +.hljs-template-variable, +.hljs-literal { + color: #c6c5fe; +} + +.hljs-number, +.hljs-deletion { + color:#ff73fd; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/kimbie.dark.css b/assets/js/highlight/styles/kimbie.dark.css new file mode 100644 index 0000000..d139cb5 --- /dev/null +++ b/assets/js/highlight/styles/kimbie.dark.css @@ -0,0 +1,74 @@ +/* + Name: Kimbie (dark) + Author: Jan T. Sott + License: Creative Commons Attribution-ShareAlike 4.0 Unported License + URL: https://github.com/idleberg/Kimbie-highlight.js +*/ + +/* Kimbie Comment */ +.hljs-comment, +.hljs-quote { + color: #d6baad; +} + +/* Kimbie Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-meta { + color: #dc3958; +} + +/* Kimbie Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-deletion, +.hljs-link { + color: #f79a32; +} + +/* Kimbie Yellow */ +.hljs-title, +.hljs-section, +.hljs-attribute { + color: #f06431; +} + +/* Kimbie Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #889b4a; +} + +/* Kimbie Purple */ +.hljs-keyword, +.hljs-selector-tag, +.hljs-function { + color: #98676a; +} + +.hljs { + display: block; + overflow-x: auto; + background: #221a0f; + color: #d3af86; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/kimbie.light.css b/assets/js/highlight/styles/kimbie.light.css new file mode 100644 index 0000000..04ff6ed --- /dev/null +++ b/assets/js/highlight/styles/kimbie.light.css @@ -0,0 +1,74 @@ +/* + Name: Kimbie (light) + Author: Jan T. Sott + License: Creative Commons Attribution-ShareAlike 4.0 Unported License + URL: https://github.com/idleberg/Kimbie-highlight.js +*/ + +/* Kimbie Comment */ +.hljs-comment, +.hljs-quote { + color: #a57a4c; +} + +/* Kimbie Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-meta { + color: #dc3958; +} + +/* Kimbie Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-deletion, +.hljs-link { + color: #f79a32; +} + +/* Kimbie Yellow */ +.hljs-title, +.hljs-section, +.hljs-attribute { + color: #f06431; +} + +/* Kimbie Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #889b4a; +} + +/* Kimbie Purple */ +.hljs-keyword, +.hljs-selector-tag, +.hljs-function { + color: #98676a; +} + +.hljs { + display: block; + overflow-x: auto; + background: #fbebd4; + color: #84613d; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/magula.css b/assets/js/highlight/styles/magula.css new file mode 100644 index 0000000..44dee5e --- /dev/null +++ b/assets/js/highlight/styles/magula.css @@ -0,0 +1,70 @@ +/* +Description: Magula style for highligh.js +Author: Ruslan Keba +Website: http://rukeba.com/ +Version: 1.0 +Date: 2009-01-03 +Music: Aphex Twin / Xtal +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background-color: #f4f4f4; +} + +.hljs, +.hljs-subst { + color: black; +} + +.hljs-string, +.hljs-title, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute, +.hljs-addition, +.hljs-variable, +.hljs-template-tag, +.hljs-template-variable { + color: #050; +} + +.hljs-comment, +.hljs-quote { + color: #777; +} + +.hljs-number, +.hljs-regexp, +.hljs-literal, +.hljs-type, +.hljs-link { + color: #800; +} + +.hljs-deletion, +.hljs-meta { + color: #00e; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-doctag, +.hljs-title, +.hljs-section, +.hljs-built_in, +.hljs-tag, +.hljs-name { + font-weight: bold; + color: navy; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/mono-blue.css b/assets/js/highlight/styles/mono-blue.css new file mode 100644 index 0000000..884c97c --- /dev/null +++ b/assets/js/highlight/styles/mono-blue.css @@ -0,0 +1,59 @@ +/* + Five-color theme from a single blue hue. +*/ +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #eaeef3; +} + +.hljs { + color: #00193a; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-title, +.hljs-section, +.hljs-doctag, +.hljs-name, +.hljs-strong { + font-weight: bold; +} + +.hljs-comment { + color: #738191; +} + +.hljs-string, +.hljs-title, +.hljs-section, +.hljs-built_in, +.hljs-literal, +.hljs-type, +.hljs-addition, +.hljs-tag, +.hljs-quote, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #0048ab; +} + +.hljs-meta, +.hljs-subst, +.hljs-symbol, +.hljs-regexp, +.hljs-attribute, +.hljs-deletion, +.hljs-variable, +.hljs-template-variable, +.hljs-link, +.hljs-bullet { + color: #4c81c9; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/assets/js/highlight/styles/monokai-sublime.css b/assets/js/highlight/styles/monokai-sublime.css new file mode 100644 index 0000000..2864170 --- /dev/null +++ b/assets/js/highlight/styles/monokai-sublime.css @@ -0,0 +1,83 @@ +/* + +Monokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-license.org/ + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #23241f; +} + +.hljs, +.hljs-tag, +.hljs-subst { + color: #f8f8f2; +} + +.hljs-strong, +.hljs-emphasis { + color: #a8a8a2; +} + +.hljs-bullet, +.hljs-quote, +.hljs-number, +.hljs-regexp, +.hljs-literal, +.hljs-link { + color: #ae81ff; +} + +.hljs-code, +.hljs-title, +.hljs-section, +.hljs-selector-class { + color: #a6e22e; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-name, +.hljs-attr { + color: #f92672; +} + +.hljs-symbol, +.hljs-attribute { + color: #66d9ef; +} + +.hljs-params, +.hljs-class .hljs-title { + color: #f8f8f2; +} + +.hljs-string, +.hljs-type, +.hljs-built_in, +.hljs-builtin-name, +.hljs-selector-id, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-addition, +.hljs-variable, +.hljs-template-variable { + color: #e6db74; +} + +.hljs-comment, +.hljs-deletion, +.hljs-meta { + color: #75715e; +} diff --git a/assets/js/highlight/styles/monokai.css b/assets/js/highlight/styles/monokai.css new file mode 100644 index 0000000..775d53f --- /dev/null +++ b/assets/js/highlight/styles/monokai.css @@ -0,0 +1,70 @@ +/* +Monokai style - ported by Luigi Maselli - http://grigio.org +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #272822; color: #ddd; +} + +.hljs-tag, +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-strong, +.hljs-name { + color: #f92672; +} + +.hljs-code { + color: #66d9ef; +} + +.hljs-class .hljs-title { + color: white; +} + +.hljs-attribute, +.hljs-symbol, +.hljs-regexp, +.hljs-link { + color: #bf79db; +} + +.hljs-string, +.hljs-bullet, +.hljs-subst, +.hljs-title, +.hljs-section, +.hljs-emphasis, +.hljs-type, +.hljs-built_in, +.hljs-builtin-name, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-addition, +.hljs-variable, +.hljs-template-tag, +.hljs-template-variable { + color: #a6e22e; +} + +.hljs-comment, +.hljs-quote, +.hljs-deletion, +.hljs-meta { + color: #75715e; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-doctag, +.hljs-title, +.hljs-section, +.hljs-type, +.hljs-selector-id { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/obsidian.css b/assets/js/highlight/styles/obsidian.css new file mode 100644 index 0000000..356630f --- /dev/null +++ b/assets/js/highlight/styles/obsidian.css @@ -0,0 +1,88 @@ +/** + * Obsidian style + * ported by Alexander Marenin (http://github.com/ioncreature) + */ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #282b2e; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-selector-id { + color: #93c763; +} + +.hljs-number { + color: #ffcd22; +} + +.hljs { + color: #e0e2e4; +} + +.hljs-attribute { + color: #668bb0; +} + +.hljs-code, +.hljs-class .hljs-title, +.hljs-section { + color: white; +} + +.hljs-regexp, +.hljs-link { + color: #d39745; +} + +.hljs-meta { + color: #557182; +} + +.hljs-tag, +.hljs-name, +.hljs-bullet, +.hljs-subst, +.hljs-emphasis, +.hljs-type, +.hljs-built_in, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-addition, +.hljs-variable, +.hljs-template-tag, +.hljs-template-variable { + color: #8cbbad; +} + +.hljs-string, +.hljs-symbol { + color: #ec7600; +} + +.hljs-comment, +.hljs-quote, +.hljs-deletion { + color: #818e96; +} + +.hljs-selector-class { + color: #A082BD +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-doctag, +.hljs-title, +.hljs-section, +.hljs-type, +.hljs-name, +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/paraiso-dark.css b/assets/js/highlight/styles/paraiso-dark.css new file mode 100644 index 0000000..e729240 --- /dev/null +++ b/assets/js/highlight/styles/paraiso-dark.css @@ -0,0 +1,72 @@ +/* + Paraíso (dark) + Created by Jan T. Sott (http://github.com/idleberg) + Inspired by the art of Rubens LP (http://www.rubenslp.com.br) +*/ + +/* Paraíso Comment */ +.hljs-comment, +.hljs-quote { + color: #8d8687; +} + +/* Paraíso Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-link, +.hljs-meta { + color: #ef6155; +} + +/* Paraíso Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-deletion { + color: #f99b15; +} + +/* Paraíso Yellow */ +.hljs-title, +.hljs-section, +.hljs-attribute { + color: #fec418; +} + +/* Paraíso Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #48b685; +} + +/* Paraíso Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #815ba4; +} + +.hljs { + display: block; + overflow-x: auto; + background: #2f1e2e; + color: #a39e9b; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/paraiso-light.css b/assets/js/highlight/styles/paraiso-light.css new file mode 100644 index 0000000..944857c --- /dev/null +++ b/assets/js/highlight/styles/paraiso-light.css @@ -0,0 +1,72 @@ +/* + Paraíso (light) + Created by Jan T. Sott (http://github.com/idleberg) + Inspired by the art of Rubens LP (http://www.rubenslp.com.br) +*/ + +/* Paraíso Comment */ +.hljs-comment, +.hljs-quote { + color: #776e71; +} + +/* Paraíso Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-link, +.hljs-meta { + color: #ef6155; +} + +/* Paraíso Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-deletion { + color: #f99b15; +} + +/* Paraíso Yellow */ +.hljs-title, +.hljs-section, +.hljs-attribute { + color: #fec418; +} + +/* Paraíso Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #48b685; +} + +/* Paraíso Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #815ba4; +} + +.hljs { + display: block; + overflow-x: auto; + background: #e7e9db; + color: #4f424c; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/pojoaque.css b/assets/js/highlight/styles/pojoaque.css new file mode 100644 index 0000000..2e07847 --- /dev/null +++ b/assets/js/highlight/styles/pojoaque.css @@ -0,0 +1,83 @@ +/* + +Pojoaque Style by Jason Tate +http://web-cms-designs.com/ftopict-10-pojoaque-style-for-highlight-js-code-highlighter.html +Based on Solarized Style from http://ethanschoonover.com/solarized + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #dccf8f; + background: url(./pojoaque.jpg) repeat scroll left top #181914; +} + +.hljs-comment, +.hljs-quote { + color: #586e75; + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-addition { + color: #b64926; +} + +.hljs-number, +.hljs-string, +.hljs-doctag, +.hljs-regexp { + color: #468966; +} + +.hljs-title, +.hljs-section, +.hljs-built_in, +.hljs-name { + color: #ffb03b; +} + +.hljs-variable, +.hljs-template-variable, +.hljs-class .hljs-title, +.hljs-type, +.hljs-tag { + color: #b58900; +} + +.hljs-attribute { + color: #b89859; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-link, +.hljs-subst, +.hljs-meta { + color: #cb4b16; +} + +.hljs-deletion { + color: #dc322f; +} + +.hljs-selector-id, +.hljs-selector-class { + color: #d3a60c; +} + +.hljs-formula { + background: #073642; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/pojoaque.jpg b/assets/js/highlight/styles/pojoaque.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9c07d4ab40b6d77e90ff69f0012bcd33b21d31c3 GIT binary patch literal 1186 zcmZXSe^8Tk9LK-kXFs3)f@f?)Cddzw3v4wdZyXQ;4x3=;Ja*N#%n9ik!UGmt9H3k0 zJST|5jOc(ID$FQt3C?jQZBws#kXolO1lg9Pba9BB=Q+UEBX!nY@6Uhl&+ofe$Q$y5 z@ci`~)&qzDP(lOiQ5p?p z(`j^e7!yUAVHk%K#^GQXn?s0=VLYCI$HRoe=xCuZ>A6A3@sxEP#XqNFpIb=0)KQ#Nss_tD17;m4@$JKL;LR|K|QF3f%!L5+s(9Ft8SQ zG|~pGpEGFW5Z|OA)-O@mNHy-g@7m8JTf?kl@vUKBGmw)Y*9sDRNr3PN!IKefWaydTe1D zjzpyzPnD3}hBNaS4aFX7=0&~I*Hu7#4au@qVBglH#-m;QFOx_`=j z{EqRY#Eh*yoWP^pa4H>8GH{rO?!_+xwL0(k4yL^D%^nBkJ*UI;Lx;ped8d|f*S_s@ z3~ilcRC(&NT#9Gn#UD;o^EYSMXDMf%XcUi3>;WXXD-QX3P9wMyP7eA&RS{)h5{??W3^Rq=goFJ>?lA~J- zdYe>!xvYLW*fPT0RK7wsJRg^?x#W1*GP9_f`6t>QD_X>0d!owyN>nO2?U5}|3?hX_UZYT@^>S!9eB~bZ9U`q;`U)@L670o1g z`Hd}h<_WRvUc|n*%v4Hbb-4tJD40iyF^q%g*&!6>hkYDvi-{Uc4yTM zzcthN4Z{ka!+F_KzYV#yWi;c^X^q6g`pD8cp?$Kl?hCz0s^a|mH%P!CF%*<6k^~i` zT5Mi-t5-frUcHkk^Qh}+N)Kz1&Bi95`oNc|quI>tUi~BY>xcF9(%tv2i{G6kE9*q~ qCoAGl20`)w0rdgp9H%Q=M5|p`hOhFz6$I%Y&ncY8>c?7PXyh+SL&XXJ literal 0 HcmV?d00001 diff --git a/assets/js/highlight/styles/qtcreator_dark.css b/assets/js/highlight/styles/qtcreator_dark.css new file mode 100644 index 0000000..7aa56a3 --- /dev/null +++ b/assets/js/highlight/styles/qtcreator_dark.css @@ -0,0 +1,83 @@ +/* + +Qt Creator dark color scheme + +*/ + + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #000000; +} + +.hljs, +.hljs-subst, +.hljs-tag, +.hljs-title { + color: #aaaaaa; +} + +.hljs-strong, +.hljs-emphasis { + color: #a8a8a2; +} + +.hljs-bullet, +.hljs-quote, +.hljs-number, +.hljs-regexp, +.hljs-literal { + color: #ff55ff; +} + +.hljs-code +.hljs-selector-class { + color: #aaaaff; +} + +.hljs-emphasis, +.hljs-stronge, +.hljs-type { + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-function, +.hljs-section, +.hljs-symbol, +.hljs-name { + color: #ffff55; +} + +.hljs-attribute { + color: #ff5555; +} + +.hljs-variable, +.hljs-params, +.hljs-class .hljs-title { + color: #8888ff; +} + +.hljs-string, +.hljs-selector-id, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-type, +.hljs-built_in, +.hljs-builtin-name, +.hljs-template-tag, +.hljs-template-variable, +.hljs-addition, +.hljs-link { + color: #ff55ff; +} + +.hljs-comment, +.hljs-meta, +.hljs-deletion { + color: #55ffff; +} diff --git a/assets/js/highlight/styles/qtcreator_light.css b/assets/js/highlight/styles/qtcreator_light.css new file mode 100644 index 0000000..1efa2c6 --- /dev/null +++ b/assets/js/highlight/styles/qtcreator_light.css @@ -0,0 +1,83 @@ +/* + +Qt Creator light color scheme + +*/ + + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #ffffff; +} + +.hljs, +.hljs-subst, +.hljs-tag, +.hljs-title { + color: #000000; +} + +.hljs-strong, +.hljs-emphasis { + color: #000000; +} + +.hljs-bullet, +.hljs-quote, +.hljs-number, +.hljs-regexp, +.hljs-literal { + color: #000080; +} + +.hljs-code +.hljs-selector-class { + color: #800080; +} + +.hljs-emphasis, +.hljs-stronge, +.hljs-type { + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-function, +.hljs-section, +.hljs-symbol, +.hljs-name { + color: #808000; +} + +.hljs-attribute { + color: #800000; +} + +.hljs-variable, +.hljs-params, +.hljs-class .hljs-title { + color: #0055AF; +} + +.hljs-string, +.hljs-selector-id, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-type, +.hljs-built_in, +.hljs-builtin-name, +.hljs-template-tag, +.hljs-template-variable, +.hljs-addition, +.hljs-link { + color: #008000; +} + +.hljs-comment, +.hljs-meta, +.hljs-deletion { + color: #008000; +} diff --git a/assets/js/highlight/styles/railscasts.css b/assets/js/highlight/styles/railscasts.css new file mode 100644 index 0000000..008cdc5 --- /dev/null +++ b/assets/js/highlight/styles/railscasts.css @@ -0,0 +1,106 @@ +/* + +Railscasts-like style (c) Visoft, Inc. (Damien White) + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #232323; + color: #e6e1dc; +} + +.hljs-comment, +.hljs-quote { + color: #bc9458; + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag { + color: #c26230; +} + +.hljs-string, +.hljs-number, +.hljs-regexp, +.hljs-variable, +.hljs-template-variable { + color: #a5c261; +} + +.hljs-subst { + color: #519f50; +} + +.hljs-tag, +.hljs-name { + color: #e8bf6a; +} + +.hljs-type { + color: #da4939; +} + + +.hljs-symbol, +.hljs-bullet, +.hljs-built_in, +.hljs-builtin-name, +.hljs-attr, +.hljs-link { + color: #6d9cbe; +} + +.hljs-params { + color: #d0d0ff; +} + +.hljs-attribute { + color: #cda869; +} + +.hljs-meta { + color: #9b859d; +} + +.hljs-title, +.hljs-section { + color: #ffc66d; +} + +.hljs-addition { + background-color: #144212; + color: #e6e1dc; + display: inline-block; + width: 100%; +} + +.hljs-deletion { + background-color: #600; + color: #e6e1dc; + display: inline-block; + width: 100%; +} + +.hljs-selector-class { + color: #9b703f; +} + +.hljs-selector-id { + color: #8b98ab; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-link { + text-decoration: underline; +} diff --git a/assets/js/highlight/styles/rainbow.css b/assets/js/highlight/styles/rainbow.css new file mode 100644 index 0000000..905eb8e --- /dev/null +++ b/assets/js/highlight/styles/rainbow.css @@ -0,0 +1,85 @@ +/* + +Style with support for rainbow parens + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #474949; + color: #d1d9e1; +} + + +.hljs-comment, +.hljs-quote { + color: #969896; + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-type, +.hljs-addition { + color: #cc99cc; +} + +.hljs-number, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #f99157; +} + +.hljs-string, +.hljs-doctag, +.hljs-regexp { + color: #8abeb7; +} + +.hljs-title, +.hljs-name, +.hljs-section, +.hljs-built_in { + color: #b5bd68; +} + +.hljs-variable, +.hljs-template-variable, +.hljs-selector-id, +.hljs-class .hljs-title { + color: #ffcc66; +} + +.hljs-section, +.hljs-name, +.hljs-strong { + font-weight: bold; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-subst, +.hljs-meta, +.hljs-link { + color: #f99157; +} + +.hljs-deletion { + color: #dc322f; +} + +.hljs-formula { + background: #eee8d5; +} + +.hljs-attr, +.hljs-attribute { + color: #81a2be; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/assets/js/highlight/styles/school-book.css b/assets/js/highlight/styles/school-book.css new file mode 100644 index 0000000..964b51d --- /dev/null +++ b/assets/js/highlight/styles/school-book.css @@ -0,0 +1,72 @@ +/* + +School Book style from goldblog.com.ua (c) Zaripov Yura + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 15px 0.5em 0.5em 30px; + font-size: 11px; + line-height:16px; +} + +pre{ + background:#f6f6ae url(./school-book.png); + border-top: solid 2px #d2e8b9; + border-bottom: solid 1px #d2e8b9; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal { + color:#005599; + font-weight:bold; +} + +.hljs, +.hljs-subst { + color: #3e5915; +} + +.hljs-string, +.hljs-title, +.hljs-section, +.hljs-type, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute, +.hljs-built_in, +.hljs-builtin-name, +.hljs-addition, +.hljs-variable, +.hljs-template-tag, +.hljs-template-variable, +.hljs-link { + color: #2c009f; +} + +.hljs-comment, +.hljs-quote, +.hljs-deletion, +.hljs-meta { + color: #e60415; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-doctag, +.hljs-title, +.hljs-section, +.hljs-type, +.hljs-name, +.hljs-selector-id, +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/assets/js/highlight/styles/school-book.png b/assets/js/highlight/styles/school-book.png new file mode 100644 index 0000000000000000000000000000000000000000..956e9790a0e2c079b3d568348ff3accd1d9cac30 GIT binary patch literal 486 zcmeAS@N?(olHy`uVBq!ia0y~yV7?7x3vjRjNjAS6Ga$v1?&#~tz_9*=IcwKTAYZb? zHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkD0|R4)r;B4q#jQ7Ycl#YS5MfK$ z?b^fh#qmaEhFDxvyThwfhdfkOPApt1lr{NA;Vr%uzxJuVIyzm(ed_8_-0$LLU})H&o5Re&aDemE>EG#(|F^t9_pa-H z_Mf?rMVrs}-M?S|?ZdY@c6s41zy8~}@a{v&#Ea7V)wJ$+#K|u$5UvWCdFLwGac}6w{_s*=8A6L7Rfc|9gboFyt I=akR{0OLZ+qyPW_ literal 0 HcmV?d00001 diff --git a/assets/js/highlight/styles/solarized-dark.css b/assets/js/highlight/styles/solarized-dark.css new file mode 100644 index 0000000..b4c0da1 --- /dev/null +++ b/assets/js/highlight/styles/solarized-dark.css @@ -0,0 +1,84 @@ +/* + +Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #002b36; + color: #839496; +} + +.hljs-comment, +.hljs-quote { + color: #586e75; +} + +/* Solarized Green */ +.hljs-keyword, +.hljs-selector-tag, +.hljs-addition { + color: #859900; +} + +/* Solarized Cyan */ +.hljs-number, +.hljs-string, +.hljs-meta .hljs-meta-string, +.hljs-literal, +.hljs-doctag, +.hljs-regexp { + color: #2aa198; +} + +/* Solarized Blue */ +.hljs-title, +.hljs-section, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #268bd2; +} + +/* Solarized Yellow */ +.hljs-attribute, +.hljs-attr, +.hljs-variable, +.hljs-template-variable, +.hljs-class .hljs-title, +.hljs-type { + color: #b58900; +} + +/* Solarized Orange */ +.hljs-symbol, +.hljs-bullet, +.hljs-subst, +.hljs-meta, +.hljs-meta .hljs-keyword, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-link { + color: #cb4b16; +} + +/* Solarized Red */ +.hljs-built_in, +.hljs-deletion { + color: #dc322f; +} + +.hljs-formula { + background: #073642; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/solarized-light.css b/assets/js/highlight/styles/solarized-light.css new file mode 100644 index 0000000..fdcfcc7 --- /dev/null +++ b/assets/js/highlight/styles/solarized-light.css @@ -0,0 +1,84 @@ +/* + +Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #fdf6e3; + color: #657b83; +} + +.hljs-comment, +.hljs-quote { + color: #93a1a1; +} + +/* Solarized Green */ +.hljs-keyword, +.hljs-selector-tag, +.hljs-addition { + color: #859900; +} + +/* Solarized Cyan */ +.hljs-number, +.hljs-string, +.hljs-meta .hljs-meta-string, +.hljs-literal, +.hljs-doctag, +.hljs-regexp { + color: #2aa198; +} + +/* Solarized Blue */ +.hljs-title, +.hljs-section, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #268bd2; +} + +/* Solarized Yellow */ +.hljs-attribute, +.hljs-attr, +.hljs-variable, +.hljs-template-variable, +.hljs-class .hljs-title, +.hljs-type { + color: #b58900; +} + +/* Solarized Orange */ +.hljs-symbol, +.hljs-bullet, +.hljs-subst, +.hljs-meta, +.hljs-meta .hljs-keyword, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-link { + color: #cb4b16; +} + +/* Solarized Red */ +.hljs-built_in, +.hljs-deletion { + color: #dc322f; +} + +.hljs-formula { + background: #eee8d5; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/sunburst.css b/assets/js/highlight/styles/sunburst.css new file mode 100644 index 0000000..f56dd5e --- /dev/null +++ b/assets/js/highlight/styles/sunburst.css @@ -0,0 +1,102 @@ +/* + +Sunburst-like style (c) Vasily Polovnyov + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #000; + color: #f8f8f8; +} + +.hljs-comment, +.hljs-quote { + color: #aeaeae; + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-type { + color: #e28964; +} + +.hljs-string { + color: #65b042; +} + +.hljs-subst { + color: #daefa3; +} + +.hljs-regexp, +.hljs-link { + color: #e9c062; +} + +.hljs-title, +.hljs-section, +.hljs-tag, +.hljs-name { + color: #89bdff; +} + +.hljs-class .hljs-title, +.hljs-doctag { + text-decoration: underline; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-number { + color: #3387cc; +} + +.hljs-params, +.hljs-variable, +.hljs-template-variable { + color: #3e87e3; +} + +.hljs-attribute { + color: #cda869; +} + +.hljs-meta { + color: #8996a8; +} + +.hljs-formula { + background-color: #0e2231; + color: #f8f8f8; + font-style: italic; +} + +.hljs-addition { + background-color: #253b22; + color: #f8f8f8; +} + +.hljs-deletion { + background-color: #420e09; + color: #f8f8f8; +} + +.hljs-selector-class { + color: #9b703f; +} + +.hljs-selector-id { + color: #8b98ab; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/tomorrow-night-blue.css b/assets/js/highlight/styles/tomorrow-night-blue.css new file mode 100644 index 0000000..78e59cc --- /dev/null +++ b/assets/js/highlight/styles/tomorrow-night-blue.css @@ -0,0 +1,75 @@ +/* Tomorrow Night Blue Theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment, +.hljs-quote { + color: #7285b7; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-deletion { + color: #ff9da4; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-meta, +.hljs-link { + color: #ffc58f; +} + +/* Tomorrow Yellow */ +.hljs-attribute { + color: #ffeead; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #d1f1a9; +} + +/* Tomorrow Blue */ +.hljs-title, +.hljs-section { + color: #bbdaff; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #ebbbff; +} + +.hljs { + display: block; + overflow-x: auto; + background: #002451; + color: white; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/tomorrow-night-bright.css b/assets/js/highlight/styles/tomorrow-night-bright.css new file mode 100644 index 0000000..e05af8a --- /dev/null +++ b/assets/js/highlight/styles/tomorrow-night-bright.css @@ -0,0 +1,74 @@ +/* Tomorrow Night Bright Theme */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment, +.hljs-quote { + color: #969896; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-deletion { + color: #d54e53; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-meta, +.hljs-link { + color: #e78c45; +} + +/* Tomorrow Yellow */ +.hljs-attribute { + color: #e7c547; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #b9ca4a; +} + +/* Tomorrow Blue */ +.hljs-title, +.hljs-section { + color: #7aa6da; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #c397d8; +} + +.hljs { + display: block; + overflow-x: auto; + background: black; + color: #eaeaea; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/tomorrow-night-eighties.css b/assets/js/highlight/styles/tomorrow-night-eighties.css new file mode 100644 index 0000000..08fd51c --- /dev/null +++ b/assets/js/highlight/styles/tomorrow-night-eighties.css @@ -0,0 +1,74 @@ +/* Tomorrow Night Eighties Theme */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment, +.hljs-quote { + color: #999999; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-deletion { + color: #f2777a; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-meta, +.hljs-link { + color: #f99157; +} + +/* Tomorrow Yellow */ +.hljs-attribute { + color: #ffcc66; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #99cc99; +} + +/* Tomorrow Blue */ +.hljs-title, +.hljs-section { + color: #6699cc; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #cc99cc; +} + +.hljs { + display: block; + overflow-x: auto; + background: #2d2d2d; + color: #cccccc; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/tomorrow-night.css b/assets/js/highlight/styles/tomorrow-night.css new file mode 100644 index 0000000..ddd270a --- /dev/null +++ b/assets/js/highlight/styles/tomorrow-night.css @@ -0,0 +1,75 @@ +/* Tomorrow Night Theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment, +.hljs-quote { + color: #969896; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-deletion { + color: #cc6666; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-meta, +.hljs-link { + color: #de935f; +} + +/* Tomorrow Yellow */ +.hljs-attribute { + color: #f0c674; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #b5bd68; +} + +/* Tomorrow Blue */ +.hljs-title, +.hljs-section { + color: #81a2be; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #b294bb; +} + +.hljs { + display: block; + overflow-x: auto; + background: #1d1f21; + color: #c5c8c6; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/tomorrow.css b/assets/js/highlight/styles/tomorrow.css new file mode 100644 index 0000000..026a62f --- /dev/null +++ b/assets/js/highlight/styles/tomorrow.css @@ -0,0 +1,72 @@ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment, +.hljs-quote { + color: #8e908c; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-deletion { + color: #c82829; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-meta, +.hljs-link { + color: #f5871f; +} + +/* Tomorrow Yellow */ +.hljs-attribute { + color: #eab700; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #718c00; +} + +/* Tomorrow Blue */ +.hljs-title, +.hljs-section { + color: #4271ae; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #8959a8; +} + +.hljs { + display: block; + overflow-x: auto; + background: white; + color: #4d4d4c; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/vs.css b/assets/js/highlight/styles/vs.css new file mode 100644 index 0000000..c5d07d3 --- /dev/null +++ b/assets/js/highlight/styles/vs.css @@ -0,0 +1,68 @@ +/* + +Visual Studio-like style based on original C# coloring by Jason Diamond + +*/ +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: white; + color: black; +} + +.hljs-comment, +.hljs-quote, +.hljs-variable { + color: #008000; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-built_in, +.hljs-name, +.hljs-tag { + color: #00f; +} + +.hljs-string, +.hljs-title, +.hljs-section, +.hljs-attribute, +.hljs-literal, +.hljs-template-tag, +.hljs-template-variable, +.hljs-type, +.hljs-addition { + color: #a31515; +} + +.hljs-deletion, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-meta { + color: #2b91af; +} + +.hljs-doctag { + color: #808080; +} + +.hljs-attr { + color: #f00; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-link { + color: #00b0e8; +} + + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/highlight/styles/xcode.css b/assets/js/highlight/styles/xcode.css new file mode 100644 index 0000000..43dddad --- /dev/null +++ b/assets/js/highlight/styles/xcode.css @@ -0,0 +1,93 @@ +/* + +XCode style (c) Angel Garcia + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #fff; + color: black; +} + +.hljs-comment, +.hljs-quote { + color: #006a00; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal { + color: #aa0d91; +} + +.hljs-name { + color: #008; +} + +.hljs-variable, +.hljs-template-variable { + color: #660; +} + +.hljs-string { + color: #c41a16; +} + +.hljs-regexp, +.hljs-link { + color: #080; +} + +.hljs-title, +.hljs-tag, +.hljs-symbol, +.hljs-bullet, +.hljs-number, +.hljs-meta { + color: #1c00cf; +} + +.hljs-section, +.hljs-class .hljs-title, +.hljs-type, +.hljs-attr, +.hljs-built_in, +.hljs-builtin-name, +.hljs-params { + color: #5c2699; +} + +.hljs-attribute, +.hljs-subst { + color: #000; +} + +.hljs-formula { + background-color: #eee; + font-style: italic; +} + +.hljs-addition { + background-color: #baeeba; +} + +.hljs-deletion { + background-color: #ffc8bd; +} + +.hljs-selector-id, +.hljs-selector-class { + color: #9b703f; +} + +.hljs-doctag, +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/assets/js/highlight/styles/xt256.css b/assets/js/highlight/styles/xt256.css new file mode 100644 index 0000000..351d066 --- /dev/null +++ b/assets/js/highlight/styles/xt256.css @@ -0,0 +1,92 @@ + +/* + xt256.css + + Contact: initbar [at] protonmail [dot] ch + : github.com/initbar +*/ + +.hljs { + display: block; + overflow-x: auto; + color: #eaeaea; + background: #000; + padding: 0.5e; +} + +.hljs-subst { + color: #eaeaea; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-builtin-name, +.hljs-type { + color: #eaeaea; +} + +.hljs-params { + color: #da0000; +} + +.hljs-literal, +.hljs-number, +.hljs-name { + color: #ff0000; + font-weight: bolder; +} + +.hljs-comment { + color: #969896; +} + +.hljs-selector-id, +.hljs-quote { + color: #00ffff; +} + +.hljs-template-variable, +.hljs-variable, +.hljs-title { + color: #00ffff; + font-weight: bold; +} + +.hljs-selector-class, +.hljs-keyword, +.hljs-symbol { + color: #fff000; +} + +.hljs-string, +.hljs-bullet { + color: #00ff00; +} + +.hljs-tag, +.hljs-section { + color: #000fff; +} + +.hljs-selector-tag { + color: #000fff; + font-weight: bold; +} + +.hljs-attribute, +.hljs-built_in, +.hljs-regexp, +.hljs-link { + color: #ff00ff; +} + +.hljs-meta { + color: #fff; + font-weight: bolder; +} diff --git a/assets/js/highlight/styles/zenburn.css b/assets/js/highlight/styles/zenburn.css new file mode 100644 index 0000000..07be502 --- /dev/null +++ b/assets/js/highlight/styles/zenburn.css @@ -0,0 +1,80 @@ +/* + +Zenburn style from voldmar.ru (c) Vladimir Epifanov +based on dark.css by Ivan Sagalaev + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #3f3f3f; + color: #dcdcdc; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-tag { + color: #e3ceab; +} + +.hljs-template-tag { + color: #dcdcdc; +} + +.hljs-number { + color: #8cd0d3; +} + +.hljs-variable, +.hljs-template-variable, +.hljs-attribute { + color: #efdcbc; +} + +.hljs-literal { + color: #efefaf; +} + +.hljs-subst { + color: #8f8f8f; +} + +.hljs-title, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-section, +.hljs-type { + color: #efef8f; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-link { + color: #dca3a3; +} + +.hljs-deletion, +.hljs-string, +.hljs-built_in, +.hljs-builtin-name { + color: #cc9393; +} + +.hljs-addition, +.hljs-comment, +.hljs-quote, +.hljs-meta { + color: #7f9f7f; +} + + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/js/html5shiv.min.js b/assets/js/html5shiv.min.js new file mode 100644 index 0000000..bbbc46d --- /dev/null +++ b/assets/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** + * @preserve HTML5 Shiv 3.7.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed + */ +!function(a,b){function c(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 d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.2",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b)}(this,document); \ No newline at end of file diff --git a/assets/js/index.php b/assets/js/index.php new file mode 100644 index 0000000..e668113 --- /dev/null +++ b/assets/js/index.php @@ -0,0 +1,64 @@ +1; +$assets_root = '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . ASSETS_ROOT; +$path = $assets_root . DIRECTORY_SEPARATOR . ASSETS_CACHE_FILE; +$gz_path = $assets_root . DIRECTORY_SEPARATOR . ASSETS_GZIP_CACHE_FILE; + +if (!file_exists($path)) exit('File not found'); +if (!is_readable($path)) exit('File is not readable'); + +header_remove('X-Powered-By'); +header_remove('Pragma'); +header_remove('Set-Cookie'); +header("Content-Type: text/javascript; charset=utf-8"); +header('Cache-Control: public'); +header("Expires: ".date('r',time()+3600*24)); + +if (!empty($etag)) header('ETag: '.$etag); +if (empty($etag) || !isset($_SERVER['HTTP_IF_NONE_MATCH']) || $etag!=$_SERVER['HTTP_IF_NONE_MATCH']) { + header('HTTP/1.1 200 OK'); + + $accept_encoding = ''; + if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) && preg_match( '/\b(x-gzip|gzip)\b/', strtolower($_SERVER['HTTP_ACCEPT_ENCODING']), $match)) { + $accept_encoding = $match[1]; + } + if (empty($accept_encoding) && defined('FORCE_GZIP_ASSETS') && FORCE_GZIP_ASSETS) $accept_encoding = 'gzip'; + if ($gzip && function_exists('gzencode') && !@ini_get('zlib.output_compression') && !empty($accept_encoding)) { + header("Vary: Accept-Encoding"); + header("Content-Encoding: " . $accept_encoding); + + if (file_exists($gz_path) && is_readable($gz_path) && filesize($gz_path)>0 && filemtime($gz_path)==filemtime($path)) { + $output = file_get_contents($gz_path); + } else { + $output = file_get_contents($path); + $output = gzencode($output, 9, FORCE_GZIP); + + if (is_writable($assets_root) && ($f=fopen($gz_path,'wb'))!==false) { + fwrite($f, $output); + fclose($f); + touch($gz_path, filemtime($path)); + } + } + } else { + $output = file_get_contents($path); + } + + echo $output; +} else { + header('HTTP/1.1 304 Not Modified'); +} \ No newline at end of file diff --git a/assets/js/jquery.min.js b/assets/js/jquery.min.js new file mode 100644 index 0000000..0f60b7b --- /dev/null +++ b/assets/js/jquery.min.js @@ -0,0 +1,5 @@ +/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1; + +return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
  • ").addClass("cw").text("#"));c.isBefore(f.clone().endOf("w"));)b.append(a("").addClass("dow").text(c.format("dd"))),c.add(1,"d");o.find(".datepicker-days thead").append(b)},M=function(a){return d.disabledDates[a.format("YYYY-MM-DD")]===!0},N=function(a){return d.enabledDates[a.format("YYYY-MM-DD")]===!0},O=function(a){return d.disabledHours[a.format("H")]===!0},P=function(a){return d.enabledHours[a.format("H")]===!0},Q=function(b,c){if(!b.isValid())return!1;if(d.disabledDates&&"d"===c&&M(b))return!1;if(d.enabledDates&&"d"===c&&!N(b))return!1;if(d.minDate&&b.isBefore(d.minDate,c))return!1;if(d.maxDate&&b.isAfter(d.maxDate,c))return!1;if(d.daysOfWeekDisabled&&"d"===c&&-1!==d.daysOfWeekDisabled.indexOf(b.day()))return!1;if(d.disabledHours&&("h"===c||"m"===c||"s"===c)&&O(b))return!1;if(d.enabledHours&&("h"===c||"m"===c||"s"===c)&&!P(b))return!1;if(d.disabledTimeIntervals&&("h"===c||"m"===c||"s"===c)){var e=!1;if(a.each(d.disabledTimeIntervals,function(){return b.isBetween(this[0],this[1])?(e=!0,!1):void 0}),e)return!1}return!0},R=function(){for(var b=[],c=f.clone().startOf("y").startOf("d");c.isSame(f,"y");)b.push(a("").attr("data-action","selectMonth").addClass("month").text(c.format("MMM"))),c.add(1,"M");o.find(".datepicker-months td").empty().append(b)},S=function(){var b=o.find(".datepicker-months"),c=b.find("th"),g=b.find("tbody").find("span");c.eq(0).find("span").attr("title",d.tooltips.prevYear),c.eq(1).attr("title",d.tooltips.selectYear),c.eq(2).find("span").attr("title",d.tooltips.nextYear),b.find(".disabled").removeClass("disabled"),Q(f.clone().subtract(1,"y"),"y")||c.eq(0).addClass("disabled"),c.eq(1).text(f.year()),Q(f.clone().add(1,"y"),"y")||c.eq(2).addClass("disabled"),g.removeClass("active"),e.isSame(f,"y")&&!m&&g.eq(e.month()).addClass("active"),g.each(function(b){Q(f.clone().month(b),"M")||a(this).addClass("disabled")})},T=function(){var a=o.find(".datepicker-years"),b=a.find("th"),c=f.clone().subtract(5,"y"),g=f.clone().add(6,"y"),h="";for(b.eq(0).find("span").attr("title",d.tooltips.prevDecade),b.eq(1).attr("title",d.tooltips.selectDecade),b.eq(2).find("span").attr("title",d.tooltips.nextDecade),a.find(".disabled").removeClass("disabled"),d.minDate&&d.minDate.isAfter(c,"y")&&b.eq(0).addClass("disabled"),b.eq(1).text(c.year()+"-"+g.year()),d.maxDate&&d.maxDate.isBefore(g,"y")&&b.eq(2).addClass("disabled");!c.isAfter(g,"y");)h+=''+c.year()+"",c.add(1,"y");a.find("td").html(h)},U=function(){var a=o.find(".datepicker-decades"),c=a.find("th"),g=b({y:f.year()-f.year()%100-1}),h=g.clone().add(100,"y"),i=g.clone(),j="";for(c.eq(0).find("span").attr("title",d.tooltips.prevCentury),c.eq(2).find("span").attr("title",d.tooltips.nextCentury),a.find(".disabled").removeClass("disabled"),(g.isSame(b({y:1900}))||d.minDate&&d.minDate.isAfter(g,"y"))&&c.eq(0).addClass("disabled"),c.eq(1).text(g.year()+"-"+h.year()),(g.isSame(b({y:2e3}))||d.maxDate&&d.maxDate.isBefore(h,"y"))&&c.eq(2).addClass("disabled");!g.isAfter(h,"y");)j+=''+(g.year()+1)+" - "+(g.year()+12)+"",g.add(12,"y");j+="",a.find("td").html(j),c.eq(1).text(i.year()+1+"-"+g.year())},V=function(){var b,c,g,h,i=o.find(".datepicker-days"),j=i.find("th"),k=[];if(A()){for(j.eq(0).find("span").attr("title",d.tooltips.prevMonth),j.eq(1).attr("title",d.tooltips.selectMonth),j.eq(2).find("span").attr("title",d.tooltips.nextMonth),i.find(".disabled").removeClass("disabled"),j.eq(1).text(f.format(d.dayViewHeaderFormat)),Q(f.clone().subtract(1,"M"),"M")||j.eq(0).addClass("disabled"),Q(f.clone().add(1,"M"),"M")||j.eq(2).addClass("disabled"),b=f.clone().startOf("M").startOf("w").startOf("d"),h=0;42>h;h++)0===b.weekday()&&(c=a("
    '+b.week()+"'+b.date()+"
    '+c.format(h?"HH":"hh")+"
    '+c.format("mm")+"
    '+c.format("ss")+"
    a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/
    ","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:k.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?""!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m(""}else"application/x-shockwave-flash"==e.source1mime?(f+='',e.poster&&(f+=''),f+=""):-1!=e.source1mime.indexOf("audio")?a.settings.audio_template_callback?f=a.settings.audio_template_callback(e):f+='":"script"==e.type?f+='':f=a.settings.video_template_callback?a.settings.video_template_callback(e):'"}return f}function i(a){var b={};return new tinymce.html.SaxParser({validate:!1,allow_conditional_comments:!0,special:"script,noscript",start:function(a,c){if(b.source1||"param"!=a||(b.source1=c.map.movie),("iframe"==a||"object"==a||"embed"==a||"video"==a||"audio"==a)&&(b.type||(b.type=a),b=tinymce.extend(c.map,b)),"script"==a){var e=d(c.map.src);if(!e)return;b={type:"script",source1:c.map.src,width:e.width,height:e.height}}"source"==a&&(b.source1?b.source2||(b.source2=c.map.src):b.source1=c.map.src),"img"!=a||b.poster||(b.poster=c.map.src)}}).parse(a),b.source1=b.source1||b.src||b.data,b.source2=b.source2||"",b.poster=b.poster||"",b}function j(b){return b.getAttribute("data-mce-object")?i(a.serializer.serialize(b,{selection:!0})):{}}function k(b){if(a.settings.media_filter_html===!1)return b;var c,d=new tinymce.html.Writer;return new tinymce.html.SaxParser({validate:!1,allow_conditional_comments:!1,special:"script,noscript",comment:function(a){d.comment(a)},cdata:function(a){d.cdata(a)},text:function(a,b){d.text(a,b)},start:function(b,e,f){if(c=!0,"script"!=b&&"noscript"!=b){for(var g=0;g=g&&(d(h,{src:b["source"+g],type:b["source"+g+"mime"]}),!b["source"+g]))return;break;case"img":if(!b.poster)return;e=!0}f.start(a,h,i)},end:function(a){if("video"==a&&c)for(var h=1;2>=h;h++)if(b["source"+h]){var i=[];i.map={},h>g&&(d(i,{src:b["source"+h],type:b["source"+h+"mime"]}),f.start("source",i,!0))}if(b.poster&&"object"==a&&c&&!e){var j=[];j.map={},d(j,{src:b.poster,width:b.width,height:b.height}),f.start("img",j,!0)}f.end(a)}},new tinymce.html.Schema({})).parse(a),f.getContent()}function m(b,c){var d,e,f,g,h;for(f=b.attributes,g=f.length;g--;)d=f[g].name,e=f[g].value,"width"!==d&&"height"!==d&&"style"!==d&&(("data"==d||"src"==d)&&(e=a.convertURL(e,d)),c.attr("data-mce-p-"+d,e));h=b.firstChild&&b.firstChild.value,h&&(c.attr("data-mce-html",escape(h)),c.firstChild=null)}function n(a){var b,c=a.name;return b=new tinymce.html.Node("img",1),b.shortEnded=!0,m(a,b),b.attr({width:a.attr("width")||"300",height:a.attr("height")||("audio"==c?"30":"150"),style:a.attr("style"),src:tinymce.Env.transparentSrc,"data-mce-object":c,"class":"mce-object mce-object-"+c}),b}function o(a){var b,c,d,e=a.name;return b=new tinymce.html.Node("span",1),b.attr({contentEditable:"false",style:a.attr("style"),"data-mce-object":e,"class":"mce-preview-object mce-object-"+e}),m(a,b),c=new tinymce.html.Node(e,1),c.attr({src:a.attr("src"),allowfullscreen:a.attr("allowfullscreen"),width:a.attr("width")||"300",height:a.attr("height")||("audio"==e?"30":"150"),frameborder:"0"}),d=new tinymce.html.Node("span",1),d.attr("class","mce-shim"),b.append(c),b.append(d),b}var p=[{regex:/youtu\.be\/([\w\-.]+)/,type:"iframe",w:560,h:314,url:"//www.youtube.com/embed/$1",allowFullscreen:!0},{regex:/youtube\.com(.+)v=([^&]+)/,type:"iframe",w:560,h:314,url:"//www.youtube.com/embed/$2",allowFullscreen:!0},{regex:/youtube.com\/embed\/([a-z0-9]+)/i,type:"iframe",w:560,h:314,url:"//www.youtube.com/embed/$1",allowFullscreen:!0},{regex:/vimeo\.com\/([0-9]+)/,type:"iframe",w:425,h:350,url:"//player.vimeo.com/video/$1?title=0&byline=0&portrait=0&color=8dc7dc",allowfullscreen:!0},{regex:/vimeo\.com\/(.*)\/([0-9]+)/,type:"iframe",w:425,h:350,url:"//player.vimeo.com/video/$2?title=0&byline=0",allowfullscreen:!0},{regex:/maps\.google\.([a-z]{2,3})\/maps\/(.+)msid=(.+)/,type:"iframe",w:425,h:350,url:'//maps.google.com/maps/ms?msid=$2&output=embed"',allowFullscreen:!1}],q=tinymce.Env.ie&&tinymce.Env.ie<=8?"onChange":"onInput";a.on("ResolveName",function(a){var b;1==a.target.nodeType&&(b=a.target.getAttribute("data-mce-object"))&&(a.name=b)}),a.on("preInit",function(){var b=a.schema.getSpecialElements();tinymce.each("video audio iframe object".split(" "),function(a){b[a]=new RegExp("]*>","gi")});var c=a.schema.getBoolAttrs();tinymce.each("webkitallowfullscreen mozallowfullscreen allowfullscreen".split(" "),function(a){c[a]={}}),a.parser.addNodeFilter("iframe,video,audio,object,embed,script",function(b){for(var c,e,f,g=b.length;g--;)c=b[g],c.parent&&(c.parent.attr("data-mce-object")||("script"!=c.name||(f=d(c.attr("src"))))&&(f&&(f.width&&c.attr("width",f.width.toString()),f.height&&c.attr("height",f.height.toString())),e="iframe"==c.name&&a.settings.media_live_embeds!==!1&&tinymce.Env.ceFalse?o(c):n(c),c.replace(e)))}),a.serializer.addAttributeFilter("data-mce-object",function(a,b){for(var c,d,e,f,g,h,i,j,l=a.length;l--;)if(c=a[l],c.parent){for(i=c.attr(b),d=new tinymce.html.Node(i,1),"audio"!=i&&"script"!=i&&(j=c.attr("class"),j&&-1!==j.indexOf("mce-preview-object")?d.attr({width:c.firstChild.attr("width"),height:c.firstChild.attr("height")}):d.attr({width:c.attr("width"),height:c.attr("height")})),d.attr({style:c.attr("style")}),f=c.attributes,e=f.length;e--;){var m=f[e].name;0===m.indexOf("data-mce-p-")&&d.attr(m.substr(11),f[e].value)}"script"==i&&d.attr("type","text/javascript"),g=c.attr("data-mce-html"),g&&(h=new tinymce.html.Node("#text",3),h.raw=!0,h.value=k(unescape(g)),d.append(h)),c.replace(d)}}),a.on("PastePreProcess",function(a){var b=g(a.content);b&&(a.content=b)})}),a.on("ObjectSelected",function(a){var b=a.target.getAttribute("data-mce-object");("audio"==b||"script"==b)&&a.preventDefault()}),a.on("objectResized",function(a){var b,c=a.target;c.getAttribute("data-mce-object")&&(b=c.getAttribute("data-mce-html"),b&&(b=unescape(b),c.setAttribute("data-mce-html",escape(l(b,{width:a.width,height:a.height})))))}),a.addButton("media",{tooltip:"Insert/edit video",onclick:e,stateSelector:["img[data-mce-object]","span[data-mce-object]"]}),a.addMenuItem("media",{icon:"media",text:"Insert/edit video",onclick:e,context:"insert",prependToContext:!0}),a.addCommand("mceMedia",e),this.showDialog=e}); \ No newline at end of file diff --git a/assets/js/tinymce/plugins/nonbreaking/plugin.min.js b/assets/js/tinymce/plugins/nonbreaking/plugin.min.js new file mode 100644 index 0000000..190dc33 --- /dev/null +++ b/assets/js/tinymce/plugins/nonbreaking/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("nonbreaking",function(a){var b=a.getParam("nonbreaking_force_tab");if(a.addCommand("mceNonBreaking",function(){a.insertContent(a.plugins.visualchars&&a.plugins.visualchars.state?' ':" "),a.dom.setAttrib(a.dom.select("span.mce-nbsp"),"data-mce-bogus","1")}),a.addButton("nonbreaking",{title:"Nonbreaking space",cmd:"mceNonBreaking"}),a.addMenuItem("nonbreaking",{text:"Nonbreaking space",cmd:"mceNonBreaking",context:"insert"}),b){var c=+b>1?+b:3;a.on("keydown",function(b){if(9==b.keyCode){if(b.shiftKey)return;b.preventDefault();for(var d=0;c>d;d++)a.execCommand("mceNonBreaking")}})}}); \ No newline at end of file diff --git a/assets/js/tinymce/plugins/noneditable/plugin.min.js b/assets/js/tinymce/plugins/noneditable/plugin.min.js new file mode 100644 index 0000000..49e9d5a --- /dev/null +++ b/assets/js/tinymce/plugins/noneditable/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("noneditable",function(a){function b(a){return function(b){return-1!==(" "+b.attr("class")+" ").indexOf(a)}}function c(b){function c(b){var c=arguments,d=c[c.length-2];return d>0&&'"'==g.charAt(d-1)?b:''+a.dom.encode("string"==typeof c[1]?c[1]:c[0])+""}var d=f.length,g=b.content,h=tinymce.trim(e);if("raw"!=b.format){for(;d--;)g=g.replace(f[d],c);b.content=g}}var d,e,f,g="contenteditable";d=" "+tinymce.trim(a.getParam("noneditable_editable_class","mceEditable"))+" ",e=" "+tinymce.trim(a.getParam("noneditable_noneditable_class","mceNonEditable"))+" ";var h=b(d),i=b(e);f=a.getParam("noneditable_regexp"),f&&!f.length&&(f=[f]),a.on("PreInit",function(){f&&a.on("BeforeSetContent",c),a.parser.addAttributeFilter("class",function(a){for(var b,c=a.length;c--;)b=a[c],h(b)?b.attr(g,"true"):i(b)&&b.attr(g,"false")}),a.serializer.addAttributeFilter(g,function(a){for(var b,c=a.length;c--;)b=a[c],(h(b)||i(b))&&(f&&b.attr("data-mce-content")?(b.name="#text",b.type=3,b.raw=!0,b.value=b.attr("data-mce-content")):b.attr(g,null))})})}); \ No newline at end of file diff --git a/assets/js/tinymce/plugins/pagebreak/plugin.min.js b/assets/js/tinymce/plugins/pagebreak/plugin.min.js new file mode 100644 index 0000000..2a69eba --- /dev/null +++ b/assets/js/tinymce/plugins/pagebreak/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("pagebreak",function(a){var b="mce-pagebreak",c=a.getParam("pagebreak_separator",""),d=new RegExp(c.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g,function(a){return"\\"+a}),"gi"),e='';a.addCommand("mcePageBreak",function(){a.settings.pagebreak_split_block?a.insertContent("

    "+e+"

    "):a.insertContent(e)}),a.addButton("pagebreak",{title:"Page break",cmd:"mcePageBreak"}),a.addMenuItem("pagebreak",{text:"Page break",icon:"pagebreak",cmd:"mcePageBreak",context:"insert"}),a.on("ResolveName",function(c){"IMG"==c.target.nodeName&&a.dom.hasClass(c.target,b)&&(c.name="pagebreak")}),a.on("click",function(c){c=c.target,"IMG"===c.nodeName&&a.dom.hasClass(c,b)&&a.selection.select(c)}),a.on("BeforeSetContent",function(a){a.content=a.content.replace(d,e)}),a.on("PreInit",function(){a.serializer.addNodeFilter("img",function(b){for(var d,e,f=b.length;f--;)if(d=b[f],e=d.attr("class"),e&&-1!==e.indexOf("mce-pagebreak")){var g=d.parent;if(a.schema.getBlockElements()[g.name]&&a.settings.pagebreak_split_block){g.type=3,g.value=c,g.raw=!0,d.remove();continue}d.type=3,d.value=c,d.raw=!0}})})}); \ No newline at end of file diff --git a/assets/js/tinymce/plugins/paste/plugin.min.js b/assets/js/tinymce/plugins/paste/plugin.min.js new file mode 100644 index 0000000..0145b01 --- /dev/null +++ b/assets/js/tinymce/plugins/paste/plugin.min.js @@ -0,0 +1 @@ +!function(a,b){"use strict";function c(a,b){for(var c,d=[],f=0;f/g]),f(h.parse(e)),i}function f(a){function b(a,b,c){return b||c?"\xa0":" "}return a=d(a,[/^[\s\S]*]*>\s*|\s*<\/body[^>]*>[\s\S]*$/g,/|/g,[/( ?)\u00a0<\/span>( ?)/g,b],/
    /g,/
    $/i])}return{filter:d,innerText:e,trimHtml:f}}),d("tinymce/pasteplugin/Clipboard",["tinymce/Env","tinymce/dom/RangeUtils","tinymce/util/VK","tinymce/pasteplugin/Utils","tinymce/util/Delay"],function(a,b,c,d,e){return function(f){function g(a){var b,c=f.dom;if(b=f.fire("BeforePastePreProcess",{content:a}),b=f.fire("PastePreProcess",b),a=b.content,!b.isDefaultPrevented()){if(f.hasEventListeners("PastePostProcess")&&!b.isDefaultPrevented()){var d=c.add(f.getBody(),"div",{style:"display:none"},a);b=f.fire("PastePostProcess",{node:d}),c.remove(d),a=b.node.innerHTML}b.isDefaultPrevented()||f.insertContent(a,{merge:f.settings.paste_merge_formats!==!1,data:{paste:!0}})}}function h(a){a=f.dom.encode(a).replace(/\r\n/g,"\n");var b,c=f.dom.getParent(f.selection.getStart(),f.dom.isBlock),e=f.settings.forced_root_block;e&&(b=f.dom.createHTML(e,f.settings.forced_root_block_attrs),b=b.substr(0,b.length-3)+">"),c&&/^(PRE|DIV)$/.test(c.nodeName)||!e?a=d.filter(a,[[/\n/g,"
    "]]):(a=d.filter(a,[[/\n\n/g,"

    "+b],[/^(.*<\/p>)(

    )$/,b+"$1"],[/\n/g,"
    "]]),-1!=a.indexOf("

    ")&&(a=b+a)),g(a)}function i(){function b(a){var b,c,e,f=a.startContainer;if(b=a.getClientRects(),b.length)return b[0];if(a.collapsed&&1==f.nodeType){for(e=f.childNodes[w.startOffset];e&&3==e.nodeType&&!e.data.length;)e=e.nextSibling;if(e)return"BR"==e.tagName&&(c=d.doc.createTextNode("\ufeff"),e.parentNode.insertBefore(c,e),a=d.createRng(),a.setStartBefore(c),a.setEndAfter(c),b=a.getClientRects(),d.remove(c)),b.length?b[0]:void 0}}var c,d=f.dom,e=f.getBody(),g=f.dom.getViewPort(f.getWin()),h=g.y,i=20;if(w=f.selection.getRng(),f.inline&&(c=f.selection.getScrollContainer(),c&&c.scrollTop>0&&(h=c.scrollTop)),w.getClientRects){var j=b(w);if(j)i=h+(j.top-d.getPos(e).y);else{i=h;var k=w.startContainer;k&&(3==k.nodeType&&k.parentNode!=e&&(k=k.parentNode),1==k.nodeType&&(i=d.getPos(k,c||e).y))}}v=d.add(f.getBody(),"div",{id:"mcepastebin",contentEditable:!0,"data-mce-bogus":"all",style:"position: absolute; top: "+i+"px;width: 10px; height: 10px; overflow: hidden; opacity: 0"},B),(a.ie||a.gecko)&&d.setStyle(v,"left","rtl"==d.getStyle(e,"direction",!0)?65535:-65535),d.bind(v,"beforedeactivate focusin focusout",function(a){a.stopPropagation()}),v.focus(),f.selection.select(v,!0)}function j(){if(v){for(var a;a=f.dom.get("mcepastebin");)f.dom.remove(a),f.dom.unbind(a);w&&f.selection.setRng(w)}v=w=null}function k(){var a,b,c,d,e="";for(a=f.dom.select("div[id=mcepastebin]"),b=0;b>8);return decodeURIComponent(escape(c))}function m(a){var b,c,d;return c="",b=a.indexOf(c),-1!==b&&(a=a.substr(b+c.length)),d="",b=a.indexOf(d),-1!==b&&(a=a.substr(0,b)),a}function n(a){var b={};if(a){if(a.getData){var c=a.getData("Text");c&&c.length>0&&-1==c.indexOf(C)&&(b["text/plain"]=c)}if(a.types)for(var d=0;d')}var e,h,i,j=!1;if(c)for(e=0;e0}function t(a){return c.metaKeyPressed(a)&&86==a.keyCode||a.shiftKey&&45==a.keyCode}function u(){function b(a,b,c){var e;return s(a,"text/html")?e=a["text/html"]:(e=k(),e==B&&(c=!0)),e=d.trimHtml(e),v&&v.firstChild&&"mcepastebin"===v.firstChild.id&&(c=!0),j(),e.length||(c=!0),c&&(e=s(a,"text/plain")&&-1==e.indexOf("

    ")?a["text/plain"]:d.innerText(e)),e==B?void(b||f.windowManager.alert("Please use Ctrl+V/Cmd+V keyboard shortcuts to paste contents.")):void(c?h(e):g(e))}f.on("keydown",function(b){function c(a){t(a)&&!a.isDefaultPrevented()&&j()}if(t(b)&&!b.isDefaultPrevented()){if(x=b.shiftKey&&86==b.keyCode,x&&a.webkit&&-1!=navigator.userAgent.indexOf("Version/"))return;if(b.stopImmediatePropagation(),z=(new Date).getTime(),a.ie&&x)return b.preventDefault(),void f.fire("paste",{ieFake:!0});j(),i(),f.once("keyup",c),f.once("paste",function(){f.off("keyup",c)})}}),f.on("paste",function(c){var d=(new Date).getTime(),g=o(c),h=(new Date).getTime()-d,l=(new Date).getTime()-z-h<1e3,m="text"==y.pasteFormat||x;return x=!1,c.isDefaultPrevented()||q(c)?void j():p(c)?void j():(l||c.preventDefault(),!a.ie||l&&!c.ieFake||(i(),f.dom.bind(v,"paste",function(a){a.stopPropagation()}),f.getDoc().execCommand("Paste",!1,null),g["text/html"]=k()),void(s(g,"text/html")?(c.preventDefault(),b(g,l,m)):e.setEditorTimeout(f,function(){b(g,l,m)},0)))}),f.on("dragstart dragend",function(a){A="dragstart"==a.type}),f.on("drop",function(a){var b=r(a);if(!a.isDefaultPrevented()&&!A&&!p(a,b)&&b&&f.settings.paste_filter_drop!==!1){var c=n(a.dataTransfer),e=c["mce-internal"]||c["text/html"]||c["text/plain"];e&&(a.preventDefault(),f.undoManager.transact(function(){c["mce-internal"]&&f.execCommand("Delete"),f.selection.setRng(b),e=d.trimHtml(e),c["text/html"]?g(e):h(e)}))}}),f.on("dragover dragend",function(a){f.settings.paste_data_images&&a.preventDefault()})}var v,w,x,y=this,z=0,A=!1,B="%MCEPASTEBIN%",C="data:text/mce-internal,";y.pasteHtml=g,y.pasteText=h,f.on("preInit",function(){u(),f.parser.addNodeFilter("img",function(b,c,d){function e(a){return a.data&&a.data.paste===!0}function g(b){b.attr("data-mce-object")||k===a.transparentSrc||b.remove()}function h(a){return 0===a.indexOf("webkit-fake-url")}function i(a){return 0===a.indexOf("data:")}if(!f.settings.paste_data_images&&e(d))for(var j=b.length;j--;){var k=b[j].attributes.map.src;k&&(h(k)?g(b[j]):!f.settings.allow_html_data_urls&&i(k)&&g(b[j]))}})})}}),d("tinymce/pasteplugin/WordFilter",["tinymce/util/Tools","tinymce/html/DomParser","tinymce/html/Schema","tinymce/html/Serializer","tinymce/html/Node","tinymce/pasteplugin/Utils"],function(a,b,c,d,e,f){function g(a){return/h?g&&(g=g.parent.parent):(j=g,g=null)),g&&g.name==b?g.append(a):(j=j||g,g=new e(b,1),f>1&&g.attr("start",""+f),a.wrap(g)),a.name="li",h>k&&j&&j.lastChild.append(g),k=h,d(a),c(a,/^\u00a0+/),c(a,/^\s*([\u2022\u00b7\u00a7\u25CF]|\w+\.)/),c(a,/^\u00a0+/)}for(var g,j,k=1,l=[],m=a.firstChild;"undefined"!=typeof m&&null!==m;)if(l.push(m),m=m.walk(),null!==m)for(;"undefined"!=typeof m&&m.parent!==a;)m=m.walk();for(var n=0;n]+id="?docs-internal-[^>]*>/gi,""),q=q.replace(/
    /gi,""),o=k.paste_retain_style_properties,o&&(p=a.makeMap(o.split(/[, ]/))),k.paste_enable_default_filters!==!1&&g(l.content)){l.wordContent=!0,q=f.filter(q,[//gi,/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,[/<(\/?)s>/gi,"<$1strike>"],[/ /gi,"\xa0"],[/([\s\u00a0]*)<\/span>/gi,function(a,b){return b.length>0?b.replace(/./," ").slice(Math.floor(b.length/2)).split("").join("\xa0"):""}]]);var r=k.paste_word_valid_elements;r||(r="-strong/b,-em/i,-u,-span,-p,-ol,-ul,-li,-h1,-h2,-h3,-h4,-h5,-h6,-p/div,-a[href|name],sub,sup,strike,br,del,table[width],tr,td[colspan|rowspan|width],th[colspan|rowspan|width],thead,tfoot,tbody");var s=new c({valid_elements:r,valid_children:"-li[p]"});a.each(s.elements,function(a){a.attributes["class"]||(a.attributes["class"]={},a.attributesOrder.push("class")),a.attributes.style||(a.attributes.style={},a.attributesOrder.push("style"))});var t=new b({},s);t.addAttributeFilter("style",function(a){for(var b,c=a.length;c--;)b=a[c],b.attr("style",n(b,b.attr("style"))),"span"==b.name&&b.parent&&!b.attributes.length&&b.unwrap()}),t.addAttributeFilter("class",function(a){for(var b,c,d=a.length;d--;)b=a[d],c=b.attr("class"),/^(MsoCommentReference|MsoCommentText|msoDel)$/i.test(c)&&b.remove(),b.attr("class",null)}),t.addNodeFilter("del",function(a){for(var b=a.length;b--;)a[b].remove()}),t.addNodeFilter("a",function(a){for(var b,c,d,e=a.length;e--;)if(b=a[e],c=b.attr("href"),d=b.attr("name"),c&&-1!=c.indexOf("#_msocom_"))b.remove();else if(c&&0===c.indexOf("file://")&&(c=c.split("#")[1],c&&(c="#"+c)),c||d){if(d&&!/^_?(?:toc|edn|ftn)/i.test(d)){b.unwrap();continue}b.attr({href:c,name:d})}else b.unwrap()});var u=t.parse(q);k.paste_convert_word_fake_lists!==!1&&m(u),l.content=new d({validate:k.validate},s).serialize(u)}})}return j.isWordContent=g,j}),d("tinymce/pasteplugin/Quirks",["tinymce/Env","tinymce/util/Tools","tinymce/pasteplugin/WordFilter","tinymce/pasteplugin/Utils"],function(a,b,c,d){return function(e){function f(a){e.on("BeforePastePreProcess",function(b){b.content=a(b.content)})}function g(a){if(!c.isWordContent(a))return a;var f=[];b.each(e.schema.getBlockElements(),function(a,b){f.push(b)});var g=new RegExp("(?:
     [\\s\\r\\n]+|
    )*(<\\/?("+f.join("|")+")[^>]*>)(?:
     [\\s\\r\\n]+|
    )*","g");return a=d.filter(a,[[g,"$1"]]),a=d.filter(a,[[/

    /g,"

    "],[/
    /g," "],[/

    /g,"
    "]])}function h(a){if(c.isWordContent(a))return a;var b=e.settings.paste_webkit_styles;if(e.settings.paste_remove_styles_if_webkit===!1||"all"==b)return a;if(b&&(b=b.split(/[, ]/)),b){var d=e.dom,f=e.selection.getNode();a=a.replace(/(<[^>]+) style="([^"]*)"([^>]*>)/gi,function(a,c,e,g){var h=d.parseStyle(e,"span"),i={};if("none"===b)return c+g;for(var j=0;j]+) style="([^"]*)"([^>]*>)/gi,"$1$3");return a=a.replace(/(<[^>]+) data-mce-style="([^"]+)"([^>]*>)/gi,function(a,b,c,d){return b+' style="'+c+'"'+d})}a.webkit&&f(h),a.ie&&f(g)}}),d("tinymce/pasteplugin/Plugin",["tinymce/PluginManager","tinymce/pasteplugin/Clipboard","tinymce/pasteplugin/WordFilter","tinymce/pasteplugin/Quirks"],function(a,b,c,d){var e;a.add("paste",function(a){function f(){if("text"==g.pasteFormat)this.active(!1),g.pasteFormat="html";else if(g.pasteFormat="text",this.active(!0),!e){var b=a.translate("Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.");a.notificationManager.open({text:b,type:"info"}),e=!0}}var g,h=this,i=a.settings;h.clipboard=g=new b(a),h.quirks=new d(a),h.wordFilter=new c(a),a.settings.paste_as_text&&(h.clipboard.pasteFormat="text"),i.paste_preprocess&&a.on("PastePreProcess",function(a){i.paste_preprocess.call(h,h,a)}),i.paste_postprocess&&a.on("PastePostProcess",function(a){i.paste_postprocess.call(h,h,a)}),a.addCommand("mceInsertClipboardContent",function(a,b){b.content&&h.clipboard.pasteHtml(b.content),b.text&&h.clipboard.pasteText(b.text)}),a.paste_block_drop&&a.on("dragend dragover draggesture dragdrop drop drag",function(a){a.preventDefault(),a.stopPropagation()}),a.settings.paste_data_images||a.on("drop",function(a){var b=a.dataTransfer;b&&b.files&&b.files.length>0&&a.preventDefault()}),a.addButton("pastetext",{icon:"pastetext",tooltip:"Paste as text",onclick:f,active:"text"==h.clipboard.pasteFormat}),a.addMenuItem("pastetext",{text:"Paste as text",selectable:!0,active:g.pasteFormat,onclick:f})})}),f(["tinymce/pasteplugin/Utils"])}(this); \ No newline at end of file diff --git a/assets/js/tinymce/plugins/preview/plugin.min.js b/assets/js/tinymce/plugins/preview/plugin.min.js new file mode 100644 index 0000000..10e57e2 --- /dev/null +++ b/assets/js/tinymce/plugins/preview/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("preview",function(a){var b=a.settings,c=!tinymce.Env.ie;a.addCommand("mcePreview",function(){a.windowManager.open({title:"Preview",width:parseInt(a.getParam("plugin_preview_width","650"),10),height:parseInt(a.getParam("plugin_preview_height","500"),10),html:'",buttons:{text:"Close",onclick:function(){this.parent().parent().close()}},onPostRender:function(){var d,e="";e+='',tinymce.each(a.contentCSS,function(b){e+=''});var f=b.body_id||"tinymce";-1!=f.indexOf("=")&&(f=a.getParam("body_id","","hash"),f=f[a.id]||f);var g=b.body_class||"";-1!=g.indexOf("=")&&(g=a.getParam("body_class","","hash"),g=g[a.id]||"");var h=a.settings.directionality?' dir="'+a.settings.directionality+'"':"";if(d=""+e+'"+a.getContent()+"",c)this.getEl("body").firstChild.src="data:text/html;charset=utf-8,"+encodeURIComponent(d);else{var i=this.getEl("body").firstChild.contentWindow.document;i.open(),i.write(d),i.close()}}})}),a.addButton("preview",{title:"Preview",cmd:"mcePreview"}),a.addMenuItem("preview",{text:"Preview",cmd:"mcePreview",context:"view"})}); \ No newline at end of file diff --git a/assets/js/tinymce/plugins/print/plugin.min.js b/assets/js/tinymce/plugins/print/plugin.min.js new file mode 100644 index 0000000..e91ff54 --- /dev/null +++ b/assets/js/tinymce/plugins/print/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("print",function(a){a.addCommand("mcePrint",function(){a.getWin().print()}),a.addButton("print",{title:"Print",cmd:"mcePrint"}),a.addShortcut("Meta+P","","mcePrint"),a.addMenuItem("print",{text:"Print",cmd:"mcePrint",icon:"print",shortcut:"Meta+P",context:"file"})}); \ No newline at end of file diff --git a/assets/js/tinymce/plugins/save/plugin.min.js b/assets/js/tinymce/plugins/save/plugin.min.js new file mode 100644 index 0000000..b805dbd --- /dev/null +++ b/assets/js/tinymce/plugins/save/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("save",function(a){function b(){var b;return b=tinymce.DOM.getParent(a.id,"form"),!a.getParam("save_enablewhendirty",!0)||a.isDirty()?(tinymce.triggerSave(),a.getParam("save_onsavecallback")?(a.execCallback("save_onsavecallback",a),void a.nodeChanged()):void(b?(a.setDirty(!1),(!b.onsubmit||b.onsubmit())&&("function"==typeof b.submit?b.submit():c(a.translate("Error: Form submit field collision."))),a.nodeChanged()):c(a.translate("Error: No form element found.")))):void 0}function c(b){a.notificationManager.open({text:b,type:"error"})}function d(){var b=tinymce.trim(a.startContent);return a.getParam("save_oncancelcallback")?void a.execCallback("save_oncancelcallback",a):(a.setContent(b),a.undoManager.clear(),void a.nodeChanged())}function e(){var b=this;a.on("nodeChange dirty",function(){b.disabled(a.getParam("save_enablewhendirty",!0)&&!a.isDirty())})}a.addCommand("mceSave",b),a.addCommand("mceCancel",d),a.addButton("save",{icon:"save",text:"Save",cmd:"mceSave",disabled:!0,onPostRender:e}),a.addButton("cancel",{text:"Cancel",icon:!1,cmd:"mceCancel",disabled:!0,onPostRender:e}),a.addShortcut("Meta+S","","mceSave")}); \ No newline at end of file diff --git a/assets/js/tinymce/plugins/searchreplace/plugin.min.js b/assets/js/tinymce/plugins/searchreplace/plugin.min.js new file mode 100644 index 0000000..a139b71 --- /dev/null +++ b/assets/js/tinymce/plugins/searchreplace/plugin.min.js @@ -0,0 +1 @@ +!function(){function a(a){return a&&1==a.nodeType&&"false"===a.contentEditable}function b(b,c,d,e,f){function g(a,b){if(b=b||0,!a[0])throw"findAndReplaceDOMText cannot handle zero-length matches";var c=a.index;if(b>0){var d=a[b];if(!d)throw"Invalid capture group";c+=a[0].indexOf(d),a[0]=d}return[c,c+a[0].length,[a[0]]]}function h(b){var c;if(3===b.nodeType)return b.data;if(o[b.nodeName]&&!n[b.nodeName])return"";if(c="",a(b))return"\n";if((n[b.nodeName]||p[b.nodeName])&&(c+="\n"),b=b.firstChild)do c+=h(b);while(b=b.nextSibling);return c}function i(b,c,d){var e,f,g,h,i=[],j=0,k=b,l=c.shift(),m=0;a:for(;;){if((n[k.nodeName]||p[k.nodeName]||a(k))&&j++,3===k.nodeType&&(!f&&k.length+j>=l[1]?(f=k,h=l[1]-j):e&&i.push(k),!e&&k.length+j>l[0]&&(e=k,g=l[0]-j),j+=k.length),e&&f){if(k=d({startNode:e,startNodeIndex:g,endNode:f,endNodeIndex:h,innerNodes:i,match:l[2],matchIndex:m}),j-=f.length-h,e=null,f=null,i=[],l=c.shift(),m++,!l)break}else if(o[k.nodeName]&&!n[k.nodeName]||!k.firstChild){if(k.nextSibling){k=k.nextSibling;continue}}else if(!a(k)){k=k.firstChild;continue}for(;;){if(k.nextSibling){k=k.nextSibling;break}if(k.parentNode===b)break a;k=k.parentNode}}}function j(a){var b;if("function"!=typeof a){var c=a.nodeType?a:m.createElement(a);b=function(a,b){var d=c.cloneNode(!1);return d.setAttribute("data-mce-index",b),a&&d.appendChild(m.createTextNode(a)),d}}else b=a;return function(a){var c,d,e,f=a.startNode,g=a.endNode,h=a.matchIndex;if(f===g){var i=f;e=i.parentNode,a.startNodeIndex>0&&(c=m.createTextNode(i.data.substring(0,a.startNodeIndex)),e.insertBefore(c,i));var j=b(a.match[0],h);return e.insertBefore(j,i),a.endNodeIndexn;++n){var p=a.innerNodes[n],q=b(p.data,h);p.parentNode.replaceChild(q,p),l.push(q)}var r=b(g.data.substring(0,a.endNodeIndex),h);return e=f.parentNode,e.insertBefore(c,f),e.insertBefore(k,f),e.removeChild(f),e=g.parentNode,e.insertBefore(r,g),e.insertBefore(d,g),e.removeChild(g),r}}var k,l,m,n,o,p,q=[],r=0;if(m=c.ownerDocument,n=f.getBlockElements(),o=f.getWhiteSpaceElements(),p=f.getShortEndedElements(),l=h(c)){if(b.global)for(;k=b.exec(l);)q.push(g(k,e));else k=l.match(b),q.push(g(k,e));return q.length&&(r=q.length,i(c,q,j(d))),r}}function c(a){function c(){function b(){f.statusbar.find("#next").disabled(!g(l+1).length),f.statusbar.find("#prev").disabled(!g(l-1).length)}function c(){tinymce.ui.MessageBox.alert("Could not find the specified string.",function(){f.find("#find")[0].focus()})}var d,e={};d=tinymce.trim(a.selection.getContent({format:"text"}));var f=tinymce.ui.Factory.create({type:"window",layout:"flex",pack:"center",align:"center",onClose:function(){a.focus(),k.done()},onSubmit:function(a){var d,h,i,j;return a.preventDefault(),h=f.find("#case").checked(),j=f.find("#words").checked(),i=f.find("#find").value(),i.length?e.text==i&&e.caseState==h&&e.wholeWord==j?0===g(l+1).length?void c():(k.next(),void b()):(d=k.find(i,h,j),d||c(),f.statusbar.items().slice(1).disabled(0===d),b(),void(e={text:i,caseState:h,wholeWord:j})):(k.done(!1),void f.statusbar.items().slice(1).disabled(!0))},buttons:[{text:"Find",subtype:"primary",onclick:function(){f.submit()}},{text:"Replace",disabled:!0,onclick:function(){k.replace(f.find("#replace").value())||(f.statusbar.items().slice(1).disabled(!0),l=-1,e={})}},{text:"Replace all",disabled:!0,onclick:function(){k.replace(f.find("#replace").value(),!0,!0),f.statusbar.items().slice(1).disabled(!0),e={}}},{type:"spacer",flex:1},{text:"Prev",name:"prev",disabled:!0,onclick:function(){k.prev(),b()}},{text:"Next",name:"next",disabled:!0,onclick:function(){k.next(),b()}}],title:"Find and replace",items:{type:"form",padding:20,labelGap:30,spacing:10,items:[{type:"textbox",name:"find",size:40,label:"Find",value:d},{type:"textbox",name:"replace",size:40,label:"Replace with"},{type:"checkbox",name:"case",text:"Match case",label:" "},{type:"checkbox",name:"words",text:"Whole words",label:" "}]}}).renderTo().reflow()}function d(a){var b=a.getAttribute("data-mce-index");return"number"==typeof b?""+b:b}function e(c){var d,e;return e=a.dom.create("span",{"data-mce-bogus":1}),e.className="mce-match-marker",d=a.getBody(),k.done(!1),b(c,d,e,!1,a.schema)}function f(a){var b=a.parentNode;a.firstChild&&b.insertBefore(a.firstChild,a),a.parentNode.removeChild(a)}function g(b){var c,e=[];if(c=tinymce.toArray(a.getBody().getElementsByTagName("span")),c.length)for(var f=0;f0}var k=this,l=-1;k.init=function(a){a.addMenuItem("searchreplace",{text:"Find and replace",shortcut:"Meta+F",onclick:c,separator:"before",context:"edit"}),a.addButton("searchreplace",{tooltip:"Find and replace",shortcut:"Meta+F",onclick:c}),a.addCommand("SearchReplace",c),a.shortcuts.add("Meta+F","",c)},k.find=function(a,b,c){a=a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&"),a=c?"\\b"+a+"\\b":a;var d=e(new RegExp(a,b?"g":"gi"));return d&&(l=-1,l=h(!0)),d},k.next=function(){var a=h(!0);-1!==a&&(l=a)},k.prev=function(){var a=h(!1);-1!==a&&(l=a)},k.replace=function(b,c,e){var h,m,n,o,p,q,r=l;for(c=c!==!1,n=a.getBody(),m=tinymce.grep(tinymce.toArray(n.getElementsByTagName("span")),j),h=0;hl&&m[h].setAttribute("data-mce-index",p-1)}return a.undoManager.add(),l=r,c?(q=g(r+1).length>0,k.next()):(q=g(r-1).length>0,k.prev()),!e&&q},k.done=function(b){var c,e,g,h;for(e=tinymce.toArray(a.getBody().getElementsByTagName("span")),c=0;c=i.end?(f=l,h=i.end-k):e&&j.push(l),!e&&l.length+k>i.start&&(e=l,g=i.start-k),k+=l.length),e&&f){if(l=d({startNode:e,startNodeIndex:g,endNode:f,endNodeIndex:h,innerNodes:j,match:i.text,matchIndex:m}),k-=f.length-h,e=null,f=null,j=[],i=c.shift(),m++,!i)break}else if(y[l.nodeName]&&!x[l.nodeName]||!l.firstChild){if(l.nextSibling){l=l.nextSibling;continue}}else if(!a(l)){l=l.firstChild;continue}for(;;){if(l.nextSibling){l=l.nextSibling;break}if(l.parentNode===b)break a;l=l.parentNode}}}function g(a){function b(b,c){var d=A[c];d.stencil||(d.stencil=a(d));var e=d.stencil.cloneNode(!1);return e.setAttribute("data-mce-index",c),b&&e.appendChild(B.doc.createTextNode(b)),e}return function(a){var c,d,e,f=a.startNode,g=a.endNode,h=a.matchIndex,i=B.doc;if(f===g){var j=f;e=j.parentNode,a.startNodeIndex>0&&(c=i.createTextNode(j.data.substring(0,a.startNodeIndex)),e.insertBefore(c,j));var k=b(a.match,h);return e.insertBefore(k,j),a.endNodeIndexn;++n){var p=a.innerNodes[n],q=b(p.data,h);p.parentNode.replaceChild(q,p),m.push(q)}var r=b(g.data.substring(0,a.endNodeIndex),h);return e=f.parentNode,e.insertBefore(c,f),e.insertBefore(l,f),e.removeChild(f),e=g.parentNode,e.insertBefore(r,g),e.insertBefore(d,g),e.removeChild(g),r}}function h(a){var b=a.parentNode;b.insertBefore(a.firstChild,a),a.parentNode.removeChild(a)}function i(a){var c=b.getElementsByTagName("*"),d=[];a="number"==typeof a?""+a:null;for(var e=0;eb&&a(A[b],b)!==!1;b++);return this}function m(a){return A.length&&f(b,A,g(a)),this}function n(a,b){if(w&&a.global)for(;v=a.exec(w);)A.push(d(v,b));return this}function o(a){var b,c=i(a?j(a):null);for(b=c.length;b--;)h(c[b]);return this}function p(a){return A[a.getAttribute("data-mce-index")]}function q(a){return i(j(a))[0]}function r(a,b,c){return A.push({start:a,end:a+b,text:w.substr(a,b),data:c}),this}function s(a){var b=i(j(a)),d=c.dom.createRng();return d.setStartBefore(b[0]),d.setEndAfter(b[b.length-1]),d}function t(a,b){var d=s(a);return d.deleteContents(),b.length>0&&d.insertNode(c.dom.doc.createTextNode(b)),d}function u(){return A.splice(0,A.length),o(),this}var v,w,x,y,z,A=[],B=c.dom;return x=c.schema.getBlockElements(),y=c.schema.getWhiteSpaceElements(),z=c.schema.getShortEndedElements(),w=e(b),{text:w,matches:A,each:l,filter:k,reset:u,matchFromElement:p,elementFromMatch:q,find:n,add:r,wrap:m,unwrap:o,replace:t,rangeFromMatch:s,indexOf:j}}}),d("tinymce/spellcheckerplugin/Plugin",["tinymce/spellcheckerplugin/DomTextMatcher","tinymce/PluginManager","tinymce/util/Tools","tinymce/ui/Menu","tinymce/dom/DOMUtils","tinymce/util/XHR","tinymce/util/URI","tinymce/util/JSON"],function(a,b,c,d,e,f,g,h){b.add("spellchecker",function(b,i){function j(){return E.textMatcher||(E.textMatcher=new a(b.getBody(),b)),E.textMatcher}function k(a,b){var d=[];return c.each(b,function(a){d.push({selectable:!0,text:a.name,data:a.value})}),d}function l(a){for(var b in a)return!1;return!0}function m(a,f){var g=[],h=A[a];c.each(h,function(a){g.push({text:a,onclick:function(){b.insertContent(b.dom.encode(a)),b.dom.remove(f),r()}})}),g.push({text:"-"}),D&&g.push({text:"Add to Dictionary",onclick:function(){s(a,f)}}),g.push.apply(g,[{text:"Ignore",onclick:function(){t(a,f)}},{text:"Ignore all",onclick:function(){t(a,f,!0)}}]),C=new d({items:g,context:"contextmenu",onautohide:function(a){-1!=a.target.className.indexOf("spellchecker")&&a.preventDefault()},onhide:function(){C.remove(),C=null}}),C.renderTo(document.body);var i=e.DOM.getPos(b.getContentAreaContainer()),j=b.dom.getPos(f[0]),k=b.dom.getRoot();"BODY"==k.nodeName?(j.x-=k.ownerDocument.documentElement.scrollLeft||k.scrollLeft,j.y-=k.ownerDocument.documentElement.scrollTop||k.scrollTop):(j.x-=k.scrollLeft,j.y-=k.scrollTop),i.x+=j.x,i.y+=j.y,C.moveTo(i.x,i.y+f[0].offsetHeight)}function n(){return b.getParam("spellchecker_wordchar_pattern")||new RegExp('[^\\s!"#$%&()*+,-./:;<=>?@[\\]^_{|}`\xa7\xa9\xab\xae\xb1\xb6\xb7\xb8\xbb\xbc\xbd\xbe\xbf\xd7\xf7\xa4\u201d\u201c\u201e\xa0\u2002\u2003\u2009]+',"g")}function o(a,d,e,j){var k={method:a},l="";"spellcheck"==a&&(k.text=d,k.lang=F.spellchecker_language),"addToDictionary"==a&&(k.word=d),c.each(k,function(a,b){l&&(l+="&"),l+=b+"="+encodeURIComponent(a)}),f.send({url:new g(i).toAbsolute(F.spellchecker_rpc_url),type:"post",content_type:"application/x-www-form-urlencoded",data:l,success:function(a){if(a=h.parse(a))a.error?j(a.error):e(a);else{var c=b.translate("Server response wasn't proper JSON.");j(c)}},error:function(){var a=b.translate("The spelling service was not found: (")+F.spellchecker_rpc_url+b.translate(")");j(a)}})}function p(a,b,c,d){var e=F.spellchecker_callback||o;e.call(E,a,b,c,d)}function q(){function a(a){b.notificationManager.open({text:a,type:"error"}),b.setProgressState(!1),u()}u()||(b.setProgressState(!0),p("spellcheck",j().text,y,a),b.focus())}function r(){b.dom.select("span.mce-spellchecker-word").length||u()}function s(a,c){b.setProgressState(!0),p("addToDictionary",a,function(){b.setProgressState(!1),b.dom.remove(c,!0),r()},function(a){b.notificationManager.open({text:a,type:"error"}),b.setProgressState(!1)})}function t(a,d,e){b.selection.collapse(),e?c.each(b.dom.select("span.mce-spellchecker-word"),function(c){c.getAttribute("data-mce-word")==a&&b.dom.remove(c,!0)}):b.dom.remove(d,!0),r()}function u(){return j().reset(),E.textMatcher=null,B?(B=!1,b.fire("SpellcheckEnd"),!0):void 0}function v(a){var b=a.getAttribute("data-mce-index");return"number"==typeof b?""+b:b}function w(a){var d,e=[];if(d=c.toArray(b.getBody().getElementsByTagName("span")),d.length)for(var f=0;f0){var e=b.dom.createRng();e.setStartBefore(d[0]),e.setEndAfter(d[d.length-1]),b.selection.setRng(e),m(c.getAttribute("data-mce-word"),d)}}}),b.addMenuItem("spellchecker",{text:"Spellcheck",context:"tools",onclick:q,selectable:!0,onPostRender:function(){var a=this;a.active(B),b.on("SpellcheckStart SpellcheckEnd",function(){a.active(B)})}});var H={tooltip:"Spellcheck",onclick:q,onPostRender:function(){var a=this;b.on("SpellcheckStart SpellcheckEnd",function(){a.active(B)})}};z.length>1&&(H.type="splitbutton",H.menu=z,H.onshow=x,H.onselect=function(a){F.spellchecker_language=a.control.settings.data}),b.addButton("spellchecker",H),b.addCommand("mceSpellCheck",q),b.on("remove",function(){C&&(C.remove(),C=null)}),b.on("change",r),this.getTextMatcher=j,this.getWordCharPattern=n,this.markErrors=y,this.getLanguage=function(){return F.spellchecker_language},F.spellchecker_language=F.spellchecker_language||F.language||"en"})}),f(["tinymce/spellcheckerplugin/DomTextMatcher"])}(this); \ No newline at end of file diff --git a/assets/js/tinymce/plugins/tabfocus/plugin.min.js b/assets/js/tinymce/plugins/tabfocus/plugin.min.js new file mode 100644 index 0000000..df420ac --- /dev/null +++ b/assets/js/tinymce/plugins/tabfocus/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("tabfocus",function(a){function b(a){9!==a.keyCode||a.ctrlKey||a.altKey||a.metaKey||a.preventDefault()}function c(b){function c(c){function f(a){return"BODY"===a.nodeName||"hidden"!=a.type&&"none"!=a.style.display&&"hidden"!=a.style.visibility&&f(a.parentNode)}function i(a){return/INPUT|TEXTAREA|BUTTON/.test(a.tagName)&&tinymce.get(b.id)&&-1!=a.tabIndex&&f(a)}if(h=d.select(":input:enabled,*[tabindex]:not(iframe)"),e(h,function(b,c){return b.id==a.id?(g=c,!1):void 0}),c>0){for(j=g+1;j=0;j--)if(i(h[j]))return h[j];return null}var g,h,i,j;if(!(9!==b.keyCode||b.ctrlKey||b.altKey||b.metaKey||b.isDefaultPrevented())&&(i=f(a.getParam("tab_focus",a.getParam("tabfocus_elements",":prev,:next"))),1==i.length&&(i[1]=i[0],i[0]=":prev"),h=b.shiftKey?":prev"==i[0]?c(-1):d.get(i[0]):":next"==i[1]?c(1):d.get(i[1]))){var k=tinymce.get(h.id||h.name);h.id&&k?k.focus():tinymce.util.Delay.setTimeout(function(){tinymce.Env.webkit||window.focus(),h.focus()},10),b.preventDefault()}}var d=tinymce.DOM,e=tinymce.each,f=tinymce.explode;a.on("init",function(){a.inline&&tinymce.DOM.setAttrib(a.getBody(),"tabIndex",null),a.on("keyup",b),tinymce.Env.gecko?a.on("keypress keydown",c):a.on("keydown",c)})}); \ No newline at end of file diff --git a/assets/js/tinymce/plugins/table/plugin.min.js b/assets/js/tinymce/plugins/table/plugin.min.js new file mode 100644 index 0000000..baff637 --- /dev/null +++ b/assets/js/tinymce/plugins/table/plugin.min.js @@ -0,0 +1,2 @@ +!function(a,b){"use strict";function c(a,b){for(var c,d=[],g=0;g10)&&(b.innerHTML='
    ')}return{getSpanVal:b,paddCell:c}}),d("tinymce/tableplugin/TableGrid",["tinymce/util/Tools","tinymce/Env","tinymce/tableplugin/Utils"],function(a,c,d){var e=a.each,f=d.getSpanVal;return function(g,h){function i(a){return a===g.getBody()}function j(){var a=0;J=[],K=0,e(["thead","tbody","tfoot"],function(b){var c=P.select("> "+b+" tr",h);e(c,function(c,d){d+=a,e(P.select("> td, > th",c),function(a,c){var e,g,h,i;if(J[d])for(;J[d][c];)c++;for(h=f(a,"rowspan"),i=f(a,"colspan"),g=d;d+h>g;g++)for(J[g]||(J[g]=[]),e=c;c+i>e;e++)J[g][e]={part:b,real:g==d&&e==c,elm:a,rowspan:h,colspan:i};K=Math.max(K,c+1)})}),a+=c.length})}function k(a,b){return a=a.cloneNode(b),a.removeAttribute("id"),a}function l(a,b){var c;return c=J[b],c?c[a]:void 0}function m(a,b,c){a&&(c=parseInt(c,10),1===c?a.removeAttribute(b,1):a.setAttribute(b,c,1))}function n(a){return a&&(P.hasClass(a.elm,"mce-item-selected")||a==N)}function o(){var a=[];return e(h.rows,function(b){e(b.cells,function(c){return P.hasClass(c,"mce-item-selected")||N&&c==N.elm?(a.push(b),!1):void 0})}),a}function p(){var a=P.createRng();i(h)||(a.setStartAfter(h),a.setEndAfter(h),O.setRng(a),P.remove(h))}function q(b){var f,h={};return g.settings.table_clone_elements!==!1&&(h=a.makeMap((g.settings.table_clone_elements||"strong em b i span font h1 h2 h3 h4 h5 h6 p div").toUpperCase(),/[ ,]/)),a.walk(b,function(a){var d;return 3==a.nodeType?(e(P.getParents(a.parentNode,null,b).reverse(),function(a){h[a.nodeName]&&(a=k(a,!1),f?d&&d.appendChild(a):f=d=a,d=a)}),d&&(d.innerHTML=c.ie?" ":'
    '),!1):void 0},"childNodes"),b=k(b,!1),m(b,"rowSpan",1),m(b,"colSpan",1),f?b.appendChild(f):d.paddCell(b),b}function r(){var a,b=P.createRng();return e(P.select("tr",h),function(a){0===a.cells.length&&P.remove(a)}),0===P.select("tr",h).length?(b.setStartBefore(h),b.setEndBefore(h),O.setRng(b),void P.remove(h)):(e(P.select("thead,tbody,tfoot",h),function(a){0===a.rows.length&&P.remove(a)}),j(),void(L&&(a=J[Math.min(J.length-1,L.y)],a&&(O.select(a[Math.min(a.length-1,L.x)].elm,!0),O.collapse(!0)))))}function s(a,b,c,d){var e,f,g,h,i;for(e=J[b][a].elm.parentNode,g=1;c>=g;g++)if(e=P.getNext(e,"tr")){for(f=a;f>=0;f--)if(i=J[b+g][f].elm,i.parentNode==e){for(h=1;d>=h;h++)P.insertAfter(q(i),i);break}if(-1==f)for(h=1;d>=h;h++)e.insertBefore(q(e.cells[0]),e.cells[0])}}function t(){e(J,function(a,b){e(a,function(a,c){var d,e,g;if(n(a)&&(a=a.elm,d=f(a,"colspan"),e=f(a,"rowspan"),d>1||e>1)){for(m(a,"rowSpan",1),m(a,"colSpan",1),g=0;d-1>g;g++)P.insertAfter(q(a),a);s(c,b,e-1,d)}})})}function u(b,c,d){var f,g,h,i,k,o,p,q,s,u,v;if(b?(f=E(b),g=f.x,h=f.y,i=g+(c-1),k=h+(d-1)):(L=M=null,e(J,function(a,b){e(a,function(a,c){n(a)&&(L||(L={x:c,y:b}),M={x:c,y:b})})}),L&&(g=L.x,h=L.y,i=M.x,k=M.y)),q=l(g,h),s=l(i,k),q&&s&&q.part==s.part){for(t(),j(),q=l(g,h).elm,m(q,"colSpan",i-g+1),m(q,"rowSpan",k-h+1),p=h;k>=p;p++)for(o=g;i>=o;o++)J[p]&&J[p][o]&&(b=J[p][o].elm,b!=q&&(u=a.grep(b.childNodes),e(u,function(a){q.appendChild(a)}),u.length&&(u=a.grep(q.childNodes),v=0,e(u,function(a){"BR"==a.nodeName&&P.getAttrib(a,"data-mce-bogus")&&v++0&&J[c-1][h]&&(o=J[c-1][h].elm,p=f(o,"rowSpan"),p>1)){m(o,"rowSpan",p+1);continue}}else if(p=f(d,"rowspan"),p>1){m(d,"rowSpan",p+1);continue}l=q(d),m(l,"colSpan",d.colSpan),j.appendChild(l),g=d}j.hasChildNodes()&&(a?i.parentNode.insertBefore(j,i):P.insertAfter(j,i))}}function w(a){var b,c;e(J,function(c){return e(c,function(c,d){return n(c)&&(b=d,a)?!1:void 0}),a?!b:void 0}),e(J,function(d,e){var g,h,i;d[b]&&(g=d[b].elm,g!=c&&(i=f(g,"colspan"),h=f(g,"rowspan"),1==i?a?(g.parentNode.insertBefore(q(g),g),s(b,e,h-1,i)):(P.insertAfter(q(g),g),s(b,e,h-1,i)):m(g,"colSpan",g.colSpan+1),c=g))})}function x(b){return a.grep(y(b),n)}function y(a){var b=[];return e(a,function(a){e(a,function(a){b.push(a)})}),b}function z(){var b=[];if(i(h)){if(1==J[0].length)return;if(x(J).length==y(J).length)return}e(J,function(c){e(c,function(c,d){n(c)&&-1===a.inArray(b,d)&&(e(J,function(a){var b,c=a[d].elm;b=f(c,"colSpan"),b>1?m(c,"colSpan",b-1):P.remove(c)}),b.push(d))})}),r()}function A(){function a(a){var b,c;e(a.cells,function(a){var c=f(a,"rowSpan");c>1&&(m(a,"rowSpan",c-1),b=E(a),s(b.x,b.y,1,1))}),b=E(a.cells[0]),e(J[b.y],function(a){var b;a=a.elm,a!=c&&(b=f(a,"rowSpan"),1>=b?P.remove(a):m(a,"rowSpan",b-1),c=a)})}var b;b=o(),i(h)&&b.length==h.rows.length||(e(b.reverse(),function(b){a(b)}),r())}function B(){var a=o();if(!i(h)||a.length!=h.rows.length)return P.remove(a),r(),a}function C(){var a=o();return e(a,function(b,c){a[c]=k(b,!0)}),a}function D(a,b){var c=o(),d=c[b?0:c.length-1],f=d.cells.length;a&&(e(J,function(a){var b;return f=0,e(a,function(a){a.real&&(f+=a.colspan),a.elm.parentNode==d&&(b=1)}),b?!1:void 0}),b||a.reverse(),e(a,function(a){var c,e,g=a.cells.length;for(c=0;g>c;c++)e=a.cells[c],m(e,"colSpan",1),m(e,"rowSpan",1);for(c=g;f>c;c++)a.appendChild(q(a.cells[g-1]));for(c=f;g>c;c++)P.remove(a.cells[c]);b?d.parentNode.insertBefore(a,d):P.insertAfter(a,d)}),P.removeClass(P.select("td.mce-item-selected,th.mce-item-selected"),"mce-item-selected"))}function E(a){var b;return e(J,function(c,d){return e(c,function(c,e){return c.elm==a?(b={x:e,y:d},!1):void 0}),!b}),b}function F(a){L=E(a)}function G(){var a,b;return a=b=0,e(J,function(c,d){e(c,function(c,e){var f,g;n(c)&&(c=J[d][e],e>a&&(a=e),d>b&&(b=d),c.real&&(f=c.colspan-1,g=c.rowspan-1,f&&e+f>a&&(a=e+f),g&&d+g>b&&(b=d+g)))})}),{x:a,y:b}}function H(a){var b,c,d,e,f,g,h,i,j,k;if(M=E(a),L&&M){for(b=Math.min(L.x,M.x),c=Math.min(L.y,M.y),d=Math.max(L.x,M.x),e=Math.max(L.y,M.y),f=d,g=e,k=c;g>=k;k++)a=J[k][b],a.real||b-(a.colspan-1)=j;j++)a=J[c][j],a.real||c-(a.rowspan-1)=k;k++)for(j=b;d>=j;j++)a=J[k][j],a.real&&(h=a.colspan-1,i=a.rowspan-1,h&&j+h>f&&(f=j+h),i&&k+i>g&&(g=k+i));for(P.removeClass(P.select("td.mce-item-selected,th.mce-item-selected"),"mce-item-selected"),k=c;g>=k;k++)for(j=b;f>=j;j++)J[k][j]&&P.addClass(J[k][j].elm,"mce-item-selected")}}function I(a,b){var c,d,e;c=E(a),d=c.y*K+c.x;do{if(d+=b,e=l(d%K,Math.floor(d/K)),!e)break;if(e.elm!=a)return O.select(e.elm,!0),P.isEmpty(e.elm)&&O.collapse(!0),!0}while(e.elm==a);return!1}var J,K,L,M,N,O=g.selection,P=O.dom;h=h||P.getParent(O.getStart(!0),"table"),j(),N=P.getParent(O.getStart(!0),"th,td"),N&&(L=E(N),M=G(),N=l(L.x,L.y)),a.extend(this,{deleteTable:p,split:t,merge:u,insertRow:v,insertCol:w,deleteCols:z,deleteRows:A,cutRows:B,copyRows:C,pasteRows:D,getPos:E,setStartCell:F,setEndCell:H,moveRelIdx:I,refresh:j})}}),d("tinymce/tableplugin/Quirks",["tinymce/util/VK","tinymce/util/Delay","tinymce/Env","tinymce/util/Tools","tinymce/tableplugin/Utils"],function(a,b,c,d,e){var f=d.each,g=e.getSpanVal;return function(h){function i(){function c(c){function d(a,b){var d=a?"previousSibling":"nextSibling",f=h.dom.getParent(b,"tr"),g=f[d];if(g)return r(h,b,g,a),c.preventDefault(),!0;var i=h.dom.getParent(f,"table"),l=f.parentNode,m=l.nodeName.toLowerCase();if("tbody"===m||m===(a?"tfoot":"thead")){var n=e(a,i,l,"tbody");if(null!==n)return j(a,n,b)}return k(a,f,d,i)}function e(a,b,c,d){var e=h.dom.select(">"+d,b),f=e.indexOf(c);if(a&&0===f||!a&&f===e.length-1)return i(a,b);if(-1===f){var g="thead"===c.tagName.toLowerCase()?0:e.length-1;return e[g]}return e[f+(a?-1:1)]}function i(a,b){var c=a?"thead":"tfoot",d=h.dom.select(">"+c,b);return 0!==d.length?d[0]:null}function j(a,b,d){var e=l(b,a);return e&&r(h,d,e,a),c.preventDefault(),!0}function k(a,b,e,f){var g=f[e];if(g)return m(g),!0;var i=h.dom.getParent(f,"td,th");if(i)return d(a,i,c);var j=l(b,!a);return m(j),c.preventDefault(),!1}function l(a,b){var c=a&&a[b?"lastChild":"firstChild"];return c&&"BR"===c.nodeName?h.dom.getParent(c,"td,th"):c}function m(a){h.selection.setCursorLocation(a,0)}function n(){return u==a.UP||u==a.DOWN}function o(a){var b=a.selection.getNode(),c=a.dom.getParent(b,"tr");return null!==c}function p(a){for(var b=0,c=a;c.previousSibling;)c=c.previousSibling,b+=g(c,"colspan");return b}function q(a,b){var c=0,d=0;return f(a.children,function(a,e){return c+=g(a,"colspan"),d=e,c>b?!1:void 0}),d}function r(a,b,c,d){var e=p(h.dom.getParent(b,"td,th")),f=q(c,e),g=c.childNodes[f],i=l(g,d);m(i||g)}function s(a){var b=h.selection.getNode(),c=h.dom.getParent(b,"td,th"),d=h.dom.getParent(a,"td,th");return c&&c!==d&&t(c,d)}function t(a,b){return h.dom.getParent(a,"TABLE")===h.dom.getParent(b,"TABLE")}var u=c.keyCode;if(n()&&o(h)){var v=h.selection.getNode();b.setEditorTimeout(h,function(){s(v)&&d(!c.shiftKey&&u===a.UP,v,c)},0)}}h.on("KeyDown",function(a){c(a)})}function j(){function a(a,b){var c,d=b.ownerDocument,e=d.createRange();return e.setStartBefore(b),e.setEnd(a.endContainer,a.endOffset),c=d.createElement("body"),c.appendChild(e.cloneContents()),0===c.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi,"-").replace(/<[^>]+>/g,"").length}h.on("KeyDown",function(b){var c,d,e=h.dom;(37==b.keyCode||38==b.keyCode)&&(c=h.selection.getRng(),d=e.getParent(c.startContainer,"table"),d&&h.getBody().firstChild==d&&a(c,d)&&(c=e.createRng(),c.setStartBefore(d),c.setEndBefore(d),h.selection.setRng(c),b.preventDefault()))})}function k(){h.on("KeyDown SetContent VisualAid",function(){var a;for(a=h.getBody().lastChild;a;a=a.previousSibling)if(3==a.nodeType){if(a.nodeValue.length>0)break}else if(1==a.nodeType&&("BR"==a.tagName||!a.getAttribute("data-mce-bogus")))break;a&&"TABLE"==a.nodeName&&(h.settings.forced_root_block?h.dom.add(h.getBody(),h.settings.forced_root_block,h.settings.forced_root_block_attrs,c.ie&&c.ie<11?" ":'
    '):h.dom.add(h.getBody(),"br",{"data-mce-bogus":"1"}))}),h.on("PreProcess",function(a){var b=a.node.lastChild;b&&("BR"==b.nodeName||1==b.childNodes.length&&("BR"==b.firstChild.nodeName||"\xa0"==b.firstChild.nodeValue))&&b.previousSibling&&"TABLE"==b.previousSibling.nodeName&&h.dom.remove(b)})}function l(){function a(a,b,c,d){var e,f,g,h=3,i=a.dom.getParent(b.startContainer,"TABLE");return i&&(e=i.parentNode),f=b.startContainer.nodeType==h&&0===b.startOffset&&0===b.endOffset&&d&&("TR"==c.nodeName||c==e),g=("TD"==c.nodeName||"TH"==c.nodeName)&&!d,f||g}function b(){var b=h.selection.getRng(),c=h.selection.getNode(),d=h.dom.getParent(b.startContainer,"TD,TH");if(a(h,b,c,d)){d||(d=c);for(var e=d.lastChild;e.lastChild;)e=e.lastChild;3==e.nodeType&&(b.setEnd(e,e.data.length),h.selection.setRng(b))}}h.on("KeyDown",function(){b()}),h.on("MouseDown",function(a){2!=a.button&&b()})}function m(){function b(a){h.selection.select(a,!0),h.selection.collapse(!0)}function c(a){h.$(a).empty(),e.paddCell(a)}h.on("keydown",function(e){if((e.keyCode==a.DELETE||e.keyCode==a.BACKSPACE)&&!e.isDefaultPrevented()){var f,g,i,j;if(f=h.dom.getParent(h.selection.getStart(),"table")){if(g=h.dom.select("td,th",f),i=d.grep(g,function(a){return h.dom.hasClass(a,"mce-item-selected")}),0===i.length)return j=h.dom.getParent(h.selection.getStart(),"td,th"),void(h.selection.isCollapsed()&&j&&h.dom.isEmpty(j)&&(e.preventDefault(),c(j),b(j)));e.preventDefault(),h.undoManager.transact(function(){g.length==i.length?h.execCommand("mceTableDelete"):(d.each(i,c),b(i[0]))})}}})}m(),c.webkit&&(i(),l()),c.gecko&&(j(),k()),c.ie>10&&(j(),k())}}),d("tinymce/tableplugin/CellSelection",["tinymce/tableplugin/TableGrid","tinymce/dom/TreeWalker","tinymce/util/Tools"],function(a,b,c){return function(d){function e(a){d.getBody().style.webkitUserSelect="",(a||l)&&(d.dom.removeClass(d.dom.select("td.mce-item-selected,th.mce-item-selected"),"mce-item-selected"),l=!1)}function f(b){var c,e,f=b.target;if(!j&&h&&(g||f!=h)&&("TD"==f.nodeName||"TH"==f.nodeName)){e=k.getParent(f,"table"),e==i&&(g||(g=new a(d,e),g.setStartCell(h),d.getBody().style.webkitUserSelect="none"),g.setEndCell(f),l=!0),c=d.selection.getSel();try{c.removeAllRanges?c.removeAllRanges():c.empty()}catch(m){}b.preventDefault()}}var g,h,i,j,k=d.dom,l=!0;return d.on("MouseDown",function(a){2==a.button||j||(e(),h=k.getParent(a.target,"td,th"),i=k.getParent(h,"table"))}),d.on("mouseover",f),d.on("remove",function(){k.unbind(d.getDoc(),"mouseover",f)}),d.on("MouseUp",function(){function a(a,d){var f=new b(a,a);do{if(3==a.nodeType&&0!==c.trim(a.nodeValue).length)return void(d?e.setStart(a,0):e.setEnd(a,a.nodeValue.length));if("BR"==a.nodeName)return void(d?e.setStartBefore(a):e.setEndBefore(a))}while(a=d?f.next():f.prev())}var e,f,j,l,m,n=d.selection;if(h){if(g&&(d.getBody().style.webkitUserSelect=""),f=k.select("td.mce-item-selected,th.mce-item-selected"),f.length>0){e=k.createRng(),l=f[0],e.setStartBefore(l),e.setEndAfter(l),a(l,1),j=new b(l,k.getParent(f[0],"table"));do if("TD"==l.nodeName||"TH"==l.nodeName){if(!k.hasClass(l,"mce-item-selected"))break;m=l}while(l=j.next());a(m),n.setRng(e)}d.nodeChanged(),h=g=i=null}}),d.on("KeyUp Drop SetContent",function(a){e("setcontent"==a.type),h=g=i=null,j=!1}),d.on("ObjectResizeStart ObjectResized",function(a){j="objectresized"!=a.type}),{clear:e}}}),d("tinymce/tableplugin/Dialogs",["tinymce/util/Tools","tinymce/Env"],function(a,b){var c=a.each;return function(d){function e(){var a=d.settings.color_picker_callback;return a?function(){var b=this;a.call(d,function(a){b.value(a).fire("change")},b.value())}:void 0}function f(a){return{title:"Advanced",type:"form",defaults:{onchange:function(){l(a,this.parents().reverse()[0],"style"==this.name())}},items:[{label:"Style",name:"style",type:"textbox"},{type:"form",padding:0,formItemDefaults:{layout:"grid",alignH:["start","right"]},defaults:{size:7},items:[{label:"Border color",type:"colorbox",name:"borderColor",onaction:e()},{label:"Background color",type:"colorbox",name:"backgroundColor",onaction:e()}]}]}}function g(a){return a?a.replace(/px$/,""):""}function h(a){return/^[0-9]+$/.test(a)&&(a+="px"),a}function i(a){c("left center right".split(" "),function(b){d.formatter.remove("align"+b,{},a)})}function j(a){c("top middle bottom".split(" "),function(b){d.formatter.remove("valign"+b,{},a)})}function k(b,c,d){function e(b,d){return d=d||[],a.each(b,function(a){var b={text:a.text||a.title};a.menu?b.menu=e(a.menu):(b.value=a.value,c&&c(b)),d.push(b)}),d}return e(b,d||[])}function l(a,b,c){var d=b.toJSON(),e=a.parseStyle(d.style);c?(b.find("#borderColor").value(e["border-color"]||"")[0].fire("change"),b.find("#backgroundColor").value(e["background-color"]||"")[0].fire("change")):(e["border-color"]=d.borderColor,e["background-color"]=d.backgroundColor),b.find("#style").value(a.serializeStyle(a.parseStyle(a.serializeStyle(e))))}function m(a,b,c){var d=a.parseStyle(a.getAttrib(c,"style"));d["border-color"]&&(b.borderColor=d["border-color"]),d["background-color"]&&(b.backgroundColor=d["background-color"]),b.style=a.serializeStyle(d)}function n(a,b,d){var e=a.parseStyle(a.getAttrib(b,"style"));c(d,function(a){e[a.name]=a.value}),a.setAttrib(b,"style",a.serializeStyle(a.parseStyle(a.serializeStyle(e))))}var o=this;o.tableProps=function(){o.table(!0)},o.table=function(e){function j(){function c(a,b,d){if("TD"===a.tagName||"TH"===a.tagName)v.setStyle(a,b,d);else if(a.children)for(var e=0;e',p.insertBefore(e,p.firstChild)),i(p),w.align&&d.formatter.apply("align"+w.align,{},p),d.focus(),d.addVisual()})}function o(a,b){function c(a,c){for(var d=0;dd;d++)c.push(d);return c}function A(a,b,c){for(var d,e=a(),f=0;f0?r(d,e,g):[],m=h.length>0?r(k,l,h):[];v(j,a.offsetWidth,i),w(m,a.offsetHeight,i)}function E(a,b,c,d){if(0>b||b>=a.length-1)return"";var e=a[b];if(e)e={value:e,delta:0};else for(var f=a.slice(0,b).reverse(),g=0;g0?e:f}function H(b,c,d){for(var e=B(b),f=a.map(e,function(a){return k(a.colIndex,a.element).x}),g=[],h=0;h1?E(f,h):G(e[h].element,c,d);j=j?j:ua,g.push(j)}return g}function I(a){var b=F(a,"height"),c=parseInt(b,10);return P(b)&&(c=0),!isNaN(c)&&c>0?c:n(a,"height")}function J(b){for(var c=C(b),e=a.map(c,function(a){return d(a.rowIndex,a.element).y}),f=[],g=0;g1?E(e,g):I(c[g].element);i=i?i:va,f.push(i)}return f}function K(b,c,d,e,f){function g(b){return a.map(b,function(){return 0})}function h(){var a;if(f)a=[100-l[0]];else{var b=Math.max(e,l[0]+d);a=[b-l[0]]}return a}function i(a,b){var c,f=g(l.slice(0,a)),h=g(l.slice(b+1));if(d>=0){var i=Math.max(e,l[b]-d);c=f.concat([d,i-l[b]]).concat(h)}else{var j=Math.max(e,l[a]+d),k=l[a]-j;c=f.concat([j-l[a],k]).concat(h)}return c}function j(a,b){var c,f=g(l.slice(0,b));if(d>=0)c=f.concat([d]);else{var h=Math.max(e,l[b]+d);c=f.concat([h-l[b]])}return c}var k,l=b.slice(0);return k=0===b.length?[]:1===b.length?h():0===c?i(0,1):c>0&&ce;e++)d+=c[e];return d}function M(b,c){var d=b.getAllCells();return a.map(d,function(a){var b=L(a.colIndex,a.colIndex+a.colspan,c);return{element:a.element,width:b,colspan:a.colspan}})}function N(b,c){var d=b.getAllCells();return a.map(d,function(a){var b=L(a.rowIndex,a.rowIndex+a.rowspan,c);return{element:a.element,height:b,rowspan:a.rowspan}})}function O(b,c){var d=b.getAllRows();return a.map(d,function(a,b){return{element:a.element,height:c[b]}})}function P(a){return xa.test(a)}function Q(a){return ya.test(a)}function R(b,d,e){function f(b,d){a.each(b,function(a){c.dom.setStyle(a.element,"width",a.width+d),c.dom.setAttrib(a.element,"width",null)})}function g(){return ec;c++){for(e+="
    ",d=0;a>d;d++)e+="";e+=""}return e+="
    "+(h.ie?" ":"
    ")+"
    ",f.undoManager.transact(function(){f.insertContent(e),g=f.dom.get("__mce"),f.dom.setAttrib(g,"id",null),f.dom.setAttribs(g,f.settings.table_default_attributes||{}),f.dom.setStyles(g,f.settings.table_default_styles||{})}),g}function j(a,b){function c(){a.disabled(!f.dom.getParent(f.selection.getStart(),b)),f.selection.selectorChanged(b,function(b){a.disabled(!b)})}f.initialized?c():f.on("init",c)}function l(){j(this,"table")}function m(){j(this,"td,th")}function n(){var a="";a='';for(var b=0;10>b;b++){a+="";for(var c=0;10>c;c++)a+='';a+=""}return a+="
    ",a+=''}function o(a,b,c){var d,e,g,h,i,j=c.getEl().getElementsByTagName("table")[0],k=c.isRtl()||"tl-tr"==c.parent().rel;for(j.nextSibling.innerHTML=a+1+" x "+(b+1),k&&(a=9-a),e=0;10>e;e++)for(d=0;10>d;d++)h=j.rows[e].childNodes[d].firstChild,i=(k?d>=a:a>=d)&&b>=e,f.dom.toggleClass(h,"mce-active",i),i&&(g=h);return g.parentNode}function p(){f.addButton("tableprops",{title:"Table properties",onclick:u.tableProps,icon:"table"}),f.addButton("tabledelete",{title:"Delete table",onclick:g("mceTableDelete")}),f.addButton("tablecellprops",{title:"Cell properties",onclick:g("mceTableCellProps")}),f.addButton("tablemergecells",{title:"Merge cells",onclick:g("mceTableMergeCells")}),f.addButton("tablesplitcells",{title:"Split cell",onclick:g("mceTableSplitCells")}),f.addButton("tableinsertrowbefore",{title:"Insert row before",onclick:g("mceTableInsertRowBefore")}),f.addButton("tableinsertrowafter",{title:"Insert row after",onclick:g("mceTableInsertRowAfter")}),f.addButton("tabledeleterow",{title:"Delete row",onclick:g("mceTableDeleteRow")}),f.addButton("tablerowprops",{title:"Row properties",onclick:g("mceTableRowProps")}),f.addButton("tablecutrow",{title:"Cut row",onclick:g("mceTableCutRow")}),f.addButton("tablecopyrow",{title:"Copy row",onclick:g("mceTableCopyRow")}),f.addButton("tablepasterowbefore",{title:"Paste row before",onclick:g("mceTablePasteRowBefore")}),f.addButton("tablepasterowafter",{title:"Paste row after",onclick:g("mceTablePasteRowAfter")}),f.addButton("tableinsertcolbefore",{title:"Insert column before",onclick:g("mceTableInsertColBefore")}),f.addButton("tableinsertcolafter",{title:"Insert column after",onclick:g("mceTableInsertColAfter")}),f.addButton("tabledeletecol",{title:"Delete column",onclick:g("mceTableDeleteCol")})}function q(a){var b=f.dom.is(a,"table");return b}function r(){var a=f.settings.table_toolbar;""!==a&&a!==!1&&(a||(a="tableprops tabledelete | tableinsertrowbefore tableinsertrowafter tabledeleterow | tableinsertcolbefore tableinsertcolafter tabledeletecol"),f.addContextToolbar(q,a))}var s,t=this,u=new d(f),v=e(f);f.settings.table_grid===!1?f.addMenuItem("inserttable",{text:"Insert table",icon:"table",context:"table",onclick:u.table}):f.addMenuItem("inserttable",{text:"Insert table",icon:"table",context:"table",ariaHideMenu:!0,onclick:function(a){a.aria&&(this.parent().hideAll(),a.stopImmediatePropagation(),u.table())},onshow:function(){o(0,0,this.menu.items()[0])},onhide:function(){var a=this.menu.items()[0].getEl().getElementsByTagName("a");f.dom.removeClass(a,"mce-active"),f.dom.addClass(a[0],"mce-active")},menu:[{type:"container",html:n(),onPostRender:function(){this.lastX=this.lastY=0},onmousemove:function(a){var b,c,d=a.target;"A"==d.tagName.toUpperCase()&&(b=parseInt(d.getAttribute("data-mce-x"),10),c=parseInt(d.getAttribute("data-mce-y"),10),(this.isRtl()||"tl-tr"==this.parent().rel)&&(b=9-b),(b!==this.lastX||c!==this.lastY)&&(o(b,c,a.control),this.lastX=b,this.lastY=c))},onclick:function(a){var b=this;"A"==a.target.tagName.toUpperCase()&&(a.preventDefault(),a.stopPropagation(),b.parent().cancel(),f.undoManager.transact(function(){i(b.lastX+1,b.lastY+1)}),f.addVisual())}}]}),f.addMenuItem("tableprops",{text:"Table properties",context:"table",onPostRender:l,onclick:u.tableProps}),f.addMenuItem("deletetable",{text:"Delete table",context:"table",onPostRender:l,cmd:"mceTableDelete"}),f.addMenuItem("cell",{separator:"before",text:"Cell",context:"table",menu:[{text:"Cell properties",onclick:g("mceTableCellProps"),onPostRender:m},{text:"Merge cells",onclick:g("mceTableMergeCells"),onPostRender:m},{text:"Split cell",onclick:g("mceTableSplitCells"),onPostRender:m}]}),f.addMenuItem("row",{text:"Row",context:"table",menu:[{text:"Insert row before",onclick:g("mceTableInsertRowBefore"),onPostRender:m},{text:"Insert row after",onclick:g("mceTableInsertRowAfter"),onPostRender:m},{text:"Delete row",onclick:g("mceTableDeleteRow"),onPostRender:m},{text:"Row properties",onclick:g("mceTableRowProps"),onPostRender:m},{text:"-"},{text:"Cut row",onclick:g("mceTableCutRow"),onPostRender:m},{text:"Copy row",onclick:g("mceTableCopyRow"),onPostRender:m},{text:"Paste row before",onclick:g("mceTablePasteRowBefore"),onPostRender:m},{text:"Paste row after",onclick:g("mceTablePasteRowAfter"),onPostRender:m}]}),f.addMenuItem("column",{text:"Column",context:"table",menu:[{text:"Insert column before",onclick:g("mceTableInsertColBefore"),onPostRender:m},{text:"Insert column after",onclick:g("mceTableInsertColAfter"),onPostRender:m},{text:"Delete column",onclick:g("mceTableDeleteCol"),onPostRender:m}]});var w=[];k("inserttable tableprops deletetable | cell row column".split(" "),function(a){"|"==a?w.push({text:"-"}):w.push(f.menuItems[a])}),f.addButton("table",{type:"menubutton",title:"Table",menu:w}),h.isIE||f.on("click",function(a){a=a.target,"TABLE"===a.nodeName&&(f.selection.select(a),f.nodeChanged())}),t.quirks=new b(f),f.on("Init",function(){t.cellSelection=new c(f),t.resizeBars=v}),f.on("PreInit",function(){f.serializer.addAttributeFilter("data-mce-cell-padding,data-mce-border,data-mce-border-color",function(a,b){for(var c=a.length;c--;)a[c].attr(b,null)})}),k({mceTableSplitCells:function(a){a.split()},mceTableMergeCells:function(a){var b;b=f.dom.getParent(f.selection.getStart(),"th,td"),f.dom.select("td.mce-item-selected,th.mce-item-selected").length?a.merge():u.merge(a,b)},mceTableInsertRowBefore:function(a){a.insertRow(!0)},mceTableInsertRowAfter:function(a){a.insertRow()},mceTableInsertColBefore:function(a){a.insertCol(!0)},mceTableInsertColAfter:function(a){a.insertCol()},mceTableDeleteCol:function(a){a.deleteCols()},mceTableDeleteRow:function(a){a.deleteRows()},mceTableCutRow:function(a){s=a.cutRows()},mceTableCopyRow:function(a){s=a.copyRows()},mceTablePasteRowBefore:function(a){a.pasteRows(s,!0)},mceTablePasteRowAfter:function(a){a.pasteRows(s)},mceTableDelete:function(a){v.clearBars(),a.deleteTable()}},function(b,c){f.addCommand(c,function(){var c=new a(f);c&&(b(c),f.execCommand("mceRepaint"),t.cellSelection.clear())})}),k({mceInsertTable:u.table,mceTableProps:function(){u.table(!0)},mceTableRowProps:u.row,mceTableCellProps:u.cell},function(a,b){f.addCommand(b,function(b,c){a(c)})}),p(),r(),f.settings.table_tab_navigation!==!1&&f.on("keydown",function(b){var c,d,e;9==b.keyCode&&(c=f.dom.getParent(f.selection.getStart(),"th,td"),c&&(b.preventDefault(),d=new a(f),e=b.shiftKey?-1:1,f.undoManager.transact(function(){!d.moveRelIdx(c,e)&&e>0&&(d.insertRow(),d.refresh(),d.moveRelIdx(c,e))})))}),t.insertTable=i}var k=f.each;i.add("table",j)})}(this); \ No newline at end of file diff --git a/assets/js/tinymce/plugins/template/plugin.min.js b/assets/js/tinymce/plugins/template/plugin.min.js new file mode 100644 index 0000000..c3d3c69 --- /dev/null +++ b/assets/js/tinymce/plugins/template/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("template",function(a){function b(b){return function(){var c=a.settings.templates;"string"==typeof c?tinymce.util.XHR.send({url:c,success:function(a){b(tinymce.util.JSON.parse(a))}}):b(c)}}function c(b){function c(b){function c(b){if(-1==b.indexOf("")){var c="";tinymce.each(a.contentCSS,function(b){c+=''}),b=""+c+""+b+""}b=f(b,"template_preview_replace_values");var e=d.find("iframe")[0].getEl().contentWindow.document;e.open(),e.write(b),e.close()}var g=b.control.value();g.url?tinymce.util.XHR.send({url:g.url,success:function(a){e=a,c(e)}}):(e=g.content,c(e)),d.find("#description")[0].text(b.control.value().description)}var d,e,h=[];if(!b||0===b.length){var i=a.translate("No templates defined.");return void a.notificationManager.open({text:i,type:"info"})}tinymce.each(b,function(a){h.push({selected:!h.length,text:a.title,value:{url:a.url,content:a.content,description:a.description}})}),d=a.windowManager.open({title:"Insert template",layout:"flex",direction:"column",align:"stretch",padding:15,spacing:10,items:[{type:"form",flex:0,padding:0,items:[{type:"container",label:"Templates",items:{type:"listbox",label:"Templates",name:"template",values:h,onselect:c}}]},{type:"label",name:"description",label:"Description",text:"\xa0"},{type:"iframe",flex:1,border:1}],onsubmit:function(){g(!1,e)},width:a.getParam("template_popup_width",600),height:a.getParam("template_popup_height",500)}),d.find("listbox")[0].fire("select")}function d(b,c){function d(a,b){if(a=""+a,a.length0&&(i=k.create("div",null),i.appendChild(j[0].cloneNode(!0))),h(k.select("*",i),function(b){g(b,a.getParam("template_cdate_classes","cdate").replace(/\s+/g,"|"))&&(b.innerHTML=d(a.getParam("template_cdate_format",a.getLang("template.cdate_format")))),g(b,a.getParam("template_mdate_classes","mdate").replace(/\s+/g,"|"))&&(b.innerHTML=d(a.getParam("template_mdate_format",a.getLang("template.mdate_format")))),g(b,a.getParam("template_selected_content_classes","selcontent").replace(/\s+/g,"|"))&&(b.innerHTML=l)}),e(i),a.execCommand("mceInsertContent",!1,i.innerHTML),a.addVisual()}var h=tinymce.each;a.addCommand("mceInsertTemplate",g),a.addButton("template",{title:"Insert template",onclick:b(c)}),a.addMenuItem("template",{text:"Insert template",onclick:b(c),context:"insert"}),a.on("PreProcess",function(b){var c=a.dom;h(c.select("div",b.node),function(b){c.hasClass(b,"mceTmpl")&&(h(c.select("*",b),function(b){c.hasClass(b,a.getParam("template_mdate_classes","mdate").replace(/\s+/g,"|"))&&(b.innerHTML=d(a.getParam("template_mdate_format",a.getLang("template.mdate_format"))))}),e(b))})})}); \ No newline at end of file diff --git a/assets/js/tinymce/plugins/textcolor/plugin.min.js b/assets/js/tinymce/plugins/textcolor/plugin.min.js new file mode 100644 index 0000000..7ca105a --- /dev/null +++ b/assets/js/tinymce/plugins/textcolor/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("textcolor",function(a){function b(b){var c;return a.dom.getParents(a.selection.getStart(),function(a){var d;(d=a.style["forecolor"==b?"color":"background-color"])&&(c=d)}),c}function c(){var b,c,d=[];for(c=a.settings.textcolor_map||["000000","Black","993300","Burnt orange","333300","Dark olive","003300","Dark green","003366","Dark azure","000080","Navy Blue","333399","Indigo","333333","Very dark gray","800000","Maroon","FF6600","Orange","808000","Olive","008000","Green","008080","Teal","0000FF","Blue","666699","Grayish blue","808080","Gray","FF0000","Red","FF9900","Amber","99CC00","Yellow green","339966","Sea green","33CCCC","Turquoise","3366FF","Royal blue","800080","Purple","999999","Medium gray","FF00FF","Magenta","FFCC00","Gold","FFFF00","Yellow","00FF00","Lime","00FFFF","Aqua","00CCFF","Sky blue","993366","Red violet","FFFFFF","White","FF99CC","Pink","FFCC99","Peach","FFFF99","Light yellow","CCFFCC","Pale green","CCFFFF","Pale cyan","99CCFF","Light sky blue","CC99FF","Plum"],b=0;b
    '+(c?"×":"")+"
    ',g=d.length-1,k=0;j>k;k++){for(f+="",h=0;i>h;h++)l=k*i+h,l>g?f+="":(e=d[l],f+=b(e.color,e.text));f+=""}if(a.settings.color_picker_callback){for(f+='",f+="",h=0;i>h;h++)f+=b("","Custom color");f+=""}return f+="
    "}function e(b,c){a.undoManager.transact(function(){a.focus(),a.formatter.apply(b,{value:c}),a.nodeChanged()})}function f(b){a.undoManager.transact(function(){a.focus(),a.formatter.remove(b,{value:null},null,!0),a.nodeChanged()})}function g(c){function d(a){k.hidePanel(),k.color(a),e(k.settings.format,a)}function g(){k.hidePanel(),k.resetColor(),f(k.settings.format)}function h(a,b){a.style.background=b,a.setAttribute("data-mce-color",b)}var j,k=this.parent();tinymce.DOM.getParent(c.target,".mce-custom-color-btn")&&(k.hidePanel(),a.settings.color_picker_callback.call(a,function(a){var b,c,e,f=k.panel.getEl().getElementsByTagName("table")[0];for(b=tinymce.map(f.rows[f.rows.length-1].childNodes,function(a){return a.firstChild}),e=0;ee;e++)h(b[e],b[e+1].getAttribute("data-mce-color"));h(c,a),d(a)},b(k.settings.format))),j=c.target.getAttribute("data-mce-color"),j?(this.lastId&&document.getElementById(this.lastId).setAttribute("aria-selected",!1),c.target.setAttribute("aria-selected",!0),this.lastId=c.target.id,"transparent"==j?g():d(j)):null!==j&&k.hidePanel()}function h(){var a=this;a._color?e(a.settings.format,a._color):f(a.settings.format)}var i,j;j=a.settings.textcolor_rows||5,i=a.settings.textcolor_cols||8,a.addButton("forecolor",{type:"colorbutton",tooltip:"Text color",format:"forecolor",panel:{role:"application",ariaRemember:!0,html:d,onclick:g},onclick:h}),a.addButton("backcolor",{type:"colorbutton",tooltip:"Background color",format:"hilitecolor",panel:{role:"application",ariaRemember:!0,html:d,onclick:g},onclick:h})}); \ No newline at end of file diff --git a/assets/js/tinymce/plugins/textpattern/plugin.min.js b/assets/js/tinymce/plugins/textpattern/plugin.min.js new file mode 100644 index 0000000..8af96cd --- /dev/null +++ b/assets/js/tinymce/plugins/textpattern/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("textpattern",function(a){function b(){return j&&(i.sort(function(a,b){return a.start.length>b.start.length?-1:a.start.length'+a+""}function f(){var a,b="";for(a in n)b+=a;return new RegExp("["+b+"]","g")}function g(){var a,b="";for(a in n)b&&(b+=","),b+="span.mce-"+n[a];return b}var h,i,j,k,l,m,n,o,p=a.getBody(),q=a.selection;if(n={"\xa0":"nbsp","\xad":"shy"},d=!d,e.state=d,a.fire("VisualChars",{state:d}),o=f(),b&&(m=q.getBookmark()),d)for(i=[],tinymce.walk(p,function(a){3==a.nodeType&&a.nodeValue&&o.test(a.nodeValue)&&i.push(a)},"childNodes"),j=0;j=0;j--)a.dom.remove(i[j],1);q.moveToBookmark(m)}function c(){var b=this;a.on("VisualChars",function(a){b.active(a.state)})}var d,e=this;a.addCommand("mceVisualChars",b),a.addButton("visualchars",{title:"Show invisible characters",cmd:"mceVisualChars",onPostRender:c}),a.addMenuItem("visualchars",{text:"Show invisible characters",cmd:"mceVisualChars",onPostRender:c,selectable:!0,context:"view",prependToContext:!0}),a.on("beforegetcontent",function(a){d&&"raw"!=a.format&&!a.draft&&(d=!0,b(!1))})}); \ No newline at end of file diff --git a/assets/js/tinymce/plugins/wordcount/plugin.min.js b/assets/js/tinymce/plugins/wordcount/plugin.min.js new file mode 100644 index 0000000..f20e765 --- /dev/null +++ b/assets/js/tinymce/plugins/wordcount/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("wordcount",function(a){function b(){a.theme.panel.find("#wordcount").text(["Words: {0}",e.getCount()])}var c,d,e=this;c=a.getParam("wordcount_countregex",/[\w\u2019\x27\-\u00C0-\u1FFF]+/g),d=a.getParam("wordcount_cleanregex",/[0-9.(),;:!?%#$?\x27\x22_+=\\\/\-]*/g),a.on("init",function(){var c=a.theme.panel&&a.theme.panel.find("#statusbar")[0];c&&tinymce.util.Delay.setEditorTimeout(a,function(){c.insert({type:"label",name:"wordcount",text:["Words: {0}",e.getCount()],classes:"wordcount",disabled:a.settings.readonly},0),a.on("setcontent beforeaddundo",b),a.on("keyup",function(a){32==a.keyCode&&b()})},0)}),e.getCount=function(){var b=a.getContent({format:"raw"}),e=0;if(b){b=b.replace(/\.\.\./g," "),b=b.replace(/<.[^<>]*?>/g," ").replace(/ | /gi," "),b=b.replace(/(\w+)(&#?[a-z0-9]+;)+(\w+)/i,"$1$3").replace(/&.+?;/g," "),b=b.replace(d,"");var f=b.match(c);f&&(e=f.length)}return e}}); \ No newline at end of file diff --git a/assets/js/tinymce/skins/lightgray/content.inline.min.css b/assets/js/tinymce/skins/lightgray/content.inline.min.css new file mode 100644 index 0000000..3079cc7 --- /dev/null +++ b/assets/js/tinymce/skins/lightgray/content.inline.min.css @@ -0,0 +1,154 @@ +/* Content.Inline.less */ +/* Content.Objects.less */ +.mce-content-body .mce-reset { + margin: 0; + padding: 0; + border: 0; + outline: 0; + vertical-align: top; + background: transparent; + text-decoration: none; + color: black; + font-family: Arial; + font-size: 11px; + text-shadow: none; + float: none; + position: static; + width: auto; + height: auto; + white-space: nowrap; + cursor: inherit; + line-height: normal; + font-weight: normal; + text-align: left; + -webkit-tap-highlight-color: transparent; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; + direction: ltr; + max-width: none; +} +.mce-object { + border: 1px dotted #3A3A3A; + background: #d5d5d5 url(img/object.gif) no-repeat center; +} +.mce-preview-object { + display: inline-block; + position: relative; + margin: 0 2px 0 2px; + line-height: 0; + border: 1px solid gray; +} +.mce-preview-object .mce-shim { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); +} +figure.align-left { + float: left; +} +figure.align-right { + float: right; +} +figure.image { + display: inline-block; + border: 1px solid gray; + margin: 0 2px 0 1px; + background: #f5f2f0; +} +figure.image img { + margin: 8px 8px 0 8px; +} +figure.image figcaption { + margin: 6px 8px 6px 8px; + text-align: center; +} +.mce-preview-object[data-mce-selected] .mce-shim { + display: none; +} +.mce-pagebreak { + cursor: default; + display: block; + border: 0; + width: 100%; + height: 5px; + border: 1px dashed #666; + margin-top: 15px; + page-break-before: always; +} +@media print { + .mce-pagebreak { + border: 0px; + } +} +.mce-item-anchor { + cursor: default; + display: inline-block; + -webkit-user-select: all; + -webkit-user-modify: read-only; + -moz-user-select: all; + -moz-user-modify: read-only; + user-select: all; + user-modify: read-only; + width: 9px !important; + height: 9px !important; + border: 1px dotted #3A3A3A; + background: #d5d5d5 url(img/anchor.gif) no-repeat center; +} +.mce-nbsp, +.mce-shy { + background: #AAA; +} +.mce-shy::after { + content: '-'; +} +hr { + cursor: default; +} +.mce-match-marker { + background: #AAA; + color: #fff; +} +.mce-match-marker-selected { + background: #3399ff; + color: #fff; +} +.mce-spellchecker-word { + border-bottom: 2px solid #F00; + cursor: default; +} +.mce-spellchecker-grammar { + border-bottom: 2px solid #008000; + cursor: default; +} +.mce-item-table, +.mce-item-table td, +.mce-item-table th, +.mce-item-table caption { + border: 1px dashed #BBB; +} +td.mce-item-selected, +th.mce-item-selected { + background-color: #3399ff !important; +} +.mce-edit-focus { + outline: 1px dotted #333; +} +.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus { + outline: 2px solid #2d8ac7; +} +.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover { + outline: 2px solid #7ACAFF; +} +.mce-content-body *[contentEditable=false][data-mce-selected] { + outline: 2px solid #2d8ac7; +} +.mce-resize-bar-dragging { + background-color: blue; + opacity: 0.25; + filter: alpha(opacity=25); + zoom: 1; +} diff --git a/assets/js/tinymce/skins/lightgray/content.min.css b/assets/js/tinymce/skins/lightgray/content.min.css new file mode 100644 index 0000000..f12e891 --- /dev/null +++ b/assets/js/tinymce/skins/lightgray/content.min.css @@ -0,0 +1 @@ +body{background-color:#fff;color:#000;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:11px;scrollbar-3dlight-color:#f0f0ee;scrollbar-arrow-color:#676662;scrollbar-base-color:#f0f0ee;scrollbar-darkshadow-color:#ddd;scrollbar-face-color:#e0e0dd;scrollbar-highlight-color:#f0f0ee;scrollbar-shadow-color:#f0f0ee;scrollbar-track-color:#f5f5f5}td,th{font-family:Verdana,Arial,Helvetica,sans-serif;font-size:11px}.mce-content-body .mce-reset{margin:0;padding:0;border:0;outline:0;vertical-align:top;background:transparent;text-decoration:none;color:black;font-family:Arial;font-size:11px;text-shadow:none;float:none;position:static;width:auto;height:auto;white-space:nowrap;cursor:inherit;line-height:normal;font-weight:normal;text-align:left;-webkit-tap-highlight-color:transparent;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;direction:ltr;max-width:none}.mce-object{border:1px dotted #3a3a3a;background:#d5d5d5 url(img/object.gif) no-repeat center}.mce-preview-object{display:inline-block;position:relative;margin:0 2px 0 2px;line-height:0;border:1px solid gray}.mce-preview-object .mce-shim{position:absolute;top:0;left:0;width:100%;height:100%;background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}figure.align-left{float:left}figure.align-right{float:right}figure.image{display:inline-block;border:1px solid gray;margin:0 2px 0 1px;background:#f5f2f0}figure.image img{margin:8px 8px 0 8px}figure.image figcaption{margin:6px 8px 6px 8px;text-align:center}.mce-preview-object[data-mce-selected] .mce-shim{display:none}.mce-pagebreak{cursor:default;display:block;border:0;width:100%;height:5px;border:1px dashed #666;margin-top:15px;page-break-before:always}@media print{.mce-pagebreak{border:0}}.mce-item-anchor{cursor:default;display:inline-block;-webkit-user-select:all;-webkit-user-modify:read-only;-moz-user-select:all;-moz-user-modify:read-only;user-select:all;user-modify:read-only;width:9px !important;height:9px !important;border:1px dotted #3a3a3a;background:#d5d5d5 url(img/anchor.gif) no-repeat center}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}hr{cursor:default}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-spellchecker-word{border-bottom:2px solid #f00;cursor:default}.mce-spellchecker-grammar{border-bottom:2px solid #008000;cursor:default}.mce-item-table,.mce-item-table td,.mce-item-table th,.mce-item-table caption{border:1px dashed #bbb}td.mce-item-selected,th.mce-item-selected{background-color:#39f !important}.mce-edit-focus{outline:1px dotted #333}.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus{outline:2px solid #2d8ac7}.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover{outline:2px solid #7acaff}.mce-content-body *[contentEditable=false][data-mce-selected]{outline:2px solid #2d8ac7}.mce-resize-bar-dragging{background-color:blue;opacity:.25;filter:alpha(opacity=25);zoom:1} \ No newline at end of file diff --git a/assets/js/tinymce/skins/lightgray/fonts/tinymce-small.eot b/assets/js/tinymce/skins/lightgray/fonts/tinymce-small.eot new file mode 100644 index 0000000000000000000000000000000000000000..b144ba0bd949de3c0f87abdd78b517067169884f GIT binary patch literal 9492 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 + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/js/tinymce/skins/lightgray/fonts/tinymce-small.ttf b/assets/js/tinymce/skins/lightgray/fonts/tinymce-small.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a983e2dc4cb30880fffe00e1f0879be4d95eb4cc GIT binary patch literal 9304 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 literal 0 HcmV?d00001 diff --git a/assets/js/tinymce/skins/lightgray/fonts/tinymce.eot b/assets/js/tinymce/skins/lightgray/fonts/tinymce.eot new file mode 100644 index 0000000000000000000000000000000000000000..8838c8dc9762b9d3d6658d10601cf241062c0aa2 GIT binary patch literal 14308 zcmcIr3v?V;dA@gMcSkE}SG(G$Bun1aW_M*hRx7PWE8CJhmW^UtmZLcFBPJ$NY{ifG zq4*J;KB8wG%ck^5HJA}P7ehVsCLxv zzcVAP6xjiKIy?9M`tN`L```cn@9YnXjA?M3No?`M*#%BHTgMjXQ(f!%=A}=6ZD|=} zes+o-V#nA$>?qsECQ-r9wj(^iPO~Fyf}KE4l$33d`SkE3pab+H`Fi@Hl&Ba;TK zVmgyq{)U@6yK8Ez9z)J$xbb~QC#JT2vStq|tw8z*2PRHVAq+5UJ{1R!+;hhR&)$#v zQUzoAR}M~2>{q@t_Yh;<|Al(J2a%zC(iLH>(1P@J2aldQbB9#@0Mc90=hTto`zBV0 z+cS*y(0I=roj5avX`ny#4AO~X6Gta6-5ho!{ZZ6^-_-GwrvN9OVuH$JN%mQ+OL0h zX09|hM;)U+n`ynmuK2FBzQRQPPoTak>VJJneLnYc!j+KgSJ(H|H^w)|im`a)$;cCt z72!{XeiC{hbguSiwI8dU2)+y$%jX~ldJB&;4v1>X+JRV$t3@{peO)^bn3*$N3|Mrt zN)`qplfh&#>n;RSK|~8k6k9tMD0Dh0Ekz`t^t6s4+V&Dvu|} z;yKA9Uy@w%L#4M-MR{EDa&Dq_X_~fxJ?A`I4d_&Wmn~+M9Pi{Q#m|+j67%yK9*F@& zB~~OD3&lZRj1{wkd>v0KsjONo#3C+s(NkM>@Gd>n77I)VVr?P)u7g#zo{Lw>HVxnl z51;xiDwp*Uu$mD$V8<|!txUUK!S1hNA;v<jhuH=s@O#V$K@ot?2@FM?sr^ z4E%MoU2H!CM@#2;8_$LYIf&BB{X86vg_KmY2b2H;D0KH?>9fU{Cu*m9Gg&u?M7*iy z42VbVp*q%E00D!1!ycswk_JV0N0CUOg;kem&1qrPMRmJ{{I2GkTN<^wI3Dx8=6fle z(;8cDZXWO#qH7Z^H>FydmG$eD=9bh=Es3?!f`6cN#S^Tmiu$uG$~3stTfBg{Tp)_SaQa1w{IPno}BQ@r|1{#!c*W5t(CJ zs(IjIAsS6Jx9rOe4dwQ=G^e7`!o`6He07!cJyl`E@}8@z>#9GaW@zAyIx7GRR#n#d zkX>a1Y5^Xnv_*@Wy)Rd=ENjQXM<=k_lWDWOW=|uKXmgQBvKUP9KHgP;i=?=FBJ0e1UC%B)O6jDn2C)sIjI{a;*vh?3u*P4Og$QubYI9o zCTE&vXjOZ^%i8Q^(Zb90Pm~-B>&^$Qs!y>}!DLaKmgcrKZ$S zqyS1OB36h*kW-)-++vsrW4ZxCful!a^cr)_&`Lk=);`=1_cN1fX&T|?P5d}&(FJil z=ST56?iLJc@n{y~gNQ<`+4|vJ*9{Brzir<i}%bv}=?x zrwxUPy_fDC*7LcFP^HALS^$Ehb(Veuxx$ZwaFFM?67lj#Zxfdk={IeezE6IFxYk!+ z9=_p_Hv06VlMoG%e#8CPtLAHvuQ~VFatYdV)yvh4pGRXEX^_VxjrQ6nKG~OPJ9NYF z%U_kg@`i~F(>3|%)1xPN=+(#EIB|1m|1B~8dWiFkM|+DLheO7r;M^cV0j$0TQS9wb zfQRkA4&}t=i;#etQRWG+r62sa!gzpO$bx$nLu zny!uECoD8Azc{6skuwfy8n&e&Q~WPA9KwdduZd_v+5TuOhGqO65&b?4@ngf#%zs5> zmB9@Syg*_GXj=nqyCGGwP|(YRNw0(x&EOi>AV%U8nL{-a`?+Qs5U>7}P8B&l`yI4* z!NHR?cwQ*74b%tNuTUoz9Sxymh!;@{(x@@3%Q_CWmX9RHpNJ>mHN}80g ziuzj21kP<^oQ5I&P@5mi4+%I9j^7NKq17HWL>!(NyyXcX3iC-(khD3bA$YuwL!NM8 zB}xE;Adp!}gS5^pM^Zxx73R~#q%m)sW@TvCtJw{pRic>gXd_qXtVycLY_nfd{Bk7R zB*mKKLieCl9F*0boRrPUDYdJdy%Oi;2942>Hb_9hNzghrvazwLV`U()vZJYS|ibDAU(yIN#NHd2{N9XhLI#Y)Cduc%_1uCsSTt;9Mhd z0!xRZiUC+sDX?BdA(Uf<%*}eC41P`C0zI&U^|1|X8?Xap5GDu>go9Mbk&G=VdO?2X zS--5rAXmGKIa#QS=~M*5c^A|$Rbpcg9_sHuMANpyudh0^X3e2hE$!_s3o-NFw)BQI z`Owa$@qQ_{Gn8MmA>GzL-ei72Q{2-n56i5)3+k%$)Z!kjz9em-?K2BqdW;I6OYgq> z?}!eV4w_70u1U5P<{L3n#a?eLv@$ObK~Mrqg#xjl5m?%TA1pr#J`a&ME0hALp-KpC z1p(o-qiP@^q9Yztp-D*Wh7X^cYHy!9_u(5BVp>Bw-9U~HH?2!FZ%m~&HYe6Kb?!)| zc68Qt*ZYH0V`Ec6e|>kImA7lvj$M0lxjnmftZLt$Zk z%?V@1IPvJFHJ8_bSqfzoj1s7a?E(+*ufro5b%7_e!-!_{B2p3DkXMsI@{mx$pWv_J z@CGOm>vHl@tktXhOaQ?Sn#q3)>6_ ztw03BR7rOiV?o9gQvg4aXTXOoSvCfX4r)-X1|E~$Sp}8~oKmn$FiFEW#3gq;|L*6c zinC`2omWHmdP$Q5iBiCDGEqu6UV;8~?CC0ozSCtAF-SB^ySo@GKrR##@PFKY`SSfV zSqkS^w=Mlj+b>_HJ%0JJFf*Y~@Ch9-i#~Z-pUPYIDLEqbu|<8NW1FwSew2o;msBmD zNqa$XQV934q?!XG1<$m3s1lJ3NQtK2wY@)C9M?B**2jy<{_S0+u5mVe_l{17%XRL! zdzg$M-;Qj$ZEA4r0|(ZwJ@A3C!KvFeMZOJ|maMz!h<-iEr6ki{uOGRoF3H^UFomIC z^n#!5UWT6qNrWzgDJ4VwpEm_0%M+ZA0zbAljsh?Wi8<`s32*uM>5UstfBY6FoZobO zJ~qeHiS0vSrEka4fq|nt`jqg{_6Zp0oQXQ&>{xk6)S)!xun8wLp9(j3#I@r$c6Q!) zT#I)!hZ*rTc*5R9rz}ob+9Ph;nzt5GLXbEXEP5&HtY0)i&>N0TV-{+7rk?f#g>#I= zbnb5mg&N3_>XWHAQAWEfQ_rD}V^3*N&l6US1{k@@&sq=oLzrX?9uynGO~M+44Uh?T zM-7jGHi|BG{>39No;U9%ALIS%ys0DSC1fF#4Uu~Byr{(WS-V)&J^vz&r_9?iiJvsX zlDV1B+cCh!8@U>ZOZ61Da9wJ0D#z#O01{vkdtK_EnJ;7KRN)JB-bwej)#jEN+I zO#O^b`xbhO#uLL2^Bgf5+DBr)1Bo0!01N;eNu_D&;K(pSeM;Ia(_w{17f7QMj{QL! z9NN;njH3vPV+>kj3i4JbE5Jsx4mjC@zR@d5&uLq;CMjB^X}Dk^0<2xLT#!$(OGu5F zIp)DN2r$BCgE<+Rj(6E?NhhWY@Ik1I)NogK;T|P(4uG)Y( z(pp)~~-_ z@6L34pP89?vTEDif3m}XgeL36%c$zOQ-vyLZtJ0CzVU+x*22~TlmmwV2D*R_s&B+9 zGpMRURD(P(q_#|!bXusVZ9Evl(pr*@^xTR>%kW;6gjRL$aLdL%^YUbCfB&jGE?&IY zJ~-IUztenkCzZ_VRB!lHlBdb^gZl%WGm2p-rekctN?HgP>Q_=NfNa4eU_J*ia1Esp z&NU5d4f=LqUBMD)0h60;#Sqpv$Vu3Ou*|Bs&4?r=L+{>odT8kMu5P^{zG8Dr%jOmF z21~G)b#uJ`(6)|_ZHM~#v^n0?7mGJE#AAI;e7ZzX(O$CGr;qhxEX&O6h;eGck=-n@ zZjm^f0uKPQpc>H_8K$J~Lg!)JaI7$xGdjXu zjt+hcd11L;e4HDLI|4y7VRKsAovF{v5FQh6)n^B%o7ZySNV^bLvZZ~_8r0{)*<1;J zRmcnphuuW5AHDHjstbxBS+{eUlGFkkw&E}A60SovC*%JisMVPhY z6jGU!Pa)-%J7Q|OCLR&M<03*?h|IqL*Ltjw+o|~gV1SZ!$bU10v5=Q%c~<8MKBJq{ z)1dkpD`uUw-*N#BsMjcD9mbQ{q>=>Ffizk!c6pQ-uEoHf918C(V%x!1mC2^(XT>HN4^OIgOHP+A_{hMGR`5QlR35mY>OM2$ozmfSAOoMZ%8^Cjo3- z!=a>crs>Ag3kS(SHXT>6cR-{^6K2EPgcAt&?_3s_M!;`Mg$gKcm`DR`-~}0?2Ny>s z!NgzwW5w@w`IYJ#Nr`&nnQFJ!?e>z*XV|JNKldy7K6wo?y>v3AX)IX`I0#DzK*4pFU&>^oWZFQ8 z+gBy#4#lLCrO!$mHk(`dQ|7-7J^868hv>;2z588jbK|$|PWSbD@;x1=-tz~2JI#NO z?j7SFG*9wj+UWdxQI(o>^sjJ-D&-Z0^y>2;`oo@%ygRdMXN+g}0yLnu1NzKg%Ld>& zjHQOnK#0@06zbqQwM#t0AntgfMb>^Yd>9r&2VYkn{vOga0 zU%6^sdz`!7qt(IaElv66(Aqm57?Z@qWjTAp=$4ex@eiec+TYG^m0j=r-rwGtShKxr zSgBPqL-F`frf1(fc4b{up9h?>a$>L^-M9@a8 zMH`5l3{c@H38T#!5l}>$%9gQ&+fJXq639I!LJtU|F-52{k}};7YaU(vZT78 z>PtG29XU(Mw^aXSRC~yH5IU^K(daFk93f zGSOHVu`u8P4loa#t&7GMb`!93f`D{0OnC9I#Be1;j9q$U@q*B(79`R+Yw(ga_QJTN zhnF-O`fB4tCv>K7&mH57xeE_F2;+a|!te#WrO^cdtjSwGjmk?GE^N4Pfol#3z_?N3 zUo^2(uQs-WbU+}+rVCTcE+^DN3-6=W*yd-%*g6palnwaSViOWL2F7b?gt{15qmgOL z(%fk;Sh!!zCvx^K730dwAYMQq!_45=-_Q#wZ#2ASk)K77)-q7e_`tby&TBykfXYdM z#2HX0Kr{C`714q~gbYvyC%(fA5%yz(ES3T>AfKDPPkL?q`RAS29u4w@QTi7r6Q$PP z)2_}Zmri^U0g4$fa3+E7MN=nYU)cUc>=2?23I*ZQzW;5;UZDGhm>7Fumn|1tJUZ=m z8r2CG;k23sSq5^ILUtp2K`oLOGJ32)oTmtvC4|U#KQ=u&{rKqgrO``|Z=O9*3ojc{ zZRZ}Xepctbnt7g|)Xe80Ru4Q*HMfYGqkIEx02m*L?Ff%#(eicmL%W83lgA>8>W-;O zL;#^ABU$>Kg*=d5tO#hx3%UU)ErX$5$w6cc&Upp3DbslD>HOF`DJ5XtGt% zp)HGspw%P*E0JJv(Z_sB2&{{&T+k+B9G7M~AJ}x|9%AHtjCyRuv|(i;(LkAlEg~EfU8K5N?C~(7ETY&>&~Zmhw$X zK1rV3x;0VciMo+n4;PDvZyl+t2}t2+-KJY6Rdw=~O?A<*6sUPm^4-I$wk0dWmF+ig z83;GazN(NCtZwE%dfVA|9_j2n^3JnwYumkh=c?S+-p0n>t+`b@ckga9zdtzA5SMto zV_jC$)o5!te|9}BCkI|Mc}CVCtut}Im5LQp> z9R*Pv9Le3#QN%Z%q7JBH6%R^wv1|}Y5)YeuNqz-un8NMfMx3rNVBw1rVM}sAhIPgh zrLP@|LSI~BI}hPZf<}zfK~2dsKM!RCZCwsRD1@1d2ZG;d7-^_?HI=5xxJ0HUC)CJ- zpzF7MBN*T?iaB_uu&XVQ4gI{yRgbnmDsMw=p{~(`wOu?1Sbcu?InWoBzX$9F83uoM z$TgkTMw}fQbBp`vq*sO-kOd0g!U=XqEKfMtZgKGj2l(e5wztV(55Z4-4^R_a>F-$U z-@My@$0`5WKk{GvYyY!ft$FE+{}-lN!-MAc{Jg{blAmujKcPJM;=cxd^m@SjHID_% zf8)h~`Hy^8h52VPn3oWuSn0GJxXM%U;CxYqc^d1YVb2*@9?R|`?$IKElzy6Z{t59z zhc%OUFHnLzLYtTQVbf@b9bgN)g&kz?WFKH3!^#SkiSBBkFZC9Jc4+5XpY6fqZ+*n) zCN0a3!~E%vMZ=1xxszvlioM-XPDQwqi`;C|(~JyQM7mL}hC891`=%Rlj0|P$;C<=4xw0YN+(S@|1KhvT9MJqDn{UedQ@W;A|Hs z9D2t)hRETP$r=Wom&NBWs0EZLrRewVo<+a>x$=~N#)if0FHiCBFWqmB1=x!$T|OUsG(e`KU-BzNoAKL3QO#tZk} zD(m$LPyYu$@+WT_KDa(!ncYw?vTyz8&tJlsLi@y~hp;%==2?>cWdbJ_F0S+5d^2b2 z4jX#&RhuckO(=;^3#@sZV;f*U84xyYd}EAn(PLg-B%3`QgYo|+tS-b(nJzMjL7_9>FqWNT1n|iD+&0BPa2Rb4cr-! z{gZKgP>(w?V&C`(Q!wzLJBj-O92GKcNLa{7lZFQ|Sc8;A9yB$`N`_8yqmBy`nxJz% zLUSYcwNGFA=500ozhqT7WAJ?Iw!IHH;oJnEX>x3dqc&xEb2CUA zaJn5bgwt>uTmlYh4kyYf)T}&~N7w;OykV!Q?DugO(Jo=T<=Sg@zXdxyhj7}CV?;dk zf0HJBNBvRuE1dtse2PCJ?U()@Ux4WH=j2yi^{!K{hh0y(_j{T>L!L99&nfN7R^c8NBr6ynVo|-oTX9Hgd27VI%yDNK0f* zWNYNp(TeE3(T8J4VvogMi2Xe7i4Vn30dAthTiK(y38lxOGLf)7Kl`+(MRiH*p%zqA zVdHk3POV-$?n3;u9jCAFB6i$^{1H1|2_ASJyNtWM$nm4Zic5$eu;Vh~19qJL+4OEZ z?#B0c2|MmV{&qWF3Eks~Q-_Y-b9CS2;(w>@oIG*z(D7r5u3UckzoaeOYT3-~lLt;8 znK-fdzi!Lc96o;RRN}zovB?t?rzZC&Zoen7dEfET + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/js/tinymce/skins/lightgray/fonts/tinymce.ttf b/assets/js/tinymce/skins/lightgray/fonts/tinymce.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ab4487febe5b98a161dcd2daa9b80d03de7c0fd8 GIT binary patch literal 14144 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 C+YCGa literal 0 HcmV?d00001 diff --git a/assets/js/tinymce/skins/lightgray/img/loader.gif b/assets/js/tinymce/skins/lightgray/img/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..c69e937232b24ea30f01c68bbd2ebc798dcecfcb GIT binary patch literal 2608 zcmdVcdr(tX9tZGC9yiG~=H_*Q-0%n(kWqP*D#hw{AQu8;1%gl-Hrf&{2?48KX;hHy z3Ze*zEz4t3XdUFyLbNPUYlA`|B}P=N1fqtL1*}S;87#|-W9v<#G;ul(e%d3)N(^9c$d2Dz{7}?ErjNd;{EMKkCsk21~b9Gvg zDo<7L=3Z5HNbVlZUcm1eg#o#CZCJU`3IYHwM->zCd?uYrF3vKFeM}v?f+%s?E>ly|3W25ry9#NNbTx-}0ON58dTrs^ix{_1O0Wh~SVSBlH)Ajn zPn^Gbjz}PCtN@#keR&hK&Dhl-b$kZ8^S)x#dh0{7X=X%CCJk7P1PSO>T&S8I4{#Lg zb5#)o=;!ZP*1nM{cI4@(x7o27*SA()NHmrn67aN@Pmi~(i_SnrjYnwh36aG%!@i0d zqbvfa44f|?OG4ntP|nbjhEl1)Yp6ZN@yjy zy4==QmLy%t;ps3R?~f2KfTTI|2?q8dFd6^z5GF+Xa&Y)sjG)hxit80pPcOP zJ z*LW{SyGHD%hUotV+W%I}fBLAIx!8|7#}$;clKQ+{&FjDqGQ2ZNx(lYM3*%~}ILnao zM`aui55~ZFJlu^!5rdA9Q_7H68H_;##u{x(Yn-vSfIRCb^Nqsg zGRS!Egm>h+o<}LeV4&CLReo9FrDjDvs}8?JwC)#Qs|ie=r?~xUh)&*d`Fx>FG}%X# zNdtDHBKhLPC0wpooFDAQKL%*6T|ULH$=wX!NhcasgD3d;-d$I6yRK3yN+E~C1335_iLOt+*9uvSZ`>*KA}vm}08wRq=>5l|t*Na&jR z-C1&C`nkEk#sB|@yyt-#fXngP04My zm7u$Q%EJbHp`>~`5W&L{W!6`y&}LMS;jfUpgO~7TLVMRZ9IC)IZp0A${`yp0{&wco z#1nx@XMkhqeK%7?RE7JdLr1^nwFfaJ0Q&Lv?WNJ%9}VSJsNY2+UYs2%EU0J~ayFXv zi*?7KCXQHkD)O6!0Q%4N+HTODHxJ{kQSuQX$l-rSwkwh(zMkdfzxyGwl@yHC)C4p< z&n2%8#M?)Q@mgHL1ot8`SFdSEj9ye|jHy+U8#@HoUExG=@AVkRAe_qYm4EpzK6L*& zh`)26?V#f4#_h^P9G^%>h2-H3)$QP zQovu6J9qDvsxqweDdNNa!Lb?L4_UF{tLX_nN7r0U_vF14YKcGR-*Gl} zx3oG)bzf|65dBxD-;2ZCp??K;+TuQ9onnK?==5hzbkb^r_g>z4#D8mcv8(+XdoszA zCx-qhdgxMNMotj}SiL_6V(tLcsK7(M(r(%u<}QrVfOvyK6_;~NOTlPGfX@M7S5YQF z&*$(ylJMHJt^_aQeu{C6NaTE$G3HNN@_SnN8YcaKn%`)F@~L1x+ah7-gEJPpc6w%3 zyX}r+Qk$4RHZzfH){e~F*qJ{d*L8a6n4;U?+{de0-t)mal#TVxe)3F}^UBh+zd T)6_**#cgp_+?JL9(ew3BlNF>u literal 0 HcmV?d00001 diff --git a/assets/js/tinymce/skins/lightgray/img/object.gif b/assets/js/tinymce/skins/lightgray/img/object.gif new file mode 100644 index 0000000000000000000000000000000000000000..cccd7f023fb80908cb33bb7d9604236cd21b7ae7 GIT binary patch literal 152 zcmV;J0B8S4Nk%w1VG#fg0J9GO<>lo+KR<78Z?v?uS65g4{r%Y3*xlXT%F4>`@9+2b z_ww@cot>Tk|Nk>HGXMYpA^8LW000jFEC2ui01*HU000C<(8)=wd#<&tyXIMjHBV`d zBSi|xsj3(;nD0kQ0aJq8eLH~x02P|t2!_J&Wqb%0io?#xD.mce-arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:rgba(0,0,0,0.2);border-bottom-color:rgba(0,0,0,0.25);top:-11px}.mce-floatpanel.mce-popover.mce-bottom>.mce-arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.mce-floatpanel.mce-popover.mce-bottom.mce-start{margin-left:-22px}.mce-floatpanel.mce-popover.mce-bottom.mce-start>.mce-arrow{left:20px}.mce-floatpanel.mce-popover.mce-bottom.mce-end{margin-left:22px}.mce-floatpanel.mce-popover.mce-bottom.mce-end>.mce-arrow{right:10px;left:auto}.mce-fullscreen{border:0;padding:0;margin:0;overflow:hidden;height:100%}div.mce-fullscreen{position:fixed;top:0;left:0}#mce-modal-block{opacity:0;filter:alpha(opacity=0);zoom:1;position:fixed;left:0;top:0;width:100%;height:100%;background:#000}#mce-modal-block.mce-in{opacity:.3;filter:alpha(opacity=30);zoom:1}.mce-window-move{cursor:move}.mce-window{filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;background:#fff;position:fixed;top:0;left:0;opacity:0;-webkit-transition:opacity 150ms ease-in;transition:opacity 150ms ease-in}.mce-window.mce-in{opacity:1}.mce-window-head{padding:9px 15px;border-bottom:1px solid #c5c5c5;position:relative}.mce-window-head .mce-close{position:absolute;right:15px;top:9px;font-size:20px;font-weight:bold;line-height:20px;color:#858585;cursor:pointer;height:20px;overflow:hidden}.mce-close:hover{color:#adadad}.mce-window-head .mce-title{line-height:20px;font-size:20px;font-weight:bold;text-rendering:optimizelegibility;padding-right:10px}.mce-window .mce-container-body{display:block}.mce-foot{display:block;background-color:#fff;border-top:1px solid #c5c5c5}.mce-window-head .mce-dragh{position:absolute;top:0;left:0;cursor:move;width:90%;height:100%}.mce-window iframe{width:100%;height:100%}.mce-window-body .mce-listbox{border-color:#ccc}.mce-rtl .mce-window-head .mce-close{position:absolute;right:auto;left:15px}.mce-rtl .mce-window-head .mce-dragh{left:auto;right:0}.mce-rtl .mce-window-head .mce-title{direction:rtl;text-align:right}.mce-tooltip{position:absolute;padding:5px;opacity:.8;filter:alpha(opacity=80);zoom:1}.mce-tooltip-inner{font-size:11px;background-color:#000;color:white;max-width:200px;padding:5px 8px 4px 8px;text-align:center;white-space:normal}.mce-tooltip-arrow{position:absolute;width:0;height:0;line-height:0;border:5px dashed #000}.mce-tooltip-arrow-n{border-bottom-color:#000}.mce-tooltip-arrow-s{border-top-color:#000}.mce-tooltip-arrow-e{border-left-color:#000}.mce-tooltip-arrow-w{border-right-color:#000}.mce-tooltip-nw,.mce-tooltip-sw{margin-left:-14px}.mce-tooltip-n .mce-tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-nw .mce-tooltip-arrow{top:0;left:10px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-ne .mce-tooltip-arrow{top:0;right:10px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-s .mce-tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-sw .mce-tooltip-arrow{bottom:0;left:10px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-se .mce-tooltip-arrow{bottom:0;right:10px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-e .mce-tooltip-arrow{right:0;top:50%;margin-top:-5px;border-left-style:solid;border-right:none;border-top-color:transparent;border-bottom-color:transparent}.mce-tooltip-w .mce-tooltip-arrow{left:0;top:50%;margin-top:-5px;border-right-style:solid;border-left:none;border-top-color:transparent;border-bottom-color:transparent}.mce-progress{display:inline-block;position:relative;height:20px}.mce-progress .mce-bar-container{display:inline-block;width:100px;height:100%;margin-right:8px;border:1px solid #ccc;overflow:hidden}.mce-progress .mce-text{display:inline-block;margin-top:auto;margin-bottom:auto;font-size:14px;width:40px;color:#333;text-shadow:1px 1px none}.mce-bar{display:block;width:0;height:100%;background-color:#d7d7d7;-webkit-transition:width .2s ease;transition:width .2s ease}.mce-notification{position:absolute;background-color:#f0f0f0;padding:5px;margin-top:5px;opacity:.8;filter:alpha(opacity=80);zoom:1;border-width:1px;border-style:solid;border-color:#ccc}.mce-notification-success{background-color:#dff0d8;border-color:#d6e9c6}.mce-notification-info{background-color:#d9edf7;border-color:#779ecb}.mce-notification-warning{background-color:#fcf8e3;border-color:#faebcc}.mce-notification-error{background-color:#f2dede;border-color:#ebccd1}.mce-notification.mce-has-close{padding-right:15px}.mce-notification .mce-ico{margin-top:5px}.mce-notification-inner{display:inline-block;font-size:14px;margin:5px 8px 4px 8px;text-align:center;white-space:normal;color:#31708f}.mce-notification-inner a{text-decoration:underline;cursor:pointer}.mce-notification .mce-progress{margin-right:8px}.mce-notification .mce-progress .mce-text{margin-top:5px}.mce-notification *,.mce-notification .mce-progress .mce-text{color:#333}.mce-notification .mce-progress .mce-bar-container{border-color:#ccc}.mce-notification .mce-progress .mce-bar-container .mce-bar{background-color:#333}.mce-notification-success *,.mce-notification-success .mce-progress .mce-text{color:#3c763d}.mce-notification-success .mce-progress .mce-bar-container{border-color:#d6e9c6}.mce-notification-success .mce-progress .mce-bar-container .mce-bar{background-color:#3c763d}.mce-notification-info *,.mce-notification-info .mce-progress .mce-text{color:#31708f}.mce-notification-info .mce-progress .mce-bar-container{border-color:#779ecb}.mce-notification-info .mce-progress .mce-bar-container .mce-bar{background-color:#31708f}.mce-notification-warning *,.mce-notification-warning .mce-progress .mce-text{color:#8a6d3b}.mce-notification-warning .mce-progress .mce-bar-container{border-color:#faebcc}.mce-notification-warning .mce-progress .mce-bar-container .mce-bar{background-color:#8a6d3b}.mce-notification-error *,.mce-notification-error .mce-progress .mce-text{color:#a94442}.mce-notification-error .mce-progress .mce-bar-container{border-color:#ebccd1}.mce-notification-error .mce-progress .mce-bar-container .mce-bar{background-color:#a94442}.mce-notification .mce-close{position:absolute;top:6px;right:8px;font-size:20px;font-weight:bold;line-height:20px;color:#858585;cursor:pointer;height:20px;overflow:hidden}.mce-abs-layout{position:relative}body .mce-abs-layout-item,.mce-abs-end{position:absolute}.mce-abs-end{width:1px;height:1px}.mce-container-body.mce-abs-layout{overflow:hidden}.mce-btn{border:1px solid #b1b1b1;border-color:transparent transparent transparent transparent;position:relative;text-shadow:0 1px 1px rgba(255,255,255,0.75);display:inline-block;*display:inline;*zoom:1;background-color:#f0f0f0}.mce-btn:hover,.mce-btn:focus{color:#333;background-color:#e3e3e3;border-color:#ccc}.mce-btn.mce-disabled button,.mce-btn.mce-disabled:hover button{cursor:default;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-btn.mce-active,.mce-btn.mce-active:hover{background-color:#dbdbdb;border-color:#ccc}.mce-btn:active{background-color:#e0e0e0;border-color:#ccc}.mce-btn button{padding:4px 8px;font-size:14px;line-height:20px;*line-height:16px;cursor:pointer;color:#333;text-align:center;overflow:visible;-webkit-appearance:none}.mce-btn button::-moz-focus-inner{border:0;padding:0}.mce-btn i{text-shadow:1px 1px none}.mce-primary{min-width:50px;color:#fff;border:1px solid transparent;border-color:transparent;background-color:#2d8ac7}.mce-primary:hover,.mce-primary:focus{background-color:#257cb6;border-color:transparent}.mce-primary.mce-disabled button,.mce-primary.mce-disabled:hover button{cursor:default;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-primary.mce-active,.mce-primary.mce-active:hover,.mce-primary:not(.mce-disabled):active{background-color:#206ea1}.mce-primary button,.mce-primary button i{color:#fff;text-shadow:1px 1px none}.mce-btn .mce-txt{font-size:inherit;line-height:inherit;color:inherit}.mce-btn-large button{padding:9px 14px;font-size:16px;line-height:normal}.mce-btn-large i{margin-top:2px}.mce-btn-small button{padding:1px 5px;font-size:12px;*padding-bottom:2px}.mce-btn-small i{line-height:20px;vertical-align:top;*line-height:18px}.mce-btn .mce-caret{margin-top:8px;margin-left:0}.mce-btn-small .mce-caret{margin-top:8px;margin-left:0}.mce-caret{display:inline-block;*display:inline;*zoom:1;width:0;height:0;vertical-align:top;border-top:4px solid #333;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.mce-disabled .mce-caret{border-top-color:#aaa}.mce-caret.mce-up{border-bottom:4px solid #333;border-top:0}.mce-btn-flat{border:0;background:transparent;filter:none}.mce-btn-flat:hover,.mce-btn-flat.mce-active,.mce-btn-flat:focus,.mce-btn-flat:active{border:0;background:#e6e6e6;filter:none}.mce-btn-has-text .mce-ico{padding-right:5px}.mce-rtl .mce-btn button{direction:rtl}.mce-btn-group .mce-btn{border-width:1px;margin:0;margin-left:2px}.mce-btn-group:not(:first-child){border-left:1px solid #d9d9d9;padding-left:3px;margin-left:3px}.mce-btn-group .mce-first{margin-left:0}.mce-btn-group .mce-btn.mce-flow-layout-item{margin:0}.mce-rtl .mce-btn-group .mce-btn{margin-left:0;margin-right:2px}.mce-rtl .mce-btn-group .mce-first{margin-right:0}.mce-rtl .mce-btn-group:not(:first-child){border-left:none;border-right:1px solid #d9d9d9;padding-right:4px;margin-right:4px}.mce-checkbox{cursor:pointer}i.mce-i-checkbox{margin:0 3px 0 0;border:1px solid #c5c5c5;background-color:#f0f0f0;text-indent:-10em;*font-size:0;*line-height:0;*text-indent:0;overflow:hidden}.mce-checked i.mce-i-checkbox{color:#333;font-size:16px;line-height:16px;text-indent:0}.mce-checkbox:focus i.mce-i-checkbox,.mce-checkbox.mce-focus i.mce-i-checkbox{border:1px solid rgba(82,168,236,0.8)}.mce-checkbox.mce-disabled .mce-label,.mce-checkbox.mce-disabled i.mce-i-checkbox{color:#acacac}.mce-checkbox .mce-label{vertical-align:middle}.mce-rtl .mce-checkbox{direction:rtl;text-align:right}.mce-rtl i.mce-i-checkbox{margin:0 0 0 3px}.mce-combobox{display:inline-block;*display:inline;*zoom:1;*height:32px}.mce-combobox input{border:1px solid #c5c5c5;border-right-color:#c5c5c5;height:28px}.mce-combobox.mce-disabled input{color:#adadad}.mce-combobox .mce-btn{border:1px solid #c5c5c5;border-left:0}.mce-combobox button{padding-right:8px;padding-left:8px}.mce-combobox.mce-disabled .mce-btn button{cursor:default;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-colorbox i{border:1px solid #c5c5c5;width:14px;height:14px}.mce-colorbutton .mce-ico{position:relative}.mce-colorbutton-grid{margin:4px}.mce-colorbutton button{padding-right:6px;padding-left:6px}.mce-colorbutton .mce-preview{padding-right:3px;display:block;position:absolute;left:50%;top:50%;margin-left:-17px;margin-top:7px;background:gray;width:13px;height:2px;overflow:hidden}.mce-colorbutton.mce-btn-small .mce-preview{margin-left:-16px;padding-right:0;width:16px}.mce-colorbutton .mce-open{padding-left:4px;padding-right:4px;border-left:1px solid transparent}.mce-colorbutton:hover .mce-open{border-color:#ccc}.mce-colorbutton.mce-btn-small .mce-open{padding:0 3px 0 3px}.mce-rtl .mce-colorbutton{direction:rtl}.mce-rtl .mce-colorbutton .mce-preview{margin-left:0;padding-right:0;padding-left:3px}.mce-rtl .mce-colorbutton.mce-btn-small .mce-preview{margin-left:0;padding-right:0;padding-left:2px}.mce-rtl .mce-colorbutton .mce-open{padding-left:4px;padding-right:4px;border-left:0}.mce-colorpicker{position:relative;width:250px;height:220px}.mce-colorpicker-sv{position:absolute;top:0;left:0;width:90%;height:100%;border:1px solid #c5c5c5;cursor:crosshair;overflow:hidden}.mce-colorpicker-h-chunk{width:100%}.mce-colorpicker-overlay1,.mce-colorpicker-overlay2{width:100%;height:100%;position:absolute;top:0;left:0}.mce-colorpicker-overlay1{filter:progid:DXImageTransform.Microsoft.gradient(GradientType=1, startColorstr='#ffffff', endColorstr='#00ffffff');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientType=1,startColorstr='#ffffff', endColorstr='#00ffffff')";background:linear-gradient(to right, #fff, rgba(255,255,255,0))}.mce-colorpicker-overlay2{filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#00000000', endColorstr='#000000');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#00000000', endColorstr='#000000')";background:linear-gradient(to bottom, rgba(0,0,0,0), #000)}.mce-colorpicker-selector1{background:none;position:absolute;width:12px;height:12px;margin:-8px 0 0 -8px;border:1px solid black;border-radius:50%}.mce-colorpicker-selector2{position:absolute;width:10px;height:10px;border:1px solid white;border-radius:50%}.mce-colorpicker-h{position:absolute;top:0;right:0;width:6.5%;height:100%;border:1px solid #c5c5c5;cursor:crosshair}.mce-colorpicker-h-marker{margin-top:-4px;position:absolute;top:0;left:-1px;width:100%;border:1px solid #333;background:#fff;height:4px;z-index:100}.mce-path{display:inline-block;*display:inline;*zoom:1;padding:8px;white-space:normal}.mce-path .mce-txt{display:inline-block;padding-right:3px}.mce-path .mce-path-body{display:inline-block}.mce-path-item{display:inline-block;*display:inline;*zoom:1;cursor:pointer;color:#333}.mce-path-item:hover{text-decoration:underline}.mce-path-item:focus{background:#666;color:#fff}.mce-path .mce-divider{display:inline}.mce-disabled .mce-path-item{color:#aaa}.mce-rtl .mce-path{direction:rtl}.mce-fieldset{border:0 solid #9e9e9e}.mce-fieldset>.mce-container-body{margin-top:-15px}.mce-fieldset-title{margin-left:5px;padding:0 5px 0 5px}.mce-fit-layout{display:inline-block;*display:inline;*zoom:1}.mce-fit-layout-item{position:absolute}.mce-flow-layout-item{display:inline-block;*display:inline;*zoom:1}.mce-flow-layout-item{margin:2px 0 2px 2px}.mce-flow-layout-item.mce-last{margin-right:2px}.mce-flow-layout{white-space:normal}.mce-tinymce-inline .mce-flow-layout{white-space:nowrap}.mce-rtl .mce-flow-layout{text-align:right;direction:rtl}.mce-rtl .mce-flow-layout-item{margin:2px 2px 2px 0}.mce-rtl .mce-flow-layout-item.mce-last{margin-left:2px}.mce-iframe{border:0 solid rgba(0,0,0,0.2);width:100%;height:100%}.mce-label{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 1px rgba(255,255,255,0.75);overflow:hidden}.mce-label.mce-autoscroll{overflow:auto}.mce-label.mce-disabled{color:#aaa}.mce-label.mce-multiline{white-space:pre-wrap}.mce-label.mce-error{color:#a00}.mce-rtl .mce-label{text-align:right;direction:rtl}.mce-menubar .mce-menubtn{border-color:transparent;background:transparent;filter:none}.mce-menubar .mce-menubtn button{color:#333}.mce-menubar{border:1px solid rgba(217,217,217,0.52)}.mce-menubar .mce-menubtn button span{color:#333}.mce-menubar .mce-caret{border-top-color:#333}.mce-menubar .mce-menubtn:hover,.mce-menubar .mce-menubtn.mce-active,.mce-menubar .mce-menubtn:focus{border-color:#ccc;background:#fff;filter:none}.mce-menubtn button{color:#333}.mce-menubtn.mce-btn-small span{font-size:12px}.mce-menubtn.mce-fixed-width span{display:inline-block;overflow-x:hidden;text-overflow:ellipsis;width:90px}.mce-menubtn.mce-fixed-width.mce-btn-small span{width:70px}.mce-menubtn .mce-caret{*margin-top:6px}.mce-rtl .mce-menubtn button{direction:rtl;text-align:right}.mce-menu-item{display:block;padding:6px 15px 6px 12px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap;cursor:pointer;line-height:normal;border-left:4px solid transparent;margin-bottom:1px}.mce-menu-item .mce-ico,.mce-menu-item .mce-text{color:#333}.mce-menu-item.mce-disabled .mce-text,.mce-menu-item.mce-disabled .mce-ico{color:#adadad}.mce-menu-item:hover .mce-text,.mce-menu-item.mce-selected .mce-text,.mce-menu-item:focus .mce-text{color:white}.mce-menu-item:hover .mce-ico,.mce-menu-item.mce-selected .mce-ico,.mce-menu-item:focus .mce-ico{color:white}.mce-menu-item.mce-disabled:hover{background:#ccc}.mce-menu-shortcut{display:inline-block;color:#adadad}.mce-menu-shortcut{display:inline-block;*display:inline;*zoom:1;padding:0 15px 0 20px}.mce-menu-item:hover .mce-menu-shortcut,.mce-menu-item.mce-selected .mce-menu-shortcut,.mce-menu-item:focus .mce-menu-shortcut{color:white}.mce-menu-item .mce-caret{margin-top:4px;*margin-top:3px;margin-right:6px;border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:4px solid #333}.mce-menu-item.mce-selected .mce-caret,.mce-menu-item:focus .mce-caret,.mce-menu-item:hover .mce-caret{border-left-color:white}.mce-menu-align .mce-menu-shortcut{*margin-top:-2px}.mce-menu-align .mce-menu-shortcut,.mce-menu-align .mce-caret{position:absolute;right:0}.mce-menu-item.mce-active i{visibility:visible}.mce-menu-item-normal.mce-active{background-color:#3498db}.mce-menu-item-preview.mce-active{border-left:5px solid #aaa}.mce-menu-item-normal.mce-active .mce-text{color:white}.mce-menu-item-normal.mce-active:hover .mce-text,.mce-menu-item-normal.mce-active:hover .mce-ico{color:white}.mce-menu-item-normal.mce-active:focus .mce-text,.mce-menu-item-normal.mce-active:focus .mce-ico{color:white}.mce-menu-item:hover,.mce-menu-item.mce-selected,.mce-menu-item:focus{text-decoration:none;color:white;background-color:#2d8ac7}div.mce-menu .mce-menu-item-sep,.mce-menu-item-sep:hover{border:0;padding:0;height:1px;margin:9px 1px;overflow:hidden;background:transparent;border-bottom:1px solid rgba(0,0,0,0.1);cursor:default;filter:none}.mce-menu.mce-rtl{direction:rtl}.mce-rtl .mce-menu-item{text-align:right;direction:rtl;padding:6px 12px 6px 15px}.mce-menu-align.mce-rtl .mce-menu-shortcut,.mce-menu-align.mce-rtl .mce-caret{right:auto;left:0}.mce-rtl .mce-menu-item .mce-caret{margin-left:6px;margin-right:0;border-right:4px solid #333;border-left:0}.mce-rtl .mce-menu-item.mce-selected .mce-caret,.mce-rtl .mce-menu-item:focus .mce-caret,.mce-rtl .mce-menu-item:hover .mce-caret{border-left-color:transparent;border-right-color:white}.mce-menu{position:absolute;left:0;top:0;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;z-index:1000;padding:5px 0 5px 0;margin:-1px 0 0;min-width:160px;background:#fff;border:1px solid #989898;border:1px solid rgba(0,0,0,0.2);z-index:1002;max-height:400px;overflow:auto;overflow-x:hidden}.mce-menu i{display:none}.mce-menu-has-icons i{display:inline-block;*display:inline}.mce-menu-sub-tr-tl{margin:-6px 0 0 -1px}.mce-menu-sub-br-bl{margin:6px 0 0 -1px}.mce-menu-sub-tl-tr{margin:-6px 0 0 1px}.mce-menu-sub-bl-br{margin:6px 0 0 1px}.mce-listbox button{text-align:left;padding-right:20px;position:relative}.mce-listbox .mce-caret{position:absolute;margin-top:-2px;right:8px;top:50%}.mce-rtl .mce-listbox .mce-caret{right:auto;left:8px}.mce-rtl .mce-listbox button{padding-right:10px;padding-left:20px}.mce-container-body .mce-resizehandle{position:absolute;right:0;bottom:0;width:16px;height:16px;visibility:visible;cursor:s-resize;margin:0}.mce-container-body .mce-resizehandle-both{cursor:se-resize}i.mce-i-resize{color:#333}.mce-selectbox{background:#fff;border:1px solid #c5c5c5}.mce-slider{border:1px solid #aaa;background:#eee;width:100px;height:10px;position:relative;display:block}.mce-slider.mce-vertical{width:10px;height:100px}.mce-slider-handle{border:1px solid #bbb;background:#ddd;display:block;width:13px;height:13px;position:absolute;top:0;left:0;margin-left:-1px;margin-top:-2px}.mce-spacer{visibility:hidden}.mce-splitbtn .mce-open{border-left:1px solid transparent}.mce-splitbtn:hover .mce-open{border-left-color:#ccc}.mce-splitbtn button{padding-right:6px;padding-left:6px}.mce-splitbtn .mce-open{padding-right:4px;padding-left:4px}.mce-splitbtn .mce-open.mce-active{background-color:#dbdbdb;outline:1px solid #ccc}.mce-splitbtn.mce-btn-small .mce-open{padding:0 3px 0 3px}.mce-rtl .mce-splitbtn{direction:rtl;text-align:right}.mce-rtl .mce-splitbtn button{padding-right:4px;padding-left:4px}.mce-rtl .mce-splitbtn .mce-open{border-left:0}.mce-stack-layout-item{display:block}.mce-tabs{display:block;border-bottom:1px solid #c5c5c5}.mce-tabs,.mce-tabs+.mce-container-body{background:#fff}.mce-tab{display:inline-block;*display:inline;*zoom:1;border:1px solid #c5c5c5;border-width:0 1px 0 0;background:#fff;padding:8px;text-shadow:0 1px 1px rgba(255,255,255,0.75);height:13px;cursor:pointer}.mce-tab:hover{background:#fdfdfd}.mce-tab.mce-active{background:#fdfdfd;border-bottom-color:transparent;margin-bottom:-1px;height:14px}.mce-rtl .mce-tabs{text-align:right;direction:rtl}.mce-rtl .mce-tab{border-width:0 0 0 1px}.mce-textbox{background:#fff;border:1px solid #c5c5c5;display:inline-block;-webkit-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s;height:28px;resize:none;padding:0 4px 0 4px;white-space:pre-wrap;*white-space:pre;color:#333}.mce-textbox:focus,.mce-textbox.mce-focus{border-color:#3498db}.mce-placeholder .mce-textbox{color:#aaa}.mce-textbox.mce-multiline{padding:4px;height:auto}.mce-textbox.mce-disabled{color:#adadad}.mce-rtl .mce-textbox{text-align:right;direction:rtl}.mce-throbber{position:absolute;top:0;left:0;width:100%;height:100%;opacity:.6;filter:alpha(opacity=60);zoom:1;background:#fff url('img/loader.gif') no-repeat center center}.mce-throbber-inline{position:static;height:50px}@font-face{font-family:'tinymce';src:url('fonts/tinymce.eot');src:url('fonts/tinymce.eot?#iefix') format('embedded-opentype'),url('fonts/tinymce.woff') format('woff'),url('fonts/tinymce.ttf') format('truetype'),url('fonts/tinymce.svg#tinymce') format('svg');font-weight:normal;font-style:normal}@font-face{font-family:'tinymce-small';src:url('fonts/tinymce-small.eot');src:url('fonts/tinymce-small.eot?#iefix') format('embedded-opentype'),url('fonts/tinymce-small.woff') format('woff'),url('fonts/tinymce-small.ttf') format('truetype'),url('fonts/tinymce-small.svg#tinymce') format('svg');font-weight:normal;font-style:normal}.mce-ico{font-family:'tinymce';font-style:normal;font-weight:normal;font-size:16px;line-height:16px;vertical-align:text-top;-webkit-font-smoothing:antialiased;display:inline-block;background:transparent center center;width:16px;height:16px;color:#333;-ie7-icon:' '}.mce-btn-small .mce-ico{font-family:'tinymce-small'}.mce-ico,i.mce-i-checkbox{zoom:expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = this.currentStyle['-ie7-icon'].substr(1, 1) + ' ')}.mce-i-save{-ie7-icon:"\e000"}.mce-i-newdocument{-ie7-icon:"\e001"}.mce-i-fullpage{-ie7-icon:"\e002"}.mce-i-alignleft{-ie7-icon:"\e003"}.mce-i-aligncenter{-ie7-icon:"\e004"}.mce-i-alignright{-ie7-icon:"\e005"}.mce-i-alignjustify{-ie7-icon:"\e006"}.mce-i-alignnone{-ie7-icon:"\e003"}.mce-i-cut{-ie7-icon:"\e007"}.mce-i-paste{-ie7-icon:"\e008"}.mce-i-searchreplace{-ie7-icon:"\e009"}.mce-i-bullist{-ie7-icon:"\e00a"}.mce-i-numlist{-ie7-icon:"\e00b"}.mce-i-indent{-ie7-icon:"\e00c"}.mce-i-outdent{-ie7-icon:"\e00d"}.mce-i-blockquote{-ie7-icon:"\e00e"}.mce-i-undo{-ie7-icon:"\e00f"}.mce-i-redo{-ie7-icon:"\e010"}.mce-i-link{-ie7-icon:"\e011"}.mce-i-unlink{-ie7-icon:"\e012"}.mce-i-anchor{-ie7-icon:"\e013"}.mce-i-image{-ie7-icon:"\e014"}.mce-i-media{-ie7-icon:"\e015"}.mce-i-help{-ie7-icon:"\e016"}.mce-i-code{-ie7-icon:"\e017"}.mce-i-insertdatetime{-ie7-icon:"\e018"}.mce-i-preview{-ie7-icon:"\e019"}.mce-i-forecolor{-ie7-icon:"\e01a"}.mce-i-backcolor{-ie7-icon:"\e01a"}.mce-i-table{-ie7-icon:"\e01b"}.mce-i-hr{-ie7-icon:"\e01c"}.mce-i-removeformat{-ie7-icon:"\e01d"}.mce-i-subscript{-ie7-icon:"\e01e"}.mce-i-superscript{-ie7-icon:"\e01f"}.mce-i-charmap{-ie7-icon:"\e020"}.mce-i-emoticons{-ie7-icon:"\e021"}.mce-i-print{-ie7-icon:"\e022"}.mce-i-fullscreen{-ie7-icon:"\e023"}.mce-i-spellchecker{-ie7-icon:"\e024"}.mce-i-nonbreaking{-ie7-icon:"\e025"}.mce-i-template{-ie7-icon:"\e026"}.mce-i-pagebreak{-ie7-icon:"\e027"}.mce-i-restoredraft{-ie7-icon:"\e028"}.mce-i-untitled{-ie7-icon:"\e029"}.mce-i-bold{-ie7-icon:"\e02a"}.mce-i-italic{-ie7-icon:"\e02b"}.mce-i-underline{-ie7-icon:"\e02c"}.mce-i-strikethrough{-ie7-icon:"\e02d"}.mce-i-visualchars{-ie7-icon:"\e02e"}.mce-i-ltr{-ie7-icon:"\e02f"}.mce-i-rtl{-ie7-icon:"\e030"}.mce-i-copy{-ie7-icon:"\e031"}.mce-i-resize{-ie7-icon:"\e032"}.mce-i-browse{-ie7-icon:"\e034"}.mce-i-pastetext{-ie7-icon:"\e035"}.mce-i-rotateleft{-ie7-icon:"\eaa8"}.mce-i-rotateright{-ie7-icon:"\eaa9"}.mce-i-crop{-ie7-icon:"\ee78"}.mce-i-editimage{-ie7-icon:"\e914"}.mce-i-options{-ie7-icon:"\ec6a"}.mce-i-flipv{-ie7-icon:"\eaaa"}.mce-i-fliph{-ie7-icon:"\eaac"}.mce-i-zoomin{-ie7-icon:"\eb35"}.mce-i-zoomout{-ie7-icon:"\eb36"}.mce-i-sun{-ie7-icon:"\eccc"}.mce-i-moon{-ie7-icon:"\eccd"}.mce-i-arrowleft{-ie7-icon:"\edc0"}.mce-i-arrowright{-ie7-icon:"\edb8"}.mce-i-drop{-ie7-icon:"\e934"}.mce-i-contrast{-ie7-icon:"\ecd4"}.mce-i-sharpen{-ie7-icon:"\eba7"}.mce-i-palette{-ie7-icon:"\e92a"}.mce-i-resize2{-ie7-icon:"\edf9"}.mce-i-orientation{-ie7-icon:"\e601"}.mce-i-invert{-ie7-icon:"\e602"}.mce-i-gamma{-ie7-icon:"\e600"}.mce-i-remove{-ie7-icon:"\ed6a"}.mce-i-codesample{-ie7-icon:"\e603"}.mce-i-checkbox,.mce-i-selected{-ie7-icon:"\e033"}.mce-i-selected{visibility:hidden}.mce-i-backcolor{background:#bbb} \ No newline at end of file diff --git a/assets/js/tinymce/skins/lightgray/skin.min.css b/assets/js/tinymce/skins/lightgray/skin.min.css new file mode 100644 index 0000000..4718a6d --- /dev/null +++ b/assets/js/tinymce/skins/lightgray/skin.min.css @@ -0,0 +1 @@ +.mce-container,.mce-container *,.mce-widget,.mce-widget *,.mce-reset{margin:0;padding:0;border:0;outline:0;vertical-align:top;background:transparent;text-decoration:none;color:#333;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;text-shadow:none;float:none;position:static;width:auto;height:auto;white-space:nowrap;cursor:inherit;-webkit-tap-highlight-color:transparent;line-height:normal;font-weight:normal;text-align:left;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;direction:ltr;max-width:none}.mce-widget button{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.mce-container *[unselectable]{-moz-user-select:none;-webkit-user-select:none;-o-user-select:none;user-select:none}.mce-fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.mce-fade.mce-in{opacity:1}.mce-tinymce{visibility:inherit !important;position:relative}.mce-fullscreen{border:0;padding:0;margin:0;overflow:hidden;height:100%;z-index:100}div.mce-fullscreen{position:fixed;top:0;left:0;width:100%;height:auto}.mce-tinymce{display:block}.mce-wordcount{position:absolute;top:0;right:0;padding:8px}div.mce-edit-area{background:#fff;filter:none}.mce-statusbar{position:relative}.mce-statusbar .mce-container-body{position:relative}.mce-fullscreen .mce-resizehandle{display:none}.mce-charmap{border-collapse:collapse}.mce-charmap td{cursor:default;border:1px solid rgba(0,0,0,0.2);width:20px;height:20px;line-height:20px;text-align:center;vertical-align:middle;padding:2px}.mce-charmap td div{text-align:center}.mce-charmap td:hover{background:#d9d9d9}.mce-grid td.mce-grid-cell div{border:1px solid #d6d6d6;width:15px;height:15px;margin:0;cursor:pointer}.mce-grid td.mce-grid-cell div:focus{border-color:#3498db}.mce-grid td.mce-grid-cell div[disabled]{cursor:not-allowed}.mce-grid{border-spacing:2px;border-collapse:separate}.mce-grid a{display:block;border:1px solid transparent}.mce-grid a:hover,.mce-grid a:focus{border-color:#3498db}.mce-grid-border{margin:0 4px 0 4px}.mce-grid-border a{border-color:#d6d6d6;width:13px;height:13px}.mce-grid-border a:hover,.mce-grid-border a.mce-active{border-color:#3498db;background:#3498db}.mce-text-center{text-align:center}div.mce-tinymce-inline{width:100%}.mce-colorbtn-trans div{text-align:center;vertical-align:middle;font-weight:bold;font-size:20px;line-height:16px;color:#707070}.mce-monospace{font-family:"Courier New",Courier,monospace}.mce-toolbar-grp{padding:2px 0}.mce-toolbar-grp .mce-flow-layout-item{margin-bottom:0}.mce-rtl .mce-wordcount{left:0;right:auto}.mce-croprect-container{position:absolute;top:0;left:0}.mce-croprect-handle{position:absolute;top:0;left:0;width:20px;height:20px;border:2px solid white}.mce-croprect-handle-nw{border-width:2px 0 0 2px;margin:-2px 0 0 -2px;cursor:nw-resize;top:100px;left:100px}.mce-croprect-handle-ne{border-width:2px 2px 0 0;margin:-2px 0 0 -20px;cursor:ne-resize;top:100px;left:200px}.mce-croprect-handle-sw{border-width:0 0 2px 2px;margin:-20px 2px 0 -2px;cursor:sw-resize;top:200px;left:100px}.mce-croprect-handle-se{border-width:0 2px 2px 0;margin:-20px 0 0 -20px;cursor:se-resize;top:200px;left:200px}.mce-croprect-handle-move{position:absolute;cursor:move;border:0}.mce-croprect-block{opacity:.3;filter:alpha(opacity=30);zoom:1;position:absolute;background:black}.mce-imagepanel{overflow:auto;background:black}.mce-imagepanel img{position:absolute}.mce-imagetool.mce-btn .mce-ico{display:block;width:20px;height:20px;text-align:center;line-height:20px;font-size:20px;padding:5px}.mce-container,.mce-container-body{display:block}.mce-autoscroll{overflow:hidden}.mce-scrollbar{position:absolute;width:7px;height:100%;top:2px;right:2px;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-scrollbar-h{top:auto;right:auto;left:2px;bottom:2px;width:100%;height:7px}.mce-scrollbar-thumb{position:absolute;background-color:#000;border:1px solid #888;border-color:rgba(85,85,85,0.6);width:5px;height:100%}.mce-scrollbar-h .mce-scrollbar-thumb{width:100%;height:5px}.mce-scrollbar:hover,.mce-scrollbar.mce-active{background-color:#aaa;opacity:.6;filter:alpha(opacity=60);zoom:1}.mce-scroll{position:relative}.mce-panel{border:0 solid #cacaca;border:0 solid rgba(0,0,0,0.2);background-color:#f0f0f0}.mce-floatpanel{position:absolute}.mce-floatpanel.mce-fixed{position:fixed}.mce-floatpanel .mce-arrow,.mce-floatpanel .mce-arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.mce-floatpanel .mce-arrow{border-width:11px}.mce-floatpanel .mce-arrow:after{border-width:10px;content:""}.mce-floatpanel.mce-popover{filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;top:0;left:0;background:#fff;border:1px solid rgba(0,0,0,0.2);border:1px solid rgba(0,0,0,0.25)}.mce-floatpanel.mce-popover.mce-bottom{margin-top:10px;*margin-top:0}.mce-floatpanel.mce-popover.mce-bottom>.mce-arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:rgba(0,0,0,0.2);border-bottom-color:rgba(0,0,0,0.25);top:-11px}.mce-floatpanel.mce-popover.mce-bottom>.mce-arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.mce-floatpanel.mce-popover.mce-bottom.mce-start{margin-left:-22px}.mce-floatpanel.mce-popover.mce-bottom.mce-start>.mce-arrow{left:20px}.mce-floatpanel.mce-popover.mce-bottom.mce-end{margin-left:22px}.mce-floatpanel.mce-popover.mce-bottom.mce-end>.mce-arrow{right:10px;left:auto}.mce-fullscreen{border:0;padding:0;margin:0;overflow:hidden;height:100%}div.mce-fullscreen{position:fixed;top:0;left:0}#mce-modal-block{opacity:0;filter:alpha(opacity=0);zoom:1;position:fixed;left:0;top:0;width:100%;height:100%;background:#000}#mce-modal-block.mce-in{opacity:.3;filter:alpha(opacity=30);zoom:1}.mce-window-move{cursor:move}.mce-window{filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;background:#fff;position:fixed;top:0;left:0;opacity:0;-webkit-transition:opacity 150ms ease-in;transition:opacity 150ms ease-in}.mce-window.mce-in{opacity:1}.mce-window-head{padding:9px 15px;border-bottom:1px solid #c5c5c5;position:relative}.mce-window-head .mce-close{position:absolute;right:15px;top:9px;font-size:20px;font-weight:bold;line-height:20px;color:#858585;cursor:pointer;height:20px;overflow:hidden}.mce-close:hover{color:#adadad}.mce-window-head .mce-title{line-height:20px;font-size:20px;font-weight:bold;text-rendering:optimizelegibility;padding-right:10px}.mce-window .mce-container-body{display:block}.mce-foot{display:block;background-color:#fff;border-top:1px solid #c5c5c5}.mce-window-head .mce-dragh{position:absolute;top:0;left:0;cursor:move;width:90%;height:100%}.mce-window iframe{width:100%;height:100%}.mce-window-body .mce-listbox{border-color:#ccc}.mce-rtl .mce-window-head .mce-close{position:absolute;right:auto;left:15px}.mce-rtl .mce-window-head .mce-dragh{left:auto;right:0}.mce-rtl .mce-window-head .mce-title{direction:rtl;text-align:right}.mce-tooltip{position:absolute;padding:5px;opacity:.8;filter:alpha(opacity=80);zoom:1}.mce-tooltip-inner{font-size:11px;background-color:#000;color:white;max-width:200px;padding:5px 8px 4px 8px;text-align:center;white-space:normal}.mce-tooltip-arrow{position:absolute;width:0;height:0;line-height:0;border:5px dashed #000}.mce-tooltip-arrow-n{border-bottom-color:#000}.mce-tooltip-arrow-s{border-top-color:#000}.mce-tooltip-arrow-e{border-left-color:#000}.mce-tooltip-arrow-w{border-right-color:#000}.mce-tooltip-nw,.mce-tooltip-sw{margin-left:-14px}.mce-tooltip-n .mce-tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-nw .mce-tooltip-arrow{top:0;left:10px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-ne .mce-tooltip-arrow{top:0;right:10px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-s .mce-tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-sw .mce-tooltip-arrow{bottom:0;left:10px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-se .mce-tooltip-arrow{bottom:0;right:10px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-e .mce-tooltip-arrow{right:0;top:50%;margin-top:-5px;border-left-style:solid;border-right:none;border-top-color:transparent;border-bottom-color:transparent}.mce-tooltip-w .mce-tooltip-arrow{left:0;top:50%;margin-top:-5px;border-right-style:solid;border-left:none;border-top-color:transparent;border-bottom-color:transparent}.mce-progress{display:inline-block;position:relative;height:20px}.mce-progress .mce-bar-container{display:inline-block;width:100px;height:100%;margin-right:8px;border:1px solid #ccc;overflow:hidden}.mce-progress .mce-text{display:inline-block;margin-top:auto;margin-bottom:auto;font-size:14px;width:40px;color:#333;text-shadow:1px 1px none}.mce-bar{display:block;width:0;height:100%;background-color:#d7d7d7;-webkit-transition:width .2s ease;transition:width .2s ease}.mce-notification{position:absolute;background-color:#f0f0f0;padding:5px;margin-top:5px;opacity:.8;filter:alpha(opacity=80);zoom:1;border-width:1px;border-style:solid;border-color:#ccc}.mce-notification-success{background-color:#dff0d8;border-color:#d6e9c6}.mce-notification-info{background-color:#d9edf7;border-color:#779ecb}.mce-notification-warning{background-color:#fcf8e3;border-color:#faebcc}.mce-notification-error{background-color:#f2dede;border-color:#ebccd1}.mce-notification.mce-has-close{padding-right:15px}.mce-notification .mce-ico{margin-top:5px}.mce-notification-inner{display:inline-block;font-size:14px;margin:5px 8px 4px 8px;text-align:center;white-space:normal;color:#31708f}.mce-notification-inner a{text-decoration:underline;cursor:pointer}.mce-notification .mce-progress{margin-right:8px}.mce-notification .mce-progress .mce-text{margin-top:5px}.mce-notification *,.mce-notification .mce-progress .mce-text{color:#333}.mce-notification .mce-progress .mce-bar-container{border-color:#ccc}.mce-notification .mce-progress .mce-bar-container .mce-bar{background-color:#333}.mce-notification-success *,.mce-notification-success .mce-progress .mce-text{color:#3c763d}.mce-notification-success .mce-progress .mce-bar-container{border-color:#d6e9c6}.mce-notification-success .mce-progress .mce-bar-container .mce-bar{background-color:#3c763d}.mce-notification-info *,.mce-notification-info .mce-progress .mce-text{color:#31708f}.mce-notification-info .mce-progress .mce-bar-container{border-color:#779ecb}.mce-notification-info .mce-progress .mce-bar-container .mce-bar{background-color:#31708f}.mce-notification-warning *,.mce-notification-warning .mce-progress .mce-text{color:#8a6d3b}.mce-notification-warning .mce-progress .mce-bar-container{border-color:#faebcc}.mce-notification-warning .mce-progress .mce-bar-container .mce-bar{background-color:#8a6d3b}.mce-notification-error *,.mce-notification-error .mce-progress .mce-text{color:#a94442}.mce-notification-error .mce-progress .mce-bar-container{border-color:#ebccd1}.mce-notification-error .mce-progress .mce-bar-container .mce-bar{background-color:#a94442}.mce-notification .mce-close{position:absolute;top:6px;right:8px;font-size:20px;font-weight:bold;line-height:20px;color:#858585;cursor:pointer;height:20px;overflow:hidden}.mce-abs-layout{position:relative}body .mce-abs-layout-item,.mce-abs-end{position:absolute}.mce-abs-end{width:1px;height:1px}.mce-container-body.mce-abs-layout{overflow:hidden}.mce-btn{border:1px solid #b1b1b1;border-color:transparent transparent transparent transparent;position:relative;text-shadow:0 1px 1px rgba(255,255,255,0.75);display:inline-block;*display:inline;*zoom:1;background-color:#f0f0f0}.mce-btn:hover,.mce-btn:focus{color:#333;background-color:#e3e3e3;border-color:#ccc}.mce-btn.mce-disabled button,.mce-btn.mce-disabled:hover button{cursor:default;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-btn.mce-active,.mce-btn.mce-active:hover{background-color:#dbdbdb;border-color:#ccc}.mce-btn:active{background-color:#e0e0e0;border-color:#ccc}.mce-btn button{padding:4px 8px;font-size:14px;line-height:20px;*line-height:16px;cursor:pointer;color:#333;text-align:center;overflow:visible;-webkit-appearance:none}.mce-btn button::-moz-focus-inner{border:0;padding:0}.mce-btn i{text-shadow:1px 1px none}.mce-primary{min-width:50px;color:#fff;border:1px solid transparent;border-color:transparent;background-color:#2d8ac7}.mce-primary:hover,.mce-primary:focus{background-color:#257cb6;border-color:transparent}.mce-primary.mce-disabled button,.mce-primary.mce-disabled:hover button{cursor:default;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-primary.mce-active,.mce-primary.mce-active:hover,.mce-primary:not(.mce-disabled):active{background-color:#206ea1}.mce-primary button,.mce-primary button i{color:#fff;text-shadow:1px 1px none}.mce-btn .mce-txt{font-size:inherit;line-height:inherit;color:inherit}.mce-btn-large button{padding:9px 14px;font-size:16px;line-height:normal}.mce-btn-large i{margin-top:2px}.mce-btn-small button{padding:1px 5px;font-size:12px;*padding-bottom:2px}.mce-btn-small i{line-height:20px;vertical-align:top;*line-height:18px}.mce-btn .mce-caret{margin-top:8px;margin-left:0}.mce-btn-small .mce-caret{margin-top:8px;margin-left:0}.mce-caret{display:inline-block;*display:inline;*zoom:1;width:0;height:0;vertical-align:top;border-top:4px solid #333;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.mce-disabled .mce-caret{border-top-color:#aaa}.mce-caret.mce-up{border-bottom:4px solid #333;border-top:0}.mce-btn-flat{border:0;background:transparent;filter:none}.mce-btn-flat:hover,.mce-btn-flat.mce-active,.mce-btn-flat:focus,.mce-btn-flat:active{border:0;background:#e6e6e6;filter:none}.mce-btn-has-text .mce-ico{padding-right:5px}.mce-rtl .mce-btn button{direction:rtl}.mce-btn-group .mce-btn{border-width:1px;margin:0;margin-left:2px}.mce-btn-group:not(:first-child){border-left:1px solid #d9d9d9;padding-left:3px;margin-left:3px}.mce-btn-group .mce-first{margin-left:0}.mce-btn-group .mce-btn.mce-flow-layout-item{margin:0}.mce-rtl .mce-btn-group .mce-btn{margin-left:0;margin-right:2px}.mce-rtl .mce-btn-group .mce-first{margin-right:0}.mce-rtl .mce-btn-group:not(:first-child){border-left:none;border-right:1px solid #d9d9d9;padding-right:4px;margin-right:4px}.mce-checkbox{cursor:pointer}i.mce-i-checkbox{margin:0 3px 0 0;border:1px solid #c5c5c5;background-color:#f0f0f0;text-indent:-10em;*font-size:0;*line-height:0;*text-indent:0;overflow:hidden}.mce-checked i.mce-i-checkbox{color:#333;font-size:16px;line-height:16px;text-indent:0}.mce-checkbox:focus i.mce-i-checkbox,.mce-checkbox.mce-focus i.mce-i-checkbox{border:1px solid rgba(82,168,236,0.8)}.mce-checkbox.mce-disabled .mce-label,.mce-checkbox.mce-disabled i.mce-i-checkbox{color:#acacac}.mce-checkbox .mce-label{vertical-align:middle}.mce-rtl .mce-checkbox{direction:rtl;text-align:right}.mce-rtl i.mce-i-checkbox{margin:0 0 0 3px}.mce-combobox{display:inline-block;*display:inline;*zoom:1;*height:32px}.mce-combobox input{border:1px solid #c5c5c5;border-right-color:#c5c5c5;height:28px}.mce-combobox.mce-disabled input{color:#adadad}.mce-combobox .mce-btn{border:1px solid #c5c5c5;border-left:0}.mce-combobox button{padding-right:8px;padding-left:8px}.mce-combobox.mce-disabled .mce-btn button{cursor:default;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-colorbox i{border:1px solid #c5c5c5;width:14px;height:14px}.mce-colorbutton .mce-ico{position:relative}.mce-colorbutton-grid{margin:4px}.mce-colorbutton button{padding-right:6px;padding-left:6px}.mce-colorbutton .mce-preview{padding-right:3px;display:block;position:absolute;left:50%;top:50%;margin-left:-17px;margin-top:7px;background:gray;width:13px;height:2px;overflow:hidden}.mce-colorbutton.mce-btn-small .mce-preview{margin-left:-16px;padding-right:0;width:16px}.mce-colorbutton .mce-open{padding-left:4px;padding-right:4px;border-left:1px solid transparent}.mce-colorbutton:hover .mce-open{border-color:#ccc}.mce-colorbutton.mce-btn-small .mce-open{padding:0 3px 0 3px}.mce-rtl .mce-colorbutton{direction:rtl}.mce-rtl .mce-colorbutton .mce-preview{margin-left:0;padding-right:0;padding-left:3px}.mce-rtl .mce-colorbutton.mce-btn-small .mce-preview{margin-left:0;padding-right:0;padding-left:2px}.mce-rtl .mce-colorbutton .mce-open{padding-left:4px;padding-right:4px;border-left:0}.mce-colorpicker{position:relative;width:250px;height:220px}.mce-colorpicker-sv{position:absolute;top:0;left:0;width:90%;height:100%;border:1px solid #c5c5c5;cursor:crosshair;overflow:hidden}.mce-colorpicker-h-chunk{width:100%}.mce-colorpicker-overlay1,.mce-colorpicker-overlay2{width:100%;height:100%;position:absolute;top:0;left:0}.mce-colorpicker-overlay1{filter:progid:DXImageTransform.Microsoft.gradient(GradientType=1, startColorstr='#ffffff', endColorstr='#00ffffff');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientType=1,startColorstr='#ffffff', endColorstr='#00ffffff')";background:linear-gradient(to right, #fff, rgba(255,255,255,0))}.mce-colorpicker-overlay2{filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#00000000', endColorstr='#000000');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#00000000', endColorstr='#000000')";background:linear-gradient(to bottom, rgba(0,0,0,0), #000)}.mce-colorpicker-selector1{background:none;position:absolute;width:12px;height:12px;margin:-8px 0 0 -8px;border:1px solid black;border-radius:50%}.mce-colorpicker-selector2{position:absolute;width:10px;height:10px;border:1px solid white;border-radius:50%}.mce-colorpicker-h{position:absolute;top:0;right:0;width:6.5%;height:100%;border:1px solid #c5c5c5;cursor:crosshair}.mce-colorpicker-h-marker{margin-top:-4px;position:absolute;top:0;left:-1px;width:100%;border:1px solid #333;background:#fff;height:4px;z-index:100}.mce-path{display:inline-block;*display:inline;*zoom:1;padding:8px;white-space:normal}.mce-path .mce-txt{display:inline-block;padding-right:3px}.mce-path .mce-path-body{display:inline-block}.mce-path-item{display:inline-block;*display:inline;*zoom:1;cursor:pointer;color:#333}.mce-path-item:hover{text-decoration:underline}.mce-path-item:focus{background:#666;color:#fff}.mce-path .mce-divider{display:inline}.mce-disabled .mce-path-item{color:#aaa}.mce-rtl .mce-path{direction:rtl}.mce-fieldset{border:0 solid #9e9e9e}.mce-fieldset>.mce-container-body{margin-top:-15px}.mce-fieldset-title{margin-left:5px;padding:0 5px 0 5px}.mce-fit-layout{display:inline-block;*display:inline;*zoom:1}.mce-fit-layout-item{position:absolute}.mce-flow-layout-item{display:inline-block;*display:inline;*zoom:1}.mce-flow-layout-item{margin:2px 0 2px 2px}.mce-flow-layout-item.mce-last{margin-right:2px}.mce-flow-layout{white-space:normal}.mce-tinymce-inline .mce-flow-layout{white-space:nowrap}.mce-rtl .mce-flow-layout{text-align:right;direction:rtl}.mce-rtl .mce-flow-layout-item{margin:2px 2px 2px 0}.mce-rtl .mce-flow-layout-item.mce-last{margin-left:2px}.mce-iframe{border:0 solid rgba(0,0,0,0.2);width:100%;height:100%}.mce-label{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 1px rgba(255,255,255,0.75);overflow:hidden}.mce-label.mce-autoscroll{overflow:auto}.mce-label.mce-disabled{color:#aaa}.mce-label.mce-multiline{white-space:pre-wrap}.mce-label.mce-error{color:#a00}.mce-rtl .mce-label{text-align:right;direction:rtl}.mce-menubar .mce-menubtn{border-color:transparent;background:transparent;filter:none}.mce-menubar .mce-menubtn button{color:#333}.mce-menubar{border:1px solid rgba(217,217,217,0.52)}.mce-menubar .mce-menubtn button span{color:#333}.mce-menubar .mce-caret{border-top-color:#333}.mce-menubar .mce-menubtn:hover,.mce-menubar .mce-menubtn.mce-active,.mce-menubar .mce-menubtn:focus{border-color:#ccc;background:#fff;filter:none}.mce-menubtn button{color:#333}.mce-menubtn.mce-btn-small span{font-size:12px}.mce-menubtn.mce-fixed-width span{display:inline-block;overflow-x:hidden;text-overflow:ellipsis;width:90px}.mce-menubtn.mce-fixed-width.mce-btn-small span{width:70px}.mce-menubtn .mce-caret{*margin-top:6px}.mce-rtl .mce-menubtn button{direction:rtl;text-align:right}.mce-menu-item{display:block;padding:6px 15px 6px 12px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap;cursor:pointer;line-height:normal;border-left:4px solid transparent;margin-bottom:1px}.mce-menu-item .mce-ico,.mce-menu-item .mce-text{color:#333}.mce-menu-item.mce-disabled .mce-text,.mce-menu-item.mce-disabled .mce-ico{color:#adadad}.mce-menu-item:hover .mce-text,.mce-menu-item.mce-selected .mce-text,.mce-menu-item:focus .mce-text{color:white}.mce-menu-item:hover .mce-ico,.mce-menu-item.mce-selected .mce-ico,.mce-menu-item:focus .mce-ico{color:white}.mce-menu-item.mce-disabled:hover{background:#ccc}.mce-menu-shortcut{display:inline-block;color:#adadad}.mce-menu-shortcut{display:inline-block;*display:inline;*zoom:1;padding:0 15px 0 20px}.mce-menu-item:hover .mce-menu-shortcut,.mce-menu-item.mce-selected .mce-menu-shortcut,.mce-menu-item:focus .mce-menu-shortcut{color:white}.mce-menu-item .mce-caret{margin-top:4px;*margin-top:3px;margin-right:6px;border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:4px solid #333}.mce-menu-item.mce-selected .mce-caret,.mce-menu-item:focus .mce-caret,.mce-menu-item:hover .mce-caret{border-left-color:white}.mce-menu-align .mce-menu-shortcut{*margin-top:-2px}.mce-menu-align .mce-menu-shortcut,.mce-menu-align .mce-caret{position:absolute;right:0}.mce-menu-item.mce-active i{visibility:visible}.mce-menu-item-normal.mce-active{background-color:#3498db}.mce-menu-item-preview.mce-active{border-left:5px solid #aaa}.mce-menu-item-normal.mce-active .mce-text{color:white}.mce-menu-item-normal.mce-active:hover .mce-text,.mce-menu-item-normal.mce-active:hover .mce-ico{color:white}.mce-menu-item-normal.mce-active:focus .mce-text,.mce-menu-item-normal.mce-active:focus .mce-ico{color:white}.mce-menu-item:hover,.mce-menu-item.mce-selected,.mce-menu-item:focus{text-decoration:none;color:white;background-color:#2d8ac7}div.mce-menu .mce-menu-item-sep,.mce-menu-item-sep:hover{border:0;padding:0;height:1px;margin:9px 1px;overflow:hidden;background:transparent;border-bottom:1px solid rgba(0,0,0,0.1);cursor:default;filter:none}.mce-menu.mce-rtl{direction:rtl}.mce-rtl .mce-menu-item{text-align:right;direction:rtl;padding:6px 12px 6px 15px}.mce-menu-align.mce-rtl .mce-menu-shortcut,.mce-menu-align.mce-rtl .mce-caret{right:auto;left:0}.mce-rtl .mce-menu-item .mce-caret{margin-left:6px;margin-right:0;border-right:4px solid #333;border-left:0}.mce-rtl .mce-menu-item.mce-selected .mce-caret,.mce-rtl .mce-menu-item:focus .mce-caret,.mce-rtl .mce-menu-item:hover .mce-caret{border-left-color:transparent;border-right-color:white}.mce-menu{position:absolute;left:0;top:0;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;z-index:1000;padding:5px 0 5px 0;margin:-1px 0 0;min-width:160px;background:#fff;border:1px solid #989898;border:1px solid rgba(0,0,0,0.2);z-index:1002;max-height:400px;overflow:auto;overflow-x:hidden}.mce-menu i{display:none}.mce-menu-has-icons i{display:inline-block;*display:inline}.mce-menu-sub-tr-tl{margin:-6px 0 0 -1px}.mce-menu-sub-br-bl{margin:6px 0 0 -1px}.mce-menu-sub-tl-tr{margin:-6px 0 0 1px}.mce-menu-sub-bl-br{margin:6px 0 0 1px}.mce-listbox button{text-align:left;padding-right:20px;position:relative}.mce-listbox .mce-caret{position:absolute;margin-top:-2px;right:8px;top:50%}.mce-rtl .mce-listbox .mce-caret{right:auto;left:8px}.mce-rtl .mce-listbox button{padding-right:10px;padding-left:20px}.mce-container-body .mce-resizehandle{position:absolute;right:0;bottom:0;width:16px;height:16px;visibility:visible;cursor:s-resize;margin:0}.mce-container-body .mce-resizehandle-both{cursor:se-resize}i.mce-i-resize{color:#333}.mce-selectbox{background:#fff;border:1px solid #c5c5c5}.mce-slider{border:1px solid #aaa;background:#eee;width:100px;height:10px;position:relative;display:block}.mce-slider.mce-vertical{width:10px;height:100px}.mce-slider-handle{border:1px solid #bbb;background:#ddd;display:block;width:13px;height:13px;position:absolute;top:0;left:0;margin-left:-1px;margin-top:-2px}.mce-spacer{visibility:hidden}.mce-splitbtn .mce-open{border-left:1px solid transparent}.mce-splitbtn:hover .mce-open{border-left-color:#ccc}.mce-splitbtn button{padding-right:6px;padding-left:6px}.mce-splitbtn .mce-open{padding-right:4px;padding-left:4px}.mce-splitbtn .mce-open.mce-active{background-color:#dbdbdb;outline:1px solid #ccc}.mce-splitbtn.mce-btn-small .mce-open{padding:0 3px 0 3px}.mce-rtl .mce-splitbtn{direction:rtl;text-align:right}.mce-rtl .mce-splitbtn button{padding-right:4px;padding-left:4px}.mce-rtl .mce-splitbtn .mce-open{border-left:0}.mce-stack-layout-item{display:block}.mce-tabs{display:block;border-bottom:1px solid #c5c5c5}.mce-tabs,.mce-tabs+.mce-container-body{background:#fff}.mce-tab{display:inline-block;*display:inline;*zoom:1;border:1px solid #c5c5c5;border-width:0 1px 0 0;background:#fff;padding:8px;text-shadow:0 1px 1px rgba(255,255,255,0.75);height:13px;cursor:pointer}.mce-tab:hover{background:#fdfdfd}.mce-tab.mce-active{background:#fdfdfd;border-bottom-color:transparent;margin-bottom:-1px;height:14px}.mce-rtl .mce-tabs{text-align:right;direction:rtl}.mce-rtl .mce-tab{border-width:0 0 0 1px}.mce-textbox{background:#fff;border:1px solid #c5c5c5;display:inline-block;-webkit-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s;height:28px;resize:none;padding:0 4px 0 4px;white-space:pre-wrap;*white-space:pre;color:#333}.mce-textbox:focus,.mce-textbox.mce-focus{border-color:#3498db}.mce-placeholder .mce-textbox{color:#aaa}.mce-textbox.mce-multiline{padding:4px;height:auto}.mce-textbox.mce-disabled{color:#adadad}.mce-rtl .mce-textbox{text-align:right;direction:rtl}.mce-throbber{position:absolute;top:0;left:0;width:100%;height:100%;opacity:.6;filter:alpha(opacity=60);zoom:1;background:#fff url('img/loader.gif') no-repeat center center}.mce-throbber-inline{position:static;height:50px}@font-face{font-family:'tinymce';src:url('fonts/tinymce.eot');src:url('fonts/tinymce.eot?#iefix') format('embedded-opentype'),url('fonts/tinymce.woff') format('woff'),url('fonts/tinymce.ttf') format('truetype'),url('fonts/tinymce.svg#tinymce') format('svg');font-weight:normal;font-style:normal}@font-face{font-family:'tinymce-small';src:url('fonts/tinymce-small.eot');src:url('fonts/tinymce-small.eot?#iefix') format('embedded-opentype'),url('fonts/tinymce-small.woff') format('woff'),url('fonts/tinymce-small.ttf') format('truetype'),url('fonts/tinymce-small.svg#tinymce') format('svg');font-weight:normal;font-style:normal}.mce-ico{font-family:'tinymce',Arial;font-style:normal;font-weight:normal;font-variant:normal;font-size:16px;line-height:16px;speak:none;vertical-align:text-top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;background:transparent center center;background-size:cover;width:16px;height:16px;color:#333}.mce-btn-small .mce-ico{font-family:'tinymce-small',Arial}.mce-i-save:before{content:"\e000"}.mce-i-newdocument:before{content:"\e001"}.mce-i-fullpage:before{content:"\e002"}.mce-i-alignleft:before{content:"\e003"}.mce-i-aligncenter:before{content:"\e004"}.mce-i-alignright:before{content:"\e005"}.mce-i-alignjustify:before{content:"\e006"}.mce-i-alignnone:before{content:"\e003"}.mce-i-cut:before{content:"\e007"}.mce-i-paste:before{content:"\e008"}.mce-i-searchreplace:before{content:"\e009"}.mce-i-bullist:before{content:"\e00a"}.mce-i-numlist:before{content:"\e00b"}.mce-i-indent:before{content:"\e00c"}.mce-i-outdent:before{content:"\e00d"}.mce-i-blockquote:before{content:"\e00e"}.mce-i-undo:before{content:"\e00f"}.mce-i-redo:before{content:"\e010"}.mce-i-link:before{content:"\e011"}.mce-i-unlink:before{content:"\e012"}.mce-i-anchor:before{content:"\e013"}.mce-i-image:before{content:"\e014"}.mce-i-media:before{content:"\e015"}.mce-i-help:before{content:"\e016"}.mce-i-code:before{content:"\e017"}.mce-i-insertdatetime:before{content:"\e018"}.mce-i-preview:before{content:"\e019"}.mce-i-forecolor:before{content:"\e01a"}.mce-i-backcolor:before{content:"\e01a"}.mce-i-table:before{content:"\e01b"}.mce-i-hr:before{content:"\e01c"}.mce-i-removeformat:before{content:"\e01d"}.mce-i-subscript:before{content:"\e01e"}.mce-i-superscript:before{content:"\e01f"}.mce-i-charmap:before{content:"\e020"}.mce-i-emoticons:before{content:"\e021"}.mce-i-print:before{content:"\e022"}.mce-i-fullscreen:before{content:"\e023"}.mce-i-spellchecker:before{content:"\e024"}.mce-i-nonbreaking:before{content:"\e025"}.mce-i-template:before{content:"\e026"}.mce-i-pagebreak:before{content:"\e027"}.mce-i-restoredraft:before{content:"\e028"}.mce-i-untitled:before{content:"\e029"}.mce-i-bold:before{content:"\e02a"}.mce-i-italic:before{content:"\e02b"}.mce-i-underline:before{content:"\e02c"}.mce-i-strikethrough:before{content:"\e02d"}.mce-i-visualchars:before{content:"\e02e"}.mce-i-visualblocks:before{content:"\e02e"}.mce-i-ltr:before{content:"\e02f"}.mce-i-rtl:before{content:"\e030"}.mce-i-copy:before{content:"\e031"}.mce-i-resize:before{content:"\e032"}.mce-i-browse:before{content:"\e034"}.mce-i-pastetext:before{content:"\e035"}.mce-i-rotateleft:before{content:"\eaa8"}.mce-i-rotateright:before{content:"\eaa9"}.mce-i-crop:before{content:"\ee78"}.mce-i-editimage:before{content:"\e914"}.mce-i-options:before{content:"\ec6a"}.mce-i-flipv:before{content:"\eaaa"}.mce-i-fliph:before{content:"\eaac"}.mce-i-zoomin:before{content:"\eb35"}.mce-i-zoomout:before{content:"\eb36"}.mce-i-sun:before{content:"\eccc"}.mce-i-moon:before{content:"\eccd"}.mce-i-arrowleft:before{content:"\edc0"}.mce-i-arrowright:before{content:"\edb8"}.mce-i-drop:before{content:"\e934"}.mce-i-contrast:before{content:"\ecd4"}.mce-i-sharpen:before{content:"\eba7"}.mce-i-palette:before{content:"\e92a"}.mce-i-resize2:before{content:"\edf9"}.mce-i-orientation:before{content:"\e601"}.mce-i-invert:before{content:"\e602"}.mce-i-gamma:before{content:"\e600"}.mce-i-remove:before{content:"\ed6a"}.mce-i-tablerowprops:before{content:"\e604"}.mce-i-tablecellprops:before{content:"\e605"}.mce-i-table2:before{content:"\e606"}.mce-i-tablemergecells:before{content:"\e607"}.mce-i-tableinsertcolbefore:before{content:"\e608"}.mce-i-tableinsertcolafter:before{content:"\e609"}.mce-i-tableinsertrowbefore:before{content:"\e60a"}.mce-i-tableinsertrowafter:before{content:"\e60b"}.mce-i-tablesplitcells:before{content:"\e60d"}.mce-i-tabledelete:before{content:"\e60e"}.mce-i-tableleftheader:before{content:"\e62a"}.mce-i-tabletopheader:before{content:"\e62b"}.mce-i-tabledeleterow:before{content:"\e800"}.mce-i-tabledeletecol:before{content:"\e801"}.mce-i-codesample:before{content:"\e603"}.mce-i-checkbox:before,.mce-i-selected:before{content:"\e033"}.mce-i-selected{visibility:hidden}i.mce-i-backcolor{text-shadow:none;background:#bbb} \ No newline at end of file diff --git a/assets/js/tinymce/themes/modern/theme.min.js b/assets/js/tinymce/themes/modern/theme.min.js new file mode 100644 index 0000000..d101fc6 --- /dev/null +++ b/assets/js/tinymce/themes/modern/theme.min.js @@ -0,0 +1 @@ +tinymce.ThemeManager.add("modern",function(a){function b(b,c){var d,e=[];if(b)return n(b.split(/[ ,]/),function(b){function f(){function c(a){return function(c,d){for(var e,f=d.parents.length;f--&&(e=d.parents[f].nodeName,"OL"!=e&&"UL"!=e););b.active(c&&e==a)}}var d=a.selection;"bullist"==g&&d.selectorChanged("ul > li",c("UL")),"numlist"==g&&d.selectorChanged("ol > li",c("OL")),b.settings.stateSelector&&d.selectorChanged(b.settings.stateSelector,function(a){b.active(a)},!0),b.settings.disabledStateSelector&&d.selectorChanged(b.settings.disabledStateSelector,function(a){b.disabled(a)})}var g;"|"==b?d=null:m.has(b)?(b={type:b,size:c},e.push(b),d=null):(d||(d={type:"buttongroup",items:[]},e.push(d)),a.buttons[b]&&(g=b,b=a.buttons[g],"function"==typeof b&&(b=b()),b.type=b.type||"button",b.size=c,b=m.create(b),d.items.push(b),a.initialized?f():a.on("init",f)))}),{type:"toolbar",layout:"flow",items:e}}function c(a){function c(c){return c?(d.push(b(c,a)),!0):void 0}var d=[];if(tinymce.isArray(l.toolbar)){if(0===l.toolbar.length)return;tinymce.each(l.toolbar,function(a,b){l["toolbar"+(b+1)]=a}),delete l.toolbar}for(var e=1;10>e&&c(l["toolbar"+e]);e++);return d.length||l.toolbar===!1||c(l.toolbar||s),d.length?{type:"panel",layout:"stack",classes:"toolbar-grp",ariaRoot:!0,ariaRemember:!0,items:d}:void 0}function d(){function b(b){var c;return"|"==b?{text:"|"}:c=a.menuItems[b]}function c(c){var d,e,f,g,h;if(h=tinymce.makeMap((l.removed_menuitems||"").split(/[ ,]/)),l.menu?(e=l.menu[c],g=!0):e=r[c],e){d={text:e.title},f=[],n((e.items||"").split(/[ ,]/),function(a){var c=b(a);c&&!h[a]&&f.push(b(a))}),g||n(a.menuItems,function(a){a.context==c&&("before"==a.separator&&f.push({text:"|"}),a.prependToContext?f.unshift(a):f.push(a),"after"==a.separator&&f.push({text:"|"}))});for(var i=0;i=0;d--)for(e=g.length-1;e>=0;e--)if(g[e].predicate(f[d]))return{toolbar:g[e],element:f[d]};return null}var l;a.on("click keyup setContent",function(b){("setcontent"!=b.type||b.selection)&&tinymce.util.Delay.setEditorTimeout(a,function(){var b;b=k(a.selection.getNode()),b?(j(),i(b)):j()})}),a.on("blur hide",j),a.on("ObjectResizeStart",function(){var b=k(a.selection.getNode());b&&b.toolbar.panel&&b.toolbar.panel.hide()}),a.on("nodeChange ResizeEditor ResizeWindow",g),a.on("remove",function(){tinymce.each(c(),function(a){a.panel&&a.panel.remove()}),a.contextToolbars={}})}function i(b){function f(){if(n&&n.moveRel&&n.visible()&&!n._fixed){var b=a.selection.getScrollContainer(),c=a.getBody(),d=0,e=0;if(b){var f=o.getPos(c),g=o.getPos(b);d=Math.max(0,g.x-f.x),e=Math.max(0,g.y-f.y)}n.fixed(!1).moveRel(c,a.rtl?["tr-br","br-tr"]:["tl-bl","bl-tl","tr-br"]).moveBy(d,e)}}function g(){n&&(n.show(),f(),o.addClass(a.getBody(),"mce-edit-focus"))}function i(){n&&(n.hide(),q.hideAll(),o.removeClass(a.getBody(),"mce-edit-focus"))}function j(){return n?void(n.visible()||g()):(n=k.panel=m.create({type:p?"panel":"floatpanel",role:"application",classes:"tinymce tinymce-inline",layout:"flex",direction:"column",align:"stretch",autohide:!1,autofix:!0,fixed:!!p,border:1,items:[l.menubar===!1?null:{type:"menubar",border:"0 0 1 0",items:d()},c(l.toolbar_items_size)]}),a.fire("BeforeRenderUI"),n.renderTo(p||document.body).reflow(),e(n),g(),h(),a.on("nodeChange",f),a.on("activate",g),a.on("deactivate",i),void a.nodeChanged())}var n,p;return l.fixed_toolbar_container&&(p=o.select(l.fixed_toolbar_container)[0]),l.content_editable=!0,a.on("focus",function(){b.skinUiCss?tinymce.DOM.styleSheetLoader.load(b.skinUiCss,j,j):j()}),a.on("blur hide",i),a.on("remove",function(){n&&(n.remove(),n=null)}),b.skinUiCss&&tinymce.DOM.styleSheetLoader.load(b.skinUiCss),{}}function j(b){function g(){return function(a){"readonly"==a.mode?i.find("*").disabled(!0):i.find("*").disabled(!1)}}var i,j,n;return b.skinUiCss&&tinymce.DOM.loadCSS(b.skinUiCss),i=k.panel=m.create({type:"panel",role:"application",classes:"tinymce",style:"visibility: hidden",layout:"stack",border:1,items:[l.menubar===!1?null:{type:"menubar",border:"0 0 1 0",items:d()},c(l.toolbar_items_size),{type:"panel",name:"iframe",layout:"stack",classes:"edit-area",html:"",border:"1 0 0 0"}]}),l.resize!==!1&&(j={type:"resizehandle",direction:l.resize,onResizeStart:function(){var b=a.getContentAreaContainer().firstChild;n={width:b.clientWidth,height:b.clientHeight}},onResize:function(a){"both"==l.resize?f(n.width+a.deltaX,n.height+a.deltaY):f(null,n.height+a.deltaY)}}),l.statusbar!==!1&&i.add({type:"panel",name:"statusbar",classes:"statusbar",layout:"flow",border:"1 0 0 0",ariaRoot:!0,items:[{type:"elementpath"},j]}),l.readonly&&i.find("*").disabled(!0),a.fire("BeforeRenderUI"),a.on("SwitchMode",g()),i.renderBefore(b.targetNode).reflow(),l.width&&tinymce.DOM.setStyle(i.getEl(),"width",l.width),a.on("remove",function(){i.remove(),i=null}),e(i),h(),{iframeContainer:i.find("#iframe")[0].getEl(),editorContainer:i.getEl()}}var k=this,l=a.settings,m=tinymce.ui.Factory,n=tinymce.each,o=tinymce.DOM,p=tinymce.geom.Rect,q=tinymce.ui.FloatPanel,r={file:{title:"File",items:"newdocument"},edit:{title:"Edit",items:"undo redo | cut copy paste pastetext | selectall"},insert:{title:"Insert",items:"|"},view:{title:"View",items:"visualaid |"},format:{title:"Format",items:"bold italic underline strikethrough superscript subscript | formats | removeformat"},table:{title:"Table"},tools:{title:"Tools"}},s="undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image";k.renderUI=function(b){var c=l.skin!==!1?l.skin||"lightgray":!1;if(c){var d=l.skin_url;d=d?a.documentBaseURI.toAbsolute(d):tinymce.baseURL+"/skins/"+c,tinymce.Env.documentMode<=7?b.skinUiCss=d+"/skin.ie7.min.css":b.skinUiCss=d+"/skin.min.css",a.contentCSS.push(d+"/content"+(a.inline?".inline":"")+".min.css")}return a.on("ProgressState",function(a){k.throbber=k.throbber||new tinymce.ui.Throbber(k.panel.getEl("body")),a.state?k.throbber.show(a.time):k.throbber.hide()}),l.inline?i(b):j(b)},k.resizeTo=f,k.resizeBy=g}); \ No newline at end of file diff --git a/assets/js/tinymce/tinymce.gzip.js b/assets/js/tinymce/tinymce.gzip.js new file mode 100644 index 0000000..8926bb0 --- /dev/null +++ b/assets/js/tinymce/tinymce.gzip.js @@ -0,0 +1 @@ +!function(){function n(n,e){function t(){o.parentNode.removeChild(o),o&&(o.onreadystatechange=o.onload=o=null),e()}function i(){"undefined"!=typeof console&&console.log&&console.log("Failed to load: "+n)}var o,a=document.getElementsByTagName("head")[0]||document.body;o=document.createElement("script"),o.type="text/javascript","onload"in o?(o.onload=t,a.appendChild(o),o.src=n):(o.onreadystatechange=function(){o.src&&/loaded|complete/.test(o.readyState)&&t()},o.src=n,a.appendChild(o)),o.onerror=i}function e(n,e,t){function i(n,e){if(e){for(var t=e.length-1;t>=0;t--)u[n+"_"+e[t]]?e.splice(t,1):u[n+"_"+e[t]]=!0;if(e.length)return"&"+n+"s="+e.join(",")}return""}var o="";return o+=i("plugin",e),o+=i("theme",n),o+=i("language",t),o&&(u.core?o+="&core=false":u.core=!0,o=r.baseURL+"/index.php?js=true"+o),o}function t(n){if("string"==typeof n)return n.split(/[, ]/);var e=[];if(n)for(var i=0;i=r.x&&o.x+o.w<=r.w+r.x&&o.y>=r.y&&o.y+o.h<=r.h+r.y)return i[a];return null}function n(e,t,n){return o(e.x-t,e.y-n,e.w+2*t,e.h+2*n)}function r(e,t){var n,r,i,a;return n=l(e.x,t.x),r=l(e.y,t.y),i=s(e.x+e.w,t.x+t.w),a=s(e.y+e.h,t.y+t.h),0>i-n||0>a-r?null:o(n,r,i-n,a-r)}function i(e,t,n){var r,i,a,s,c,u,d,f,h,p;return c=e.x,u=e.y,d=e.x+e.w,f=e.y+e.h,h=t.x+t.w,p=t.y+t.h,r=l(0,t.x-c),i=l(0,t.y-u),a=l(0,d-h),s=l(0,f-p),c+=r,u+=i,n&&(d+=r,f+=i,c-=a,u-=s),d-=a,f-=s,o(c,u,d-c,f-u)}function o(e,t,n,r){return{x:e,y:t,w:n,h:r}}function a(e){return o(e.left,e.top,e.width,e.height)}var s=Math.min,l=Math.max,c=Math.round;return{inflate:n,relativePosition:e,findBestRelativePosition:t,intersect:r,clamp:i,create:o,fromClientRect:a}}),r(c,[],function(){function e(e,t){return function(){e.apply(t,arguments)}}function t(t){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof t)throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],s(t,e(r,this),e(i,this))}function n(e){var t=this;return null===this._state?void this._deferreds.push(e):void l(function(){var n=t._state?e.onFulfilled:e.onRejected;if(null===n)return void(t._state?e.resolve:e.reject)(t._value);var r;try{r=n(t._value)}catch(i){return void e.reject(i)}e.resolve(r)})}function r(t){try{if(t===this)throw new TypeError("A promise cannot be resolved with itself.");if(t&&("object"==typeof t||"function"==typeof t)){var n=t.then;if("function"==typeof n)return void s(e(n,t),e(r,this),e(i,this))}this._state=!0,this._value=t,o.call(this)}catch(a){i.call(this,a)}}function i(e){this._state=!1,this._value=e,o.call(this)}function o(){for(var e=0,t=this._deferreds.length;t>e;e++)n.call(this,this._deferreds[e]);this._deferreds=null}function a(e,t,n,r){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.resolve=n,this.reject=r}function s(e,t,n){var r=!1;try{e(function(e){r||(r=!0,t(e))},function(e){r||(r=!0,n(e))})}catch(i){if(r)return;r=!0,n(i)}}if(window.Promise)return window.Promise;var l=t.immediateFn||"function"==typeof setImmediate&&setImmediate||function(e){setTimeout(e,1)},c=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)};return t.prototype["catch"]=function(e){return this.then(null,e)},t.prototype.then=function(e,r){var i=this;return new t(function(t,o){n.call(i,new a(e,r,t,o))})},t.all=function(){var e=Array.prototype.slice.call(1===arguments.length&&c(arguments[0])?arguments[0]:arguments);return new t(function(t,n){function r(o,a){try{if(a&&("object"==typeof a||"function"==typeof a)){var s=a.then;if("function"==typeof s)return void s.call(a,function(e){r(o,e)},n)}e[o]=a,0===--i&&t(e)}catch(l){n(l)}}if(0===e.length)return t([]);for(var i=e.length,o=0;or;r++)e[r].then(t,n)})},t}),r(u,[c],function(e){function t(e,t){function n(e){window.setTimeout(e,0)}var r,i=window.requestAnimationFrame,o=["ms","moz","webkit"];for(r=0;rr;r++)if(o=n[r],o&&o.func.call(o.scope,e)===!1&&e.preventDefault(),e.isImmediatePropagationStopped())return}var o=this,s={},l,c,u,d,f;c=a+(+new Date).toString(32),d="onmouseenter"in document.documentElement,u="onfocusin"in document.documentElement,f={mouseenter:"mouseover",mouseleave:"mouseout"},l=1,o.domLoaded=!1,o.events=s,o.bind=function(n,a,h,p){function m(t){e(r(t||N.event),g)}var g,v,y,b,C,x,w,N=window;if(n&&3!==n.nodeType&&8!==n.nodeType){for(n[c]?g=n[c]:(g=l++,n[c]=g,s[g]={}),p=p||n,a=a.split(" "),y=a.length;y--;)b=a[y],x=m,C=w=!1,"DOMContentLoaded"===b&&(b="ready"),o.domLoaded&&"ready"===b&&"complete"==n.readyState?h.call(p,r({type:b})):(d||(C=f[b],C&&(x=function(t){var n,i;if(n=t.currentTarget,i=t.relatedTarget,i&&n.contains)i=n.contains(i);else for(;i&&i!==n;)i=i.parentNode;i||(t=r(t||N.event),t.type="mouseout"===t.type?"mouseleave":"mouseenter",t.target=n,e(t,g))})),u||"focusin"!==b&&"focusout"!==b||(w=!0,C="focusin"===b?"focus":"blur",x=function(t){t=r(t||N.event),t.type="focus"===t.type?"focusin":"focusout",e(t,g)}),v=s[g][b],v?"ready"===b&&o.domLoaded?h({type:b}):v.push({func:h,scope:p}):(s[g][b]=v=[{func:h,scope:p}],v.fakeName=C,v.capture=w,v.nativeHandler=x,"ready"===b?i(n,x,o):t(n,C||b,x,w)));return n=v=0,h}},o.unbind=function(e,t,r){var i,a,l,u,d,f;if(!e||3===e.nodeType||8===e.nodeType)return o;if(i=e[c]){if(f=s[i],t){for(t=t.split(" "),l=t.length;l--;)if(d=t[l],a=f[d]){if(r)for(u=a.length;u--;)if(a[u].func===r){var h=a.nativeHandler,p=a.fakeName,m=a.capture;a=a.slice(0,u).concat(a.slice(u+1)),a.nativeHandler=h,a.fakeName=p,a.capture=m,f[d]=a}r&&0!==a.length||(delete f[d],n(e,a.fakeName||d,a.nativeHandler,a.capture))}}else{for(d in f)a=f[d],n(e,a.fakeName||d,a.nativeHandler,a.capture);f={}}for(d in f)return o;delete s[i];try{delete e[c]}catch(g){e[c]=null}}return o},o.fire=function(t,n,i){var a;if(!t||3===t.nodeType||8===t.nodeType)return o;i=r(null,i),i.type=n,i.target=t;do a=t[c],a&&e(i,a),t=t.parentNode||t.ownerDocument||t.defaultView||t.parentWindow;while(t&&!i.isPropagationStopped());return o},o.clean=function(e){var t,n,r=o.unbind;if(!e||3===e.nodeType||8===e.nodeType)return o;if(e[c]&&r(e),e.getElementsByTagName||(e=e.document),e&&e.getElementsByTagName)for(r(e),n=e.getElementsByTagName("*"),t=n.length;t--;)e=n[t],e[c]&&r(e);return o},o.destroy=function(){s={}},o.cancel=function(e){return e&&(e.preventDefault(),e.stopImmediatePropagation()),!1}}var a="mce-data-",s=/^(?:mouse|contextmenu)|click/,l={keyLocation:1,layerX:1,layerY:1,returnValue:1,webkitMovementX:1,webkitMovementY:1};return o.Event=new o,o.Event.bind(window,"ready",function(){}),o}),r(f,[],function(){function e(e,t,n,r){var i,o,a,s,l,c,d,h,p,m;if((t?t.ownerDocument||t:z)!==D&&B(t),t=t||D,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(L&&!r){if(i=ve.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&I(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return Z.apply(n,t.getElementsByTagName(e)),n;if((a=i[3])&&x.getElementsByClassName)return Z.apply(n,t.getElementsByClassName(a)),n}if(x.qsa&&(!P||!P.test(e))){if(h=d=F,p=t,m=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){for(c=_(e),(d=t.getAttribute("id"))?h=d.replace(be,"\\$&"):t.setAttribute("id",h),h="[id='"+h+"'] ",l=c.length;l--;)c[l]=h+f(c[l]);p=ye.test(e)&&u(t.parentNode)||t,m=c.join(",")}if(m)try{return Z.apply(n,p.querySelectorAll(m)),n}catch(g){}finally{d||t.removeAttribute("id")}}}return k(e.replace(se,"$1"),t,n,r)}function n(){function e(n,r){return t.push(n+" ")>w.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[F]=!0,e}function i(e){var t=D.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=e.length;r--;)w.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||X)-(~e.sourceIndex||X);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function l(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function c(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function u(e){return e&&typeof e.getElementsByTagName!==Y&&e}function d(){}function f(e){for(var t=0,n=e.length,r="";n>t;t++)r+=e[t].value;return r}function h(e,t,n){var r=t.dir,i=n&&"parentNode"===r,o=V++;return t.first?function(t,n,o){for(;t=t[r];)if(1===t.nodeType||i)return e(t,n,o)}:function(t,n,a){var s,l,c=[W,o];if(a){for(;t=t[r];)if((1===t.nodeType||i)&&e(t,n,a))return!0}else for(;t=t[r];)if(1===t.nodeType||i){if(l=t[F]||(t[F]={}),(s=l[r])&&s[0]===W&&s[1]===o)return c[2]=s[2];if(l[r]=c,c[2]=e(t,n,a))return!0}}}function p(e){return e.length>1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function m(t,n,r){for(var i=0,o=n.length;o>i;i++)e(t,n[i],r);return r}function g(e,t,n,r,i){for(var o,a=[],s=0,l=e.length,c=null!=t;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),c&&t.push(s));return a}function v(e,t,n,i,o,a){return i&&!i[F]&&(i=v(i)),o&&!o[F]&&(o=v(o,a)),r(function(r,a,s,l){var c,u,d,f=[],h=[],p=a.length,v=r||m(t||"*",s.nodeType?[s]:s,[]),y=!e||!r&&t?v:g(v,f,e,s,l),b=n?o||(r?e:p||i)?[]:a:y;if(n&&n(y,b,s,l),i)for(c=g(b,h),i(c,[],s,l),u=c.length;u--;)(d=c[u])&&(b[h[u]]=!(y[h[u]]=d));if(r){if(o||e){if(o){for(c=[],u=b.length;u--;)(d=b[u])&&c.push(y[u]=d);o(null,b=[],c,l)}for(u=b.length;u--;)(d=b[u])&&(c=o?te.call(r,d):f[u])>-1&&(r[c]=!(a[c]=d))}}else b=g(b===a?b.splice(p,b.length):b),o?o(null,a,b,l):Z.apply(a,b)})}function y(e){for(var t,n,r,i=e.length,o=w.relative[e[0].type],a=o||w.relative[" "],s=o?1:0,l=h(function(e){return e===t},a,!0),c=h(function(e){return te.call(t,e)>-1},a,!0),u=[function(e,n,r){return!o&&(r||n!==T)||((t=n).nodeType?l(e,n,r):c(e,n,r))}];i>s;s++)if(n=w.relative[e[s].type])u=[h(p(u),n)];else{if(n=w.filter[e[s].type].apply(null,e[s].matches),n[F]){for(r=++s;i>r&&!w.relative[e[r].type];r++);return v(s>1&&p(u),s>1&&f(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(se,"$1"),n,r>s&&y(e.slice(s,r)),i>r&&y(e=e.slice(r)),i>r&&f(e))}u.push(n)}return p(u)}function b(t,n){var i=n.length>0,o=t.length>0,a=function(r,a,s,l,c){var u,d,f,h=0,p="0",m=r&&[],v=[],y=T,b=r||o&&w.find.TAG("*",c),C=W+=null==y?1:Math.random()||.1,x=b.length;for(c&&(T=a!==D&&a);p!==x&&null!=(u=b[p]);p++){if(o&&u){for(d=0;f=t[d++];)if(f(u,a,s)){l.push(u);break}c&&(W=C)}i&&((u=!f&&u)&&h--,r&&m.push(u))}if(h+=p,i&&p!==h){for(d=0;f=n[d++];)f(m,v,a,s);if(r){if(h>0)for(;p--;)m[p]||v[p]||(v[p]=J.call(l));v=g(v)}Z.apply(l,v),c&&!r&&v.length>0&&h+n.length>1&&e.uniqueSort(l)}return c&&(W=C,T=y),m};return i?r(a):a}var C,x,w,N,E,_,S,k,T,R,A,B,D,M,L,P,H,O,I,F="sizzle"+-new Date,z=window.document,W=0,V=0,U=n(),$=n(),q=n(),j=function(e,t){return e===t&&(A=!0),0},Y=typeof t,X=1<<31,K={}.hasOwnProperty,G=[],J=G.pop,Q=G.push,Z=G.push,ee=G.slice,te=G.indexOf||function(e){for(var t=0,n=this.length;n>t;t++)if(this[t]===e)return t;return-1},ne="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",re="[\\x20\\t\\r\\n\\f]",ie="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",oe="\\["+re+"*("+ie+")(?:"+re+"*([*^$|!~]?=)"+re+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+ie+"))|)"+re+"*\\]",ae=":("+ie+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+oe+")*)|.*)\\)|)",se=new RegExp("^"+re+"+|((?:^|[^\\\\])(?:\\\\.)*)"+re+"+$","g"),le=new RegExp("^"+re+"*,"+re+"*"),ce=new RegExp("^"+re+"*([>+~]|"+re+")"+re+"*"),ue=new RegExp("="+re+"*([^\\]'\"]*?)"+re+"*\\]","g"),de=new RegExp(ae),fe=new RegExp("^"+ie+"$"),he={ID:new RegExp("^#("+ie+")"),CLASS:new RegExp("^\\.("+ie+")"),TAG:new RegExp("^("+ie+"|[*])"),ATTR:new RegExp("^"+oe),PSEUDO:new RegExp("^"+ae),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+re+"*(even|odd|(([+-]|)(\\d*)n|)"+re+"*(?:([+-]|)"+re+"*(\\d+)|))"+re+"*\\)|)","i"),bool:new RegExp("^(?:"+ne+")$","i"),needsContext:new RegExp("^"+re+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+re+"*((?:-\\d)?\\d*)"+re+"*\\)|)(?=[^-]|$)","i")},pe=/^(?:input|select|textarea|button)$/i,me=/^h\d$/i,ge=/^[^{]+\{\s*\[native \w/,ve=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ye=/[+~]/,be=/'|\\/g,Ce=new RegExp("\\\\([\\da-f]{1,6}"+re+"?|("+re+")|.)","ig"),xe=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)};try{Z.apply(G=ee.call(z.childNodes),z.childNodes),G[z.childNodes.length].nodeType}catch(we){Z={apply:G.length?function(e,t){Q.apply(e,ee.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}x=e.support={},E=e.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},B=e.setDocument=function(e){var t,n=e?e.ownerDocument||e:z,r=n.defaultView;return n!==D&&9===n.nodeType&&n.documentElement?(D=n,M=n.documentElement,L=!E(n),r&&r!==r.top&&(r.addEventListener?r.addEventListener("unload",function(){B()},!1):r.attachEvent&&r.attachEvent("onunload",function(){B()})),x.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),x.getElementsByTagName=i(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),x.getElementsByClassName=ge.test(n.getElementsByClassName),x.getById=i(function(e){return M.appendChild(e).id=F,!n.getElementsByName||!n.getElementsByName(F).length}),x.getById?(w.find.ID=function(e,t){if(typeof t.getElementById!==Y&&L){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},w.filter.ID=function(e){var t=e.replace(Ce,xe);return function(e){return e.getAttribute("id")===t}}):(delete w.find.ID,w.filter.ID=function(e){var t=e.replace(Ce,xe);return function(e){var n=typeof e.getAttributeNode!==Y&&e.getAttributeNode("id");return n&&n.value===t}}),w.find.TAG=x.getElementsByTagName?function(e,t){return typeof t.getElementsByTagName!==Y?t.getElementsByTagName(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},w.find.CLASS=x.getElementsByClassName&&function(e,t){return L?t.getElementsByClassName(e):void 0},H=[],P=[],(x.qsa=ge.test(n.querySelectorAll))&&(i(function(e){e.innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&P.push("[*^$]="+re+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||P.push("\\["+re+"*(?:value|"+ne+")"),e.querySelectorAll(":checked").length||P.push(":checked")}),i(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&P.push("name"+re+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||P.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),P.push(",.*:")})),(x.matchesSelector=ge.test(O=M.matches||M.webkitMatchesSelector||M.mozMatchesSelector||M.oMatchesSelector||M.msMatchesSelector))&&i(function(e){x.disconnectedMatch=O.call(e,"div"),O.call(e,"[s!='']:x"),H.push("!=",ae)}),P=P.length&&new RegExp(P.join("|")),H=H.length&&new RegExp(H.join("|")),t=ge.test(M.compareDocumentPosition),I=t||ge.test(M.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return A=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r?r:(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&r||!x.sortDetached&&t.compareDocumentPosition(e)===r?e===n||e.ownerDocument===z&&I(z,e)?-1:t===n||t.ownerDocument===z&&I(z,t)?1:R?te.call(R,e)-te.call(R,t):0:4&r?-1:1)}:function(e,t){if(e===t)return A=!0,0;var r,i=0,o=e.parentNode,s=t.parentNode,l=[e],c=[t];if(!o||!s)return e===n?-1:t===n?1:o?-1:s?1:R?te.call(R,e)-te.call(R,t):0;if(o===s)return a(e,t);for(r=e;r=r.parentNode;)l.unshift(r);for(r=t;r=r.parentNode;)c.unshift(r);for(;l[i]===c[i];)i++;return i?a(l[i],c[i]):l[i]===z?-1:c[i]===z?1:0},n):D},e.matches=function(t,n){return e(t,null,null,n)},e.matchesSelector=function(t,n){if((t.ownerDocument||t)!==D&&B(t),n=n.replace(ue,"='$1']"),x.matchesSelector&&L&&(!H||!H.test(n))&&(!P||!P.test(n)))try{var r=O.call(t,n);if(r||x.disconnectedMatch||t.document&&11!==t.document.nodeType)return r}catch(i){}return e(n,D,null,[t]).length>0},e.contains=function(e,t){return(e.ownerDocument||e)!==D&&B(e),I(e,t)},e.attr=function(e,n){(e.ownerDocument||e)!==D&&B(e);var r=w.attrHandle[n.toLowerCase()],i=r&&K.call(w.attrHandle,n.toLowerCase())?r(e,n,!L):t;return i!==t?i:x.attributes||!L?e.getAttribute(n):(i=e.getAttributeNode(n))&&i.specified?i.value:null},e.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},e.uniqueSort=function(e){var t,n=[],r=0,i=0;if(A=!x.detectDuplicates,R=!x.sortStable&&e.slice(0),e.sort(j),A){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return R=null,e},N=e.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=N(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=N(t);return n},w=e.selectors={cacheLength:50,createPseudo:r,match:he,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Ce,xe),e[3]=(e[3]||e[4]||e[5]||"").replace(Ce,xe),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||e.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&e.error(t[0]),t},PSEUDO:function(e){var t,n=!e[6]&&e[2];return he.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&de.test(n)&&(t=_(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Ce,xe).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=U[e+" "];return t||(t=new RegExp("(^|"+re+")"+e+"("+re+"|$)"))&&U(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==Y&&e.getAttribute("class")||"")})},ATTR:function(t,n,r){return function(i){var o=e.attr(i,t);return null==o?"!="===n:n?(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o+" ").indexOf(r)>-1:"|="===n?o===r||o.slice(0,r.length+1)===r+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var c,u,d,f,h,p,m=o!==a?"nextSibling":"previousSibling",g=t.parentNode,v=s&&t.nodeName.toLowerCase(),y=!l&&!s;if(g){if(o){for(;m;){for(d=t;d=d[m];)if(s?d.nodeName.toLowerCase()===v:1===d.nodeType)return!1;p=m="only"===e&&!p&&"nextSibling"}return!0}if(p=[a?g.firstChild:g.lastChild],a&&y){for(u=g[F]||(g[F]={}),c=u[e]||[],h=c[0]===W&&c[1],f=c[0]===W&&c[2],d=h&&g.childNodes[h];d=++h&&d&&d[m]||(f=h=0)||p.pop();)if(1===d.nodeType&&++f&&d===t){u[e]=[W,h,f];break}}else if(y&&(c=(t[F]||(t[F]={}))[e])&&c[0]===W)f=c[1];else for(;(d=++h&&d&&d[m]||(f=h=0)||p.pop())&&((s?d.nodeName.toLowerCase()!==v:1!==d.nodeType)||!++f||(y&&((d[F]||(d[F]={}))[e]=[W,f]),d!==t)););return f-=i,f===r||f%r===0&&f/r>=0}}},PSEUDO:function(t,n){var i,o=w.pseudos[t]||w.setFilters[t.toLowerCase()]||e.error("unsupported pseudo: "+t);return o[F]?o(n):o.length>1?(i=[t,t,"",n],w.setFilters.hasOwnProperty(t.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),a=i.length;a--;)r=te.call(e,i[a]),e[r]=!(t[r]=i[a])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=S(e.replace(se,"$1"));return i[F]?r(function(e,t,n,r){for(var o,a=i(e,null,r,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),!n.pop()}}),has:r(function(t){return function(n){return e(t,n).length>0}}),contains:r(function(e){return e=e.replace(Ce,xe),function(t){return(t.textContent||t.innerText||N(t)).indexOf(e)>-1}}),lang:r(function(t){return fe.test(t||"")||e.error("unsupported lang: "+t),t=t.replace(Ce,xe).toLowerCase(),function(e){var n;do if(n=L?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return n=n.toLowerCase(),n===t||0===n.indexOf(t+"-");while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=window.location&&window.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===M},focus:function(e){return e===D.activeElement&&(!D.hasFocus||D.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!w.pseudos.empty(e)},header:function(e){return me.test(e.nodeName)},input:function(e){return pe.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:c(function(){return[0]}),last:c(function(e,t){return[t-1]}),eq:c(function(e,t,n){return[0>n?n+t:n]}),even:c(function(e,t){for(var n=0;t>n;n+=2)e.push(n);return e}),odd:c(function(e,t){for(var n=1;t>n;n+=2)e.push(n);return e}),lt:c(function(e,t,n){for(var r=0>n?n+t:n;--r>=0;)e.push(r);return e}),gt:c(function(e,t,n){for(var r=0>n?n+t:n;++r2&&"ID"===(a=o[0]).type&&x.getById&&9===t.nodeType&&L&&w.relative[o[1].type]){if(t=(w.find.ID(a.matches[0].replace(Ce,xe),t)||[])[0],!t)return n;c&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=he.needsContext.test(e)?0:o.length;i--&&(a=o[i],!w.relative[s=a.type]);)if((l=w.find[s])&&(r=l(a.matches[0].replace(Ce,xe),ye.test(o[0].type)&&u(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&f(o),!e)return Z.apply(n,r),n;break}}return(c||S(e,d))(r,t,!L,n,ye.test(e)&&u(t.parentNode)||t),n},x.sortStable=F.split("").sort(j).join("")===F,x.detectDuplicates=!!A,B(),x.sortDetached=i(function(e){return 1&e.compareDocumentPosition(D.createElement("div"))}),i(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){return n?void 0:e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),x.attributes&&i(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){return n||"input"!==e.nodeName.toLowerCase()?void 0:e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(ne,function(e,t,n){var r;return n?void 0:e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),e}),r(h,[],function(){var e=navigator,t=e.userAgent,n,r,i,o,a,s,l,c,u,d;n=window.opera&&window.opera.buildNumber,u=/Android/.test(t),r=/WebKit/.test(t),i=!r&&!n&&/MSIE/gi.test(t)&&/Explorer/gi.test(e.appName),i=i&&/MSIE (\w+)\./.exec(t)[1],o=-1==t.indexOf("Trident/")||-1==t.indexOf("rv:")&&-1==e.appName.indexOf("Netscape")?!1:11,a=-1==t.indexOf("Edge/")||i||o?!1:12,i=i||o||a,s=!r&&!o&&/Gecko/.test(t),l=-1!=t.indexOf("Mac"),c=/(iPad|iPhone)/.test(t),d="FormData"in window&&"FileReader"in window&&"URL"in window&&!!URL.createObjectURL,a&&(r=!1);var f=!c||d||t.match(/AppleWebKit\/(\d*)/)[1]>=534;return{ +opera:n,webkit:r,ie:i,gecko:s,mac:l,iOS:c,android:u,contentEditable:f,transparentSrc:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",caretAfter:8!=i,range:window.getSelection&&"Range"in window,documentMode:i&&!a?document.documentMode||7:10,fileApi:d,ceFalse:i===!1||i>8}}),r(p,[],function(){function e(e){var t=e,n,r;if(!u(e))for(t=[],n=0,r=e.length;r>n;n++)t[n]=e[n];return t}function n(e,n,r){var i,o;if(!e)return 0;if(r=r||e,e.length!==t){for(i=0,o=e.length;o>i;i++)if(n.call(r,e[i],i,e)===!1)return 0}else for(i in e)if(e.hasOwnProperty(i)&&n.call(r,e[i],i,e)===!1)return 0;return 1}function r(e,t){var r=[];return n(e,function(n,i){r.push(t(n,i,e))}),r}function i(e,t){var r=[];return n(e,function(n,i){(!t||t(n,i,e))&&r.push(n)}),r}function o(e,t){var n,r;if(e)for(n=0,r=e.length;r>n;n++)if(e[n]===t)return n;return-1}function a(e,t,n,r){var i=0;for(arguments.length<3&&(n=e[0]);ir;r++)if(t.call(n,e[r],r,e))return r;return-1}function l(e,n,r){var i=s(e,n,r);return-1!==i?e[i]:t}function c(e){return e[e.length-1]}var u=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)};return{isArray:u,toArray:e,each:n,map:r,filter:i,indexOf:o,reduce:a,findIndex:s,find:l,last:c}}),r(m,[h,p],function(e,n){function r(e){return null===e||e===t?"":(""+e).replace(h,"")}function i(e,r){return r?"array"==r&&n.isArray(e)?!0:typeof e==r:e!==t}function o(e,t,n){var r;for(e=e||[],t=t||",","string"==typeof e&&(e=e.split(t)),n=n||{},r=e.length;r--;)n[e[r]]={};return n}function a(e,t,n){var r=this,i,o,a,s,l,c=0;if(e=/^((static) )?([\w.]+)(:([\w.]+))?/.exec(e),a=e[3].match(/(^|\.)(\w+)$/i)[2],o=r.createNS(e[3].replace(/\.\w+$/,""),n),!o[a]){if("static"==e[2])return o[a]=t,void(this.onCreate&&this.onCreate(e[2],e[3],o[a]));t[a]||(t[a]=function(){},c=1),o[a]=t[a],r.extend(o[a].prototype,t),e[5]&&(i=r.resolve(e[5]).prototype,s=e[5].match(/\.(\w+)$/i)[1],l=o[a],c?o[a]=function(){return i[s].apply(this,arguments)}:o[a]=function(){return this.parent=i[s],l.apply(this,arguments)},o[a].prototype[a]=o[a],r.each(i,function(e,t){o[a].prototype[t]=i[t]}),r.each(t,function(e,t){i[t]?o[a].prototype[t]=function(){return this.parent=i[t],e.apply(this,arguments)}:t!=a&&(o[a].prototype[t]=e)})),r.each(t["static"],function(e,t){o[a][t]=e})}}function s(e,n){var r,i,o,a=arguments,s;for(r=1,i=a.length;i>r;r++){n=a[r];for(o in n)n.hasOwnProperty(o)&&(s=n[o],s!==t&&(e[o]=s))}return e}function l(e,t,r,i){i=i||this,e&&(r&&(e=e[r]),n.each(e,function(e,n){return t.call(i,e,n,r)===!1?!1:void l(e,t,r,i)}))}function c(e,t){var n,r;for(t=t||window,e=e.split("."),n=0;nn&&(t=t[e[n]],t);n++);return t}function d(e,t){return!e||i(e,"array")?e:n.map(e.split(t||","),r)}function f(t){var n=e.cacheSuffix;return n&&(t+=(-1===t.indexOf("?")?"?":"&")+n),t}var h=/^\s*|\s*$/g;return{trim:r,isArray:n.isArray,is:i,toArray:n.toArray,makeMap:o,each:n.each,map:n.map,grep:n.filter,inArray:n.indexOf,extend:s,create:a,walk:l,createNS:c,resolve:u,explode:d,_addCacheSuffix:f}}),r(g,[d,f,m,h],function(e,n,r,i){function o(e){return"undefined"!=typeof e}function a(e){return"string"==typeof e}function s(e){return e&&e==e.window}function l(e,t){var n,r,i;for(t=t||w,i=t.createElement("div"),n=t.createDocumentFragment(),i.innerHTML=e;r=i.firstChild;)n.appendChild(r);return n}function c(e,t,n,r){var i;if(a(t))t=l(t,v(e[0]));else if(t.length&&!t.nodeType){if(t=f.makeArray(t),r)for(i=t.length-1;i>=0;i--)c(e,t[i],n,r);else for(i=0;ii&&(a=e[i],t.call(a,i,a)!==!1);i++);return e}function g(e,t){var n=[];return m(e,function(e,r){t(r,e)&&n.push(r)}),n}function v(e){return e?9==e.nodeType?e:e.ownerDocument:w}function y(e,n,r){var i=[],o=e[n];for("string"!=typeof r&&r instanceof f&&(r=r[0]);o&&9!==o.nodeType;){if(r!==t){if(o===r)break;if("string"==typeof r&&f(o).is(r))break}1===o.nodeType&&i.push(o),o=o[n]}return i}function b(e,n,r,i){var o=[];for(i instanceof f&&(i=i[0]);e;e=e[n])if(!r||e.nodeType===r){if(i!==t){if(e===i)break;if("string"==typeof i&&f(e).is(i))break}o.push(e)}return o}function C(e,t,n){for(e=e[t];e;e=e[t])if(e.nodeType==n)return e;return null}function x(e,t,n){m(n,function(n,r){e[n]=e[n]||{},e[n][t]=r})}var w=document,N=Array.prototype.push,E=Array.prototype.slice,_=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,S=e.Event,k,T=r.makeMap("children,contents,next,prev"),R=r.makeMap("fillOpacity fontWeight lineHeight opacity orphans widows zIndex zoom"," "),A=r.makeMap("checked compact declare defer disabled ismap multiple nohref noshade nowrap readonly selected"," "),B={"for":"htmlFor","class":"className",readonly:"readOnly"},D={"float":"cssFloat"},M={},L={},P=/^\s*|\s*$/g;return f.fn=f.prototype={constructor:f,selector:"",context:null,length:0,init:function(e,t){var n=this,r,i;if(!e)return n;if(e.nodeType)return n.context=n[0]=e,n.length=1,n;if(t&&t.nodeType)n.context=t;else{if(t)return f(e).attr(t);n.context=t=document}if(a(e)){if(n.selector=e,r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:_.exec(e),!r)return f(t).find(e);if(r[1])for(i=l(e,v(t)).firstChild;i;)N.call(n,i),i=i.nextSibling;else{if(i=v(t).getElementById(r[2]),!i)return n;if(i.id!==r[2])return n.find(e);n.length=1,n[0]=i}}else this.add(e,!1);return n},toArray:function(){return r.toArray(this)},add:function(e,t){var n=this,r,i;if(a(e))return n.add(f(e));if(t!==!1)for(r=f.unique(n.toArray().concat(f.makeArray(e))),n.length=r.length,i=0;it;t++)f.find(e,this[t],r);return f(r)},filter:function(e){return f("function"==typeof e?g(this.toArray(),function(t,n){return e(n,t)}):f.filter(e,this.toArray()))},closest:function(e){var t=[];return e instanceof f&&(e=e[0]),this.each(function(n,r){for(;r;){if("string"==typeof e&&f(r).is(e)){t.push(r);break}if(r==e){t.push(r);break}r=r.parentNode}}),f(t)},offset:function(e){var t,n,r,i=0,o=0,a;return e?this.css(e):(t=this[0],t&&(n=t.ownerDocument,r=n.documentElement,t.getBoundingClientRect&&(a=t.getBoundingClientRect(),i=a.left+(r.scrollLeft||n.body.scrollLeft)-r.clientLeft,o=a.top+(r.scrollTop||n.body.scrollTop)-r.clientTop)),{left:i,top:o})},push:N,sort:[].sort,splice:[].splice},r.extend(f,{extend:r.extend,makeArray:function(e){return s(e)||e.nodeType?[e]:r.toArray(e)},inArray:h,isArray:r.isArray,each:m,trim:p,grep:g,find:n,expr:n.selectors,unique:n.uniqueSort,text:n.getText,contains:n.contains,filter:function(e,t,n){var r=t.length;for(n&&(e=":not("+e+")");r--;)1!=t[r].nodeType&&t.splice(r,1);return t=1===t.length?f.find.matchesSelector(t[0],e)?[t[0]]:[]:f.find.matches(e,t)}}),m({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return y(e,"parentNode")},next:function(e){return C(e,"nextSibling",1)},prev:function(e){return C(e,"previousSibling",1)},children:function(e){return b(e.firstChild,"nextSibling",1)},contents:function(e){return r.toArray(("iframe"===e.nodeName?e.contentDocument||e.contentWindow.document:e).childNodes)}},function(e,t){f.fn[e]=function(n){var r=this,i=[];return r.each(function(){var e=t.call(i,this,n,i);e&&(f.isArray(e)?i.push.apply(i,e):i.push(e))}),this.length>1&&(T[e]||(i=f.unique(i)),0===e.indexOf("parents")&&(i=i.reverse())),i=f(i),n?i.filter(n):i}}),m({parentsUntil:function(e,t){return y(e,"parentNode",t)},nextUntil:function(e,t){return b(e,"nextSibling",1,t).slice(1)},prevUntil:function(e,t){return b(e,"previousSibling",1,t).slice(1)}},function(e,t){f.fn[e]=function(n,r){var i=this,o=[];return i.each(function(){var e=t.call(o,this,n,o);e&&(f.isArray(e)?o.push.apply(o,e):o.push(e))}),this.length>1&&(o=f.unique(o),(0===e.indexOf("parents")||"prevUntil"===e)&&(o=o.reverse())),o=f(o),r?o.filter(r):o}}),f.fn.is=function(e){return!!e&&this.filter(e).length>0},f.fn.init.prototype=f.fn,f.overrideDefaults=function(e){function t(r,i){return n=n||e(),0===arguments.length&&(r=n.element),i||(i=n.context),new t.fn.init(r,i)}var n;return f.extend(t,this),t},i.ie&&i.ie<8&&(x(M,"get",{maxlength:function(e){var t=e.maxLength;return 2147483647===t?k:t},size:function(e){var t=e.size;return 20===t?k:t},"class":function(e){return e.className},style:function(e){var t=e.style.cssText;return 0===t.length?k:t}}),x(M,"set",{"class":function(e,t){e.className=t},style:function(e,t){e.style.cssText=t}})),i.ie&&i.ie<9&&(D["float"]="styleFloat",x(L,"set",{opacity:function(e,t){var n=e.style;null===t||""===t?n.removeAttribute("filter"):(n.zoom=1,n.filter="alpha(opacity="+100*t+")")}})),f.attrHooks=M,f.cssHooks=L,f}),r(v,[],function(){return function(e,t){function n(e,t,n,r){function i(e){return e=parseInt(e,10).toString(16),e.length>1?e:"0"+e}return"#"+i(t)+i(n)+i(r)}var r=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi,i=/(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi,o=/\s*([^:]+):\s*([^;]+);?/g,a=/\s+$/,s,l,c={},u,d,f,h="\ufeff";for(e=e||{},t&&(d=t.getValidStyles(),f=t.getInvalidStyles()),u=("\\\" \\' \\; \\: ; : "+h).split(" "),l=0;l-1&&n||(m[e+t]=-1==l?s[0]:s.join(" "),delete m[e+"-top"+t],delete m[e+"-right"+t],delete m[e+"-bottom"+t],delete m[e+"-left"+t])}}function u(e){var t=m[e],n;if(t){for(t=t.split(" "),n=t.length;n--;)if(t[n]!==t[0])return!1;return m[e]=t[0],!0}}function d(e,t,n,r){u(t)&&u(n)&&u(r)&&(m[e]=m[t]+" "+m[n]+" "+m[r],delete m[t],delete m[n],delete m[r])}function f(e){return b=!0,c[e]}function h(e,t){return b&&(e=e.replace(/\uFEFF[0-9]/g,function(e){return c[e]})),t||(e=e.replace(/\\([\'\";:])/g,"$1")),e}function p(t,n,r,i,o,a){if(o=o||a)return o=h(o),"'"+o.replace(/\'/g,"\\'")+"'";if(n=h(n||r||i),!e.allow_script_urls){var s=n.replace(/[\s\r\n]+/,"");if(/(java|vb)script:/i.test(s))return"";if(!e.allow_svg_data_urls&&/^data:image\/svg/i.test(s))return""}return C&&(n=C.call(x,n,"style")),"url('"+n.replace(/\'/g,"\\'")+"')"}var m={},g,v,y,b,C=e.url_converter,x=e.url_converter_scope||this;if(t){for(t=t.replace(/[\u0000-\u001F]/g,""),t=t.replace(/\\[\"\';:\uFEFF]/g,f).replace(/\"[^\"]+\"|\'[^\']+\'/g,function(e){return e.replace(/[;:]/g,f)});g=o.exec(t);){if(v=g[1].replace(a,"").toLowerCase(),y=g[2].replace(a,""),y=y.replace(/\\[0-9a-f]+/g,function(e){return String.fromCharCode(parseInt(e.substr(1),16))}),v&&y.length>0){if(!e.allow_script_urls&&("behavior"==v||/expression\s*\(|\/\*|\*\//.test(y)))continue;"font-weight"===v&&"700"===y?y="bold":("color"===v||"background-color"===v)&&(y=y.toLowerCase()),y=y.replace(r,n),y=y.replace(i,p),m[v]=b?h(y,!0):y}o.lastIndex=g.index+g[0].length}s("border","",!0),s("border","-width"),s("border","-color"),s("border","-style"),s("padding",""),s("margin",""),d("border","border-width","border-style","border-color"),"medium none"===m.border&&delete m.border,"none"===m["border-image"]&&delete m["border-image"]}return m},serialize:function(e,t){function n(t){var n,r,o,a;if(n=d[t])for(r=0,o=n.length;o>r;r++)t=n[r],a=e[t],a!==s&&a.length>0&&(i+=(i.length>0?" ":"")+t+": "+a+";")}function r(e,t){var n;return n=f["*"],n&&n[e]?!1:(n=f[t],n&&n[e]?!1:!0)}var i="",o,a;if(t&&d)n("*"),n(t);else for(o in e)a=e[o],a!==s&&a.length>0&&(!f||r(o,t))&&(i+=(i.length>0?" ":"")+o+": "+a+";");return i}}}}),r(y,[],function(){return function(e,t){function n(e,n,r,i){var o,a;if(e){if(!i&&e[n])return e[n];if(e!=t){if(o=e[r])return o;for(a=e.parentNode;a&&a!=t;a=a.parentNode)if(o=a[r])return o}}}var r=e;this.current=function(){return r},this.next=function(e){return r=n(r,"firstChild","nextSibling",e)},this.prev=function(e){return r=n(r,"lastChild","previousSibling",e)}}}),r(b,[m],function(e){function t(n){function r(){return P.createDocumentFragment()}function i(e,t){N(F,e,t)}function o(e,t){N(z,e,t)}function a(e){i(e.parentNode,j(e))}function s(e){i(e.parentNode,j(e)+1)}function l(e){o(e.parentNode,j(e))}function c(e){o(e.parentNode,j(e)+1)}function u(e){e?(L[U]=L[V],L[$]=L[W]):(L[V]=L[U],L[W]=L[$]),L.collapsed=F}function d(e){a(e),c(e)}function f(e){i(e,0),o(e,1===e.nodeType?e.childNodes.length:e.nodeValue.length)}function h(e,t){var n=L[V],r=L[W],i=L[U],o=L[$],a=t.startContainer,s=t.startOffset,l=t.endContainer,c=t.endOffset;return 0===e?w(n,r,a,s):1===e?w(i,o,a,s):2===e?w(i,o,l,c):3===e?w(n,r,l,c):void 0}function p(){E(I)}function m(){return E(H)}function g(){return E(O)}function v(e){var t=this[V],r=this[W],i,o;3!==t.nodeType&&4!==t.nodeType||!t.nodeValue?(t.childNodes.length>0&&(o=t.childNodes[r]),o?t.insertBefore(e,o):3==t.nodeType?n.insertAfter(e,t):t.appendChild(e)):r?r>=t.nodeValue.length?n.insertAfter(e,t):(i=t.splitText(r),t.parentNode.insertBefore(e,i)):t.parentNode.insertBefore(e,t)}function y(e){var t=L.extractContents();L.insertNode(e),e.appendChild(t),L.selectNode(e)}function b(){return q(new t(n),{startContainer:L[V],startOffset:L[W],endContainer:L[U],endOffset:L[$],collapsed:L.collapsed,commonAncestorContainer:L.commonAncestorContainer})}function C(e,t){var n;if(3==e.nodeType)return e;if(0>t)return e;for(n=e.firstChild;n&&t>0;)--t,n=n.nextSibling;return n?n:e}function x(){return L[V]==L[U]&&L[W]==L[$]}function w(e,t,r,i){var o,a,s,l,c,u;if(e==r)return t==i?0:i>t?-1:1;for(o=r;o&&o.parentNode!=e;)o=o.parentNode;if(o){for(a=0,s=e.firstChild;s!=o&&t>a;)a++,s=s.nextSibling;return a>=t?-1:1}for(o=e;o&&o.parentNode!=r;)o=o.parentNode;if(o){for(a=0,s=r.firstChild;s!=o&&i>a;)a++,s=s.nextSibling;return i>a?-1:1}for(l=n.findCommonAncestor(e,r),c=e;c&&c.parentNode!=l;)c=c.parentNode;for(c||(c=l),u=r;u&&u.parentNode!=l;)u=u.parentNode;if(u||(u=l),c==u)return 0;for(s=l.firstChild;s;){if(s==c)return-1;if(s==u)return 1;s=s.nextSibling}}function N(e,t,r){var i,o;for(e?(L[V]=t,L[W]=r):(L[U]=t,L[$]=r),i=L[U];i.parentNode;)i=i.parentNode;for(o=L[V];o.parentNode;)o=o.parentNode;o==i?w(L[V],L[W],L[U],L[$])>0&&L.collapse(e):L.collapse(e),L.collapsed=x(),L.commonAncestorContainer=n.findCommonAncestor(L[V],L[U])}function E(e){var t,n=0,r=0,i,o,a,s,l,c;if(L[V]==L[U])return _(e);for(t=L[U],i=t.parentNode;i;t=i,i=i.parentNode){if(i==L[V])return S(t,e);++n}for(t=L[V],i=t.parentNode;i;t=i,i=i.parentNode){if(i==L[U])return k(t,e);++r}for(o=r-n,a=L[V];o>0;)a=a.parentNode,o--;for(s=L[U];0>o;)s=s.parentNode,o++;for(l=a.parentNode,c=s.parentNode;l!=c;l=l.parentNode,c=c.parentNode)a=l,s=c;return T(a,s,e)}function _(e){var t,n,i,o,a,s,l,c,u;if(e!=I&&(t=r()),L[W]==L[$])return t;if(3==L[V].nodeType){if(n=L[V].nodeValue,i=n.substring(L[W],L[$]),e!=O&&(o=L[V],c=L[W],u=L[$]-L[W],0===c&&u>=o.nodeValue.length-1?o.parentNode.removeChild(o):o.deleteData(c,u),L.collapse(F)),e==I)return;return i.length>0&&t.appendChild(P.createTextNode(i)),t}for(o=C(L[V],L[W]),a=L[$]-L[W];o&&a>0;)s=o.nextSibling,l=D(o,e),t&&t.appendChild(l),--a,o=s;return e!=O&&L.collapse(F),t}function S(e,t){var n,i,o,a,s,l;if(t!=I&&(n=r()),i=R(e,t),n&&n.appendChild(i),o=j(e),a=o-L[W],0>=a)return t!=O&&(L.setEndBefore(e),L.collapse(z)),n;for(i=e.previousSibling;a>0;)s=i.previousSibling,l=D(i,t),n&&n.insertBefore(l,n.firstChild),--a,i=s;return t!=O&&(L.setEndBefore(e),L.collapse(z)),n}function k(e,t){var n,i,o,a,s,l;for(t!=I&&(n=r()),o=A(e,t),n&&n.appendChild(o),i=j(e),++i,a=L[$]-i,o=e.nextSibling;o&&a>0;)s=o.nextSibling,l=D(o,t),n&&n.appendChild(l),--a,o=s;return t!=O&&(L.setStartAfter(e),L.collapse(F)),n}function T(e,t,n){var i,o,a,s,l,c,u;for(n!=I&&(o=r()),i=A(e,n),o&&o.appendChild(i),a=j(e),s=j(t),++a,l=s-a,c=e.nextSibling;l>0;)u=c.nextSibling,i=D(c,n),o&&o.appendChild(i),c=u,--l;return i=R(t,n),o&&o.appendChild(i),n!=O&&(L.setStartAfter(e),L.collapse(F)),o}function R(e,t){var n=C(L[U],L[$]-1),r,i,o,a,s,l=n!=L[U];if(n==e)return B(n,l,z,t);for(r=n.parentNode,i=B(r,z,z,t);r;){for(;n;)o=n.previousSibling,a=B(n,l,z,t),t!=I&&i.insertBefore(a,i.firstChild),l=F,n=o;if(r==e)return i;n=r.previousSibling,r=r.parentNode,s=B(r,z,z,t),t!=I&&s.appendChild(i),i=s}}function A(e,t){var n=C(L[V],L[W]),r=n!=L[V],i,o,a,s,l;if(n==e)return B(n,r,F,t);for(i=n.parentNode,o=B(i,z,F,t);i;){for(;n;)a=n.nextSibling,s=B(n,r,F,t),t!=I&&o.appendChild(s),r=F,n=a;if(i==e)return o;n=i.nextSibling,i=i.parentNode,l=B(i,z,F,t),t!=I&&l.appendChild(o),o=l}}function B(e,t,r,i){var o,a,s,l,c;if(t)return D(e,i);if(3==e.nodeType){if(o=e.nodeValue,r?(l=L[W],a=o.substring(l),s=o.substring(0,l)):(l=L[$],a=o.substring(0,l),s=o.substring(l)),i!=O&&(e.nodeValue=s),i==I)return;return c=n.clone(e,z),c.nodeValue=a,c}if(i!=I)return n.clone(e,z)}function D(e,t){return t!=I?t==O?n.clone(e,F):e:void e.parentNode.removeChild(e)}function M(){return n.create("body",null,g()).outerText}var L=this,P=n.doc,H=0,O=1,I=2,F=!0,z=!1,W="startOffset",V="startContainer",U="endContainer",$="endOffset",q=e.extend,j=n.nodeIndex;return q(L,{startContainer:P,startOffset:0,endContainer:P,endOffset:0,collapsed:F,commonAncestorContainer:P,START_TO_START:0,START_TO_END:1,END_TO_END:2,END_TO_START:3,setStart:i,setEnd:o,setStartBefore:a,setStartAfter:s,setEndBefore:l,setEndAfter:c,collapse:u,selectNode:d,selectNodeContents:f,compareBoundaryPoints:h,deleteContents:p,extractContents:m,cloneContents:g,insertNode:v,surroundContents:y,cloneRange:b,toStringIE:M}),L}return t.prototype.toString=function(){return this.toStringIE()},t}),r(C,[m],function(e){function t(e){var t;return t=document.createElement("div"),t.innerHTML=e,t.textContent||t.innerText||e}function n(e,t){var n,r,i,a={};if(e){for(e=e.split(","),t=t||10,n=0;n\"\u0060\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,l=/[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,c=/[<>&\"\']/g,u=/&#([a-z0-9]+);?|&([a-z0-9]+);/gi,d={128:"\u20ac",130:"\u201a",131:"\u0192",132:"\u201e",133:"\u2026",134:"\u2020",135:"\u2021",136:"\u02c6",137:"\u2030",138:"\u0160",139:"\u2039",140:"\u0152",142:"\u017d",145:"\u2018",146:"\u2019",147:"\u201c",148:"\u201d",149:"\u2022",150:"\u2013",151:"\u2014",152:"\u02dc",153:"\u2122",154:"\u0161",155:"\u203a",156:"\u0153",158:"\u017e",159:"\u0178"};o={'"':""","'":"'","<":"<",">":">","&":"&","`":"`"},a={"<":"<",">":">","&":"&",""":'"',"'":"'"},i=n("50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,t9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro",32);var f={encodeRaw:function(e,t){return e.replace(t?s:l,function(e){return o[e]||e})},encodeAllRaw:function(e){return(""+e).replace(c,function(e){return o[e]||e})},encodeNumeric:function(e,t){return e.replace(t?s:l,function(e){return e.length>1?"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";":o[e]||"&#"+e.charCodeAt(0)+";"})},encodeNamed:function(e,t,n){return n=n||i,e.replace(t?s:l,function(e){return o[e]||n[e]||e})},getEncodeFunc:function(e,t){function a(e,n){return e.replace(n?s:l,function(e){return o[e]||t[e]||"&#"+e.charCodeAt(0)+";"||e})}function c(e,n){return f.encodeNamed(e,n,t)}return t=n(t)||i,e=r(e.replace(/\+/g,",")),e.named&&e.numeric?a:e.named?t?c:f.encodeNamed:e.numeric?f.encodeNumeric:f.encodeRaw},decode:function(e){return e.replace(u,function(e,n){return n?(n="x"===n.charAt(0).toLowerCase()?parseInt(n.substr(1),16):parseInt(n,10),n>65535?(n-=65536,String.fromCharCode(55296+(n>>10),56320+(1023&n))):d[n]||String.fromCharCode(n)):a[e]||i[e]||t(e)})}};return f}),r(x,[m,u],function(e,t){return function(n,r){function i(e){n.getElementsByTagName("head")[0].appendChild(e)}function o(r,o,c){function u(){for(var e=b.passed,t=e.length;t--;)e[t]();b.status=2,b.passed=[],b.failed=[]}function d(){for(var e=b.failed,t=e.length;t--;)e[t]();b.status=3,b.passed=[],b.failed=[]}function f(){var e=navigator.userAgent.match(/WebKit\/(\d*)/);return!!(e&&e[1]<536)}function h(e,n){e()||((new Date).getTime()-y0)return v=n.createElement("style"),v.textContent='@import "'+r+'"',m(),void i(v);p()}i(g),g.href=r}}var a=0,s={},l;r=r||{},l=r.maxLoadTime||5e3,this.load=o}}),r(w,[f,g,v,d,y,b,C,h,m,x],function(e,n,r,i,o,a,s,l,c,u){function d(e,t){var n={},r=t.keep_values,i;return i={set:function(n,r,i){t.url_converter&&(r=t.url_converter.call(t.url_converter_scope||e,r,i,n[0])),n.attr("data-mce-"+i,r).attr(i,r)},get:function(e,t){return e.attr("data-mce-"+t)||e.attr(t)}},n={style:{set:function(e,t){return null!==t&&"object"==typeof t?void e.css(t):(r&&e.attr("data-mce-style",t),void e.attr("style",t))},get:function(t){var n=t.attr("data-mce-style")||t.attr("style");return n=e.serializeStyle(e.parseStyle(n),t[0].nodeName)}}},r&&(n.href=n.src=i),n}function f(e,t){var n=t.attr("style");n=e.serializeStyle(e.parseStyle(n),t[0].nodeName),n||(n=null),t.attr("data-mce-style",n)}function h(e,t){var n=0,r,i;if(e)for(r=e.nodeType,e=e.previousSibling;e;e=e.previousSibling)i=e.nodeType,(!t||3!=i||i!=r&&e.nodeValue.length)&&(n++,r=i);return n}function p(e,t){var o=this,a;o.doc=e,o.win=window,o.files={},o.counter=0,o.stdMode=!b||e.documentMode>=8,o.boxModel=!b||"CSS1Compat"==e.compatMode||o.stdMode,o.styleSheetLoader=new u(e),o.boundEvents=[],o.settings=t=t||{},o.schema=t.schema,o.styles=new r({url_converter:t.url_converter,url_converter_scope:t.url_converter_scope},t.schema),o.fixDoc(e),o.events=t.ownEvents?new i(t.proxy):i.Event,o.attrHooks=d(o,t),a=t.schema?t.schema.getBlockElements():{},o.$=n.overrideDefaults(function(){return{context:e,element:o.getRoot()}}),o.isBlock=function(e){if(!e)return!1;var t=e.nodeType;return t?!(1!==t||!a[e.nodeName]):!!a[e]}}var m=c.each,g=c.is,v=c.grep,y=c.trim,b=l.ie,C=/^([a-z0-9],?)+$/i,x=/^[ \t\r\n]*$/;return p.prototype={$$:function(e){return"string"==typeof e&&(e=this.get(e)),this.$(e)},root:null,fixDoc:function(e){var t=this.settings,n;if(b&&t.schema){"abbr article aside audio canvas details figcaption figure footer header hgroup mark menu meter nav output progress section summary time video".replace(/\w+/g,function(t){e.createElement(t)});for(n in t.schema.getCustomElements())e.createElement(n)}},clone:function(e,t){var n=this,r,i;return!b||1!==e.nodeType||t?e.cloneNode(t):(i=n.doc,t?r.firstChild:(r=i.createElement(e.nodeName),m(n.getAttribs(e),function(t){n.setAttrib(r,t.nodeName,n.getAttrib(e,t.nodeName))}),r))},getRoot:function(){var e=this;return e.settings.root_element||e.doc.body},getViewPort:function(e){var t,n;return e=e?e:this.win,t=e.document,n=this.boxModel?t.documentElement:t.body,{x:e.pageXOffset||n.scrollLeft,y:e.pageYOffset||n.scrollTop,w:e.innerWidth||n.clientWidth,h:e.innerHeight||n.clientHeight}},getRect:function(e){var t=this,n,r;return e=t.get(e),n=t.getPos(e),r=t.getSize(e),{x:n.x,y:n.y,w:r.w,h:r.h}},getSize:function(e){var t=this,n,r;return e=t.get(e),n=t.getStyle(e,"width"),r=t.getStyle(e,"height"),-1===n.indexOf("px")&&(n=0),-1===r.indexOf("px")&&(r=0),{w:parseInt(n,10)||e.offsetWidth||e.clientWidth,h:parseInt(r,10)||e.offsetHeight||e.clientHeight}},getParent:function(e,t,n){return this.getParents(e,t,n,!1)},getParents:function(e,n,r,i){var o=this,a,s=[];for(e=o.get(e),i=i===t,r=r||("BODY"!=o.getRoot().nodeName?o.getRoot().parentNode:null),g(n,"string")&&(a=n,n="*"===n?function(e){return 1==e.nodeType}:function(e){return o.is(e,a)});e&&e!=r&&e.nodeType&&9!==e.nodeType;){if(!n||n(e)){if(!i)return e;s.push(e)}e=e.parentNode}return i?s:null},get:function(e){var t;return e&&this.doc&&"string"==typeof e&&(t=e,e=this.doc.getElementById(e),e&&e.id!==t)?this.doc.getElementsByName(t)[1]:e},getNext:function(e,t){return this._findSib(e,t,"nextSibling")},getPrev:function(e,t){return this._findSib(e,t,"previousSibling")},select:function(t,n){var r=this;return e(t,r.get(n)||r.settings.root_element||r.doc,[])},is:function(n,r){var i;if(n.length===t){if("*"===r)return 1==n.nodeType;if(C.test(r)){for(r=r.toLowerCase().split(/,/),n=n.nodeName.toLowerCase(),i=r.length-1;i>=0;i--)if(r[i]==n)return!0;return!1}}if(n.nodeType&&1!=n.nodeType)return!1;var o=n.nodeType?[n]:n;return e(r,o[0].ownerDocument||o[0],null,o).length>0},add:function(e,t,n,r,i){var o=this;return this.run(e,function(e){var a;return a=g(t,"string")?o.doc.createElement(t):t,o.setAttribs(a,n),r&&(r.nodeType?a.appendChild(r):o.setHTML(a,r)),i?a:e.appendChild(a)})},create:function(e,t,n){return this.add(this.doc.createElement(e),e,t,n,1); +},createHTML:function(e,t,n){var r="",i;r+="<"+e;for(i in t)t.hasOwnProperty(i)&&null!==t[i]&&"undefined"!=typeof t[i]&&(r+=" "+i+'="'+this.encode(t[i])+'"');return"undefined"!=typeof n?r+">"+n+"":r+" />"},createFragment:function(e){var t,n,r=this.doc,i;for(i=r.createElement("div"),t=r.createDocumentFragment(),e&&(i.innerHTML=e);n=i.firstChild;)t.appendChild(n);return t},remove:function(e,t){return e=this.$$(e),t?e.each(function(){for(var e;e=this.firstChild;)3==e.nodeType&&0===e.data.length?this.removeChild(e):this.parentNode.insertBefore(e,this)}).remove():e.remove(),e.length>1?e.toArray():e[0]},setStyle:function(e,t,n){e=this.$$(e).css(t,n),this.settings.update_styles&&f(this,e)},getStyle:function(e,n,r){return e=this.$$(e),r?e.css(n):(n=n.replace(/-(\D)/g,function(e,t){return t.toUpperCase()}),"float"==n&&(n=l.ie&&l.ie<12?"styleFloat":"cssFloat"),e[0]&&e[0].style?e[0].style[n]:t)},setStyles:function(e,t){e=this.$$(e).css(t),this.settings.update_styles&&f(this,e)},removeAllAttribs:function(e){return this.run(e,function(e){var t,n=e.attributes;for(t=n.length-1;t>=0;t--)e.removeAttributeNode(n.item(t))})},setAttrib:function(e,t,n){var r=this,i,o,a=r.settings;""===n&&(n=null),e=r.$$(e),i=e.attr(t),e.length&&(o=r.attrHooks[t],o&&o.set?o.set(e,n,t):e.attr(t,n),i!=n&&a.onSetAttrib&&a.onSetAttrib({attrElm:e,attrName:t,attrValue:n}))},setAttribs:function(e,t){var n=this;n.$$(e).each(function(e,r){m(t,function(e,t){n.setAttrib(r,t,e)})})},getAttrib:function(e,t,n){var r=this,i,o;return e=r.$$(e),e.length&&(i=r.attrHooks[t],o=i&&i.get?i.get(e,t):e.attr(t)),"undefined"==typeof o&&(o=n||""),o},getPos:function(e,t){var r=this,i=0,o=0,a,s=r.doc,l=s.body,c;if(e=r.get(e),t=t||l,e){if(t===l&&e.getBoundingClientRect&&"static"===n(l).css("position"))return c=e.getBoundingClientRect(),t=r.boxModel?s.documentElement:l,i=c.left+(s.documentElement.scrollLeft||l.scrollLeft)-t.clientLeft,o=c.top+(s.documentElement.scrollTop||l.scrollTop)-t.clientTop,{x:i,y:o};for(a=e;a&&a!=t&&a.nodeType;)i+=a.offsetLeft||0,o+=a.offsetTop||0,a=a.offsetParent;for(a=e.parentNode;a&&a!=t&&a.nodeType;)i-=a.scrollLeft||0,o-=a.scrollTop||0,a=a.parentNode}return{x:i,y:o}},parseStyle:function(e){return this.styles.parse(e)},serializeStyle:function(e,t){return this.styles.serialize(e,t)},addStyle:function(e){var t=this,n=t.doc,r,i;if(t!==p.DOM&&n===document){var o=p.DOM.addedStyles;if(o=o||[],o[e])return;o[e]=!0,p.DOM.addedStyles=o}i=n.getElementById("mceDefaultStyles"),i||(i=n.createElement("style"),i.id="mceDefaultStyles",i.type="text/css",r=n.getElementsByTagName("head")[0],r.firstChild?r.insertBefore(i,r.firstChild):r.appendChild(i)),i.styleSheet?i.styleSheet.cssText+=e:i.appendChild(n.createTextNode(e))},loadCSS:function(e){var t=this,n=t.doc,r;return t!==p.DOM&&n===document?void p.DOM.loadCSS(e):(e||(e=""),r=n.getElementsByTagName("head")[0],void m(e.split(","),function(e){var i;e=c._addCacheSuffix(e),t.files[e]||(t.files[e]=!0,i=t.create("link",{rel:"stylesheet",href:e}),b&&n.documentMode&&n.recalc&&(i.onload=function(){n.recalc&&n.recalc(),i.onload=null}),r.appendChild(i))}))},addClass:function(e,t){this.$$(e).addClass(t)},removeClass:function(e,t){this.toggleClass(e,t,!1)},hasClass:function(e,t){return this.$$(e).hasClass(t)},toggleClass:function(e,t,r){this.$$(e).toggleClass(t,r).each(function(){""===this.className&&n(this).attr("class",null)})},show:function(e){this.$$(e).show()},hide:function(e){this.$$(e).hide()},isHidden:function(e){return"none"==this.$$(e).css("display")},uniqueId:function(e){return(e?e:"mce_")+this.counter++},setHTML:function(e,t){e=this.$$(e),b?e.each(function(e,r){if(r.canHaveHTML!==!1){for(;r.firstChild;)r.removeChild(r.firstChild);try{r.innerHTML="
    "+t,r.removeChild(r.firstChild)}catch(i){n("
    ").html("
    "+t).contents().slice(1).appendTo(r)}return t}}):e.html(t)},getOuterHTML:function(e){return e=this.get(e),1==e.nodeType&&"outerHTML"in e?e.outerHTML:n("
    ").append(n(e).clone()).html()},setOuterHTML:function(e,t){var r=this;r.$$(e).each(function(){try{if("outerHTML"in this)return void(this.outerHTML=t)}catch(e){}r.remove(n(this).html(t),!0)})},decode:s.decode,encode:s.encodeAllRaw,insertAfter:function(e,t){return t=this.get(t),this.run(e,function(e){var n,r;return n=t.parentNode,r=t.nextSibling,r?n.insertBefore(e,r):n.appendChild(e),e})},replace:function(e,t,n){var r=this;return r.run(t,function(t){return g(t,"array")&&(e=e.cloneNode(!0)),n&&m(v(t.childNodes),function(t){e.appendChild(t)}),t.parentNode.replaceChild(e,t)})},rename:function(e,t){var n=this,r;return e.nodeName!=t.toUpperCase()&&(r=n.create(t),m(n.getAttribs(e),function(t){n.setAttrib(r,t.nodeName,n.getAttrib(e,t.nodeName))}),n.replace(r,e,1)),r||e},findCommonAncestor:function(e,t){for(var n=e,r;n;){for(r=t;r&&n!=r;)r=r.parentNode;if(n==r)break;n=n.parentNode}return!n&&e.ownerDocument?e.ownerDocument.documentElement:n},toHex:function(e){return this.styles.toHex(c.trim(e))},run:function(e,t,n){var r=this,i;return"string"==typeof e&&(e=r.get(e)),e?(n=n||this,e.nodeType||!e.length&&0!==e.length?t.call(n,e):(i=[],m(e,function(e,o){e&&("string"==typeof e&&(e=r.get(e)),i.push(t.call(n,e,o)))}),i)):!1},getAttribs:function(e){var t;if(e=this.get(e),!e)return[];if(b){if(t=[],"OBJECT"==e.nodeName)return e.attributes;"OPTION"===e.nodeName&&this.getAttrib(e,"selected")&&t.push({specified:1,nodeName:"selected"});var n=/<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi;return e.cloneNode(!1).outerHTML.replace(n,"").replace(/[\w:\-]+/gi,function(e){t.push({specified:1,nodeName:e})}),t}return e.attributes},isEmpty:function(e,t){var n=this,r,i,a,s,l,c=0;if(e=e.firstChild){s=new o(e,e.parentNode),t=t||(n.schema?n.schema.getNonEmptyElements():null);do{if(a=e.nodeType,1===a){if(e.getAttribute("data-mce-bogus"))continue;if(l=e.nodeName.toLowerCase(),t&&t[l]){if("br"===l){c++;continue}return!1}for(i=n.getAttribs(e),r=i.length;r--;)if(l=i[r].nodeName,"name"===l||"data-mce-bookmark"===l)return!1}if(8==a)return!1;if(3===a&&!x.test(e.nodeValue))return!1}while(e=s.next())}return 1>=c},createRng:function(){var e=this.doc;return e.createRange?e.createRange():new a(this)},nodeIndex:h,split:function(e,t,n){function r(e){function t(e){var t=e.previousSibling&&"SPAN"==e.previousSibling.nodeName,n=e.nextSibling&&"SPAN"==e.nextSibling.nodeName;return t&&n}var n,o=e.childNodes,a=e.nodeType;if(1!=a||"bookmark"!=e.getAttribute("data-mce-type")){for(n=o.length-1;n>=0;n--)r(o[n]);if(9!=a){if(3==a&&e.nodeValue.length>0){var s=y(e.nodeValue).length;if(!i.isBlock(e.parentNode)||s>0||0===s&&t(e))return}else if(1==a&&(o=e.childNodes,1==o.length&&o[0]&&1==o[0].nodeType&&"bookmark"==o[0].getAttribute("data-mce-type")&&e.parentNode.insertBefore(o[0],e),o.length||/^(br|hr|input|img)$/i.test(e.nodeName)))return;i.remove(e)}return e}}var i=this,o=i.createRng(),a,s,l;return e&&t?(o.setStart(e.parentNode,i.nodeIndex(e)),o.setEnd(t.parentNode,i.nodeIndex(t)),a=o.extractContents(),o=i.createRng(),o.setStart(t.parentNode,i.nodeIndex(t)+1),o.setEnd(e.parentNode,i.nodeIndex(e)+1),s=o.extractContents(),l=e.parentNode,l.insertBefore(r(a),e),n?l.insertBefore(n,e):l.insertBefore(t,e),l.insertBefore(r(s),e),i.remove(e),n||t):void 0},bind:function(e,t,n,r){var i=this;if(c.isArray(e)){for(var o=e.length;o--;)e[o]=i.bind(e[o],t,n,r);return e}return!i.settings.collect||e!==i.doc&&e!==i.win||i.boundEvents.push([e,t,n,r]),i.events.bind(e,t,n,r||i)},unbind:function(e,t,n){var r=this,i;if(c.isArray(e)){for(i=e.length;i--;)e[i]=r.unbind(e[i],t,n);return e}if(r.boundEvents&&(e===r.doc||e===r.win))for(i=r.boundEvents.length;i--;){var o=r.boundEvents[i];e!=o[0]||t&&t!=o[1]||n&&n!=o[2]||this.events.unbind(o[0],o[1],o[2])}return this.events.unbind(e,t,n)},fire:function(e,t,n){return this.events.fire(e,t,n)},getContentEditable:function(e){var t;return e&&1==e.nodeType?(t=e.getAttribute("data-mce-contenteditable"),t&&"inherit"!==t?t:"inherit"!==e.contentEditable?e.contentEditable:null):null},getContentEditableParent:function(e){for(var t=this.getRoot(),n=null;e&&e!==t&&(n=this.getContentEditable(e),null===n);e=e.parentNode);return n},destroy:function(){var t=this;if(t.boundEvents){for(var n=t.boundEvents.length;n--;){var r=t.boundEvents[n];this.events.unbind(r[0],r[1],r[2])}t.boundEvents=null}e.setDocument&&e.setDocument(),t.win=t.doc=t.root=t.events=t.frag=null},isChildOf:function(e,t){for(;e;){if(t===e)return!0;e=e.parentNode}return!1},dumpRng:function(e){return"startContainer: "+e.startContainer.nodeName+", startOffset: "+e.startOffset+", endContainer: "+e.endContainer.nodeName+", endOffset: "+e.endOffset},_findSib:function(e,t,n){var r=this,i=t;if(e)for("string"==typeof i&&(i=function(e){return r.is(e,t)}),e=e[n];e;e=e[n])if(i(e))return e;return null}},p.DOM=new p(document),p.nodeIndex=h,p}),r(N,[w,m],function(e,t){function n(){function e(e,n){function i(){a.remove(l),s&&(s.onreadystatechange=s.onload=s=null),n()}function o(){"undefined"!=typeof console&&console.log&&console.log("Failed to load: "+e)}var a=r,s,l;l=a.uniqueId(),s=document.createElement("script"),s.id=l,s.type="text/javascript",s.src=t._addCacheSuffix(e),"onreadystatechange"in s?s.onreadystatechange=function(){/loaded|complete/.test(s.readyState)&&i()}:s.onload=i,s.onerror=o,(document.getElementsByTagName("head")[0]||document.body).appendChild(s)}var n=0,a=1,s=2,l={},c=[],u={},d=[],f=0,h;this.isDone=function(e){return l[e]==s},this.markDone=function(e){l[e]=s},this.add=this.load=function(e,t,r){var i=l[e];i==h&&(c.push(e),l[e]=n),t&&(u[e]||(u[e]=[]),u[e].push({func:t,scope:r||this}))},this.loadQueue=function(e,t){this.loadScripts(c,e,t)},this.loadScripts=function(t,n,r){function c(e){i(u[e],function(e){e.func.call(e.scope)}),u[e]=h}var p;d.push({func:n,scope:r||this}),(p=function(){var n=o(t);t.length=0,i(n,function(t){return l[t]==s?void c(t):void(l[t]!=a&&(l[t]=a,f++,e(t,function(){l[t]=s,f--,c(t),p()})))}),f||(i(d,function(e){e.func.call(e.scope)}),d.length=0)})()}}var r=e.DOM,i=t.each,o=t.grep;return n.ScriptLoader=new n,n}),r(E,[N,m],function(e,n){function r(){var e=this;e.items=[],e.urls={},e.lookup={}}var i=n.each;return r.prototype={get:function(e){return this.lookup[e]?this.lookup[e].instance:t},dependencies:function(e){var t;return this.lookup[e]&&(t=this.lookup[e].dependencies),t||[]},requireLangPack:function(t,n){var i=r.language;if(i&&r.languageLoad!==!1){if(n)if(n=","+n+",",-1!=n.indexOf(","+i.substr(0,2)+","))i=i.substr(0,2);else if(-1==n.indexOf(","+i+","))return;e.ScriptLoader.add(this.urls[t]+"/langs/"+i+".js")}},add:function(e,t,n){return this.items.push(t),this.lookup[e]={instance:t,dependencies:n},t},createUrl:function(e,t){return"object"==typeof t?t:{prefix:e.prefix,resource:t,suffix:e.suffix}},addComponents:function(t,n){var r=this.urls[t];i(n,function(t){e.ScriptLoader.add(r+"/"+t)})},load:function(n,o,a,s){function l(){var r=c.dependencies(n);i(r,function(e){var n=c.createUrl(o,e);c.load(n.resource,n,t,t)}),a&&(s?a.call(s):a.call(e))}var c=this,u=o;c.urls[n]||("object"==typeof o&&(u=o.prefix+o.resource+o.suffix),0!==u.indexOf("/")&&-1==u.indexOf("://")&&(u=r.baseURL+"/"+u),c.urls[n]=u.substring(0,u.lastIndexOf("/")),c.lookup[n]?l():e.ScriptLoader.add(u,l,s))}},r.PluginManager=new r,r.ThemeManager=new r,r}),r(_,[],function(){function e(e){return function(t){return!!t&&t.nodeType==e}}function t(e){return e=e.toLowerCase().split(" "),function(t){var n,r;if(t&&t.nodeType)for(r=t.nodeName.toLowerCase(),n=0;nn.length-1?t=n.length-1:0>t&&(t=0),n[t]||e}function o(e){this.walk=function(t,n){function r(e){var t;return t=e[0],3===t.nodeType&&t===c&&u>=t.nodeValue.length&&e.splice(0,1),t=e[e.length-1],0===f&&e.length>0&&t===d&&3===t.nodeType&&e.splice(e.length-1,1),e}function o(e,t,n){for(var r=[];e&&e!=n;e=e[t])r.push(e);return r}function a(e,t){do{if(e.parentNode==t)return e;e=e.parentNode}while(e)}function l(e,t,i){var a=i?"nextSibling":"previousSibling";for(g=e,v=g.parentNode;g&&g!=t;g=v)v=g.parentNode,y=o(g==e?g:g[a],a),y.length&&(i||y.reverse(),n(r(y)))}var c=t.startContainer,u=t.startOffset,d=t.endContainer,f=t.endOffset,h,p,m,g,v,y,b;if(b=e.select("td.mce-item-selected,th.mce-item-selected"),b.length>0)return void s(b,function(e){n([e])});if(1==c.nodeType&&c.hasChildNodes()&&(c=c.childNodes[u]),1==d.nodeType&&d.hasChildNodes()&&(d=i(d,f)),c==d)return n(r([c]));for(h=e.findCommonAncestor(c,d),g=c;g;g=g.parentNode){if(g===d)return l(c,h,!0);if(g===h)break}for(g=d;g;g=g.parentNode){if(g===c)return l(d,h);if(g===h)break}p=a(c,h)||c,m=a(d,h)||d,l(c,p,!0),y=o(p==c?p:p.nextSibling,"nextSibling",m==d?m.nextSibling:m),y.length&&n(r(y)),l(d,m)},this.split=function(e){function t(e,t){return e.splitText(t)}var n=e.startContainer,r=e.startOffset,i=e.endContainer,o=e.endOffset;return n==i&&3==n.nodeType?r>0&&rr?(o-=r,n=i=t(i,o).previousSibling,o=i.nodeValue.length,r=0):o=0):(3==n.nodeType&&r>0&&r0&&o0)return h=v,p=n?v.nodeValue.length:0,void(i=!0);if(e.isBlock(v)||y[v.nodeName.toLowerCase()])return;s=v}o&&s&&(h=s,i=!0,p=0)}var h,p,m,g=e.getRoot(),v,y,b,C;if(h=n[(r?"start":"end")+"Container"],p=n[(r?"start":"end")+"Offset"],C=1==h.nodeType&&p===h.childNodes.length,y=e.schema.getNonEmptyElements(),b=r,!c(h)){if(1==h.nodeType&&p>h.childNodes.length-1&&(b=!1),9===h.nodeType&&(h=e.getRoot(),p=0),h===g){if(b&&(v=h.childNodes[p>0?p-1:0])){if(c(v))return;if(y[v.nodeName]||"TABLE"==v.nodeName)return}if(h.hasChildNodes()){if(p=Math.min(!b&&p>0?p-1:p,h.childNodes.length-1),h=h.childNodes[p],p=0,u(h)||c(h))return;if(h.hasChildNodes()&&!/TABLE/.test(h.nodeName)){v=h,m=new t(h,g);do{if(l(v)||c(v)){i=!1;break}if(3===v.nodeType&&v.nodeValue.length>0){p=b?0:v.nodeValue.length,h=v,i=!0;break}if(y[v.nodeName.toLowerCase()]&&!a(v)){p=e.nodeIndex(v),h=v.parentNode,"IMG"!=v.nodeName||b||p++,i=!0;break}}while(v=b?m.next():m.prev())}}}o&&(3===h.nodeType&&0===p&&f(!0),1===h.nodeType&&(v=h.childNodes[p],v||(v=h.childNodes[p-1]),!v||"BR"!==v.nodeName||d(v,"A")||s(v)||s(v,!0)||f(!0,v))),b&&!o&&3===h.nodeType&&p===h.nodeValue.length&&f(!1),i&&n["set"+(r?"Start":"End")](h,p)}}var i,o;return o=n.collapsed,r(!0),o||r(),i&&o&&n.collapse(!0),i}}function a(t,n,r){var i,o,a;if(i=r.elementFromPoint(t,n),o=r.body.createTextRange(),"HTML"==i.tagName&&(i=r.body),o.moveToElementText(i),a=e.toArray(o.getClientRects()),a=a.sort(function(e,t){return e=Math.abs(Math.max(e.top-n,e.bottom-n)),t=Math.abs(Math.max(t.top-n,t.bottom-n)),e-t}),a.length>0){n=(a[0].bottom+a[0].top)/2;try{return o.moveToPoint(t,n),o.collapse(!0),o}catch(s){}}return null}var s=e.each,l=n.isContentEditableFalse,c=r.isCaretContainer;return o.compareRanges=function(e,t){if(e&&t){if(!e.item&&!e.duplicate)return e.startContainer==t.startContainer&&e.startOffset==t.startOffset;if(e.item&&t.item&&e.item(0)===t.item(0))return!0;if(e.isEqual&&t.isEqual&&t.isEqual(e))return!0}return!1},o.getCaretRangeFromPoint=function(e,t,n){var r,i;if(n.caretPositionFromPoint)i=n.caretPositionFromPoint(e,t),r=n.createRange(),r.setStart(i.offsetNode,i.offset),r.collapse(!0);else if(n.caretRangeFromPoint)r=n.caretRangeFromPoint(e,t);else if(n.body.createTextRange){r=n.body.createTextRange();try{r.moveToPoint(e,t),r.collapse(!0)}catch(o){r=a(e,t,n)}}return r},o.getSelectedNode=function(e){var t=e.startContainer,n=e.startOffset;return t.hasChildNodes()&&e.endOffset==n+1?t.childNodes[n]:null},o.getNode=function(e,t){return 1==e.nodeType&&e.hasChildNodes()&&(t>=e.childNodes.length&&(t=e.childNodes.length-1),e=e.childNodes[t]),e},o}),r(R,[T,h,u],function(e,t,n){return function(r){function i(e){var t,n;if(n=r.$(e).parentsUntil(r.getBody()).add(e),n.length===a.length){for(t=n.length;t>=0&&n[t]===a[t];t--);if(-1===t)return a=n,!0}return a=n,!1}var o,a=[];"onselectionchange"in r.getDoc()||r.on("NodeChange Click MouseUp KeyUp Focus",function(t){var n,i;n=r.selection.getRng(),i={startContainer:n.startContainer,startOffset:n.startOffset,endContainer:n.endContainer,endOffset:n.endOffset},"nodechange"!=t.type&&e.compareRanges(i,o)||r.fire("SelectionChange"),o=i}),r.on("contextmenu",function(){r.fire("SelectionChange")}),r.on("SelectionChange",function(){var e=r.selection.getStart(!0);(t.range||!r.selection.isCollapsed())&&!i(e)&&r.dom.isChildOf(e,r.getBody())&&r.nodeChanged({selectionChange:!0})}),r.on("MouseUp",function(e){e.isDefaultPrevented()||("IMG"==r.selection.getNode().nodeName?n.setEditorTimeout(r,function(){r.nodeChanged()}):r.nodeChanged())}),this.nodeChanged=function(e){var t=r.selection,n,i,o;r.initialized&&t&&!r.settings.disable_nodechange&&!r.readonly&&(o=r.getBody(),n=t.getStart()||o,n=n.ownerDocument!=r.getDoc()?r.getBody():n,"IMG"==n.nodeName&&t.isCollapsed()&&(n=n.parentNode),i=[],r.dom.getParent(n,function(e){return e===o?!0:void i.push(e)}),e=e||{},e.element=n,e.parents=i,r.fire("NodeChange",e))}}}),r(A,[],function(){function e(e,t,n){var r,i,o=n?"lastChild":"firstChild",a=n?"prev":"next";if(e[o])return e[o];if(e!==t){if(r=e[a])return r;for(i=e.parent;i&&i!==t;i=i.parent)if(r=i[a])return r}}function t(e,t){this.name=e,this.type=t,1===t&&(this.attributes=[],this.attributes.map={})}var n=/^[ \t\r\n]*$/,r={"#text":3,"#comment":8,"#cdata":4,"#pi":7,"#doctype":10,"#document-fragment":11};return t.prototype={replace:function(e){var t=this;return e.parent&&e.remove(),t.insert(e,t),t.remove(),t},attr:function(e,t){var n=this,r,i,o;if("string"!=typeof e){for(i in e)n.attr(i,e[i]);return n}if(r=n.attributes){if(t!==o){if(null===t){if(e in r.map)for(delete r.map[e],i=r.length;i--;)if(r[i].name===e)return r=r.splice(i,1),n;return n}if(e in r.map){for(i=r.length;i--;)if(r[i].name===e){r[i].value=t;break}}else r.push({name:e,value:t});return r.map[e]=t,n}return r.map[e]}},clone:function(){var e=this,n=new t(e.name,e.type),r,i,o,a,s;if(o=e.attributes){for(s=[],s.map={},r=0,i=o.length;i>r;r++)a=o[r],"id"!==a.name&&(s[s.length]={name:a.name,value:a.value},s.map[a.name]=a.value);n.attributes=s}return n.value=e.value,n.shortEnded=e.shortEnded,n},wrap:function(e){var t=this;return t.parent.insert(e,t),e.append(t),t},unwrap:function(){var e=this,t,n;for(t=e.firstChild;t;)n=t.next,e.insert(t,e,!0),t=n;e.remove()},remove:function(){var e=this,t=e.parent,n=e.next,r=e.prev;return t&&(t.firstChild===e?(t.firstChild=n,n&&(n.prev=null)):r.next=n,t.lastChild===e?(t.lastChild=r,r&&(r.next=null)):n.prev=r,e.parent=e.next=e.prev=null),e},append:function(e){var t=this,n;return e.parent&&e.remove(),n=t.lastChild,n?(n.next=e,e.prev=n,t.lastChild=e):t.lastChild=t.firstChild=e,e.parent=t,e},insert:function(e,t,n){var r;return e.parent&&e.remove(),r=t.parent||this,n?(t===r.firstChild?r.firstChild=e:t.prev.next=e,e.prev=t.prev,e.next=t,t.prev=e):(t===r.lastChild?r.lastChild=e:t.next.prev=e,e.next=t.next,e.prev=t,t.next=e),e.parent=r,e},getAll:function(t){var n=this,r,i=[];for(r=n.firstChild;r;r=e(r,n))r.name===t&&i.push(r);return i},empty:function(){var t=this,n,r,i;if(t.firstChild){for(n=[],i=t.firstChild;i;i=e(i,t))n.push(i);for(r=n.length;r--;)i=n[r],i.parent=i.firstChild=i.lastChild=i.next=i.prev=null}return t.firstChild=t.lastChild=null,t},isEmpty:function(t){var r=this,i=r.firstChild,o,a;if(i)do{if(1===i.type){if(i.attributes.map["data-mce-bogus"])continue;if(t[i.name])return!1;for(o=i.attributes.length;o--;)if(a=i.attributes[o].name,"name"===a||0===a.indexOf("data-mce-bookmark"))return!1}if(8===i.type)return!1;if(3===i.type&&!n.test(i.value))return!1}while(i=e(i,r));return!0},walk:function(t){return e(this,null,t)}},t.create=function(e,n){var i,o;if(i=new t(e,r[e]||1),n)for(o in n)i.attr(o,n[o]);return i},t}),r(B,[m],function(e){function t(e,t){return e?e.split(t||" "):[]}function n(e){function n(e,n,r){function i(e,t){var n={},r,i;for(r=0,i=e.length;i>r;r++)n[e[r]]=t||{};return n}var s,c,u,d=arguments;for(r=r||[],n=n||"","string"==typeof r&&(r=t(r)),c=3;co;o++)i.attributes[n[o]]={},i.attributesOrder.push(n[o])}var a={},l,c,u,d,f,h;return i[e]?i[e]:(l=t("id accesskey class dir lang style tabindex title"),c=t("address blockquote div dl fieldset form h1 h2 h3 h4 h5 h6 hr menu ol p pre table ul"),u=t("a abbr b bdo br button cite code del dfn em embed i iframe img input ins kbd label map noscript object q s samp script select small span strong sub sup textarea u var #text #comment"),"html4"!=e&&(l.push.apply(l,t("contenteditable contextmenu draggable dropzone hidden spellcheck translate")),c.push.apply(c,t("article aside details dialog figure header footer hgroup section nav")),u.push.apply(u,t("audio canvas command datalist mark meter output picture progress time wbr video ruby bdi keygen"))),"html5-strict"!=e&&(l.push("xml:lang"),h=t("acronym applet basefont big font strike tt"),u.push.apply(u,h),s(h,function(e){n(e,"",u)}),f=t("center dir isindex noframes"),c.push.apply(c,f),d=[].concat(c,u),s(f,function(e){n(e,"",d)})),d=d||[].concat(c,u),n("html","manifest","head body"),n("head","","base command link meta noscript script style title"),n("title hr noscript br"),n("base","href target"),n("link","href rel media hreflang type sizes hreflang"),n("meta","name http-equiv content charset"),n("style","media type scoped"),n("script","src async defer type charset"),n("body","onafterprint onbeforeprint onbeforeunload onblur onerror onfocus onhashchange onload onmessage onoffline ononline onpagehide onpageshow onpopstate onresize onscroll onstorage onunload",d),n("address dt dd div caption","",d),n("h1 h2 h3 h4 h5 h6 pre p abbr code var samp kbd sub sup i b u bdo span legend em strong small s cite dfn","",u),n("blockquote","cite",d),n("ol","reversed start type","li"),n("ul","","li"),n("li","value",d),n("dl","","dt dd"),n("a","href target rel media hreflang type",u),n("q","cite",u),n("ins del","cite datetime",d),n("img","src sizes srcset alt usemap ismap width height"),n("iframe","src name width height",d),n("embed","src type width height"),n("object","data type typemustmatch name usemap form width height",d,"param"),n("param","name value"),n("map","name",d,"area"),n("area","alt coords shape href target rel media hreflang type"),n("table","border","caption colgroup thead tfoot tbody tr"+("html4"==e?" col":"")),n("colgroup","span","col"),n("col","span"),n("tbody thead tfoot","","tr"),n("tr","","td th"),n("td","colspan rowspan headers",d),n("th","colspan rowspan headers scope abbr",d),n("form","accept-charset action autocomplete enctype method name novalidate target",d),n("fieldset","disabled form name",d,"legend"),n("label","form for",u),n("input","accept alt autocomplete checked dirname disabled form formaction formenctype formmethod formnovalidate formtarget height list max maxlength min multiple name pattern readonly required size src step type value width"),n("button","disabled form formaction formenctype formmethod formnovalidate formtarget name type value","html4"==e?d:u),n("select","disabled form multiple name required size","option optgroup"),n("optgroup","disabled label","option"),n("option","disabled label selected value"),n("textarea","cols dirname disabled form maxlength name readonly required rows wrap"),n("menu","type label",d,"li"),n("noscript","",d),"html4"!=e&&(n("wbr"),n("ruby","",u,"rt rp"),n("figcaption","",d),n("mark rt rp summary bdi","",u),n("canvas","width height",d),n("video","src crossorigin poster preload autoplay mediagroup loop muted controls width height buffered",d,"track source"),n("audio","src crossorigin preload autoplay mediagroup loop muted controls buffered volume",d,"track source"),n("picture","","img source"),n("source","src srcset type media sizes"),n("track","kind src srclang label default"),n("datalist","",u,"option"),n("article section nav aside header footer","",d),n("hgroup","","h1 h2 h3 h4 h5 h6"),n("figure","",d,"figcaption"),n("time","datetime",u),n("dialog","open",d),n("command","type label icon disabled checked radiogroup command"),n("output","for form name",u),n("progress","value max",u),n("meter","value min max low high optimum",u),n("details","open",d,"summary"),n("keygen","autofocus challenge disabled form keytype name")),"html5-strict"!=e&&(r("script","language xml:space"),r("style","xml:space"),r("object","declare classid code codebase codetype archive standby align border hspace vspace"),r("embed","align name hspace vspace"),r("param","valuetype type"),r("a","charset name rev shape coords"),r("br","clear"),r("applet","codebase archive code object alt name width height align hspace vspace"),r("img","name longdesc align border hspace vspace"),r("iframe","longdesc frameborder marginwidth marginheight scrolling align"),r("font basefont","size color face"),r("input","usemap align"),r("select","onchange"),r("textarea"),r("h1 h2 h3 h4 h5 h6 div p legend caption","align"),r("ul","type compact"),r("li","type"),r("ol dl menu dir","compact"),r("pre","width xml:space"),r("hr","align noshade size width"),r("isindex","prompt"),r("table","summary width frame rules cellspacing cellpadding align bgcolor"),r("col","width align char charoff valign"),r("colgroup","width align char charoff valign"),r("thead","align char charoff valign"),r("tr","align char charoff valign bgcolor"),r("th","axis align char charoff valign nowrap bgcolor width height"),r("form","accept"),r("td","abbr axis scope align char charoff valign nowrap bgcolor width height"),r("tfoot","align char charoff valign"),r("tbody","align char charoff valign"),r("area","nohref"),r("body","background bgcolor text link vlink alink")),"html4"!=e&&(r("input button select textarea","autofocus"),r("input textarea","placeholder"),r("a","download"),r("link script img","crossorigin"),r("iframe","sandbox seamless allowfullscreen")),s(t("a form meter progress dfn"),function(e){a[e]&&delete a[e].children[e]}),delete a.caption.children.table,delete a.script,i[e]=a,a)}function r(e,t){var n;return e&&(n={},"string"==typeof e&&(e={"*":e}),s(e,function(e,r){n[r]=n[r.toUpperCase()]="map"==t?a(e,/[, ]/):c(e,/[, ]/)})),n}var i={},o={},a=e.makeMap,s=e.each,l=e.extend,c=e.explode,u=e.inArray;return function(e){function o(t,n,r){var o=e[t];return o?o=a(o,/[, ]/,a(o.toUpperCase(),/[, ]/)):(o=i[t],o||(o=a(n," ",a(n.toUpperCase()," ")),o=l(o,r),i[t]=o)),o}function d(e){return new RegExp("^"+e.replace(/([?+*])/g,".$1")+"$")}function f(e){var n,r,i,o,s,l,c,f,h,p,m,g,v,b,x,w,N,E,_,S=/^([#+\-])?([^\[!\/]+)(?:\/([^\[!]+))?(?:(!?)\[([^\]]+)\])?$/,k=/^([!\-])?(\w+::\w+|[^=:<]+)?(?:([=:<])(.*))?$/,T=/[*?+]/;if(e)for(e=t(e,","),y["@"]&&(w=y["@"].attributes,N=y["@"].attributesOrder),n=0,r=e.length;r>n;n++)if(s=S.exec(e[n])){if(b=s[1],h=s[2],x=s[3],f=s[5],g={},v=[],l={attributes:g,attributesOrder:v},"#"===b&&(l.paddEmpty=!0),"-"===b&&(l.removeEmpty=!0),"!"===s[4]&&(l.removeEmptyAttrs=!0),w){for(E in w)g[E]=w[E];v.push.apply(v,N)}if(f)for(f=t(f,"|"),i=0,o=f.length;o>i;i++)if(s=k.exec(f[i])){if(c={},m=s[1],p=s[2].replace(/::/g,":"),b=s[3],_=s[4],"!"===m&&(l.attributesRequired=l.attributesRequired||[],l.attributesRequired.push(p),c.required=!0),"-"===m){delete g[p],v.splice(u(v,p),1);continue}b&&("="===b&&(l.attributesDefault=l.attributesDefault||[],l.attributesDefault.push({name:p,value:_}),c.defaultValue=_),":"===b&&(l.attributesForced=l.attributesForced||[],l.attributesForced.push({name:p,value:_}),c.forcedValue=_),"<"===b&&(c.validValues=a(_,"?"))),T.test(p)?(l.attributePatterns=l.attributePatterns||[],c.pattern=d(p),l.attributePatterns.push(c)):(g[p]||v.push(p),g[p]=c)}w||"@"!=h||(w=g,N=v),x&&(l.outputName=h,y[x]=l),T.test(h)?(l.pattern=d(h),C.push(l)):y[h]=l}}function h(e){y={},C=[],f(e),s(N,function(e,t){b[t]=e.children})}function p(e){var n=/^(~)?(.+)$/;e&&(i.text_block_elements=i.block_elements=null,s(t(e,","),function(e){var t=n.exec(e),r="~"===t[1],i=r?"span":"div",o=t[2];if(b[o]=b[i],L[o]=i,r||(R[o.toUpperCase()]={},R[o]={}),!y[o]){var a=y[i];a=l({},a),delete a.removeEmptyAttrs,delete a.removeEmpty,y[o]=a}s(b,function(e,t){e[i]&&(b[t]=e=l({},b[t]),e[o]=e[i])})}))}function m(n){var r=/^([+\-]?)(\w+)\[([^\]]+)\]$/;i[e.schema]=null,n&&s(t(n,","),function(e){var n=r.exec(e),i,o;n&&(o=n[1],i=o?b[n[2]]:b[n[2]]={"#comment":{}},i=b[n[2]],s(t(n[3],"|"),function(e){"-"===o?delete i[e]:i[e]={}}))})}function g(e){var t=y[e],n;if(t)return t;for(n=C.length;n--;)if(t=C[n],t.pattern.test(e))return t}var v=this,y={},b={},C=[],x,w,N,E,_,S,k,T,R,A,B,D,M,L={},P={};e=e||{},N=n(e.schema),e.verify_html===!1&&(e.valid_elements="*[*]"),x=r(e.valid_styles),w=r(e.invalid_styles,"map"),T=r(e.valid_classes,"map"),E=o("whitespace_elements","pre script noscript style textarea video audio iframe object"),_=o("self_closing_elements","colgroup dd dt li option p td tfoot th thead tr"),S=o("short_ended_elements","area base basefont br col frame hr img input isindex link meta param embed source wbr track"), +k=o("boolean_attributes","checked compact declare defer disabled ismap multiple nohref noresize noshade nowrap readonly selected autoplay loop controls"),A=o("non_empty_elements","td th iframe video audio object script",S),B=o("move_caret_before_on_enter_elements","table",A),D=o("text_block_elements","h1 h2 h3 h4 h5 h6 p div address pre form blockquote center dir fieldset header footer article section hgroup aside nav figure"),R=o("block_elements","hr table tbody thead tfoot th tr td li ol ul caption dl dt dd noscript menu isindex option datalist select optgroup figcaption",D),M=o("text_inline_elements","span strong b em i font strike u var cite dfn code mark q sup sub samp"),s((e.special||"script noscript style textarea").split(" "),function(e){P[e]=new RegExp("]*>","gi")}),e.valid_elements?h(e.valid_elements):(s(N,function(e,t){y[t]={attributes:e.attributes,attributesOrder:e.attributesOrder},b[t]=e.children}),"html5"!=e.schema&&s(t("strong/b em/i"),function(e){e=t(e,"/"),y[e[1]].outputName=e[0]}),y.img.attributesDefault=[{name:"alt",value:""}],s(t("ol ul sub sup blockquote span font a table tbody tr strong em b i"),function(e){y[e]&&(y[e].removeEmpty=!0)}),s(t("p h1 h2 h3 h4 h5 h6 th td pre div address caption"),function(e){y[e].paddEmpty=!0}),s(t("span"),function(e){y[e].removeEmptyAttrs=!0})),p(e.custom_elements),m(e.valid_children),f(e.extended_valid_elements),m("+ol[ul|ol],+ul[ul|ol]"),e.invalid_elements&&s(c(e.invalid_elements),function(e){y[e]&&delete y[e]}),g("span")||f("span[!data-mce-type|*]"),v.children=b,v.getValidStyles=function(){return x},v.getInvalidStyles=function(){return w},v.getValidClasses=function(){return T},v.getBoolAttrs=function(){return k},v.getBlockElements=function(){return R},v.getTextBlockElements=function(){return D},v.getTextInlineElements=function(){return M},v.getShortEndedElements=function(){return S},v.getSelfClosingElements=function(){return _},v.getNonEmptyElements=function(){return A},v.getMoveCaretBeforeOnEnterElements=function(){return B},v.getWhiteSpaceElements=function(){return E},v.getSpecialElements=function(){return P},v.isValidChild=function(e,t){var n=b[e];return!(!n||!n[t])},v.isValid=function(e,t){var n,r,i=g(e);if(i){if(!t)return!0;if(i.attributes[t])return!0;if(n=i.attributePatterns)for(r=n.length;r--;)if(n[r].pattern.test(e))return!0}return!1},v.getElementRule=g,v.getCustomElements=function(){return L},v.addValidElements=f,v.setValidElements=h,v.addCustomElements=p,v.addValidChildren=m,v.elements=y}}),r(D,[B,C,m],function(e,t,n){function r(e,t,n){var r=1,i,o,a,s;for(s=e.getShortEndedElements(),a=/<([!?\/])?([A-Za-z0-9\-_\:\.]+)((?:\s+[^"\'>]+(?:(?:"[^"]*")|(?:\'[^\']*\')|[^>]*))*|\/|\s+)>/g,a.lastIndex=i=n;o=a.exec(t);){if(i=a.lastIndex,"/"===o[1])r--;else if(!o[1]){if(o[2]in s)continue;r++}if(0===r)break}return i}function i(i,a){function s(){}var l=this;i=i||{},l.schema=a=a||new e,i.fix_self_closing!==!1&&(i.fix_self_closing=!0),o("comment cdata text start end pi doctype".split(" "),function(e){e&&(l[e]=i[e]||s)}),l.parse=function(e){function o(e){var t,n;for(t=h.length;t--&&h[t].name!==e;);if(t>=0){for(n=h.length-1;n>=t;n--)e=h[n],e.valid&&l.end(e.name);h.length=t}}function s(e,t,n,r,o){var a,s,l=/[\s\u0000-\u001F]+/g;if(t=t.toLowerCase(),n=t in x?t:z(n||r||o||""),N&&!y&&0!==t.indexOf("data-")){if(a=T[t],!a&&R){for(s=R.length;s--&&(a=R[s],!a.pattern.test(t)););-1===s&&(a=null)}if(!a)return;if(a.validValues&&!(n in a.validValues))return}if(V[t]&&!i.allow_script_urls){var c=n.replace(l,"");try{c=decodeURIComponent(c)}catch(u){c=unescape(c)}if(U.test(c))return;if(!i.allow_html_data_urls&&$.test(c)&&!/^data:image\//i.test(c))return}p.map[t]=n,p.push({name:t,value:n})}var l=this,c,u=0,d,f,h=[],p,m,g,v,y,b,C,x,w,N,E,_,S,k,T,R,A,B,D,M,L,P,H,O,I,F=0,z=t.decode,W,V=n.makeMap("src,href,data,background,formaction,poster"),U=/((java|vb)script|mhtml):/i,$=/^data:/i;for(P=new RegExp("<(?:(?:!--([\\w\\W]*?)-->)|(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|(?:!DOCTYPE([\\w\\W]*?)>)|(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|(?:\\/([^>]+)>)|(?:([A-Za-z0-9\\-_\\:\\.]+)((?:\\s+[^\"'>]+(?:(?:\"[^\"]*\")|(?:'[^']*')|[^>]*))*|\\/|\\s+)>))","g"),H=/([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:[^\"])*)\")|(?:\'((?:[^\'])*)\')|([^>\s]+)))?/g,C=a.getShortEndedElements(),L=i.self_closing_elements||a.getSelfClosingElements(),x=a.getBoolAttrs(),N=i.validate,b=i.remove_internals,W=i.fix_self_closing,O=a.getSpecialElements();c=P.exec(e);){if(u0&&h[h.length-1].name===d&&o(d),!N||(E=a.getElementRule(d))){if(_=!0,N&&(T=E.attributes,R=E.attributePatterns),(k=c[8])?(y=-1!==k.indexOf("data-mce-type"),y&&b&&(_=!1),p=[],p.map={},k.replace(H,s)):(p=[],p.map={}),N&&!y){if(A=E.attributesRequired,B=E.attributesDefault,D=E.attributesForced,M=E.removeEmptyAttrs,M&&!p.length&&(_=!1),D)for(m=D.length;m--;)S=D[m],v=S.name,I=S.value,"{$uid}"===I&&(I="mce_"+F++),p.map[v]=I,p.push({name:v,value:I});if(B)for(m=B.length;m--;)S=B[m],v=S.name,v in p.map||(I=S.value,"{$uid}"===I&&(I="mce_"+F++),p.map[v]=I,p.push({name:v,value:I}));if(A){for(m=A.length;m--&&!(A[m]in p.map););-1===m&&(_=!1)}if(S=p.map["data-mce-bogus"]){if("all"===S){u=r(a,e,P.lastIndex),P.lastIndex=u;continue}_=!1}}_&&l.start(d,p,w)}else _=!1;if(f=O[d]){f.lastIndex=u=c.index+c[0].length,(c=f.exec(e))?(_&&(g=e.substr(u,c.index-u)),u=c.index+c[0].length):(g=e.substr(u),u=e.length),_&&(g.length>0&&l.text(g,!0),l.end(d)),P.lastIndex=u;continue}w||(k&&k.indexOf("/")==k.length-1?_&&l.end(d):h.push({name:d,valid:_}))}else(d=c[1])?(">"===d.charAt(0)&&(d=" "+d),i.allow_conditional_comments||"[if"!==d.substr(0,3)||(d=" "+d),l.comment(d)):(d=c[2])?l.cdata(d):(d=c[3])?l.doctype(d):(d=c[4])&&l.pi(d,c[5]);u=c.index+c[0].length}for(u=0;m--)d=h[m],d.valid&&l.end(d.name)}}var o=n.each;return i.findEndTag=r,i}),r(M,[A,B,D,m],function(e,t,n,r){var i=r.makeMap,o=r.each,a=r.explode,s=r.extend;return function(r,l){function c(t){var n,r,o,a,s,c,d,f,h,p,m,g,v,y,b;for(m=i("tr,td,th,tbody,thead,tfoot,table"),p=l.getNonEmptyElements(),g=l.getTextBlockElements(),v=l.getSpecialElements(),n=0;n1){for(a.reverse(),s=c=u.filterNode(a[0].clone()),h=0;h0)return void(t.value=r);if(n=t.next){if(3==n.type&&n.value.length){t=t.prev;continue}if(!o[n.name]&&"script"!=n.name&&"style"!=n.name){t=t.prev;continue}}i=t.prev,t.remove(),t=i}}function g(e){var t,n={};for(t in e)"li"!==t&&"p"!=t&&(n[t]=e[t]);return n}var v,y,b,C,x,w,N,E,_,S,k,T,R,A=[],B,D,M,L,P,H,O,I;if(o=o||{},h={},p={},T=s(i("script,style,head,html,body,title,meta,param"),l.getBlockElements()),O=l.getNonEmptyElements(),H=l.children,k=r.validate,I="forced_root_block"in o?o.forced_root_block:r.forced_root_block,P=l.getWhiteSpaceElements(),R=/^[ \t\r\n]+/,D=/[ \t\r\n]+$/,M=/[ \t\r\n]+/g,L=/^[ \t\r\n]+$/,v=new n({validate:k,allow_script_urls:r.allow_script_urls,allow_conditional_comments:r.allow_conditional_comments,self_closing_elements:g(l.getSelfClosingElements()),cdata:function(e){b.append(u("#cdata",4)).value=e},text:function(e,t){var n;B||(e=e.replace(M," "),b.lastChild&&T[b.lastChild.name]&&(e=e.replace(R,""))),0!==e.length&&(n=u("#text",3),n.raw=!!t,b.append(n).value=e)},comment:function(e){b.append(u("#comment",8)).value=e},pi:function(e,t){b.append(u(e,7)).value=t,m(b)},doctype:function(e){var t;t=b.append(u("#doctype",10)),t.value=e,m(b)},start:function(e,t,n){var r,i,o,a,s;if(o=k?l.getElementRule(e):{}){for(r=u(o.outputName||e,1),r.attributes=t,r.shortEnded=n,b.append(r),s=H[b.name],s&&H[r.name]&&!s[r.name]&&A.push(r),i=f.length;i--;)a=f[i].name,a in t.map&&(_=p[a],_?_.push(r):p[a]=[r]);T[e]&&m(r),n||(b=r),!B&&P[e]&&(B=!0)}},end:function(t){var n,r,i,o,a;if(r=k?l.getElementRule(t):{}){if(T[t]&&!B){if(n=b.firstChild,n&&3===n.type)if(i=n.value.replace(R,""),i.length>0)n.value=i,n=n.next;else for(o=n.next,n.remove(),n=o;n&&3===n.type;)i=n.value,o=n.next,(0===i.length||L.test(i))&&(n.remove(),n=o),n=o;if(n=b.lastChild,n&&3===n.type)if(i=n.value.replace(D,""),i.length>0)n.value=i,n=n.prev;else for(o=n.prev,n.remove(),n=o;n&&3===n.type;)i=n.value,o=n.prev,(0===i.length||L.test(i))&&(n.remove(),n=o),n=o}if(B&&P[t]&&(B=!1),(r.removeEmpty||r.paddEmpty)&&b.isEmpty(O))if(r.paddEmpty)b.empty().append(new e("#text","3")).value="\xa0";else if(!b.attributes.map.name&&!b.attributes.map.id)return a=b.parent,T[b.name]?b.empty().remove():b.unwrap(),void(b=a);b=b.parent}}},l),y=b=new e(o.context||r.root_name,11),v.parse(t),k&&A.length&&(o.context?o.invalid=!0:c(A)),I&&("body"==y.name||o.isRootContent)&&a(),!o.invalid){for(S in h){for(_=d[S],C=h[S],N=C.length;N--;)C[N].parent||C.splice(N,1);for(x=0,w=_.length;w>x;x++)_[x](C,S,o)}for(x=0,w=f.length;w>x;x++)if(_=f[x],_.name in p){for(C=p[_.name],N=C.length;N--;)C[N].parent||C.splice(N,1);for(N=0,E=_.callbacks.length;E>N;N++)_.callbacks[N](C,_.name,o)}}return y},r.remove_trailing_brs&&u.addNodeFilter("br",function(t){var n,r=t.length,i,o=s({},l.getBlockElements()),a=l.getNonEmptyElements(),c,u,d,f,h,p;for(o.body=1,n=0;r>n;n++)if(i=t[n],c=i.parent,o[i.parent.name]&&i===c.lastChild){for(d=i.prev;d;){if(f=d.name,"span"!==f||"bookmark"!==d.attr("data-mce-type")){if("br"!==f)break;if("br"===f){i=null;break}}d=d.prev}i&&(i.remove(),c.isEmpty(a)&&(h=l.getElementRule(c.name),h&&(h.removeEmpty?c.remove():h.paddEmpty&&(c.empty().append(new e("#text",3)).value="\xa0"))))}else{for(u=i;c&&c.firstChild===u&&c.lastChild===u&&(u=c,!o[c.name]);)c=c.parent;u===c&&(p=new e("#text",3),p.value="\xa0",i.replace(p))}}),r.allow_html_in_named_anchor||u.addAttributeFilter("id,name",function(e){for(var t=e.length,n,r,i,o;t--;)if(o=e[t],"a"===o.name&&o.firstChild&&!o.attr("href")){i=o.parent,n=o.lastChild;do r=n.prev,i.insert(n,o),n=r;while(n)}}),r.validate&&l.getValidClasses()&&u.addAttributeFilter("class",function(e){for(var t=e.length,n,r,i,o,a,s=l.getValidClasses(),c,u;t--;){for(n=e[t],r=n.attr("class").split(" "),a="",i=0;i0&&(f=r[r.length-1],f.length>0&&"\n"!==f&&r.push("\n")),r.push("<",e),t)for(c=0,u=t.length;u>c;c++)d=t[c],r.push(" ",d.name,'="',s(d.value,!0),'"');!n||l?r[r.length]=">":r[r.length]=" />",n&&i&&a[e]&&r.length>0&&(f=r[r.length-1],f.length>0&&"\n"!==f&&r.push("\n"))},end:function(e){var t;r.push(""),i&&a[e]&&r.length>0&&(t=r[r.length-1],t.length>0&&"\n"!==t&&r.push("\n"))},text:function(e,t){e.length>0&&(r[r.length]=t?e:s(e))},cdata:function(e){r.push("")},comment:function(e){r.push("")},pi:function(e,t){t?r.push(""):r.push(""),i&&r.push("\n")},doctype:function(e){r.push("",i?"\n":"")},reset:function(){r.length=0},getContent:function(){return r.join("").replace(/\n$/,"")}}}}),r(P,[L,B],function(e,t){return function(n,r){var i=this,o=new e(n);n=n||{},n.validate="validate"in n?n.validate:!0,i.schema=r=r||new t,i.writer=o,i.serialize=function(e){function t(e){var n=i[e.type],s,l,c,u,d,f,h,p,m;if(n)n(e);else{if(s=e.name,l=e.shortEnded,c=e.attributes,a&&c&&c.length>1&&(f=[],f.map={},m=r.getElementRule(e.name))){for(h=0,p=m.attributesOrder.length;p>h;h++)u=m.attributesOrder[h],u in c.map&&(d=c.map[u],f.map[u]=d,f.push({name:u,value:d}));for(h=0,p=c.length;p>h;h++)u=c[h].name,u in f.map||(d=c.map[u],f.map[u]=d,f.push({name:u,value:d}));c=f}if(o.start(e.name,c,l),!l){if(e=e.firstChild)do t(e);while(e=e.next);o.end(s)}}}var i,a;return a=n.validate,i={3:function(e){o.text(e.value,e.raw)},8:function(e){o.comment(e.value)},7:function(e){o.pi(e.name,e.value)},10:function(e){o.doctype(e.value)},4:function(e){o.cdata(e.value)},11:function(e){if(e=e.firstChild)do t(e);while(e=e.next)}},o.reset(),1!=e.type||n.inner?i[11](e):t(e),o.getContent()}}}),r(H,[w,M,D,C,P,A,B,h,m,S],function(e,t,n,r,i,o,a,s,l,c){function u(e){function t(e){return e&&"br"===e.name}var n,r;n=e.lastChild,t(n)&&(r=n.prev,t(r)&&(n.remove(),r.remove()))}var d=l.each,f=l.trim,h=e.DOM,p=new RegExp(["]+data-mce-bogus[^>]+>[\u200b\ufeff]+<\\/span>",'\\s?data-mce-selected="[^"]+"'].join("|"),"gi");return function(e,o){function l(){var e=o.getBody().innerHTML,t=/<(\w+) [^>]*data-mce-bogus="all"[^>]*>/g,r,i,a,s,l,u=o.schema;for(e=c.trim(e.replace(p,"")),l=u.getShortEndedElements();s=t.exec(e);)i=t.lastIndex,a=s[0].length,r=l[s[1]]?i:n.findEndTag(u,e,i),e=e.substring(0,i-a)+e.substring(r),t.lastIndex=i-a;return f(e)}var m,g,v;return o&&(m=o.dom,g=o.schema),m=m||h,g=g||new a(e),e.entity_encoding=e.entity_encoding||"named",e.remove_trailing_brs="remove_trailing_brs"in e?e.remove_trailing_brs:!0,v=new t(e,g),v.addAttributeFilter("data-mce-tabindex",function(e,t){for(var n=e.length,r;n--;)r=e[n],r.attr("tabindex",r.attributes.map["data-mce-tabindex"]),r.attr(t,null)}),v.addAttributeFilter("src,href,style",function(t,n){for(var r=t.length,i,o,a="data-mce-"+n,s=e.url_converter,l=e.url_converter_scope,c;r--;)i=t[r],o=i.attributes.map[a],o!==c?(i.attr(n,o.length>0?o:null),i.attr(a,null)):(o=i.attributes.map[n],"style"===n?o=m.serializeStyle(m.parseStyle(o),i.name):s&&(o=s.call(l,o,n,i.name)),i.attr(n,o.length>0?o:null))}),v.addAttributeFilter("class",function(e){for(var t=e.length,n,r;t--;)n=e[t],r=n.attr("class"),r&&(r=n.attr("class").replace(/(?:^|\s)mce-item-\w+(?!\S)/g,""),n.attr("class",r.length>0?r:null))}),v.addAttributeFilter("data-mce-type",function(e,t,n){for(var r=e.length,i;r--;)i=e[r],"bookmark"!==i.attributes.map["data-mce-type"]||n.cleanup||i.remove()}),v.addNodeFilter("noscript",function(e){for(var t=e.length,n;t--;)n=e[t].firstChild,n&&(n.value=r.decode(n.value))}),v.addNodeFilter("script,style",function(e,t){function n(e){return e.replace(/()/g,"\n").replace(/^[\r\n]*|[\r\n]*$/g,"").replace(/^\s*(()?|\s*\/\/\s*\]\]>(-->)?|\/\/\s*(-->)?|\]\]>|\/\*\s*-->\s*\*\/|\s*-->\s*)\s*$/g,"")}for(var r=e.length,i,o,a;r--;)i=e[r],o=i.firstChild?i.firstChild.value:"","script"===t?(a=i.attr("type"),a&&i.attr("type","mce-no/type"==a?null:a.replace(/^mce\-/,"")),o.length>0&&(i.firstChild.value="// ")):o.length>0&&(i.firstChild.value="")}),v.addNodeFilter("#comment",function(e){for(var t=e.length,n;t--;)n=e[t],0===n.value.indexOf("[CDATA[")?(n.name="#cdata",n.type=4,n.value=n.value.replace(/^\[CDATA\[|\]\]$/g,"")):0===n.value.indexOf("mce:protected ")&&(n.name="#text",n.type=3,n.raw=!0,n.value=unescape(n.value).substr(14))}),v.addNodeFilter("xml:namespace,input",function(e,t){for(var n=e.length,r;n--;)r=e[n],7===r.type?r.remove():1===r.type&&("input"!==t||"type"in r.attributes.map||r.attr("type","text"))}),e.fix_list_elements&&v.addNodeFilter("ul,ol",function(e){for(var t=e.length,n,r;t--;)n=e[t],r=n.parent,("ul"===r.name||"ol"===r.name)&&n.prev&&"li"===n.prev.name&&n.prev.append(n)}),v.addAttributeFilter("data-mce-src,data-mce-href,data-mce-style,data-mce-selected,data-mce-expando,data-mce-type,data-mce-resize",function(e,t){for(var n=e.length;n--;)e[n].attr(t,null)}),{schema:g,addNodeFilter:v.addNodeFilter,addAttributeFilter:v.addAttributeFilter,serialize:function(t,n){var r=this,o,a,l,h,p,y;return s.ie&&m.select("script,style,select,map").length>0?(p=t.innerHTML,t=t.cloneNode(!1),m.setHTML(t,p)):t=t.cloneNode(!0),o=t.ownerDocument.implementation,o.createHTMLDocument&&(a=o.createHTMLDocument(""),d("BODY"==t.nodeName?t.childNodes:[t],function(e){a.body.appendChild(a.importNode(e,!0))}),t="BODY"!=t.nodeName?a.body.firstChild:a.body,l=m.doc,m.doc=a),n=n||{},n.format=n.format||"html",n.selection&&(n.forced_root_block=""),n.no_events||(n.node=t,r.onPreProcess(n)),y=v.parse(f(n.getInner?t.innerHTML:m.getOuterHTML(t)),n),u(y),h=new i(e,g),n.content=h.serialize(y),n.cleanup||(n.content=c.trim(n.content),n.content=n.content.replace(/\uFEFF/g,"")),n.no_events||r.onPostProcess(n),l&&(m.doc=l),n.node=null,n.content},addRules:function(e){g.addValidElements(e)},setRules:function(e){g.setValidElements(e)},onPreProcess:function(e){o&&o.fire("PreProcess",e)},onPostProcess:function(e){o&&o.fire("PostProcess",e)},getTrimmedContent:l}}}),r(O,[],function(){function e(e){function t(t,n){var r,i=0,o,a,s,l,c,u,d=-1,f;if(r=t.duplicate(),r.collapse(n),f=r.parentElement(),f.ownerDocument===e.dom.doc){for(;"false"===f.contentEditable;)f=f.parentNode;if(!f.hasChildNodes())return{node:f,inside:1};for(s=f.children,o=s.length-1;o>=i;)if(u=Math.floor((i+o)/2),l=s[u],r.moveToElementText(l),d=r.compareEndPoints(n?"StartToStart":"EndToEnd",t),d>0)o=u-1;else{if(!(0>d))return{node:l};i=u+1}if(0>d)for(l?r.collapse(!1):(r.moveToElementText(f),r.collapse(!0),l=f,a=!0),c=0;0!==r.compareEndPoints(n?"StartToStart":"StartToEnd",t)&&0!==r.move("character",1)&&f==r.parentElement();)c++;else for(r.collapse(!0),c=0;0!==r.compareEndPoints(n?"StartToStart":"StartToEnd",t)&&0!==r.move("character",-1)&&f==r.parentElement();)c++;return{node:l,position:d,offset:c,inside:a}}}function n(){function n(e){var n=t(o,e),r,i,s=0,l,c,u;if(r=n.node,i=n.offset,n.inside&&!r.hasChildNodes())return void a[e?"setStart":"setEnd"](r,0);if(i===c)return void a[e?"setStartBefore":"setEndAfter"](r);if(n.position<0){if(l=n.inside?r.firstChild:r.nextSibling,!l)return void a[e?"setStartAfter":"setEndAfter"](r);if(!i)return void(3==l.nodeType?a[e?"setStart":"setEnd"](l,0):a[e?"setStartBefore":"setEndBefore"](l));for(;l;){if(3==l.nodeType&&(u=l.nodeValue,s+=u.length,s>=i)){r=l,s-=i,s=u.length-s;break}l=l.nextSibling}}else{if(l=r.previousSibling,!l)return a[e?"setStartBefore":"setEndBefore"](r);if(!i)return void(3==r.nodeType?a[e?"setStart":"setEnd"](l,r.nodeValue.length):a[e?"setStartAfter":"setEndAfter"](l));for(;l;){if(3==l.nodeType&&(s+=l.nodeValue.length,s>=i)){r=l,s-=i;break}l=l.previousSibling}}a[e?"setStart":"setEnd"](r,s)}var o=e.getRng(),a=i.createRng(),s,l,c,u,d;if(s=o.item?o.item(0):o.parentElement(),s.ownerDocument!=i.doc)return a;if(l=e.isCollapsed(),o.item)return a.setStart(s.parentNode,i.nodeIndex(s)),a.setEnd(a.startContainer,a.startOffset+1),a;try{n(!0),l||n()}catch(f){if(-2147024809!=f.number)throw f;d=r.getBookmark(2),c=o.duplicate(),c.collapse(!0),s=c.parentElement(),l||(c=o.duplicate(),c.collapse(!1),u=c.parentElement(),u.innerHTML=u.innerHTML),s.innerHTML=s.innerHTML,r.moveToBookmark(d),o=e.getRng(),n(!0),l||n()}return a}var r=this,i=e.dom,o=!1;this.getBookmark=function(n){function r(e){var t,n,r,o,a=[];for(t=e.parentNode,n=i.getRoot().parentNode;t!=n&&9!==t.nodeType;){for(r=t.children,o=r.length;o--;)if(e===r[o]){a.push(o);break}e=t,t=t.parentNode}return a}function o(e){var n;return n=t(a,e),n?{position:n.position,offset:n.offset,indexes:r(n.node),inside:n.inside}:void 0}var a=e.getRng(),s={};return 2===n&&(a.item?s.start={ctrl:!0,indexes:r(a.item(0))}:(s.start=o(!0),e.isCollapsed()||(s.end=o()))),s},this.moveToBookmark=function(e){function t(e){var t,n,r,o;for(t=i.getRoot(),n=e.length-1;n>=0;n--)o=t.children,r=e[n],r<=o.length-1&&(t=o[r]);return t}function n(n){var i=e[n?"start":"end"],a,s,l,c;i&&(a=i.position>0,s=o.createTextRange(),s.moveToElementText(t(i.indexes)),c=i.offset,c!==l?(s.collapse(i.inside||a),s.moveStart("character",a?-c:c)):s.collapse(n),r.setEndPoint(n?"StartToStart":"EndToStart",s),n&&r.collapse(!0))}var r,o=i.doc.body;e.start&&(e.start.ctrl?(r=o.createControlRange(),r.addElement(t(e.start.indexes)),r.select()):(r=o.createTextRange(),n(!0),n(),r.select()))},this.addRange=function(t){function n(e){var t,n,a,d,p;a=i.create("a"),t=e?s:c,n=e?l:u,d=r.duplicate(),(t==f||t==f.documentElement)&&(t=h,n=0),3==t.nodeType?(t.parentNode.insertBefore(a,t),d.moveToElementText(a),d.moveStart("character",n),i.remove(a),r.setEndPoint(e?"StartToStart":"EndToEnd",d)):(p=t.childNodes,p.length?(n>=p.length?i.insertAfter(a,p[p.length-1]):t.insertBefore(a,p[n]),d.moveToElementText(a)):t.canHaveHTML&&(t.innerHTML="",a=t.firstChild,d.moveToElementText(a),d.collapse(o)),r.setEndPoint(e?"StartToStart":"EndToEnd",d),i.remove(a))}var r,a,s,l,c,u,d,f=e.dom.doc,h=f.body,p,m;if(s=t.startContainer,l=t.startOffset,c=t.endContainer,u=t.endOffset,r=h.createTextRange(),s==c&&1==s.nodeType){if(l==u&&!s.hasChildNodes()){if(s.canHaveHTML)return d=s.previousSibling,d&&!d.hasChildNodes()&&i.isBlock(d)?d.innerHTML="":d=null,s.innerHTML="",r.moveToElementText(s.lastChild),r.select(),i.doc.selection.clear(),s.innerHTML="",void(d&&(d.innerHTML=""));l=i.nodeIndex(s),s=s.parentNode}if(l==u-1)try{if(m=s.childNodes[l],a=h.createControlRange(),a.addElement(m),a.select(),p=e.getRng(),p.item&&m===p.item(0))return}catch(g){}}n(!0),n(),r.select()},this.getRangeAt=n}return e}),r(I,[h],function(e){return{BACKSPACE:8,DELETE:46,DOWN:40,ENTER:13,LEFT:37,RIGHT:39,SPACEBAR:32,TAB:9,UP:38,modifierPressed:function(e){return e.shiftKey||e.ctrlKey||e.altKey||this.metaKeyPressed(e)},metaKeyPressed:function(t){return e.mac?t.metaKey:t.ctrlKey&&!t.altKey}}}),r(F,[I,m,u,h,_],function(e,t,n,r,i){var o=i.isContentEditableFalse;return function(i,a){function s(e){var t=a.settings.object_resizing;return t===!1||r.iOS?!1:("string"!=typeof t&&(t="table,img,div"),"false"===e.getAttribute("data-mce-resize")?!1:e==a.getBody()?!1:a.dom.is(e,t))}function l(t){var n,r,i,o,s;n=t.screenX-B,r=t.screenY-D,F=n*R[2]+P,z=r*R[3]+H,F=5>F?5:F,z=5>z?5:z,i="IMG"==_.nodeName&&a.settings.resize_img_proportional!==!1?!e.modifierPressed(t):e.modifierPressed(t)||"IMG"==_.nodeName&&R[2]*R[3]!==0,i&&($(n)>$(r)?(z=q(F*O),F=q(z/O)):(F=q(z/O),z=q(F*O))),N.setStyles(S,{width:F,height:z}),o=R.startPos.x+n,s=R.startPos.y+r,o=o>0?o:0,s=s>0?s:0,N.setStyles(k,{left:o,top:s,display:"block"}),k.innerHTML=F+" × "+z,R[2]<0&&S.clientWidth<=F&&N.setStyle(S,"left",M+(P-F)),R[3]<0&&S.clientHeight<=z&&N.setStyle(S,"top",L+(H-z)),n=j.scrollWidth-Y,r=j.scrollHeight-X,n+r!==0&&N.setStyles(k,{left:o-n,top:s-r}),I||(a.fire("ObjectResizeStart",{target:_,width:P,height:H}),I=!0)}function c(){function e(e,t){t&&(_.style[e]||!a.schema.isValid(_.nodeName.toLowerCase(),e)?N.setStyle(_,e,t):N.setAttrib(_,e,t))}I=!1,e("width",F),e("height",z),N.unbind(W,"mousemove",l),N.unbind(W,"mouseup",c),V!=W&&(N.unbind(V,"mousemove",l),N.unbind(V,"mouseup",c)),N.remove(S),N.remove(k),U&&"TABLE"!=_.nodeName||u(_),a.fire("ObjectResized",{target:_,width:F,height:z}),N.setAttrib(_,"style",N.getAttrib(_,"style")),a.nodeChanged()}function u(e,t,n){var i,o,u,f,h;d(),b(),i=N.getPos(e,j),M=i.x,L=i.y,h=e.getBoundingClientRect(),o=h.width||h.right-h.left,u=h.height||h.bottom-h.top,_!=e&&(y(),_=e,F=z=0),f=a.fire("ObjectSelected",{target:e}),s(e)&&!f.isDefaultPrevented()?E(T,function(e,i){function a(t){B=t.screenX,D=t.screenY,P=_.clientWidth,H=_.clientHeight,O=H/P,R=e,e.startPos={x:o*e[0]+M,y:u*e[1]+L},Y=j.scrollWidth,X=j.scrollHeight,S=_.cloneNode(!0),N.addClass(S,"mce-clonedresizable"),N.setAttrib(S,"data-mce-bogus","all"),S.contentEditable=!1,S.unSelectabe=!0,N.setStyles(S,{left:M,top:L,margin:0}),S.removeAttribute("data-mce-selected"),j.appendChild(S),N.bind(W,"mousemove",l),N.bind(W,"mouseup",c),V!=W&&(N.bind(V,"mousemove",l),N.bind(V,"mouseup",c)),k=N.add(j,"div",{"class":"mce-resize-helper","data-mce-bogus":"all"},P+" × "+H)}var s;return t?void(i==t&&a(n)):(s=N.get("mceResizeHandle"+i),s&&N.remove(s),s=N.add(j,"div",{id:"mceResizeHandle"+i,"data-mce-bogus":"all","class":"mce-resizehandle",unselectable:!0,style:"cursor:"+i+"-resize; margin:0; padding:0"}),r.ie&&(s.contentEditable=!1),N.bind(s,"mousedown",function(e){e.stopImmediatePropagation(),e.preventDefault(),a(e)}),e.elm=s,void N.setStyles(s,{left:o*e[0]+M-s.offsetWidth/2,top:u*e[1]+L-s.offsetHeight/2}))}):d(),_.setAttribute("data-mce-selected","1")}function d(){var e,t;b(),_&&_.removeAttribute("data-mce-selected");for(e in T)t=N.get("mceResizeHandle"+e),t&&(N.unbind(t),N.remove(t))}function f(e){function t(e,t){if(e)do if(e===t)return!0;while(e=e.parentNode)}var n,r;if(!I&&!a.removed)return E(N.select("img[data-mce-selected],hr[data-mce-selected]"),function(e){e.removeAttribute("data-mce-selected")}),r="mousedown"==e.type?e.target:i.getNode(),r=N.$(r).closest(U?"table":"table,img,hr")[0],t(r,j)&&(C(),n=i.getStart(!0),t(n,r)&&t(i.getEnd(!0),r)&&(!U||r!=n&&"IMG"!==n.nodeName))?void u(r):void d()}function h(e,t,n){e&&e.attachEvent&&e.attachEvent("on"+t,n)}function p(e,t,n){e&&e.detachEvent&&e.detachEvent("on"+t,n)}function m(e){var t=e.srcElement,n,r,i,o,s,l,c;n=t.getBoundingClientRect(),l=A.clientX-n.left,c=A.clientY-n.top;for(r in T)if(i=T[r],o=t.offsetWidth*i[0],s=t.offsetHeight*i[1],$(o-l)<8&&$(s-c)<8){R=i;break}I=!0,a.fire("ObjectResizeStart",{target:_,width:_.clientWidth,height:_.clientHeight}),a.getDoc().selection.empty(),u(t,r,A)}function g(e){e.preventDefault?e.preventDefault():e.returnValue=!1}function v(e){var t=e.srcElement;if(o(t))return void g(e);if(t!=_){if(a.fire("ObjectSelected",{target:t}),y(),0===t.id.indexOf("mceResizeHandle"))return void(e.returnValue=!1);("IMG"==t.nodeName||"TABLE"==t.nodeName)&&(d(),_=t,h(t,"resizestart",m))}}function y(){p(_,"resizestart",m)}function b(){for(var e in T){var t=T[e];t.elm&&(N.unbind(t.elm),delete t.elm)}}function C(){try{a.getDoc().execCommand("enableObjectResizing",!1,!1)}catch(e){}}function x(e){var t;if(U){t=W.body.createControlRange();try{return t.addElement(e),t.select(),!0}catch(n){}}}function w(){_=S=null,U&&(y(),p(j,"controlselect",v))}var N=a.dom,E=t.each,_,S,k,T,R,A,B,D,M,L,P,H,O,I,F,z,W=a.getDoc(),V=document,U=r.ie&&r.ie<11,$=Math.abs,q=Math.round,j=a.getBody(),Y,X;T={nw:[0,0,-1,-1],ne:[1,0,1,-1],se:[1,1,1,1],sw:[0,1,-1,1]};var K=".mce-content-body";return a.contentStyles.push(K+" div.mce-resizehandle {position: absolute;border: 1px solid black;background: #FFF;width: 7px;height: 7px;z-index: 10000}"+K+" .mce-resizehandle:hover {background: #000}"+K+" *[data-mce-selected] {outline: 1px solid black;resize: none}"+K+" .mce-clonedresizable {position: absolute;"+(r.gecko?"":"outline: 1px dashed black;")+"opacity: .5;filter: alpha(opacity=50);z-index: 10000}"+K+" .mce-resize-helper {background: #555;background: rgba(0,0,0,0.75);border-radius: 3px;border: 1px;color: white;display: none;font-family: sans-serif;font-size: 12px;white-space: nowrap;line-height: 14px;margin: 5px 10px;padding: 5px;position: absolute;z-index: 10001}"),a.on("init",function(){U?(a.on("ObjectResized",function(e){"TABLE"!=e.target.nodeName&&(d(),x(e.target))}),h(j,"controlselect",v),a.on("mousedown",function(e){A=e})):(C(),r.ie>=11&&(a.on("mousedown click",function(e){var t=e.target.nodeName;!I&&/^(TABLE|IMG|HR)$/.test(t)&&(a.selection.select(e.target,"TABLE"==t),"mousedown"==e.type&&a.nodeChanged())}),a.dom.bind(j,"mscontrolselect",function(e){function t(e){n.setEditorTimeout(a,function(){a.selection.select(e)})}return o(e.target)?(e.preventDefault(),void t(e.target)):void(/^(TABLE|IMG|HR)$/.test(e.target.nodeName)&&(e.preventDefault(),"IMG"==e.target.tagName&&t(e.target)))}))),a.on("nodechange ResizeEditor ResizeWindow drop",function(e){n.requestAnimationFrame(function(){f(e)})}),a.on("keydown keyup",function(e){_&&"TABLE"==_.nodeName&&f(e)}),a.on("hide blur",d)}),a.on("remove",b),{isResizable:s,showResizeRect:u,hideResizeRect:d,updateResizeRect:f,controlSelect:x,destroy:w}}}),r(z,[],function(){function e(e){return function(){return e}}function t(e){return function(t){return!e(t)}}function n(e,t){return function(n){return e(t(n))}}function r(){var e=a.call(arguments);return function(t){for(var n=0;n=e.length?e.apply(this,t.slice(1)):function(){var e=t.concat([].slice.call(arguments));return o.apply(this,e)}}var a=[].slice;return{constant:e,negate:t,and:i,or:r,curry:o,compose:n}}),r(W,[_,p,k],function(e,t,n){function r(e){return m(e)?!1:d(e)?f(e.parentNode)?!1:!0:h(e)||u(e)||p(e)||c(e)}function i(e,t){for(e=e.parentNode;e&&e!=t;e=e.parentNode){if(c(e))return!1;if(l(e))return!0}return!0}function o(e){return c(e)?t.reduce(e.getElementsByTagName("*"),function(e,t){return e||l(t)},!1)!==!0:!1}function a(e){return h(e)||o(e)}function s(e,t){return r(e)&&i(e,t)}var l=e.isContentEditableTrue,c=e.isContentEditableFalse,u=e.isBr,d=e.isText,f=e.matchNodeNames("script style textarea"),h=e.matchNodeNames("img input textarea hr iframe video audio object"),p=e.matchNodeNames("table"),m=n.isCaretContainer;return{isCaretCandidate:r,isInEditable:i,isAtomic:a,isEditableCaretCandidate:s}}),r(V,[],function(){function e(e){return e?{left:c(e.left),top:c(e.top),bottom:c(e.bottom),right:c(e.right),width:c(e.width),height:c(e.height)}:{left:0,top:0,bottom:0,right:0,width:0,height:0}}function t(t,n){return t=e(t),n?t.right=t.left:(t.left=t.left+t.width,t.right=t.left),t.width=0,t}function n(e,t){return e.left===t.left&&e.top===t.top&&e.bottom===t.bottom&&e.right===t.right}function r(e,t,n){return e>=0&&e<=Math.min(t.height,n.height)/2}function i(e,t){return e.bottomt.bottom?!1:r(t.top-e.bottom,e,t)}function o(e,t){return e.top>t.bottom?!0:e.bottomt.right}function l(e,t){return i(e,t)?-1:o(e,t)?1:a(e,t)?-1:s(e,t)?1:0}var c=Math.round;return{ +clone:e,collapse:t,isEqual:n,isAbove:i,isBelow:o,isLeft:a,isRight:s,compare:l}}),r(U,[],function(){function e(e){return"string"==typeof e&&e.charCodeAt(0)>=768&&t.test(e)}var t=new RegExp("[\u0300-\u036f\u0483-\u0487\u0488-\u0489\u0591-\u05bd\u05bf\u05c1-\u05c2\u05c4-\u05c5\u05c7\u0610-\u061a\u064b-\u065f\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7-\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08e3-\u0902\u093a\u093c\u0941-\u0948\u094d\u0951-\u0957\u0962-\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2-\u09e3\u0a01-\u0a02\u0a3c\u0a41-\u0a42\u0a47-\u0a48\u0a4b-\u0a4d\u0a51\u0a70-\u0a71\u0a75\u0a81-\u0a82\u0abc\u0ac1-\u0ac5\u0ac7-\u0ac8\u0acd\u0ae2-\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62-\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c00\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56\u0c62-\u0c63\u0c81\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc-\u0ccd\u0cd5-\u0cd6\u0ce2-\u0ce3\u0d01\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62-\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb-\u0ebc\u0ec8-\u0ecd\u0f18-\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86-\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039-\u103a\u103d-\u103e\u1058-\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085-\u1086\u108d\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752-\u1753\u1772-\u1773\u17b4-\u17b5\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927-\u1928\u1932\u1939-\u193b\u1a17-\u1a18\u1a1b\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1ab0-\u1abd\u1abe\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80-\u1b81\u1ba2-\u1ba5\u1ba8-\u1ba9\u1bab-\u1bad\u1be6\u1be8-\u1be9\u1bed\u1bef-\u1bf1\u1c2c-\u1c33\u1c36-\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8-\u1cf9\u1dc0-\u1df5\u1dfc-\u1dff\u200c-\u200d\u20d0-\u20dc\u20dd-\u20e0\u20e1\u20e2-\u20e4\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302d\u302e-\u302f\u3099-\u309a\ua66f\ua670-\ua672\ua674-\ua67d\ua69e-\ua69f\ua6f0-\ua6f1\ua802\ua806\ua80b\ua825-\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\ua9e5\uaa29-\uaa2e\uaa31-\uaa32\uaa35-\uaa36\uaa43\uaa4c\uaa7c\uaab0\uaab2-\uaab4\uaab7-\uaab8\uaabe-\uaabf\uaac1\uaaec-\uaaed\uaaf6\uabe5\uabe8\uabed\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\uff9e-\uff9f]");return{isExtendingChar:e}}),r($,[z,_,w,T,W,V,U],function(e,t,n,r,i,o,a){function s(e){return e&&/[\r\n\t ]/.test(e)}function l(e){var t=e.startContainer,n=e.startOffset,r;return s(e.toString())&&g(t.parentNode)&&(r=t.data,s(r[n-1])||s(r[n+1]))?!0:!1}function c(e){function t(e){var t=e.ownerDocument,n=t.createRange(),r=t.createTextNode("\xa0"),i=e.parentNode,a;return i.insertBefore(r,e),n.setStart(r,0),n.setEnd(r,1),a=o.clone(n.getBoundingClientRect()),i.removeChild(r),a}function n(e){var n,r;return r=e.getClientRects(),n=r.length>0?o.clone(r[0]):o.clone(e.getBoundingClientRect()),y(e)&&0===n.left?t(e):n}function r(e,t){return e=o.collapse(e,t),e.width=1,e.right=e.left+1,e}function i(e){0!==e.height&&(c.length>0&&o.isEqual(e,c[c.length-1])||c.push(e))}function s(e,t){var o=e.ownerDocument.createRange();return t0&&(o.setStart(e,t-1),o.setEnd(e,t),l(o)||i(r(n(o),!1))),void(t=t.data.length:n>=t.childNodes.length}function a(){var e;return e=t.ownerDocument.createRange(),e.setStart(t,n),e.setEnd(t,n),e}function s(){return r||(r=c(new u(t,n))),r}function l(){return s().length>0}function d(e){return e&&t===e.container()&&n===e.offset()}function f(e){return C(t,e?n-1:n)}return{container:e.constant(t),offset:e.constant(n),toRange:a,getClientRects:s,isVisible:l,isAtStart:i,isAtEnd:o,isEqual:d,getNode:f}}var d=t.isElement,f=i.isCaretCandidate,h=t.matchStyleValues("display","block table"),p=t.matchStyleValues("float","left right"),m=e.and(d,f,e.negate(p)),g=e.negate(t.matchStyleValues("white-space","pre pre-line pre-wrap")),v=t.isText,y=t.isBr,b=n.nodeIndex,C=r.getNode;return u.fromRangeStart=function(e){return new u(e.startContainer,e.startOffset)},u.fromRangeEnd=function(e){return new u(e.endContainer,e.endOffset)},u.after=function(e){return new u(e.parentNode,b(e)+1)},u.before=function(e){return new u(e.parentNode,b(e))},u}),r(q,[_,w,z,p,$],function(e,t,n,r,i){function o(e){var t=e.parentNode;return v(t)?o(t):t}function a(e){return e?r.reduce(e.childNodes,function(e,t){return v(t)&&"BR"!=t.nodeName?e=e.concat(a(t)):e.push(t),e},[]):[]}function s(e,t){for(;(e=e.previousSibling)&&g(e);)t+=e.data.length;return t}function l(e){return function(t){return e===t}}function c(t){var n,i,s;return n=a(o(t)),i=r.findIndex(n,l(t),t),n=n.slice(0,i+1),s=r.reduce(n,function(e,t,r){return g(t)&&g(n[r-1])&&e++,e},0),n=r.filter(n,e.matchNodeNames(t.nodeName)),i=r.findIndex(n,l(t),t),i-s}function u(e){var t;return t=g(e)?"text()":e.nodeName.toLowerCase(),t+"["+c(e)+"]"}function d(e,t,n){var r=[];for(t=t.parentNode;t!=e&&(!n||!n(t));t=t.parentNode)r.push(t);return r}function f(t,i){var o,a,l=[],c,f,h;return o=i.container(),a=i.offset(),g(o)?c=s(o,a):(f=o.childNodes,a>=f.length?(c="after",a=f.length-1):c="before",o=f[a]),l.push(u(o)),h=d(t,o),h=r.filter(h,n.negate(e.isBogus)),l=l.concat(r.map(h,function(e){return u(e)})),l.reverse().join("/")+","+c}function h(t,n,i){var o=a(t);return o=r.filter(o,function(e,t){return!g(e)||!g(o[t-1])}),o=r.filter(o,e.matchNodeNames(n)),o[i]}function p(e,t){for(var n=e,r=0,o;g(n);){if(o=n.data.length,t>=r&&r+o>=t){e=n,t-=r;break}if(!g(n.nextSibling)){e=n,t=o;break}r+=o,n=n.nextSibling}return t>e.data.length&&(t=e.data.length),new i(e,t)}function m(e,t){var n,o,a;return t?(n=t.split(","),t=n[0].split("/"),a=n.length>1?n[1]:"before",o=r.reduce(t,function(e,t){return(t=/([\w\-\(\)]+)\[([0-9]+)\]/.exec(t))?("text()"===t[1]&&(t[1]="#text"),h(e,t[1],parseInt(t[2],10))):null},e),o?g(o)?p(o,parseInt(a,10)):(a="after"===a?y(o)+1:y(o),new i(o.parentNode,a)):null):null}var g=e.isText,v=e.isBogus,y=t.nodeIndex;return{create:f,resolve:m}}),r(j,[h,m,k,q,$,_],function(e,t,n,r,i,o){function a(a){var l=a.dom;this.getBookmark=function(e,c){function u(e,n){var r=0;return t.each(l.select(e),function(e){return"all"!==e.getAttribute("data-mce-bogus")?e==n?!1:void r++:void 0}),r}function d(e){function t(t){var n,r,i,o=t?"start":"end";n=e[o+"Container"],r=e[o+"Offset"],1==n.nodeType&&"TR"==n.nodeName&&(i=n.childNodes,n=i[Math.min(t?r:r-1,i.length-1)],n&&(r=t?0:n.childNodes.length,e["set"+(t?"Start":"End")](n,r)))}return t(!0),t(),e}function f(e){function t(e,t){var r=e[t?"startContainer":"endContainer"],i=e[t?"startOffset":"endOffset"],o=[],a,s,u=0;if(3==r.nodeType){if(c)for(a=r.previousSibling;a&&3==a.nodeType;a=a.previousSibling)i+=a.nodeValue.length;o.push(i)}else s=r.childNodes,i>=s.length&&s.length&&(u=1,i=Math.max(0,s.length-1)),o.push(l.nodeIndex(s[i],c)+u);for(;r&&r!=n;r=r.parentNode)o.push(l.nodeIndex(r,c));return o}var n=l.getRoot(),r={};return r.start=t(e,!0),a.isCollapsed()||(r.end=t(e)),r}function h(e){function t(e){var t;if(n.isCaretContainer(e)){if(o.isText(e)&&n.isCaretContainerBlock(e)&&(e=e.parentNode),t=e.previousSibling,s(t))return t;if(t=e.nextSibling,s(t))return t}}return t(e.startContainer)||t(e.endContainer)}var p,m,g,v,y,b,C="",x;if(2==e)return b=a.getNode(),y=b?b.nodeName:null,p=a.getRng(),s(b)||"IMG"==y?{name:y,index:u(y,b)}:a.tridentSel?a.tridentSel.getBookmark(e):(b=h(p),b?(y=b.tagName,{name:y,index:u(y,b)}):f(p));if(3==e)return p=a.getRng(),{start:r.create(l.getRoot(),i.fromRangeStart(p)),end:r.create(l.getRoot(),i.fromRangeEnd(p))};if(e)return{rng:a.getRng()};if(p=a.getRng(),g=l.uniqueId(),v=a.isCollapsed(),x="overflow:hidden;line-height:0px",p.duplicate||p.item){if(p.item)return b=p.item(0),y=b.nodeName,{name:y,index:u(y,b)};m=p.duplicate();try{p.collapse(),p.pasteHTML(''+C+""),v||(m.collapse(!1),p.moveToElementText(m.parentElement()),0===p.compareEndPoints("StartToEnd",m)&&m.move("character",-1),m.pasteHTML(''+C+""))}catch(w){return null}}else{if(b=a.getNode(),y=b.nodeName,"IMG"==y)return{name:y,index:u(y,b)};m=d(p.cloneRange()),v||(m.collapse(!1),m.insertNode(l.create("span",{"data-mce-type":"bookmark",id:g+"_end",style:x},C))),p=d(p),p.collapse(!0),p.insertNode(l.create("span",{"data-mce-type":"bookmark",id:g+"_start",style:x},C))}return a.moveToBookmark({id:g,keep:1}),{id:g}},this.moveToBookmark=function(n){function i(e){var t=n[e?"start":"end"],r,i,o,a;if(t){for(o=t[0],i=d,r=t.length-1;r>=1;r--){if(a=i.childNodes,t[r]>a.length-1)return;i=a[t[r]]}3===i.nodeType&&(o=Math.min(t[0],i.nodeValue.length)),1===i.nodeType&&(o=Math.min(t[0],i.childNodes.length)),e?u.setStart(i,o):u.setEnd(i,o)}return!0}function o(r){var i=l.get(n.id+"_"+r),o,a,s,c,u=n.keep;if(i&&(o=i.parentNode,"start"==r?(u?(o=i.firstChild,a=1):a=l.nodeIndex(i),f=h=o,p=m=a):(u?(o=i.firstChild,a=1):a=l.nodeIndex(i),h=o,m=a),!u)){for(c=i.previousSibling,s=i.nextSibling,t.each(t.grep(i.childNodes),function(e){3==e.nodeType&&(e.nodeValue=e.nodeValue.replace(/\uFEFF/g,""))});i=l.get(n.id+"_"+r);)l.remove(i,1);c&&s&&c.nodeType==s.nodeType&&3==c.nodeType&&!e.opera&&(a=c.nodeValue.length,c.appendData(s.nodeValue),l.remove(s),"start"==r?(f=h=c,p=m=a):(h=c,m=a))}}function s(t){return!l.isBlock(t)||t.innerHTML||e.ie||(t.innerHTML='
    '),t}function c(){var e,t;return e=l.createRng(),t=r.resolve(l.getRoot(),n.start),e.setStart(t.container(),t.offset()),t=r.resolve(l.getRoot(),n.end),e.setEnd(t.container(),t.offset()),e}var u,d,f,h,p,m;if(n)if(t.isArray(n.start)){if(u=l.createRng(),d=l.getRoot(),a.tridentSel)return a.tridentSel.moveToBookmark(n);i(!0)&&i()&&a.setRng(u)}else"string"==typeof n.start?a.setRng(c(n)):n.id?(o("start"),o("end"),f&&(u=l.createRng(),u.setStart(s(f),p),u.setEnd(s(h),m),a.setRng(u))):n.name?a.select(l.select(n.name)[n.index]):n.rng&&a.setRng(n.rng)}}var s=o.isContentEditableFalse;return a.isBookmarkNode=function(e){return e&&"SPAN"===e.tagName&&"bookmark"===e.getAttribute("data-mce-type")},a}),r(Y,[y,O,F,T,j,_,h,m],function(e,n,r,i,o,a,s,l){function c(e,t,i,a){var s=this;s.dom=e,s.win=t,s.serializer=i,s.editor=a,s.bookmarkManager=new o(s),s.controlSelection=new r(s,a),s.win.getSelection||(s.tridentSel=new n(s))}var u=l.each,d=l.trim,f=s.ie;return c.prototype={setCursorLocation:function(e,t){var n=this,r=n.dom.createRng();e?(r.setStart(e,t),r.setEnd(e,t),n.setRng(r),n.collapse(!1)):(n._moveEndPoint(r,n.editor.getBody(),!0),n.setRng(r))},getContent:function(e){var n=this,r=n.getRng(),i=n.dom.create("body"),o=n.getSel(),a,s,l;return e=e||{},a=s="",e.get=!0,e.format=e.format||"html",e.selection=!0,n.editor.fire("BeforeGetContent",e),"text"==e.format?n.isCollapsed()?"":r.text||(o.toString?o.toString():""):(r.cloneContents?(l=r.cloneContents(),l&&i.appendChild(l)):r.item!==t||r.htmlText!==t?(i.innerHTML="
    "+(r.item?r.item(0).outerHTML:r.htmlText),i.removeChild(i.firstChild)):i.innerHTML=r.toString(),/^\s/.test(i.innerHTML)&&(a=" "),/\s+$/.test(i.innerHTML)&&(s=" "),e.getInner=!0,e.content=n.isCollapsed()?"":a+n.serializer.serialize(i,e)+s,n.editor.fire("GetContent",e),e.content)},setContent:function(e,t){var n=this,r=n.getRng(),i,o=n.win.document,a,s;if(t=t||{format:"html"},t.set=!0,t.selection=!0,t.content=e,t.no_events||n.editor.fire("BeforeSetContent",t),e=t.content,r.insertNode){e+='_',r.startContainer==o&&r.endContainer==o?o.body.innerHTML=e:(r.deleteContents(),0===o.body.childNodes.length?o.body.innerHTML=e:r.createContextualFragment?r.insertNode(r.createContextualFragment(e)):(a=o.createDocumentFragment(),s=o.createElement("div"),a.appendChild(s),s.outerHTML=e,r.insertNode(a))),i=n.dom.get("__caret"),r=o.createRange(),r.setStartBefore(i),r.setEndBefore(i),n.setRng(r),n.dom.remove("__caret");try{n.setRng(r)}catch(l){}}else r.item&&(o.execCommand("Delete",!1,null),r=n.getRng()),/^\s+/.test(e)?(r.pasteHTML('_'+e),n.dom.remove("__mce_tmp")):r.pasteHTML(e);t.no_events||n.editor.fire("SetContent",t)},getStart:function(e){var t=this,n=t.getRng(),r,i,o,a;if(n.duplicate||n.item){if(n.item)return n.item(0);for(o=n.duplicate(),o.collapse(1),r=o.parentElement(),r.ownerDocument!==t.dom.doc&&(r=t.dom.getRoot()),i=a=n.parentElement();a=a.parentNode;)if(a==r){r=i;break}return r}return r=n.startContainer,1==r.nodeType&&r.hasChildNodes()&&(e&&n.collapsed||(r=r.childNodes[Math.min(r.childNodes.length-1,n.startOffset)])),r&&3==r.nodeType?r.parentNode:r},getEnd:function(e){var t=this,n=t.getRng(),r,i;return n.duplicate||n.item?n.item?n.item(0):(n=n.duplicate(),n.collapse(0),r=n.parentElement(),r.ownerDocument!==t.dom.doc&&(r=t.dom.getRoot()),r&&"BODY"==r.nodeName?r.lastChild||r:r):(r=n.endContainer,i=n.endOffset,1==r.nodeType&&r.hasChildNodes()&&(e&&n.collapsed||(r=r.childNodes[i>0?i-1:i])),r&&3==r.nodeType?r.parentNode:r)},getBookmark:function(e,t){return this.bookmarkManager.getBookmark(e,t)},moveToBookmark:function(e){return this.bookmarkManager.moveToBookmark(e)},select:function(e,t){var n=this,r=n.dom,i=r.createRng(),o;if(n.lastFocusBookmark=null,e){if(!t&&n.controlSelection.controlSelect(e))return;o=r.nodeIndex(e),i.setStart(e.parentNode,o),i.setEnd(e.parentNode,o+1),t&&(n._moveEndPoint(i,e,!0),n._moveEndPoint(i,e)),n.setRng(i)}return e},isCollapsed:function(){var e=this,t=e.getRng(),n=e.getSel();return!t||t.item?!1:t.compareEndPoints?0===t.compareEndPoints("StartToEnd",t):!n||t.collapsed},collapse:function(e){var t=this,n=t.getRng(),r;n.item&&(r=n.item(0),n=t.win.document.body.createTextRange(),n.moveToElementText(r)),n.collapse(!!e),t.setRng(n)},getSel:function(){var e=this.win;return e.getSelection?e.getSelection():e.document.selection},getRng:function(e){function t(e,t,n){try{return t.compareBoundaryPoints(e,n)}catch(r){return-1}}var n=this,r,i,o,a,s,l;if(!n.win)return null;if(a=n.win.document,!e&&n.lastFocusBookmark){var c=n.lastFocusBookmark;return c.startContainer?(i=a.createRange(),i.setStart(c.startContainer,c.startOffset),i.setEnd(c.endContainer,c.endOffset)):i=c,i}if(e&&n.tridentSel)return n.tridentSel.getRangeAt(0);try{(r=n.getSel())&&(i=r.rangeCount>0?r.getRangeAt(0):r.createRange?r.createRange():a.createRange())}catch(u){}if(l=n.editor.fire("GetSelectionRange",{range:i}),l.range!==i)return l.range;if(f&&i&&i.setStart&&a.selection){try{s=a.selection.createRange()}catch(u){}s&&s.item&&(o=s.item(0),i=a.createRange(),i.setStartBefore(o),i.setEndAfter(o))}return i||(i=a.createRange?a.createRange():a.body.createTextRange()),i.setStart&&9===i.startContainer.nodeType&&i.collapsed&&(o=n.dom.getRoot(),i.setStart(o,0),i.setEnd(o,0)),n.selectedRange&&n.explicitRange&&(0===t(i.START_TO_START,i,n.selectedRange)&&0===t(i.END_TO_END,i,n.selectedRange)?i=n.explicitRange:(n.selectedRange=null,n.explicitRange=null)),i},setRng:function(e,t){var n=this,r,i,o;if(e)if(e.select){n.explicitRange=null;try{e.select()}catch(a){}}else if(n.tridentSel){if(e.cloneRange)try{n.tridentSel.addRange(e)}catch(a){}}else{if(r=n.getSel(),o=n.editor.fire("SetSelectionRange",{range:e}),e=o.range,r){n.explicitRange=e;try{r.removeAllRanges(),r.addRange(e)}catch(a){}t===!1&&r.extend&&(r.collapse(e.endContainer,e.endOffset),r.extend(e.startContainer,e.startOffset)),n.selectedRange=r.rangeCount>0?r.getRangeAt(0):null}e.collapsed||e.startContainer!=e.endContainer||!r.setBaseAndExtent||s.ie||e.endOffset-e.startOffset<2&&e.startContainer.hasChildNodes()&&(i=e.startContainer.childNodes[e.startOffset],i&&"IMG"==i.tagName&&n.getSel().setBaseAndExtent(i,0,i,1))}},setNode:function(e){var t=this;return t.setContent(t.dom.getOuterHTML(e)),e},getNode:function(){function e(e,t){for(var n=e;e&&3===e.nodeType&&0===e.length;)e=t?e.nextSibling:e.previousSibling;return e||n}var t=this,n=t.getRng(),r,i=n.startContainer,o=n.endContainer,a=n.startOffset,s=n.endOffset,l=t.dom.getRoot();return n?n.setStart?(r=n.commonAncestorContainer,!n.collapsed&&(i==o&&2>s-a&&i.hasChildNodes()&&(r=i.childNodes[a]),3===i.nodeType&&3===o.nodeType&&(i=i.length===a?e(i.nextSibling,!0):i.parentNode,o=0===s?e(o.previousSibling,!1):o.parentNode,i&&i===o))?i:r&&3==r.nodeType?r.parentNode:r):(r=n.item?n.item(0):n.parentElement(),r.ownerDocument!==t.win.document&&(r=l),r):l},getSelectedBlocks:function(t,n){var r=this,i=r.dom,o,a,s=[];if(a=i.getRoot(),t=i.getParent(t||r.getStart(),i.isBlock),n=i.getParent(n||r.getEnd(),i.isBlock),t&&t!=a&&s.push(t),t&&n&&t!=n){o=t;for(var l=new e(t,a);(o=l.next())&&o!=n;)i.isBlock(o)&&s.push(o)}return n&&t!=n&&n!=a&&s.push(n),s},isForward:function(){var e=this.dom,t=this.getSel(),n,r;return t&&t.anchorNode&&t.focusNode?(n=e.createRng(),n.setStart(t.anchorNode,t.anchorOffset),n.collapse(!0),r=e.createRng(),r.setStart(t.focusNode,t.focusOffset),r.collapse(!0),n.compareBoundaryPoints(n.START_TO_START,r)<=0):!0},normalize:function(){var e=this,t=e.getRng();return s.range&&new i(e.dom).normalize(t)&&e.setRng(t,e.isForward()),t},selectorChanged:function(e,t){var n=this,r;return n.selectorChangedData||(n.selectorChangedData={},r={},n.editor.on("NodeChange",function(e){var t=e.element,i=n.dom,o=i.getParents(t,null,i.getRoot()),a={};u(n.selectorChangedData,function(e,t){u(o,function(n){return i.is(n,t)?(r[t]||(u(e,function(e){e(!0,{node:n,selector:t,parents:o})}),r[t]=e),a[t]=e,!1):void 0})}),u(r,function(e,n){a[n]||(delete r[n],u(e,function(e){e(!1,{node:t,selector:n,parents:o})}))})})),n.selectorChangedData[e]||(n.selectorChangedData[e]=[]),n.selectorChangedData[e].push(t),n},getScrollContainer:function(){for(var e,t=this.dom.getRoot();t&&"BODY"!=t.nodeName;){if(t.scrollHeight>t.clientHeight){e=t;break}t=t.parentNode}return e},scrollIntoView:function(e,t){function n(e){for(var t=0,n=0,r=e;r&&r.nodeType;)t+=r.offsetLeft||0,n+=r.offsetTop||0,r=r.offsetParent;return{x:t,y:n}}var r,i,o=this,s=o.dom,l=s.getRoot(),c,u,d=0;if(a.isElement(e)){if(t===!1&&(d=e.offsetHeight),"BODY"!=l.nodeName){var f=o.getScrollContainer();if(f)return r=n(e).y-n(f).y+d,u=f.clientHeight,c=f.scrollTop,void((c>r||r+25>c+u)&&(f.scrollTop=c>r?r:r-u+25))}i=s.getViewPort(o.editor.getWin()),r=s.getPos(e).y+d,c=i.y,u=i.h,(rc+u)&&o.editor.getWin().scrollTo(0,c>r?r:r-u+25)}},placeCaretAt:function(e,t){this.setRng(i.getCaretRangeFromPoint(e,t,this.editor.getDoc()))},_moveEndPoint:function(t,n,r){var i=n,o=new e(n,i),a=this.dom.schema.getNonEmptyElements();do{if(3==n.nodeType&&0!==d(n.nodeValue).length)return void(r?t.setStart(n,0):t.setEnd(n,n.nodeValue.length));if(a[n.nodeName]&&!/^(TD|TH)$/.test(n.nodeName))return void(r?t.setStartBefore(n):"BR"==n.nodeName?t.setEndBefore(n):t.setEndAfter(n));if(s.ie&&s.ie<11&&this.dom.isBlock(n)&&this.dom.isEmpty(n))return void(r?t.setStart(n,0):t.setEnd(n,0))}while(n=r?o.next():o.prev());"BODY"==i.nodeName&&(r?t.setStart(i,0):t.setEnd(i,i.childNodes.length))},destroy:function(){this.win=null,this.controlSelection.destroy()}},c}),r(X,[j,m],function(e,t){function n(t){this.compare=function(n,i){function o(e){var n={};return r(t.getAttribs(e),function(r){var i=r.nodeName.toLowerCase();0!==i.indexOf("_")&&"style"!==i&&"data-mce-style"!==i&&(n[i]=t.getAttrib(e,i))}),n}function a(e,t){var n,r;for(r in e)if(e.hasOwnProperty(r)){if(n=t[r],"undefined"==typeof n)return!1;if(e[r]!=n)return!1;delete t[r]}for(r in t)if(t.hasOwnProperty(r))return!1;return!0}return n.nodeName!=i.nodeName?!1:a(o(n),o(i))&&a(t.parseStyle(t.getAttrib(n,"style")),t.parseStyle(t.getAttrib(i,"style")))?!e.isBookmarkNode(n)&&!e.isBookmarkNode(i):!1}}var r=t.each;return n}),r(K,[m],function(e){function t(e,t){function r(e){return e.replace(/%(\w+)/g,"")}var i,o,a=e.dom,s="",l,c;if(c=e.settings.preview_styles,c===!1)return"";if(c||(c="font-family font-size font-weight font-style text-decoration text-transform color background-color border border-radius outline text-shadow"),"string"==typeof t){if(t=e.formatter.get(t),!t)return;t=t[0]}return i=t.block||t.inline||"span",o=a.create(i),n(t.styles,function(e,t){e=r(e),e&&a.setStyle(o,t,e)}),n(t.attributes,function(e,t){e=r(e),e&&a.setAttrib(o,t,e)}),n(t.classes,function(e){e=r(e),a.hasClass(o,e)||a.addClass(o,e)}),e.fire("PreviewFormats"),a.setStyles(o,{position:"absolute",left:-65535}),e.getBody().appendChild(o),l=a.getStyle(e.getBody(),"fontSize",!0),l=/px$/.test(l)?parseInt(l,10):0,n(c.split(" "),function(t){var n=a.getStyle(o,t,!0);if(!("background-color"==t&&/transparent|rgba\s*\([^)]+,\s*0\)/.test(n)&&(n=a.getStyle(e.getBody(),t,!0),"#ffffff"==a.toHex(n).toLowerCase())||"color"==t&&"#000000"==a.toHex(n).toLowerCase())){if("font-size"==t&&/em|%$/.test(n)){if(0===l)return;n=parseFloat(n,10)/(/%$/.test(n)?100:1),n=n*l+"px"}"border"==t&&n&&(s+="padding:0 2px;"),s+=t+":"+n+";"}}),e.fire("AfterPreviewFormats"),a.remove(o),s}var n=e.each;return{getCssText:t}}),r(G,[y,T,j,X,m,K],function(e,t,n,r,i,o){return function(a){function s(e){return e.nodeType&&(e=e.nodeName),!!a.schema.getTextBlockElements()[e.toLowerCase()]}function l(e){return/^(TH|TD)$/.test(e.nodeName)}function c(e){return e&&/^(IMG)$/.test(e.nodeName)}function u(e,t){return q.getParents(e,t,q.getRoot())}function d(e){return 1===e.nodeType&&"_mce_caret"===e.id}function f(){m({valigntop:[{selector:"td,th",styles:{verticalAlign:"top"}}],valignmiddle:[{selector:"td,th",styles:{verticalAlign:"middle"}}],valignbottom:[{selector:"td,th",styles:{verticalAlign:"bottom"}}],alignleft:[{selector:"figure.image",collapsed:!1,classes:"align-left",ceFalseOverride:!0},{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"left"},defaultBlock:"div"},{selector:"img,table",collapsed:!1,styles:{"float":"left"}}],aligncenter:[{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"center"},defaultBlock:"div"},{selector:"img",collapsed:!1,styles:{display:"block",marginLeft:"auto",marginRight:"auto"}},{selector:"table",collapsed:!1,styles:{marginLeft:"auto",marginRight:"auto"}}],alignright:[{selector:"figure.image",collapsed:!1,classes:"align-right",ceFalseOverride:!0},{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"right"},defaultBlock:"div"},{selector:"img,table",collapsed:!1,styles:{"float":"right"}}],alignjustify:[{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"justify"},defaultBlock:"div"}],bold:[{inline:"strong",remove:"all"},{inline:"span",styles:{fontWeight:"bold"}},{inline:"b",remove:"all"}],italic:[{inline:"em",remove:"all"},{inline:"span",styles:{fontStyle:"italic"}},{inline:"i",remove:"all"}],underline:[{inline:"span",styles:{textDecoration:"underline"},exact:!0},{inline:"u",remove:"all"}],strikethrough:[{inline:"span",styles:{textDecoration:"line-through"},exact:!0},{inline:"strike",remove:"all"}],forecolor:{inline:"span",styles:{color:"%value"},links:!0,remove_similar:!0},hilitecolor:{inline:"span",styles:{backgroundColor:"%value"},links:!0,remove_similar:!0},fontname:{inline:"span",styles:{fontFamily:"%value"}},fontsize:{inline:"span",styles:{fontSize:"%value"}},fontsize_class:{inline:"span",attributes:{"class":"%value"}},blockquote:{block:"blockquote",wrapper:1,remove:"all"},subscript:{inline:"sub"},superscript:{inline:"sup"},code:{inline:"code"},link:{inline:"a",selector:"a",remove:"all",split:!0,deep:!0,onmatch:function(){return!0},onformat:function(e,t,n){le(n,function(t,n){q.setAttrib(e,n,t)})}},removeformat:[{selector:"b,strong,em,i,font,u,strike,sub,sup,dfn,code,samp,kbd,var,cite,mark,q,del,ins",remove:"all",split:!0,expand:!1,block_expand:!0,deep:!0},{selector:"span",attributes:["style","class"],remove:"empty",split:!0,expand:!1,deep:!0},{selector:"*",attributes:["style","class"],split:!1,expand:!1,deep:!0}]}),le("p h1 h2 h3 h4 h5 h6 div address pre div dt dd samp".split(/\s/),function(e){m(e,{block:e,remove:"all"})}),m(a.settings.formats)}function h(){a.addShortcut("meta+b","bold_desc","Bold"),a.addShortcut("meta+i","italic_desc","Italic"),a.addShortcut("meta+u","underline_desc","Underline");for(var e=1;6>=e;e++)a.addShortcut("access+"+e,"",["FormatBlock",!1,"h"+e]);a.addShortcut("access+7","",["FormatBlock",!1,"p"]),a.addShortcut("access+8","",["FormatBlock",!1,"div"]),a.addShortcut("access+9","",["FormatBlock",!1,"address"])}function p(e){return e?$[e]:$}function m(e,t){e&&("string"!=typeof e?le(e,function(e,t){m(t,e)}):(t=t.length?t:[t],le(t,function(e){e.deep===re&&(e.deep=!e.selector),e.split===re&&(e.split=!e.selector||e.inline),e.remove===re&&e.selector&&!e.inline&&(e.remove="none"),e.selector&&e.inline&&(e.mixed=!0,e.block_expand=!0),"string"==typeof e.classes&&(e.classes=e.classes.split(/\s+/))}),$[e]=t))}function g(e){return e&&$[e]&&delete $[e],$}function v(e){var t;return a.dom.getParent(e,function(e){return t=a.dom.getStyle(e,"text-decoration"),t&&"none"!==t}),t}function y(e){var t;1===e.nodeType&&e.parentNode&&1===e.parentNode.nodeType&&(t=v(e.parentNode),a.dom.getStyle(e,"color")&&t?a.dom.setStyle(e,"text-decoration",t):a.dom.getStyle(e,"text-decoration")===t&&a.dom.setStyle(e,"text-decoration",null))}function b(t,n,r){function i(e,t){if(t=t||u,e){if(t.onformat&&t.onformat(e,t,n,r),le(t.styles,function(t,r){q.setStyle(e,r,D(t,n))}),t.styles){var i=q.getAttrib(e,"style");i&&e.setAttribute("data-mce-style",i)}le(t.attributes,function(t,r){q.setAttrib(e,r,D(t,n))}),le(t.classes,function(t){t=D(t,n),q.hasClass(e,t)||q.addClass(e,t)})}}function o(){function t(t,n){var i=new e(n);for(r=i.current();r;r=i.prev())if(r.childNodes.length>1||r==t||"BR"==r.tagName)return r}var n=a.selection.getRng(),i=n.startContainer,o=n.endContainer;if(i!=o&&0===n.endOffset){var s=t(i,o),l=3==s.nodeType?s.length:s.childNodes.length;n.setEnd(s,l)}return n}function l(e,r,o){var a=[],l,f,h=!0;l=u.inline||u.block,f=q.create(l),i(f),Y.walk(e,function(e){function r(e){var g,v,y,b,C;return C=h,g=e.nodeName.toLowerCase(),v=e.parentNode.nodeName.toLowerCase(),1===e.nodeType&&ie(e)&&(C=h,h="true"===ie(e),b=!0),R(g,"br")?(p=0,void(u.block&&q.remove(e))):u.wrapper&&w(e,t,n)?void(p=0):h&&!b&&u.block&&!u.wrapper&&s(g)&&X(v,l)?(e=q.rename(e,l),i(e),a.push(e),void(p=0)):u.selector&&(le(c,function(t){return"collapsed"in t&&t.collapsed!==m?void 0:q.is(e,t.selector)&&!d(e)?(i(e,t),y=!0,!1):void 0}),!u.inline||y)?void(p=0):void(!h||b||!X(l,g)||!X(v,l)||!o&&3===e.nodeType&&1===e.nodeValue.length&&65279===e.nodeValue.charCodeAt(0)||d(e)||u.inline&&K(e)?(p=0,le(ce(e.childNodes),r),b&&(h=C),p=0):(p||(p=q.clone(f,ee),e.parentNode.insertBefore(p,e),a.push(p)),p.appendChild(e)))}var p;le(e,r)}),u.links===!0&&le(a,function(e){function t(e){"A"===e.nodeName&&i(e,u),le(ce(e.childNodes),t)}t(e)}),le(a,function(e){function r(e){var t=0;return le(e.childNodes,function(e){M(e)||se(e)||t++}),t}function o(e){var t,n;return le(e.childNodes,function(e){return 1!=e.nodeType||se(e)||d(e)?void 0:(t=e,ee)}),t&&!se(t)&&T(t,u)&&(n=q.clone(t,ee),i(n),q.replace(n,e,te),q.remove(t,1)),n||e}var s;if(s=r(e),(a.length>1||!K(e))&&0===s)return void q.remove(e,1);if(u.inline||u.wrapper){if(u.exact||1!==s||(e=o(e)),le(c,function(t){le(q.select(t.inline,e),function(e){se(e)||O(t,n,e,t.exact?e:null)})}),w(e.parentNode,t,n))return q.remove(e,1),e=0,te;u.merge_with_parents&&q.getParent(e.parentNode,function(r){return w(r,t,n)?(q.remove(e,1),e=0,te):void 0}),e&&u.merge_siblings!==!1&&(e=z(F(e),e),e=z(e,F(e,te)))}})}var c=p(t),u=c[0],f,h,m=!r&&j.isCollapsed();if("false"!==ie(j.getNode())){if(u)if(r)r.nodeType?(h=q.createRng(),h.setStartBefore(r),h.setEndAfter(r),l(P(h,c),null,!0)):l(r,null,!0);else if(m&&u.inline&&!q.select("td.mce-item-selected,th.mce-item-selected").length)V("apply",t,n);else{var g=a.selection.getNode();G||!c[0].defaultBlock||q.getParent(g,q.isBlock)||b(c[0].defaultBlock),a.selection.setRng(o()),f=j.getBookmark(),l(P(j.getRng(te),c),f),u.styles&&(u.styles.color||u.styles.textDecoration)&&(ue(g,y,"childNodes"),y(g)),j.moveToBookmark(f),U(j.getRng(te)),a.nodeChanged()}}else{r=j.getNode();for(var v=0,C=c.length;C>v;v++)if(c[v].ceFalseOverride&&q.is(r,c[v].selector))return void i(r,c[v])}}function C(e,t,n,r){function i(e){var n,r,o,a,s;if(1===e.nodeType&&ie(e)&&(a=b,b="true"===ie(e),s=!0),n=ce(e.childNodes),b&&!s)for(r=0,o=h.length;o>r&&!O(h[r],t,e,e);r++);if(m.deep&&n.length){for(r=0,o=n.length;o>r;r++)i(n[r]);s&&(b=a)}}function o(n){var i;return le(u(n.parentNode).reverse(),function(n){var o;i||"_start"==n.id||"_end"==n.id||(o=w(n,e,t,r),o&&o.split!==!1&&(i=n))}),i}function s(e,n,r,i){var o,a,s,l,c,u;if(e){for(u=e.parentNode,o=n.parentNode;o&&o!=u;o=o.parentNode){for(a=q.clone(o,ee),c=0;cC&&(!h[C].ceFalseOverride||!O(h[C],t,n,n));C++);}}function x(e,t,n){var r=p(e);!N(e,t,n)||"toggle"in r[0]&&!r[0].toggle?b(e,t,n):C(e,t,n)}function w(e,t,n,r){function i(e,t,i){var o,a,s=t[i],l;if(t.onmatch)return t.onmatch(e,t,i);if(s)if(s.length===re){for(o in s)if(s.hasOwnProperty(o)){if(a="attributes"===i?q.getAttrib(e,o):A(e,o),r&&!a&&!t.exact)return;if((!r||t.exact)&&!R(a,B(D(s[o],n),o)))return}}else for(l=0;l=0;o--){if(a=t[o].selector,!a||t[o].defaultBlock)return te;for(i=r.length-1;i>=0;i--)if(q.is(r[i],a))return te}return ee}function S(e,t,n){var r;return ne||(ne={},r={},a.on("NodeChange",function(e){var t=u(e.element),n={};t=i.grep(t,function(e){return 1==e.nodeType&&!e.getAttribute("data-mce-bogus")}),le(ne,function(e,i){le(t,function(o){return w(o,i,{},e.similar)?(r[i]||(le(e,function(e){e(!0,{node:o,format:i,parents:t})}),r[i]=e),n[i]=e,!1):void 0})}),le(r,function(i,o){n[o]||(delete r[o],le(i,function(n){n(!1,{node:e.element,format:o,parents:t})}))})})),le(e.split(","),function(e){ne[e]||(ne[e]=[],ne[e].similar=n),ne[e].push(t)}),this}function k(e){return o.getCssText(a,e)}function T(e,t){return R(e,t.inline)?te:R(e,t.block)?te:t.selector?1==e.nodeType&&q.is(e,t.selector):void 0}function R(e,t){return e=e||"",t=t||"",e=""+(e.nodeName||e),t=""+(t.nodeName||t),e.toLowerCase()==t.toLowerCase()}function A(e,t){return B(q.getStyle(e,t),t)}function B(e,t){return("color"==t||"backgroundColor"==t)&&(e=q.toHex(e)),"fontWeight"==t&&700==e&&(e="bold"),"fontFamily"==t&&(e=e.replace(/[\'\"]/g,"").replace(/,\s+/g,",")),""+e}function D(e,t){return"string"!=typeof e?e=e(t):t&&(e=e.replace(/%(\w+)/g,function(e,n){return t[n]||e})),e}function M(e){return e&&3===e.nodeType&&/^([\t \r\n]+|)$/.test(e.nodeValue)}function L(e,t,n){var r=q.create(t,n);return e.parentNode.insertBefore(r,e),r.appendChild(e),r}function P(t,n,r){function i(e){function t(e){return"BR"==e.nodeName&&e.getAttribute("data-mce-bogus")&&!e.nextSibling}var r,i,o,a,s;if(r=i=e?g:y,a=e?"previousSibling":"nextSibling",s=q.getRoot(),3==r.nodeType&&!M(r)&&(e?v>0:bo?n:o,-1===n||r||n++):(n=a.indexOf(" ",t),o=a.indexOf("\xa0",t),n=-1!==n&&(-1===o||o>n)?n:o),n}var s,l,c,u;if(3===t.nodeType){if(c=o(t,n),-1!==c)return{container:t,offset:c};u=t}for(s=new e(t,q.getParent(t,K)||a.getBody());l=s[i?"prev":"next"]();)if(3===l.nodeType){if(u=l,c=o(l),-1!==c)return{container:l,offset:c}}else if(K(l))break;return u?(n=i?0:u.length,{container:u,offset:n}):void 0}function d(e,r){var i,o,a,s;for(3==e.nodeType&&0===e.nodeValue.length&&e[r]&&(e=e[r]),i=u(e),o=0;oh?h:v],3==g.nodeType&&(v=0)),1==y.nodeType&&y.hasChildNodes()&&(h=y.childNodes.length-1,y=y.childNodes[b>h?h:b-1],3==y.nodeType&&(b=y.nodeValue.length)),g=l(g),y=l(y),(se(g.parentNode)||se(g))&&(g=se(g)?g:g.parentNode,g=g.nextSibling||g,3==g.nodeType&&(v=0)),(se(y.parentNode)||se(y))&&(y=se(y)?y:y.parentNode,y=y.previousSibling||y,3==y.nodeType&&(b=y.length)),n[0].inline&&(t.collapsed&&(m=c(g,v,!0),m&&(g=m.container,v=m.offset),m=c(y,b),m&&(y=m.container,b=m.offset)),p=o(y,b),p.node)){for(;p.node&&0===p.offset&&p.node.previousSibling;)p=o(p.node.previousSibling);p.node&&p.offset>0&&3===p.node.nodeType&&" "===p.node.nodeValue.charAt(p.offset-1)&&p.offset>1&&(y=p.node,y.splitText(p.offset-1))}return(n[0].inline||n[0].block_expand)&&(n[0].inline&&3==g.nodeType&&0!==v||(g=i(!0)),n[0].inline&&3==y.nodeType&&b!==y.nodeValue.length||(y=i())),n[0].selector&&n[0].expand!==ee&&!n[0].inline&&(g=d(g,"previousSibling"),y=d(y,"nextSibling")),(n[0].block||n[0].selector)&&(g=f(g,"previousSibling"),y=f(y,"nextSibling"),n[0].block&&(K(g)||(g=i(!0)),K(y)||(y=i()))),1==g.nodeType&&(v=J(g),g=g.parentNode),1==y.nodeType&&(b=J(y)+1,y=y.parentNode),{startContainer:g,startOffset:v,endContainer:y,endOffset:b}}function H(e,t){return t.links&&"A"==e.tagName}function O(e,t,n,r){var i,o,a;if(!T(n,e)&&!H(n,e))return ee;if("all"!=e.remove)for(le(e.styles,function(i,o){i=B(D(i,t),o),"number"==typeof o&&(o=i,r=0),(e.remove_similar||!r||R(A(r,o),i))&&q.setStyle(n,o,""),a=1}),a&&""===q.getAttrib(n,"style")&&(n.removeAttribute("style"),n.removeAttribute("data-mce-style")),le(e.attributes,function(e,i){var o;if(e=D(e,t),"number"==typeof i&&(i=e,r=0),!r||R(q.getAttrib(r,i),e)){if("class"==i&&(e=q.getAttrib(n,i),e&&(o="",le(e.split(/\s+/),function(e){/mce\-\w+/.test(e)&&(o+=(o?" ":"")+e)}),o)))return void q.setAttrib(n,i,o);"class"==i&&n.removeAttribute("className"),Z.test(i)&&n.removeAttribute("data-mce-"+i),n.removeAttribute(i)}}),le(e.classes,function(e){e=D(e,t),(!r||q.hasClass(r,e))&&q.removeClass(n,e)}),o=q.getAttribs(n),i=0;io?o:i]),3===r.nodeType&&n&&i>=r.nodeValue.length&&(r=new e(r,a.getBody()).next()||r),3!==r.nodeType||n||0!==i||(r=new e(r,a.getBody()).prev()||r),r}function V(t,n,r,i){function o(e){var t=q.create("span",{id:g,"data-mce-bogus":!0,style:v?"color:red":""});return e&&t.appendChild(a.getDoc().createTextNode(Q)),t}function l(e,t){for(;e;){if(3===e.nodeType&&e.nodeValue!==Q||e.childNodes.length>1)return!1;t&&1===e.nodeType&&t.push(e),e=e.firstChild}return!0}function c(e){for(;e;){if(e.id===g)return e;e=e.parentNode}}function u(t){var n;if(t)for(n=new e(t,t),t=n.current();t;t=n.next())if(3===t.nodeType)return t}function d(e,t){var n,r;if(e)r=j.getRng(!0),l(e)?(t!==!1&&(r.setStartBefore(e),r.setEndBefore(e)),q.remove(e)):(n=u(e),n.nodeValue.charAt(0)===Q&&(n.deleteData(0,1),r.startContainer==n&&r.startOffset>0&&r.setStart(n,r.startOffset-1),r.endContainer==n&&r.endOffset>0&&r.setEnd(n,r.endOffset-1)),q.remove(e,1)),j.setRng(r);else if(e=c(j.getStart()),!e)for(;e=q.get(g);)d(e,!1)}function f(){var e,t,i,a,s,l,d;e=j.getRng(!0),a=e.startOffset,l=e.startContainer,d=l.nodeValue,t=c(j.getStart()),t&&(i=u(t)),d&&a>0&&a=0;h--)u.appendChild(q.clone(f[h],!1)),u=u.firstChild;u.appendChild(q.doc.createTextNode(Q)),u=u.firstChild;var g=q.getParent(d,s);g&&q.isEmpty(g)?d.parentNode.replaceChild(m,d):q.insertAfter(m,d),j.setCursorLocation(u,1),q.isEmpty(d)&&q.remove(d)}}function m(){var e;e=c(j.getStart()),e&&!q.isEmpty(e)&&ue(e,function(e){1!=e.nodeType||e.id===g||q.isEmpty(e)||q.setAttrib(e,"data-mce-bogus",null)},"childNodes")}var g="_mce_caret",v=a.settings.caret_debug;a._hasCaretEvents||(ae=function(){var e=[],t;if(l(c(j.getStart()),e))for(t=e.length;t--;)q.setAttrib(e[t],"data-mce-bogus","1")},oe=function(e){var t=e.keyCode;d(),8==t&&j.isCollapsed()&&j.getStart().innerHTML==Q&&d(c(j.getStart())),(37==t||39==t)&&d(c(j.getStart())),m()},a.on("SetContent",function(e){e.selection&&m()}),a._hasCaretEvents=!0),"apply"==t?f():h()}function U(t){var n=t.startContainer,r=t.startOffset,i,o,a,s,l;if((t.startContainer!=t.endContainer||!c(t.startContainer.childNodes[t.startOffset]))&&(3==n.nodeType&&r>=n.nodeValue.length&&(r=J(n),n=n.parentNode,i=!0),1==n.nodeType))for(s=n.childNodes,n=s[Math.min(r,s.length-1)],o=new e(n,q.getParent(n,q.isBlock)),(r>s.length-1||i)&&o.next(),a=o.current();a;a=o.next())if(3==a.nodeType&&!M(a))return l=q.create("a",{"data-mce-bogus":"all"},Q),a.parentNode.insertBefore(l,a),t.setStart(a,0),j.setRng(t),void q.remove(l)}var $={},q=a.dom,j=a.selection,Y=new t(q),X=a.schema.isValidChild,K=q.isBlock,G=a.settings.forced_root_block,J=q.nodeIndex,Q="\ufeff",Z=/^(src|href|style)$/,ee=!1,te=!0,ne,re,ie=q.getContentEditable,oe,ae,se=n.isBookmarkNode,le=i.each,ce=i.grep,ue=i.walk,de=i.extend;de(this,{get:p,register:m,unregister:g,apply:b,remove:C,toggle:x,match:N,matchAll:E,matchNode:w,canApply:_,formatChanged:S,getCssText:k}),f(),h(),a.on("BeforeGetContent",function(e){ae&&"raw"!=e.format&&ae()}),a.on("mouseup keydown",function(e){oe&&oe(e)})}}),r(J,[I,h],function(e,t){return function(e){function n(){return e.serializer.getTrimmedContent()}function r(t){e.setDirty(t)}function i(e){o.typing=!1,o.add({},e)}var o=this,a=0,s=[],l,c,u=0;return e.on("init",function(){o.add()}),e.on("BeforeExecCommand",function(e){var t=e.command;"Undo"!=t&&"Redo"!=t&&"mceRepaint"!=t&&o.beforeChange()}),e.on("ExecCommand",function(e){var t=e.command;"Undo"!=t&&"Redo"!=t&&"mceRepaint"!=t&&i(e)}),e.on("ObjectResizeStart Cut",function(){o.beforeChange()}),e.on("SaveContent ObjectResized blur",i),e.on("DragEnd",i),e.on("KeyUp",function(a){var l=a.keyCode;a.isDefaultPrevented()||((l>=33&&36>=l||l>=37&&40>=l||45==l||13==l||a.ctrlKey)&&(i(),e.nodeChanged()),(46==l||8==l||t.mac&&(91==l||93==l))&&e.nodeChanged(),c&&o.typing&&(e.isDirty()||(r(s[0]&&n()!=s[0].content),e.isDirty()&&e.fire("change",{level:s[0],lastLevel:null})),e.fire("TypingUndo"),c=!1,e.nodeChanged()))}),e.on("KeyDown",function(e){var t=e.keyCode;if(!e.isDefaultPrevented()){if(t>=33&&36>=t||t>=37&&40>=t||45==t)return void(o.typing&&i(e));var n=e.ctrlKey&&!e.altKey||e.metaKey;!(16>t||t>20)||224==t||91==t||o.typing||n||(o.beforeChange(),o.typing=!0,o.add({},e),c=!0)}}),e.on("MouseDown",function(e){o.typing&&i(e)}),e.addShortcut("meta+z","","Undo"),e.addShortcut("meta+y,meta+shift+z","","Redo"),e.on("AddUndo Undo Redo ClearUndos",function(t){t.isDefaultPrevented()||e.nodeChanged()}),o={data:s,typing:!1,beforeChange:function(){u||(l=e.selection.getBookmark(2,!0))},add:function(t,i){var o,c=e.settings,d;if(t=t||{},t.content=n(),u||e.removed)return null;if(d=s[a],e.fire("BeforeAddUndo",{level:t,lastLevel:d,originalEvent:i}).isDefaultPrevented())return null;if(d&&d.content==t.content)return null;if(s[a]&&(s[a].beforeBookmark=l),c.custom_undo_redo_levels&&s.length>c.custom_undo_redo_levels){for(o=0;o0&&(r(!0),e.fire("change",f)),t},undo:function(){var t;return o.typing&&(o.add(),o.typing=!1),a>0&&(t=s[--a],e.setContent(t.content,{format:"raw"}),e.selection.moveToBookmark(t.beforeBookmark),r(!0),e.fire("undo",{level:t})),t},redo:function(){var t;return a0||o.typing&&s[0]&&n()!=s[0].content},hasRedo:function(){return aP)&&(u=a.create("br"),t.parentNode.insertBefore(u,t)),l.setStartBefore(t),l.setEndBefore(t)):(l.setStartAfter(t),l.setEndAfter(t)):(l.setStart(t,0),l.setEnd(t,0));s.setRng(l),a.remove(u),s.scrollIntoView(t)}}function y(e){var t=l.forced_root_block;t&&t.toLowerCase()===e.tagName.toLowerCase()&&a.setAttribs(e,l.forced_root_block_attrs)}function b(e){e.innerHTML=r?"":'
    '}function C(e){var t=D,n,i,o,s=u.getTextInlineElements();if(e||"TABLE"==z?(n=a.create(e||V),y(n)):n=L.cloneNode(!1),o=n,l.keep_styles!==!1)do if(s[t.nodeName]){if("_mce_caret"==t.id)continue;i=t.cloneNode(!1),a.setAttrib(i,"id",""),n.hasChildNodes()?(i.appendChild(n.firstChild),n.appendChild(i)):(o=i,n.appendChild(i))}while(t=t.parentNode);return r||(o.innerHTML='
    '),n}function x(t){var n,r,i;if(3==D.nodeType&&(t?M>0:MD.childNodes.length-1,D=D.childNodes[Math.min(M,D.childNodes.length-1)]||D,M=U&&3==D.nodeType?D.nodeValue.length:0),B=S(D)){if(c.beforeChange(),!a.isBlock(B)&&B!=a.getRoot())return void((!V||H)&&E());if((V&&!H||!V&&H)&&(D=w(D,M)),L=a.getParent(D,a.isBlock),F=L?a.getParent(L.parentNode,a.isBlock):null,z=L?L.nodeName.toUpperCase():"",W=F?F.nodeName.toUpperCase():"","LI"!=W||o.ctrlKey||(L=F,z=W),/^(LI|DT|DD)$/.test(z)){if(!V&&H)return void E();if(a.isEmpty(L))return void N()}if("PRE"==z&&l.br_in_pre!==!1){if(!H)return void E()}else if(!V&&!H&&"LI"!=z||V&&H)return void E();V&&L===i.getBody()||(V=V||"P",x()?T():x(!0)?(O=L.parentNode.insertBefore(C(),L),m(O),v(L)):(A=R.cloneRange(),A.setEndAfter(L),I=A.extractContents(),_(I),O=I.firstChild,a.insertAfter(I,L),g(O),k(L),a.isEmpty(L)&&b(L),a.isEmpty(O)?(a.remove(O),T()):v(O)),a.setAttrib(O,"id",""),i.fire("NewBlock",{newBlock:O}),c.add())}}}var a=i.dom,s=i.selection,l=i.settings,c=i.undoManager,u=i.schema,d=u.getNonEmptyElements(),f=u.getMoveCaretBeforeOnEnterElements();i.on("keydown",function(e){13==e.keyCode&&o(e)!==!1&&e.preventDefault()})}}),r(Z,[],function(){return function(e){function t(){var t=i.getStart(),s=e.getBody(),l,c,u,d,f,h,p,m=-16777215,g,v,y,b,C;if(C=n.forced_root_block,t&&1===t.nodeType&&C){for(;t&&t!=s;){if(a[t.nodeName])return;t=t.parentNode}if(l=i.getRng(),l.setStart){c=l.startContainer,u=l.startOffset,d=l.endContainer,f=l.endOffset;try{v=e.getDoc().activeElement===s}catch(x){}}else l.item&&(t=l.item(0),l=e.getDoc().body.createTextRange(),l.moveToElementText(t)),v=l.parentElement().ownerDocument===e.getDoc(),y=l.duplicate(),y.collapse(!0),u=-1*y.move("character",m),y.collapsed||(y=l.duplicate(),y.collapse(!1),f=-1*y.move("character",m)-u);for(t=s.firstChild,b=s.nodeName.toLowerCase();t;)if((3===t.nodeType||1==t.nodeType&&!a[t.nodeName])&&o.isValidChild(b,C.toLowerCase())){if(3===t.nodeType&&0===t.nodeValue.length){p=t,t=t.nextSibling,r.remove(p);continue}h||(h=r.create(C,e.settings.forced_root_block_attrs),t.parentNode.insertBefore(h,t),g=!0),p=t,t=t.nextSibling,h.appendChild(p)}else h=null,t=t.nextSibling;if(g&&v){if(l.setStart)l.setStart(c,u),l.setEnd(d,f),i.setRng(l);else try{l=e.getDoc().body.createTextRange(),l.moveToElementText(s),l.collapse(!0),l.moveStart("character",u),f>0&&l.moveEnd("character",f),l.select()}catch(x){}e.nodeChanged()}}}var n=e.settings,r=e.dom,i=e.selection,o=e.schema,a=o.getBlockElements();n.forced_root_block&&e.on("NodeChange",t)}}),r(ee,[P,h,m,X,T,y],function(e,n,r,i,o,a){var s=r.each,l=r.extend,c=r.map,u=r.inArray,d=r.explode,f=n.ie,h=n.ie&&n.ie<11,p=!0,m=!1;return function(r){function g(e,t,n,i){var o,a,l=0;if(/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint)$/.test(e)||i&&i.skip_focus||r.focus(),i=r.fire("BeforeExecCommand",{command:e,ui:t,value:n}),i.isDefaultPrevented())return!1;if(a=e.toLowerCase(),o=M.exec[a])return o(a,t,n),r.fire("ExecCommand",{command:e,ui:t,value:n}),!0;if(s(r.plugins,function(i){return i.execCommand&&i.execCommand(e,t,n)?(r.fire("ExecCommand",{command:e,ui:t,value:n}),l=!0,!1):void 0}),l)return l;if(r.theme&&r.theme.execCommand&&r.theme.execCommand(e,t,n))return r.fire("ExecCommand",{command:e,ui:t,value:n}),!0;try{l=r.getDoc().execCommand(e,t,n)}catch(c){}return l?(r.fire("ExecCommand",{command:e,ui:t,value:n}),!0):!1}function v(e){var t;if(!r._isHidden()){if(e=e.toLowerCase(),t=M.state[e])return t(e);try{return r.getDoc().queryCommandState(e)}catch(n){}return!1}}function y(e){var t;if(!r._isHidden()){if(e=e.toLowerCase(),t=M.value[e])return t(e);try{return r.getDoc().queryCommandValue(e)}catch(n){}}}function b(e,t){t=t||"exec",s(e,function(e,n){s(n.toLowerCase().split(","),function(n){M[t][n]=e})})}function C(e,t,n){e=e.toLowerCase(),M.exec[e]=function(e,i,o,a){return t.call(n||r,i,o,a)}}function x(e){if(e=e.toLowerCase(),M.exec[e])return!0;try{return r.getDoc().queryCommandSupported(e)}catch(t){}return!1}function w(e,t,n){e=e.toLowerCase(),M.state[e]=function(){return t.call(n||r)}}function N(e,t,n){e=e.toLowerCase(),M.value[e]=function(){return t.call(n||r)}}function E(e){return e=e.toLowerCase(),!!M.exec[e]}function _(e,n,i){return n===t&&(n=m),i===t&&(i=null),r.getDoc().execCommand(e,n,i)}function S(e){return D.match(e)}function k(e,n){D.toggle(e,n?{value:n}:t),r.nodeChanged()}function T(e){P=B.getBookmark(e)}function R(){B.moveToBookmark(P)}var A,B,D,M={state:{},exec:{},value:{}},L=r.settings,P;r.on("PreInit",function(){A=r.dom,B=r.selection,L=r.settings,D=r.formatter}),l(this,{execCommand:g,queryCommandState:v,queryCommandValue:y,queryCommandSupported:x,addCommands:b,addCommand:C,addQueryStateHandler:w,addQueryValueHandler:N,hasCustomCommand:E}),b({"mceResetDesignMode,mceBeginUndoLevel":function(){},"mceEndUndoLevel,mceAddUndoLevel":function(){r.undoManager.add()},"Cut,Copy,Paste":function(e){var t=r.getDoc(),i;try{_(e)}catch(o){i=p}if(i||!t.queryCommandSupported(e)){var a=r.translate("Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X/C/V keyboard shortcuts instead.");n.mac&&(a=a.replace(/Ctrl\+/g,"\u2318+")),r.notificationManager.open({text:a,type:"error"})}},unlink:function(){if(B.isCollapsed()){var e=B.getNode();return void("A"==e.tagName&&r.dom.remove(e,!0))}D.remove("link")},"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull,JustifyNone":function(e){var t=e.substring(7);"full"==t&&(t="justify"),s("left,center,right,justify".split(","),function(e){t!=e&&D.remove("align"+e)}),"none"!=t&&k("align"+t)},"InsertUnorderedList,InsertOrderedList":function(e){var t,n;_(e),t=A.getParent(B.getNode(),"ol,ul"),t&&(n=t.parentNode,/^(H[1-6]|P|ADDRESS|PRE)$/.test(n.nodeName)&&(T(),A.split(n,t),R()))},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(e){k(e)},"ForeColor,HiliteColor,FontName":function(e,t,n){k(e,n)},FontSize:function(e,t,n){var r,i;n>=1&&7>=n&&(i=d(L.font_size_style_values),r=d(L.font_size_classes),n=r?r[n-1]||n:i[n-1]||n),k(e,n)},RemoveFormat:function(e){D.remove(e)},mceBlockQuote:function(){k("blockquote")},FormatBlock:function(e,t,n){return k(n||"p")},mceCleanup:function(){var e=B.getBookmark();r.setContent(r.getContent({cleanup:p}),{cleanup:p}),B.moveToBookmark(e)},mceRemoveNode:function(e,t,n){var i=n||B.getNode();i!=r.getBody()&&(T(),r.dom.remove(i,p),R())},mceSelectNodeDepth:function(e,t,n){var i=0;A.getParent(B.getNode(),function(e){return 1==e.nodeType&&i++==n?(B.select(e),m):void 0},r.getBody())},mceSelectNode:function(e,t,n){B.select(n)},mceInsertContent:function(t,n,o){function a(e){function t(e){return r[e]&&3==r[e].nodeType}var n,r,i;return n=B.getRng(!0),r=n.startContainer,i=n.startOffset,3==r.nodeType&&(i>0?e=e.replace(/^ /," "):t("previousSibling")||(e=e.replace(/^ /," ")),i|)$/," "):t("nextSibling")||(e=e.replace(/( | )(
    |)$/," "))),e}function l(){var e,t,n;e=B.getRng(!0),t=e.startContainer,n=e.startOffset,3==t.nodeType&&e.collapsed&&("\xa0"===t.data[n]?(t.deleteData(n,1),/[\u00a0| ]$/.test(o)||(o+=" ")):"\xa0"===t.data[n-1]&&(t.deleteData(n-1,1),/[\u00a0| ]$/.test(o)||(o=" "+o)))}function c(e){if(E)for(x=e.firstChild;x;x=x.walk(!0))S[x.name]&&x.attr("data-mce-new","true")}function u(){if(E){var e=r.getBody(),t=new i(A);s(A.select("*[data-mce-new]"),function(n){n.removeAttribute("data-mce-new");for(var r=n.parentNode;r&&r!=e;r=r.parentNode)t.compare(r,n)&&A.remove(n,!0)})}}function d(e){function t(e){for(var t=r.getBody();e&&e!==t;e=e.parentNode)if("false"===r.dom.getContentEditable(e))return e;return null}var n;if(e){if(B.scrollIntoView(e),n=t(e))return A.remove(e),void B.select(n);C=A.createRng(),x=e.previousSibling,x&&3==x.nodeType?(C.setStart(x,x.nodeValue.length),f||(w=e.nextSibling,w&&3==w.nodeType&&(x.appendData(w.data),w.parentNode.removeChild(w)))):(C.setStartBefore(e),C.setEndBefore(e)),A.remove(e),B.setRng(C)}}var h,p,m,g,v,y,b,C,x,w,N,E,_,S=r.schema.getTextInlineElements();"string"!=typeof o&&(E=o.merge,_=o.data,o=o.content),/^ | $/.test(o)&&(o=a(o)),h=r.parser,p=new e({validate:L.validate},r.schema),N='​',y={content:o,format:"html",selection:!0},r.fire("BeforeSetContent",y),o=y.content,-1==o.indexOf("{$caret}")&&(o+="{$caret}"),o=o.replace(/\{\$caret\}/,N),C=B.getRng();var k=C.startContainer||(C.parentElement?C.parentElement():null),T=r.getBody();k===T&&B.isCollapsed()&&A.isBlock(T.firstChild)&&A.isEmpty(T.firstChild)&&(C=A.createRng(),C.setStart(T.firstChild,0),C.setEnd(T.firstChild,0),B.setRng(C)),B.isCollapsed()||(r.getDoc().execCommand("Delete",!1,null),l()),m=B.getNode();var R={context:m.nodeName.toLowerCase(),data:_};if(v=h.parse(o,R),c(v),x=v.lastChild,"mce_marker"==x.attr("id"))for(b=x,x=x.prev;x;x=x.walk(!0))if(3==x.type||!A.isBlock(x.name)){r.schema.isValidChild(x.parent.name,"span")&&x.parent.insert(b,x,"br"===x.name);break}if(r._selectionOverrides.showBlockCaretContainer(m),R.invalid){for(B.setContent(N),m=B.getNode(),g=r.getBody(),9==m.nodeType?m=x=g:x=m;x!==g;)m=x,x=x.parentNode;o=m==g?g.innerHTML:A.getOuterHTML(m),o=p.serialize(h.parse(o.replace(//i,function(){return p.serialize(v)}))),m==g?A.setHTML(g,o):A.setOuterHTML(m,o)}else o=p.serialize(v),x=m.firstChild,w=m.lastChild,!x||x===w&&"BR"===x.nodeName?A.setHTML(m,o):B.setContent(o);u(),d(A.get("mce_marker")),r.fire("SetContent",y),r.addVisual()},mceInsertRawHTML:function(e,t,n){B.setContent("tiny_mce_marker"),r.setContent(r.getContent().replace(/tiny_mce_marker/g,function(){return n}))},mceToggleFormat:function(e,t,n){k(n)},mceSetContent:function(e,t,n){r.setContent(n)},"Indent,Outdent":function(e){var t,n,i;t=L.indentation,n=/[a-z%]+$/i.exec(t),t=parseInt(t,10),v("InsertUnorderedList")||v("InsertOrderedList")?_(e):(L.forced_root_block||A.getParent(B.getNode(),A.isBlock)||D.apply("div"),s(B.getSelectedBlocks(),function(o){if("false"!==A.getContentEditable(o)&&"LI"!=o.nodeName){var a=r.getParam("indent_use_margin",!1)?"margin":"padding";a+="rtl"==A.getStyle(o,"direction",!0)?"Right":"Left","outdent"==e?(i=Math.max(0,parseInt(o.style[a]||0,10)-t),A.setStyle(o,a,i?i+n:"")):(i=parseInt(o.style[a]||0,10)+t+n,A.setStyle(o,a,i))}}))},mceRepaint:function(){},InsertHorizontalRule:function(){r.execCommand("mceInsertContent",!1,"
    ")},mceToggleVisualAid:function(){r.hasVisual=!r.hasVisual,r.addVisual()},mceReplaceContent:function(e,t,n){r.execCommand("mceInsertContent",!1,n.replace(/\{\$selection\}/g,B.getContent({format:"text"})))},mceInsertLink:function(e,t,n){var r;"string"==typeof n&&(n={href:n}),r=A.getParent(B.getNode(),"a"),n.href=n.href.replace(" ","%20"),r&&n.href||D.remove("link"),n.href&&D.apply("link",n,r)},selectAll:function(){var e=A.getRoot(),t;B.getRng().setStart?(t=A.createRng(),t.setStart(e,0),t.setEnd(e,e.childNodes.length),B.setRng(t)):(t=B.getRng(),t.item||(t.moveToElementText(e),t.select()))},"delete":function(){_("Delete");var e=r.getBody();A.isEmpty(e)&&(r.setContent(""),e.firstChild&&A.isBlock(e.firstChild)?r.selection.setCursorLocation(e.firstChild,0):r.selection.setCursorLocation(e,0))},mceNewDocument:function(){r.setContent("")},InsertLineBreak:function(e,t,n){function i(){for(var e=new a(m,v),t,n=r.schema.getNonEmptyElements();t=e.next();)if(n[t.nodeName.toLowerCase()]||t.length>0)return!0}var s=n,l,c,u,d=B.getRng(!0);new o(A).normalize(d);var f=d.startOffset,m=d.startContainer;if(1==m.nodeType&&m.hasChildNodes()){var g=f>m.childNodes.length-1;m=m.childNodes[Math.min(f,m.childNodes.length-1)]||m,f=g&&3==m.nodeType?m.nodeValue.length:0}var v=A.getParent(m,A.isBlock),y=v?v.nodeName.toUpperCase():"",b=v?A.getParent(v.parentNode,A.isBlock):null,C=b?b.nodeName.toUpperCase():"",x=s&&s.ctrlKey;"LI"!=C||x||(v=b,y=C),m&&3==m.nodeType&&f>=m.nodeValue.length&&(h||i()||(l=A.create("br"),d.insertNode(l),d.setStartAfter(l),d.setEndAfter(l),c=!0)),l=A.create("br"),d.insertNode(l);var w=A.doc.documentMode;return h&&"PRE"==y&&(!w||8>w)&&l.parentNode.insertBefore(A.doc.createTextNode("\r"),l),u=A.create("span",{}," "),l.parentNode.insertBefore(u,l),B.scrollIntoView(u),A.remove(u),c?(d.setStartBefore(l),d.setEndBefore(l)):(d.setStartAfter(l),d.setEndAfter(l)),B.setRng(d),r.undoManager.add(),p}}),b({"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(e){var t="align"+e.substring(7),n=B.isCollapsed()?[A.getParent(B.getNode(),A.isBlock)]:B.getSelectedBlocks(),r=c(n,function(e){return!!D.matchNode(e,t)});return-1!==u(r,p)},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(e){return S(e)},mceBlockQuote:function(){return S("blockquote")},Outdent:function(){var e;if(L.inline_styles){if((e=A.getParent(B.getStart(),A.isBlock))&&parseInt(e.style.paddingLeft,10)>0)return p;if((e=A.getParent(B.getEnd(),A.isBlock))&&parseInt(e.style.paddingLeft,10)>0)return p}return v("InsertUnorderedList")||v("InsertOrderedList")||!L.inline_styles&&!!A.getParent(B.getNode(),"BLOCKQUOTE")},"InsertUnorderedList,InsertOrderedList":function(e){var t=A.getParent(B.getNode(),"ul,ol");return t&&("insertunorderedlist"===e&&"UL"===t.tagName||"insertorderedlist"===e&&"OL"===t.tagName)}},"state"),b({"FontSize,FontName":function(e){var t=0,n;return(n=A.getParent(B.getNode(),"span"))&&(t="fontsize"==e?n.style.fontSize:n.style.fontFamily.replace(/, /g,",").replace(/[\'\"]/g,"").toLowerCase()),t}},"value"),b({Undo:function(){r.undoManager.undo()},Redo:function(){r.undoManager.redo()}})}}),r(te,[m],function(e){function t(e,o){var a=this,s,l;if(e=r(e),o=a.settings=o||{},s=o.base_uri,/^([\w\-]+):([^\/]{2})/i.test(e)||/^\s*#/.test(e))return void(a.source=e);var c=0===e.indexOf("//");0!==e.indexOf("/")||c||(e=(s?s.protocol||"http":"http")+"://mce_host"+e),/^[\w\-]*:?\/\//.test(e)||(l=o.base_uri?o.base_uri.path:new t(location.href).directory,""===o.base_uri.protocol?e="//mce_host"+a.toAbsPath(l,e):(e=/([^#?]*)([#?]?.*)/.exec(e),e=(s&&s.protocol||"http")+"://mce_host"+a.toAbsPath(l,e[1])+e[2])), +e=e.replace(/@@/g,"(mce_at)"),e=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(e),n(i,function(t,n){var r=e[n];r&&(r=r.replace(/\(mce_at\)/g,"@@")),a[t]=r}),s&&(a.protocol||(a.protocol=s.protocol),a.userInfo||(a.userInfo=s.userInfo),a.port||"mce_host"!==a.host||(a.port=s.port),a.host&&"mce_host"!==a.host||(a.host=s.host),a.source=""),c&&(a.protocol="")}var n=e.each,r=e.trim,i="source protocol authority userInfo user password host port relative path directory file query anchor".split(" "),o={ftp:21,http:80,https:443,mailto:25};return t.prototype={setPath:function(e){var t=this;e=/^(.*?)\/?(\w+)?$/.exec(e),t.path=e[0],t.directory=e[1],t.file=e[2],t.source="",t.getURI()},toRelative:function(e){var n=this,r;if("./"===e)return e;if(e=new t(e,{base_uri:n}),"mce_host"!=e.host&&n.host!=e.host&&e.host||n.port!=e.port||n.protocol!=e.protocol&&""!==e.protocol)return e.getURI();var i=n.getURI(),o=e.getURI();return i==o||"/"==i.charAt(i.length-1)&&i.substr(0,i.length-1)==o?i:(r=n.toRelPath(n.path,e.path),e.query&&(r+="?"+e.query),e.anchor&&(r+="#"+e.anchor),r)},toAbsolute:function(e,n){return e=new t(e,{base_uri:this}),e.getURI(n&&this.isSameOrigin(e))},isSameOrigin:function(e){if(this.host==e.host&&this.protocol==e.protocol){if(this.port==e.port)return!0;var t=o[this.protocol];if(t&&(this.port||t)==(e.port||t))return!0}return!1},toRelPath:function(e,t){var n,r=0,i="",o,a;if(e=e.substring(0,e.lastIndexOf("/")),e=e.split("/"),n=t.split("/"),e.length>=n.length)for(o=0,a=e.length;a>o;o++)if(o>=n.length||e[o]!=n[o]){r=o+1;break}if(e.lengtho;o++)if(o>=e.length||e[o]!=n[o]){r=o+1;break}if(1===r)return t;for(o=0,a=e.length-(r-1);a>o;o++)i+="../";for(o=r-1,a=n.length;a>o;o++)i+=o!=r-1?"/"+n[o]:n[o];return i},toAbsPath:function(e,t){var r,i=0,o=[],a,s;for(a=/\/$/.test(t)?"/":"",e=e.split("/"),t=t.split("/"),n(e,function(e){e&&o.push(e)}),e=o,r=t.length-1,o=[];r>=0;r--)0!==t[r].length&&"."!==t[r]&&(".."!==t[r]?i>0?i--:o.push(t[r]):i++);return r=e.length-i,s=0>=r?o.reverse().join("/"):e.slice(0,r).join("/")+"/"+o.reverse().join("/"),0!==s.indexOf("/")&&(s="/"+s),a&&s.lastIndexOf("/")!==s.length-1&&(s+=a),s},getURI:function(e){var t,n=this;return(!n.source||e)&&(t="",e||(t+=n.protocol?n.protocol+"://":"//",n.userInfo&&(t+=n.userInfo+"@"),n.host&&(t+=n.host),n.port&&(t+=":"+n.port)),n.path&&(t+=n.path),n.query&&(t+="?"+n.query),n.anchor&&(t+="#"+n.anchor),n.source=t),n.source}},t.parseDataUri=function(e){var t,n;return e=decodeURIComponent(e).split(","),n=/data:([^;]+)/.exec(e[0]),n&&(t=n[1]),{type:t,data:e[1]}},t}),r(ne,[m],function(e){function t(){}var n=e.each,r=e.extend,i,o;return t.extend=i=function(e){function t(){var e,t,n,r=this;if(!o&&(r.init&&r.init.apply(r,arguments),t=r.Mixins))for(e=t.length;e--;)n=t[e],n.init&&n.init.apply(r,arguments)}function a(){return this}function s(e,t){return function(){var n=this,r=n._super,i;return n._super=c[e],i=t.apply(n,arguments),n._super=r,i}}var l=this,c=l.prototype,u,d,f;o=!0,u=new l,o=!1,e.Mixins&&(n(e.Mixins,function(t){t=t;for(var n in t)"init"!==n&&(e[n]=t[n])}),c.Mixins&&(e.Mixins=c.Mixins.concat(e.Mixins))),e.Methods&&n(e.Methods.split(","),function(t){e[t]=a}),e.Properties&&n(e.Properties.split(","),function(t){var n="_"+t;e[t]=function(e){var t=this,r;return e!==r?(t[n]=e,t):t[n]}}),e.Statics&&n(e.Statics,function(e,n){t[n]=e}),e.Defaults&&c.Defaults&&(e.Defaults=r({},c.Defaults,e.Defaults));for(d in e)f=e[d],"function"==typeof f&&c[d]?u[d]=s(d,f):u[d]=f;return t.prototype=u,t.constructor=t,t.extend=i,t},t}),r(re,[m],function(e){function t(t){function n(){return!1}function r(){return!0}function i(e,i){var o,s,l,c;if(e=e.toLowerCase(),i=i||{},i.type=e,i.target||(i.target=u),i.preventDefault||(i.preventDefault=function(){i.isDefaultPrevented=r},i.stopPropagation=function(){i.isPropagationStopped=r},i.stopImmediatePropagation=function(){i.isImmediatePropagationStopped=r},i.isDefaultPrevented=n,i.isPropagationStopped=n,i.isImmediatePropagationStopped=n),t.beforeFire&&t.beforeFire(i),o=d[e])for(s=0,l=o.length;l>s;s++){if(c=o[s],c.once&&a(e,c.func),i.isImmediatePropagationStopped())return i.stopPropagation(),i;if(c.func.call(u,i)===!1)return i.preventDefault(),i}return i}function o(t,r,i,o){var a,s,l;if(r===!1&&(r=n),r)for(r={func:r},o&&e.extend(r,o),s=t.toLowerCase().split(" "),l=s.length;l--;)t=s[l],a=d[t],a||(a=d[t]=[],f(t,!0)),i?a.unshift(r):a.push(r);return c}function a(e,t){var n,r,i,o,a;if(e)for(o=e.toLowerCase().split(" "),n=o.length;n--;){if(e=o[n],r=d[e],!e){for(i in d)f(i,!1),delete d[i];return c}if(r){if(t)for(a=r.length;a--;)r[a].func===t&&(r=r.slice(0,a).concat(r.slice(a+1)),d[e]=r);else r.length=0;r.length||(f(e,!1),delete d[e])}}else{for(e in d)f(e,!1);d={}}return c}function s(e,t,n){return o(e,t,n,{once:!0})}function l(e){return e=e.toLowerCase(),!(!d[e]||0===d[e].length)}var c=this,u,d={},f;t=t||{},u=t.scope||c,f=t.toggleEvent||n,c.fire=i,c.on=o,c.off=a,c.once=s,c.has=l}var n=e.makeMap("focus blur focusin focusout click dblclick mousedown mouseup mousemove mouseover beforepaste paste cut copy selectionchange mouseout mouseenter mouseleave wheel keydown keypress keyup input contextmenu dragstart dragend dragover draggesture dragdrop drop drag submit compositionstart compositionend compositionupdate touchstart touchend"," ");return t.isNative=function(e){return!!n[e.toLowerCase()]},t}),r(ie,[],function(){function e(e){this.create=e.create}return e.create=function(t,n){return new e({create:function(e,r){function i(t){e.set(r,t.value)}function o(e){t.set(n,e.value)}var a;return e.on("change:"+r,o),t.on("change:"+n,i),a=e._bindings,a||(a=e._bindings=[],e.on("destroy",function(){for(var e=a.length;e--;)a[e]()})),a.push(function(){t.off("change:"+n,i)}),t.get(n)}})},e}),r(oe,[re],function(e){function t(t){return t._eventDispatcher||(t._eventDispatcher=new e({scope:t,toggleEvent:function(n,r){e.isNative(n)&&t.toggleNativeEvent&&t.toggleNativeEvent(n,r)}})),t._eventDispatcher}return{fire:function(e,n,r){var i=this;if(i.removed&&"remove"!==e)return n;if(n=t(i).fire(e,n,r),r!==!1&&i.parent)for(var o=i.parent();o&&!n.isPropagationStopped();)o.fire(e,n,!1),o=o.parent();return n},on:function(e,n,r){return t(this).on(e,n,r)},off:function(e,n){return t(this).off(e,n)},once:function(e,n){return t(this).once(e,n)},hasEventListeners:function(e){return t(this).has(e)}}}),r(ae,[ie,oe,ne,m],function(e,t,n,r){function i(e){return e.nodeType>0}function o(e,t){var n,a;if(e===t)return!0;if(null===e||null===t)return e===t;if("object"!=typeof e||"object"!=typeof t)return e===t;if(r.isArray(t)){if(e.length!==t.length)return!1;for(n=e.length;n--;)if(!o(e[n],t[n]))return!1}if(i(e)||i(t))return e===t;a={};for(n in t){if(!o(e[n],t[n]))return!1;a[n]=!0}for(n in e)if(!a[n]&&!o(e[n],t[n]))return!1;return!0}return n.extend({Mixins:[t],init:function(t){var n,r;t=t||{};for(n in t)r=t[n],r instanceof e&&(t[n]=r.create(this,n));this.data=t},set:function(t,n){var r,i,a=this.data[t];if(n instanceof e&&(n=n.create(this,t)),"object"==typeof t){for(r in t)this.set(r,t[r]);return this}return o(a,n)||(this.data[t]=n,i={target:this,name:t,value:n,oldValue:a},this.fire("change:"+t,i),this.fire("change",i)),this},get:function(e){return this.data[e]},has:function(e){return e in this.data},bind:function(t){return e.create(this,t)},destroy:function(){this.fire("destroy")}})}),r(se,[ne],function(e){function t(e){for(var t=[],n=e.length,r;n--;)r=e[n],r.__checked||(t.push(r),r.__checked=1);for(n=t.length;n--;)delete t[n].__checked;return t}var n=/^([\w\\*]+)?(?:#([\w\\]+))?(?:\.([\w\\\.]+))?(?:\[\@?([\w\\]+)([\^\$\*!~]?=)([\w\\]+)\])?(?:\:(.+))?/i,r=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,i=/^\s*|\s*$/g,o,a=e.extend({init:function(e){function t(e){return e?(e=e.toLowerCase(),function(t){return"*"===e||t.type===e}):void 0}function o(e){return e?function(t){return t._name===e}:void 0}function a(e){return e?(e=e.split("."),function(t){for(var n=e.length;n--;)if(!t.classes.contains(e[n]))return!1;return!0}):void 0}function s(e,t,n){return e?function(r){var i=r[e]?r[e]():"";return t?"="===t?i===n:"*="===t?i.indexOf(n)>=0:"~="===t?(" "+i+" ").indexOf(" "+n+" ")>=0:"!="===t?i!=n:"^="===t?0===i.indexOf(n):"$="===t?i.substr(i.length-n.length)===n:!1:!!n}:void 0}function l(e){var t;return e?(e=/(?:not\((.+)\))|(.+)/i.exec(e),e[1]?(t=u(e[1],[]),function(e){return!d(e,t)}):(e=e[2],function(t,n,r){return"first"===e?0===n:"last"===e?n===r-1:"even"===e?n%2===0:"odd"===e?n%2===1:t[e]?t[e]():!1})):void 0}function c(e,r,c){function u(e){e&&r.push(e)}var d;return d=n.exec(e.replace(i,"")),u(t(d[1])),u(o(d[2])),u(a(d[3])),u(s(d[4],d[5],d[6])),u(l(d[7])),r.pseudo=!!d[7],r.direct=c,r}function u(e,t){var n=[],i,o,a;do if(r.exec(""),o=r.exec(e),o&&(e=o[3],n.push(o[1]),o[2])){i=o[3];break}while(o);for(i&&u(i,t),e=[],a=0;a"!=n[a]&&e.push(c(n[a],[],">"===n[a-1]));return t.push(e),t}var d=this.match;this._selectors=u(e,[])},match:function(e,t){var n,r,i,o,a,s,l,c,u,d,f,h,p;for(t=t||this._selectors,n=0,r=t.length;r>n;n++){for(a=t[n],o=a.length,p=e,h=0,i=o-1;i>=0;i--)for(c=a[i];p;){if(c.pseudo)for(f=p.parent().items(),u=d=f.length;u--&&f[u]!==p;);for(s=0,l=c.length;l>s;s++)if(!c[s](p,u,d)){s=l+1;break}if(s===l){h++;break}if(i===o-1)break;p=p.parent()}if(h===o)return!0}return!1},find:function(e){function n(e,t,i){var o,a,s,l,c,u=t[i];for(o=0,a=e.length;a>o;o++){for(c=e[o],s=0,l=u.length;l>s;s++)if(!u[s](c,o,a)){s=l+1;break}if(s===l)i==t.length-1?r.push(c):c.items&&n(c.items(),t,i+1);else if(u.direct)return;c.items&&n(c.items(),t,i)}}var r=[],i,s,l=this._selectors;if(e.items){for(i=0,s=l.length;s>i;i++)n(e.items(),l[i],0);s>1&&(r=t(r))}return o||(o=a.Collection),new o(r)}});return a}),r(le,[m,se,ne],function(e,t,n){var r,i,o=Array.prototype.push,a=Array.prototype.slice;return i={length:0,init:function(e){e&&this.add(e)},add:function(t){var n=this;return e.isArray(t)?o.apply(n,t):t instanceof r?n.add(t.toArray()):o.call(n,t),n},set:function(e){var t=this,n=t.length,r;for(t.length=0,t.add(e),r=t.length;n>r;r++)delete t[r];return t},filter:function(e){var n=this,i,o,a=[],s,l;for("string"==typeof e?(e=new t(e),l=function(t){return e.match(t)}):l=e,i=0,o=n.length;o>i;i++)s=n[i],l(s)&&a.push(s);return new r(a)},slice:function(){return new r(a.apply(this,arguments))},eq:function(e){return-1===e?this.slice(e):this.slice(e,+e+1)},each:function(t){return e.each(this,t),this},toArray:function(){return e.toArray(this)},indexOf:function(e){for(var t=this,n=t.length;n--&&t[n]!==e;);return n},reverse:function(){return new r(e.toArray(this).reverse())},hasClass:function(e){return this[0]?this[0].classes.contains(e):!1},prop:function(e,t){var n=this,r,i;return t!==r?(n.each(function(n){n[e]&&n[e](t)}),n):(i=n[0],i&&i[e]?i[e]():void 0)},exec:function(t){var n=this,r=e.toArray(arguments).slice(1);return n.each(function(e){e[t]&&e[t].apply(e,r)}),n},remove:function(){for(var e=this.length;e--;)this[e].remove();return this},addClass:function(e){return this.each(function(t){t.classes.add(e)})},removeClass:function(e){return this.each(function(t){t.classes.remove(e)})}},e.each("fire on off show hide append prepend before after reflow".split(" "),function(t){i[t]=function(){var n=e.toArray(arguments);return this.each(function(e){t in e&&e[t].apply(e,n)}),this}}),e.each("text name disabled active selected checked visible parent value data".split(" "),function(e){i[e]=function(t){return this.prop(e,t)}}),r=n.extend(i),t.Collection=r,r}),r(ce,[m,w],function(e,t){var n=0;return{id:function(){return"mceu_"+n++},createFragment:function(e){return t.DOM.createFragment(e)},getWindowSize:function(){return t.DOM.getViewPort()},getSize:function(e){var t,n;if(e.getBoundingClientRect){var r=e.getBoundingClientRect();t=Math.max(r.width||r.right-r.left,e.offsetWidth),n=Math.max(r.height||r.bottom-r.bottom,e.offsetHeight)}else t=e.offsetWidth,n=e.offsetHeight;return{width:t,height:n}},getPos:function(e,n){return t.DOM.getPos(e,n)},getViewPort:function(e){return t.DOM.getViewPort(e)},get:function(e){return document.getElementById(e)},addClass:function(e,n){return t.DOM.addClass(e,n)},removeClass:function(e,n){return t.DOM.removeClass(e,n)},hasClass:function(e,n){return t.DOM.hasClass(e,n)},toggleClass:function(e,n,r){return t.DOM.toggleClass(e,n,r)},css:function(e,n,r){return t.DOM.setStyle(e,n,r)},getRuntimeStyle:function(e,n){return t.DOM.getStyle(e,n,!0)},on:function(e,n,r,i){return t.DOM.bind(e,n,r,i)},off:function(e,n,r){return t.DOM.unbind(e,n,r)},fire:function(e,n,r){return t.DOM.fire(e,n,r)},innerHtml:function(e,n){t.DOM.setHTML(e,n)}}}),r(ue,[],function(){return{parseBox:function(e){var t,n=10;if(e)return"number"==typeof e?(e=e||0,{top:e,left:e,bottom:e,right:e}):(e=e.split(" "),t=e.length,1===t?e[1]=e[2]=e[3]=e[0]:2===t?(e[2]=e[0],e[3]=e[1]):3===t&&(e[3]=e[1]),{top:parseInt(e[0],n)||0,right:parseInt(e[1],n)||0,bottom:parseInt(e[2],n)||0,left:parseInt(e[3],n)||0})},measureBox:function(e,t){function n(t){var n=document.defaultView;return n?(t=t.replace(/[A-Z]/g,function(e){return"-"+e}),n.getComputedStyle(e,null).getPropertyValue(t)):e.currentStyle[t]}function r(e){var t=parseFloat(n(e),10);return isNaN(t)?0:t}return{top:r(t+"TopWidth"),right:r(t+"RightWidth"),bottom:r(t+"BottomWidth"),left:r(t+"LeftWidth")}}}}),r(de,[m],function(e){function t(){}function n(e){this.cls=[],this.cls._map={},this.onchange=e||t,this.prefix=""}return e.extend(n.prototype,{add:function(e){return e&&!this.contains(e)&&(this.cls._map[e]=!0,this.cls.push(e),this._change()),this},remove:function(e){if(this.contains(e)){for(var t=0;t0&&(e+=" "),e+=this.prefix+this.cls[t];return e},n}),r(fe,[u],function(e){var t={},n;return{add:function(r){var i=r.parent();if(i){if(!i._layout||i._layout.isNative())return;t[i._id]||(t[i._id]=i),n||(n=!0,e.requestAnimationFrame(function(){var e,r;n=!1;for(e in t)r=t[e],r.state.get("rendered")&&r.reflow();t={}},document.body))}},remove:function(e){t[e._id]&&delete t[e._id]}}}),r(he,[ne,m,re,ae,le,ce,g,ue,de,fe],function(e,t,n,r,i,o,a,s,l,c){function u(e){return e._eventDispatcher||(e._eventDispatcher=new n({scope:e,toggleEvent:function(t,r){r&&n.isNative(t)&&(e._nativeEvents||(e._nativeEvents={}),e._nativeEvents[t]=!0,e.state.get("rendered")&&d(e))}})),e._eventDispatcher}function d(e){function t(t){var n=e.getParentCtrl(t.target);n&&n.fire(t.type,t)}function n(){var e=c._lastHoverCtrl;e&&(e.fire("mouseleave",{target:e.getEl()}),e.parents().each(function(e){e.fire("mouseleave",{target:e.getEl()})}),c._lastHoverCtrl=null)}function r(t){var n=e.getParentCtrl(t.target),r=c._lastHoverCtrl,i=0,o,a,s;if(n!==r){if(c._lastHoverCtrl=n,a=n.parents().toArray().reverse(),a.push(n),r){for(s=r.parents().toArray().reverse(),s.push(r),i=0;i=i;o--)r=s[o],r.fire("mouseleave",{target:r.getEl()})}for(o=i;oo;o++)c=l[o]._eventsRoot;for(c||(c=l[l.length-1]||e),e._eventsRoot=c,s=o,o=0;s>o;o++)l[o]._eventsRoot=c;var p=c._delegates;p||(p=c._delegates={});for(d in u){if(!u)return!1;"wheel"!==d||h?("mouseenter"===d||"mouseleave"===d?c._hasMouseEnter||(a(c.getEl()).on("mouseleave",n).on("mouseover",r),c._hasMouseEnter=1):p[d]||(a(c.getEl()).on(d,t),p[d]=!0),u[d]=!1):f?a(e.getEl()).on("mousewheel",i):a(e.getEl()).on("DOMMouseScroll",i)}}}var f="onmousewheel"in document,h=!1,p="mce-",m,g=0,v={Statics:{classPrefix:p},isRtl:function(){return m.rtl},classPrefix:p,init:function(e){function n(e){var t;for(e=e.split(" "),t=0;tn.maxW?n.maxW:i,n.w=i,n.innerW=i-o),i=e.h,i!==s&&(i=in.maxH?n.maxH:i,n.h=i,n.innerH=i-a),i=e.innerW,i!==s&&(i=in.maxW-o?n.maxW-o:i,n.innerW=i,n.w=i+o),i=e.innerH,i!==s&&(i=in.maxH-a?n.maxH-a:i,n.innerH=i,n.h=i+a),e.contentW!==s&&(n.contentW=e.contentW),e.contentH!==s&&(n.contentH=e.contentH),r=t._lastLayoutRect,(r.x!==n.x||r.y!==n.y||r.w!==n.w||r.h!==n.h)&&(l=m.repaintControls,l&&l.map&&!l.map[t._id]&&(l.push(t),l.map[t._id]=!0),r.x=n.x,r.y=n.y,r.w=n.w,r.h=n.h),t):n},repaint:function(){var e=this,t,n,r,i,o,a,s,l,c,u;c=document.createRange?function(e){return e}:Math.round,t=e.getEl().style,i=e._layoutRect,l=e._lastRepaintRect||{},o=e.borderBox,a=o.left+o.right,s=o.top+o.bottom,i.x!==l.x&&(t.left=c(i.x)+"px",l.x=i.x),i.y!==l.y&&(t.top=c(i.y)+"px",l.y=i.y),i.w!==l.w&&(u=c(i.w-a),t.width=(u>=0?u:0)+"px",l.w=i.w),i.h!==l.h&&(u=c(i.h-s),t.height=(u>=0?u:0)+"px",l.h=i.h),e._hasBody&&i.innerW!==l.innerW&&(u=c(i.innerW),r=e.getEl("body"),r&&(n=r.style,n.width=(u>=0?u:0)+"px"),l.innerW=i.innerW),e._hasBody&&i.innerH!==l.innerH&&(u=c(i.innerH),r=r||e.getEl("body"),r&&(n=n||r.style,n.height=(u>=0?u:0)+"px"),l.innerH=i.innerH),e._lastRepaintRect=l,e.fire("repaint",{},!1)},on:function(e,t){function n(e){var t,n;return"string"!=typeof e?e:function(i){return t||r.parentsAndSelf().each(function(r){var i=r.settings.callbacks;return i&&(t=i[e])?(n=r,!1):void 0}),t?t.call(n,i):(i.action=e,void this.fire("execute",i))}}var r=this;return u(r).on(e,n(t)),r},off:function(e,t){return u(this).off(e,t),this},fire:function(e,t,n){var r=this;if(t=t||{},t.control||(t.control=r),t=u(r).fire(e,t),n!==!1&&r.parent)for(var i=r.parent();i&&!t.isPropagationStopped();)i.fire(e,t,!1),i=i.parent();return t},hasEventListeners:function(e){return u(this).has(e)},parents:function(e){var t=this,n,r=new i;for(n=t.parent();n;n=n.parent())r.add(n);return e&&(r=r.filter(e)),r},parentsAndSelf:function(e){return new i(this).add(this.parents(e))},next:function(){var e=this.parent().items();return e[e.indexOf(this)+1]},prev:function(){var e=this.parent().items();return e[e.indexOf(this)-1]},innerHtml:function(e){return this.$el.html(e),this},getEl:function(e){var t=e?this._id+"-"+e:this._id;return this._elmCache[t]||(this._elmCache[t]=a("#"+t)[0]),this._elmCache[t]},show:function(){return this.visible(!0)},hide:function(){return this.visible(!1)},focus:function(){try{this.getEl().focus()}catch(e){}return this},blur:function(){return this.getEl().blur(),this},aria:function(e,t){var n=this,r=n.getEl(n.ariaTarget);return"undefined"==typeof t?n._aria[e]:(n._aria[e]=t,n.state.get("rendered")&&r.setAttribute("role"==e?e:"aria-"+e,t),n)},encode:function(e,t){return t!==!1&&(e=this.translate(e)),(e||"").replace(/[&<>"]/g,function(e){return"&#"+e.charCodeAt(0)+";"})},translate:function(e){return m.translate?m.translate(e):e},before:function(e){var t=this,n=t.parent();return n&&n.insert(e,n.items().indexOf(t),!0),t},after:function(e){var t=this,n=t.parent();return n&&n.insert(e,n.items().indexOf(t)),t},remove:function(){var e=this,t=e.getEl(),n=e.parent(),r,i;if(e.items){var o=e.items().toArray();for(i=o.length;i--;)o[i].remove()}n&&n.items&&(r=[],n.items().each(function(t){t!==e&&r.push(t)}),n.items().set(r),n._lastRect=null),e._eventsRoot&&e._eventsRoot==e&&a(t).off();var s=e.getRoot().controlIdLookup;return s&&delete s[e._id],t&&t.parentNode&&t.parentNode.removeChild(t),e.state.set("rendered",!1),e.state.destroy(),e.fire("remove"),e},renderBefore:function(e){return a(e).before(this.renderHtml()),this.postRender(),this},renderTo:function(e){return a(e||this.getContainerElm()).append(this.renderHtml()),this.postRender(),this},preRender:function(){},render:function(){},renderHtml:function(){return'
    '},postRender:function(){var e=this,t=e.settings,n,r,i,o,s;e.$el=a(e.getEl()),e.state.set("rendered",!0);for(o in t)0===o.indexOf("on")&&e.on(o.substr(2),t[o]);if(e._eventsRoot){for(i=e.parent();!s&&i;i=i.parent())s=i._eventsRoot;if(s)for(o in s._nativeEvents)e._nativeEvents[o]=!0}d(e),t.style&&(n=e.getEl(),n&&(n.setAttribute("style",t.style),n.style.cssText=t.style)),e.settings.border&&(r=e.borderBox,e.$el.css({"border-top-width":r.top,"border-right-width":r.right,"border-bottom-width":r.bottom,"border-left-width":r.left}));var l=e.getRoot();l.controlIdLookup||(l.controlIdLookup={}),l.controlIdLookup[e._id]=e;for(var u in e._aria)e.aria(u,e._aria[u]);e.state.get("visible")===!1&&(e.getEl().style.display="none"),e.bindStates(),e.state.on("change:visible",function(t){var n=t.value,r;e.state.get("rendered")&&(e.getEl().style.display=n===!1?"none":"",e.getEl().getBoundingClientRect()),r=e.parent(),r&&(r._lastRect=null),e.fire(n?"show":"hide"),c.add(e)}),e.fire("postrender",{},!1)},bindStates:function(){},scrollIntoView:function(e){function t(e,t){var n,r,i=e;for(n=r=0;i&&i!=t&&i.nodeType;)n+=i.offsetLeft||0,r+=i.offsetTop||0,i=i.offsetParent;return{x:n,y:r}}var n=this.getEl(),r=n.parentNode,i,o,a,s,l,c,u=t(n,r);return i=u.x,o=u.y,a=n.offsetWidth,s=n.offsetHeight,l=r.clientWidth,c=r.clientHeight,"end"==e?(i-=l-a,o-=c-s):"center"==e&&(i-=l/2-a/2,o-=c/2-s/2),r.scrollLeft=i,r.scrollTop=o,this},getRoot:function(){for(var e=this,t,n=[];e;){if(e.rootControl){t=e.rootControl;break}n.push(e),t=e,e=e.parent()}t||(t=this);for(var r=n.length;r--;)n[r].rootControl=t;return t},reflow:function(){c.remove(this);var e=this.parent();return e._layout&&!e._layout.isNative()&&e.reflow(),this}};return t.each("text title visible disabled active value".split(" "),function(e){v[e]=function(t){return 0===arguments.length?this.state.get(e):("undefined"!=typeof t&&this.state.set(e,t),this)}}),m=e.extend(v)}),r(pe,[],function(){var e={},t;return{add:function(t,n){e[t.toLowerCase()]=n},has:function(t){return!!e[t.toLowerCase()]},create:function(n,r){var i,o,a;if(!t){a=tinymce.ui;for(o in a)e[o.toLowerCase()]=a[o];t=!0}if("string"==typeof n?(r=r||{},r.type=n):(r=n,n=r.type),n=n.toLowerCase(),i=e[n],!i)throw new Error("Could not find control by type: "+n);return i=new i(r),i.type=n,i}}}),r(me,[],function(){return function(e){function t(e){return e&&1===e.nodeType}function n(e){return e=e||C,t(e)?e.getAttribute("role"):null}function r(e){for(var t,r=e||C;r=r.parentNode;)if(t=n(r))return t}function i(e){var n=C;return t(n)?n.getAttribute("aria-"+e):void 0}function o(e){var t=e.tagName.toUpperCase();return"INPUT"==t||"TEXTAREA"==t}function a(e){return o(e)&&!e.hidden?!0:/^(button|menuitem|checkbox|tab|menuitemcheckbox|option|gridcell)$/.test(n(e))?!0:!1}function s(e){function t(e){if(1==e.nodeType&&"none"!=e.style.display){a(e)&&n.push(e);for(var r=0;re?e=t.length-1:e>=t.length&&(e=0),t[e]&&t[e].focus(),e}function d(e,t){var n=-1,r=l();t=t||s(r.getEl());for(var i=0;i=0&&(n=t.getEl(),n&&n.parentNode.removeChild(n),n=e.getEl(),n&&n.parentNode.removeChild(n)),t.parent(this)},create:function(t){var n=this,i,a=[];return o.isArray(t)||(t=[t]),o.each(t,function(t){t&&(t instanceof e||("string"==typeof t&&(t={type:t}),i=o.extend({},n.settings.defaults,t),t.type=i.type=i.type||t.type||n.settings.defaultType||(i.defaults?i.defaults.type:null),t=r.create(i)),a.push(t))}),a},renderNew:function(){var e=this;return e.items().each(function(t,n){var r;t.parent(e),t.state.get("rendered")||(r=e.getEl("body"),r.hasChildNodes()&&n<=r.childNodes.length-1?a(r.childNodes[n]).before(t.renderHtml()):a(r).append(t.renderHtml()),t.postRender(),l.add(t))}),e._layout.applyClasses(e.items().filter(":visible")),e._lastRect=null,e},append:function(e){return this.add(e).renderNew()},prepend:function(e){var t=this;return t.items().set(t.create(e).concat(t.items().toArray())),t.renderNew()},insert:function(e,t,n){var r=this,i,o,a;return e=r.create(e),i=r.items(),!n&&t=0&&t
    '+(e.settings.html||"")+t.renderHtml(e)+"
    "},postRender:function(){var e=this,t;return e.items().exec("postRender"),e._super(),e._layout.postRender(e),e.state.set("rendered",!0),e.settings.style&&e.$el.css(e.settings.style),e.settings.border&&(t=e.borderBox,e.$el.css({"border-top-width":t.top,"border-right-width":t.right,"border-bottom-width":t.bottom,"border-left-width":t.left})),e.parent()||(e.keyboardNav=new i({root:e})),e},initLayoutRect:function(){var e=this,t=e._super();return e._layout.recalc(e),t},recalc:function(){var e=this,t=e._layoutRect,n=e._lastRect;return n&&n.w==t.w&&n.h==t.h?void 0:(e._layout.recalc(e),t=e.layoutRect(),e._lastRect={x:t.x,y:t.y,w:t.w,h:t.h},!0)},reflow:function(){var t;if(l.remove(this),this.visible()){for(e.repaintControls=[],e.repaintControls.map={},this.recalc(),t=e.repaintControls.length;t--;)e.repaintControls[t].repaint();"flow"!==this.settings.layout&&"stack"!==this.settings.layout&&this.repaint(),e.repaintControls=[]}return this}})}),r(ve,[g],function(e){function t(e){var t,n,r,i,o,a,s,l,c=Math.max;return t=e.documentElement,n=e.body,r=c(t.scrollWidth,n.scrollWidth),i=c(t.clientWidth,n.clientWidth),o=c(t.offsetWidth,n.offsetWidth),a=c(t.scrollHeight,n.scrollHeight),s=c(t.clientHeight,n.clientHeight),l=c(t.offsetHeight,n.offsetHeight),{width:o>r?i:r,height:l>a?s:a}}function n(e){var t,n;if(e.changedTouches)for(t="screenX screenY pageX pageY clientX clientY".split(" "),n=0;n").css({position:"absolute",top:0,left:0,width:c.width,height:c.height,zIndex:2147483647,opacity:1e-4,cursor:m}).appendTo(s.body),e(s).on("mousemove touchmove",d).on("mouseup touchend",u),i.start(r)},d=function(e){return n(e),e.button!==l?u(e):(e.deltaX=e.screenX-f,e.deltaY=e.screenY-h,e.preventDefault(),void i.drag(e))},u=function(t){n(t),e(s).off("mousemove touchmove",d).off("mouseup touchend",u),a.remove(),i.stop&&i.stop(t)},this.destroy=function(){e(o()).off()},e(o()).on("mousedown touchstart",c)}}),r(ye,[g,ve],function(e,t){return{init:function(){var e=this;e.on("repaint",e.renderScroll)},renderScroll:function(){function n(){function t(t,a,s,l,c,u){var d,f,h,p,m,g,v,y,b;if(f=i.getEl("scroll"+t)){if(y=a.toLowerCase(),b=s.toLowerCase(),e(i.getEl("absend")).css(y,i.layoutRect()[l]-1),!c)return void e(f).css("display","none");e(f).css("display","block"),d=i.getEl("body"),h=i.getEl("scroll"+t+"t"),p=d["client"+s]-2*o,p-=n&&r?f["client"+u]:0, +m=d["scroll"+s],g=p/m,v={},v[y]=d["offset"+a]+o,v[b]=p,e(f).css(v),v={},v[y]=d["scroll"+a]*g,v[b]=p*g,e(h).css(v)}}var n,r,a;a=i.getEl("body"),n=a.scrollWidth>a.clientWidth,r=a.scrollHeight>a.clientHeight,t("h","Left","Width","contentW",n,"Height"),t("v","Top","Height","contentH",r,"Width")}function r(){function n(n,r,a,s,l){var c,u=i._id+"-scroll"+n,d=i.classPrefix;e(i.getEl()).append('
    '),i.draghelper=new t(u+"t",{start:function(){c=i.getEl("body")["scroll"+r],e("#"+u).addClass(d+"active")},drag:function(e){var t,u,d,f,h=i.layoutRect();u=h.contentW>h.innerW,d=h.contentH>h.innerH,f=i.getEl("body")["client"+a]-2*o,f-=u&&d?i.getEl("scroll"+n)["client"+l]:0,t=f/i.getEl("body")["scroll"+a],i.getEl("body")["scroll"+r]=c+e["delta"+s]/t},stop:function(){e("#"+u).removeClass(d+"active")}})}i.classes.add("scroll"),n("v","Top","Height","Y","Width"),n("h","Left","Width","X","Height")}var i=this,o=2;i.settings.autoScroll&&(i._hasScroll||(i._hasScroll=!0,r(),i.on("wheel",function(e){var t=i.getEl("body");t.scrollLeft+=10*(e.deltaX||0),t.scrollTop+=10*e.deltaY,n()}),e(i.getEl("body")).on("scroll",n)),n())}}}),r(be,[ge,ye],function(e,t){return e.extend({Defaults:{layout:"fit",containerCls:"panel"},Mixins:[t],renderHtml:function(){var e=this,t=e._layout,n=e.settings.html;return e.preRender(),t.preRender(e),"undefined"==typeof n?n='
    '+t.renderHtml(e)+"
    ":("function"==typeof n&&(n=n.call(e)),e._hasBody=!1),'
    '+(e._preBodyHtml||"")+n+"
    "}})}),r(Ce,[ce],function(e){function t(t,n,r){var i,o,a,s,l,c,u,d,f,h;return f=e.getViewPort(),o=e.getPos(n),a=o.x,s=o.y,t.state.get("fixed")&&"static"==e.getRuntimeStyle(document.body,"position")&&(a-=f.x,s-=f.y),i=t.getEl(),h=e.getSize(i),l=h.width,c=h.height,h=e.getSize(n),u=h.width,d=h.height,r=(r||"").split(""),"b"===r[0]&&(s+=d),"r"===r[1]&&(a+=u),"c"===r[0]&&(s+=Math.round(d/2)),"c"===r[1]&&(a+=Math.round(u/2)),"b"===r[3]&&(s-=c),"r"===r[4]&&(a-=l),"c"===r[3]&&(s-=Math.round(c/2)),"c"===r[4]&&(a-=Math.round(l/2)),{x:a,y:s,w:l,h:c}}return{testMoveRel:function(n,r){for(var i=e.getViewPort(),o=0;o0&&a.x+a.w0&&a.y+a.hi.x&&a.x+a.wi.y&&a.y+a.he?0:e+n>t?(e=t-n,0>e?0:e):e}var i=this;if(i.settings.constrainToViewport){var o=e.getViewPort(window),a=i.layoutRect();t=r(t,o.w+o.x,a.w),n=r(n,o.h+o.y,a.h)}return i.state.get("rendered")?i.layoutRect({x:t,y:n}).repaint():(i.settings.x=t,i.settings.y=n),i.fire("move",{x:t,y:n}),i}}}),r(xe,[ce],function(e){return{resizeToContent:function(){this._layoutRect.autoResize=!0,this._lastRect=null,this.reflow()},resizeTo:function(t,n){if(1>=t||1>=n){var r=e.getWindowSize();t=1>=t?t*r.w:t,n=1>=n?n*r.h:n}return this._layoutRect.autoResize=!1,this.layoutRect({minW:t,minH:n,w:t,h:n}).reflow()},resizeBy:function(e,t){var n=this,r=n.layoutRect();return n.resizeTo(r.w+e,r.h+t)}}}),r(we,[be,Ce,xe,ce,g,u],function(e,t,n,r,i,o){function a(e,t){for(;e;){if(e==t)return!0;e=e.parent()}}function s(e){for(var t=v.length;t--;){var n=v[t],r=n.getParentCtrl(e.target);if(n.settings.autohide){if(r&&(a(r,n)||n.parent()===r))continue;e=n.fire("autohide",{target:e.target}),e.isDefaultPrevented()||n.hide()}}}function l(){p||(p=function(e){2!=e.button&&s(e)},i(document).on("click touchstart",p))}function c(){m||(m=function(){var e;for(e=v.length;e--;)d(v[e])},i(window).on("scroll",m))}function u(){if(!g){var e=document.documentElement,t=e.clientWidth,n=e.clientHeight;g=function(){document.all&&t==e.clientWidth&&n==e.clientHeight||(t=e.clientWidth,n=e.clientHeight,C.hideAll())},i(window).on("resize",g)}}function d(e){function t(t,n){for(var r,i=0;in&&(e.fixed(!1).layoutRect({y:e._autoFixY}).repaint(),t(!1,e._autoFixY-n)):(e._autoFixY=e.layoutRect().y,e._autoFixY
    ').appendTo(t.getContainerElm())),o.setTimeout(function(){n.addClass(r+"in"),i(t.getEl()).addClass(r+"in")}),b=!0),f(!0,t)}}),t.on("show",function(){t.parents().each(function(e){return e.state.get("fixed")?(t.fixed(!0),!1):void 0})}),e.popover&&(t._preBodyHtml='
    ',t.classes.add("popover").add("bottom").add(t.isRtl()?"end":"start"))},fixed:function(e){var t=this;if(t.state.get("fixed")!=e){if(t.state.get("rendered")){var n=r.getViewPort();e?t.layoutRect().y-=n.y:t.layoutRect().y+=n.y}t.classes.toggle("fixed",e),t.state.set("fixed",e)}return t},show:function(){var e=this,t,n=e._super();for(t=v.length;t--&&v[t]!==e;);return-1===t&&v.push(e),n},hide:function(){return h(this),f(!1,this),this._super()},hideAll:function(){C.hideAll()},close:function(){var e=this;return e.fire("close").isDefaultPrevented()||(e.remove(),f(!1,e)),e},remove:function(){h(this),this._super()},postRender:function(){var e=this;return e.settings.bodyRole&&this.getEl("body").setAttribute("role",e.settings.bodyRole),e._super()}});return C.hideAll=function(){for(var e=v.length;e--;){var t=v[e];t&&t.settings.autohide&&(t.hide(),v.splice(e,1))}},C}),r(Ne,[we,be,ce,g,ve,ue,h,u],function(e,t,n,r,i,o,a,s){function l(e){var t="width=device-width,initial-scale=1.0,user-scalable=0,minimum-scale=1.0,maximum-scale=1.0",n=r("meta[name=viewport]")[0],i;a.overrideViewPort!==!1&&(n||(n=document.createElement("meta"),n.setAttribute("name","viewport"),document.getElementsByTagName("head")[0].appendChild(n)),i=n.getAttribute("content"),i&&"undefined"!=typeof f&&(f=i),n.setAttribute("content",e?t:f))}function c(e){for(var t=0;tr.w&&(o=r.x-Math.max(0,i/2),e.layoutRect({w:i,x:o}),a=!0)),t&&(t.layoutRect({w:e.layoutRect().innerW}).recalc(),i=t.layoutRect().minW+r.deltaW,i>r.w&&(o=r.x-Math.max(0,i-r.w),e.layoutRect({w:i,x:o}),a=!0)),a&&e.recalc()},initLayoutRect:function(){var e=this,t=e._super(),r=0,i;if(e.settings.title&&!e._fullscreen){i=e.getEl("head");var o=n.getSize(i);t.headerW=o.width,t.headerH=o.height,r+=t.headerH}e.statusbar&&(r+=e.statusbar.layoutRect().h),t.deltaH+=r,t.minH+=r,t.h+=r;var a=n.getWindowSize();return t.x=e.settings.x||Math.max(0,a.w/2-t.w/2),t.y=e.settings.y||Math.max(0,a.h/2-t.h/2),t},renderHtml:function(){var e=this,t=e._layout,n=e._id,r=e.classPrefix,i=e.settings,o="",a="",s=i.html;return e.preRender(),t.preRender(e),i.title&&(o='
    '+e.encode(i.title)+'
    '),i.url&&(s=''),"undefined"==typeof s&&(s=t.renderHtml(e)),e.statusbar&&(a=e.statusbar.renderHtml()),'
    '+o+'
    '+s+"
    "+a+"
    "},fullscreen:function(e){var t=this,i=document.documentElement,a,l=t.classPrefix,c;if(e!=t._fullscreen)if(r(window).on("resize",function(){var e;if(t._fullscreen)if(a)t._timer||(t._timer=s.setTimeout(function(){var e=n.getWindowSize();t.moveTo(0,0).resizeTo(e.w,e.h),t._timer=0},50));else{e=(new Date).getTime();var r=n.getWindowSize();t.moveTo(0,0).resizeTo(r.w,r.h),(new Date).getTime()-e>50&&(a=!0)}}),c=t.layoutRect(),t._fullscreen=e,e){t._initial={x:c.x,y:c.y,w:c.w,h:c.h},t.borderBox=o.parseBox("0"),t.getEl("head").style.display="none",c.deltaH-=c.headerH+2,r([i,document.body]).addClass(l+"fullscreen"),t.classes.add("fullscreen");var u=n.getWindowSize();t.moveTo(0,0).resizeTo(u.w,u.h)}else t.borderBox=o.parseBox(t.settings.border),t.getEl("head").style.display="",c.deltaH+=c.headerH,r([i,document.body]).removeClass(l+"fullscreen"),t.classes.remove("fullscreen"),t.moveTo(t._initial.x,t._initial.y).resizeTo(t._initial.w,t._initial.h);return t.reflow()},postRender:function(){var e=this,t;setTimeout(function(){e.classes.add("in")},0),e._super(),e.statusbar&&e.statusbar.postRender(),e.focus(),this.dragHelper=new i(e._id+"-dragh",{start:function(){t={x:e.layoutRect().x,y:e.layoutRect().y}},drag:function(n){e.moveTo(t.x+n.deltaX,t.y+n.deltaY)}}),e.on("submit",function(t){t.isDefaultPrevented()||e.close()}),d.push(e),l(!0)},submit:function(){return this.fire("submit",{data:this.toJSON()})},remove:function(){var e=this,t;for(e.dragHelper.destroy(),e._super(),e.statusbar&&this.statusbar.remove(),t=d.length;t--;)d[t]===e&&d.splice(t,1);l(d.length>0),c(e.classPrefix)},getContentWindow:function(){var e=this.getEl().getElementsByTagName("iframe")[0];return e?e.contentWindow:null}});return a.desktop||u(),h}),r(Ee,[Ne],function(e){var t=e.extend({init:function(e){e={border:1,padding:20,layout:"flex",pack:"center",align:"center",containerCls:"panel",autoScroll:!0,buttons:{type:"button",text:"Ok",action:"ok"},items:{type:"label",multiline:!0,maxWidth:500,maxHeight:200}},this._super(e)},Statics:{OK:1,OK_CANCEL:2,YES_NO:3,YES_NO_CANCEL:4,msgBox:function(n){function r(e,t,n){return{type:"button",text:e,subtype:n?"primary":"",onClick:function(e){e.control.parents()[1].close(),o(t)}}}var i,o=n.callback||function(){};switch(n.buttons){case t.OK_CANCEL:i=[r("Ok",!0,!0),r("Cancel",!1)];break;case t.YES_NO:case t.YES_NO_CANCEL:i=[r("Yes",1,!0),r("No",0)],n.buttons==t.YES_NO_CANCEL&&i.push(r("Cancel",-1));break;default:i=[r("Ok",!0,!0)]}return new e({padding:20,x:n.x,y:n.y,minWidth:300,minHeight:100,layout:"flex",pack:"center",align:"center",buttons:i,title:n.title,role:"alertdialog",items:{type:"label",multiline:!0,maxWidth:500,maxHeight:200,text:n.text},onPostRender:function(){this.aria("describedby",this.items()[0]._id)},onClose:n.onClose,onCancel:function(){o(!1)}}).renderTo(document.body).reflow()},alert:function(e,n){return"string"==typeof e&&(e={text:e}),e.callback=n,t.msgBox(e)},confirm:function(e,n){return"string"==typeof e&&(e={text:e}),e.callback=n,e.buttons=t.OK_CANCEL,t.msgBox(e)}}});return t}),r(_e,[Ne,Ee],function(e,t){return function(n){function r(){return o.length?o[o.length-1]:void 0}var i=this,o=[];i.windows=o,n.on("remove",function(){for(var e=o.length;e--;)o[e].close()}),i.open=function(t,r){var i;return n.editorManager.setActive(n),t.title=t.title||" ",t.url=t.url||t.file,t.url&&(t.width=parseInt(t.width||320,10),t.height=parseInt(t.height||240,10)),t.body&&(t.items={defaults:t.defaults,type:t.bodyType||"form",items:t.body}),t.url||t.buttons||(t.buttons=[{text:"Ok",subtype:"primary",onclick:function(){i.find("form")[0].submit()}},{text:"Cancel",onclick:function(){i.close()}}]),i=new e(t),o.push(i),i.on("close",function(){for(var e=o.length;e--;)o[e]===i&&o.splice(e,1);o.length||n.focus()}),t.data&&i.on("postRender",function(){this.find("*").each(function(e){var n=e.name();n in t.data&&e.value(t.data[n])})}),i.features=t||{},i.params=r||{},1===o.length&&n.nodeChanged(),i.renderTo().reflow()},i.alert=function(e,r,i){t.alert(e,function(){r?r.call(i||this):n.focus()})},i.confirm=function(e,n,r){t.confirm(e,function(e){n.call(r||this,e)})},i.close=function(){r()&&r().close()},i.getParams=function(){return r()?r().params:null},i.setParams=function(e){r()&&(r().params=e)},i.getWindows=function(){return o}}}),r(Se,[he,Ce],function(e,t){return e.extend({Mixins:[t],Defaults:{classes:"widget tooltip tooltip-n"},renderHtml:function(){var e=this,t=e.classPrefix;return'"},bindStates:function(){var e=this;return e.state.on("change:text",function(t){e.getEl().lastChild.innerHTML=e.encode(t.value)}),e._super()},repaint:function(){var e=this,t,n;t=e.getEl().style,n=e._layoutRect,t.left=n.x+"px",t.top=n.y+"px",t.zIndex=131070}})}),r(ke,[he,Se],function(e,t){var n,r=e.extend({init:function(e){var t=this;t._super(e),e=t.settings,t.canFocus=!0,e.tooltip&&r.tooltips!==!1&&(t.on("mouseenter",function(n){var r=t.tooltip().moveTo(-65535);if(n.control==t){var i=r.text(e.tooltip).show().testMoveRel(t.getEl(),["bc-tc","bc-tl","bc-tr"]);r.classes.toggle("tooltip-n","bc-tc"==i),r.classes.toggle("tooltip-nw","bc-tl"==i),r.classes.toggle("tooltip-ne","bc-tr"==i),r.moveRel(t.getEl(),i)}else r.hide()}),t.on("mouseleave mousedown click",function(){t.tooltip().hide()})),t.aria("label",e.ariaLabel||e.tooltip)},tooltip:function(){return n||(n=new t({type:"tooltip"}),n.renderTo()),n},postRender:function(){var e=this,t=e.settings;e._super(),e.parent()||!t.width&&!t.height||(e.initLayoutRect(),e.repaint()),t.autofocus&&e.focus()},bindStates:function(){function e(e){n.aria("disabled",e),n.classes.toggle("disabled",e)}function t(e){n.aria("pressed",e),n.classes.toggle("active",e)}var n=this;return n.state.on("change:disabled",function(t){e(t.value)}),n.state.on("change:active",function(e){t(e.value)}),n.state.get("disabled")&&e(!0),n.state.get("active")&&t(!0),n._super()},remove:function(){this._super(),n&&(n.remove(),n=null)}});return r}),r(Te,[ke],function(e){return e.extend({Defaults:{value:0},init:function(e){var t=this;t._super(e),t.classes.add("progress"),t.settings.filter||(t.settings.filter=function(e){return Math.round(e)})},renderHtml:function(){var e=this,t=e._id,n=this.classPrefix;return'
    0%
    '},postRender:function(){var e=this;return e._super(),e.value(e.settings.value),e},bindStates:function(){function e(e){e=t.settings.filter(e),t.getEl().lastChild.innerHTML=e+"%",t.getEl().firstChild.firstChild.style.width=e+"%"}var t=this;return t.state.on("change:value",function(t){e(t.value)}),e(t.state.get("value")),t._super()}})}),r(Re,[he,Ce,Te],function(e,t,n){return e.extend({Mixins:[t],Defaults:{classes:"widget notification"},init:function(e){var t=this;t._super(e),e.text&&t.text(e.text),e.icon&&(t.icon=e.icon),e.color&&(t.color=e.color),e.type&&t.classes.add("notification-"+e.type),e.timeout&&(e.timeout<0||e.timeout>0)&&!e.closeButton?t.closeButton=!1:(t.classes.add("has-close"),t.closeButton=!0),e.progressBar&&(t.progressBar=new n),t.on("click",function(e){-1!=e.target.className.indexOf(t.classPrefix+"close")&&t.close()})},renderHtml:function(){var e=this,t=e.classPrefix,n="",r="",i="",o="";return e.icon&&(n=''),e.color&&(o=' style="background-color: '+e.color+'"'),e.closeButton&&(r=''),e.progressBar&&(i=e.progressBar.renderHtml()),'"},bindStates:function(){var e=this;return e.state.on("change:text",function(t){e.getEl().childNodes[1].innerHTML=t.value}),e.progressBar&&e.progressBar.bindStates(),e._super()},close:function(){var e=this;return e.fire("close").isDefaultPrevented()||e.remove(),e},repaint:function(){var e=this,t,n;t=e.getEl().style,n=e._layoutRect,t.left=n.x+"px",t.top=n.y+"px",t.zIndex=131070}})}),r(Ae,[Re,u],function(e,t){return function(n){function r(){return l.length?l[l.length-1]:void 0}function i(){t.requestAnimationFrame(function(){o(),a()})}function o(){for(var e=0;e0){var e=l.slice(0,1)[0],t=n.inline?n.getElement():n.getContentAreaContainer();if(e.moveRel(t,"tc-tc"),l.length>1)for(var r=1;r0&&(r.timer=setTimeout(function(){r.close()},t.timeout)),r.on("close",function(){var e=l.length;for(r.timer&&n.getWin().clearTimeout(r.timer);e--;)l[e]===r&&l.splice(e,1);a()}),r.renderTo(),a(),r},s.close=function(){r()&&r().close()},s.getNotifications=function(){return l}}}),r(Be,[w],function(e){function t(t,n,r){for(var i=[];n&&n!=t;n=n.parentNode)i.push(e.nodeIndex(n,r));return i}function n(e,t){var n,r,i;for(r=e,n=t.length-1;n>=0;n--){if(i=r.childNodes,t[n]>i.length-1)return null;r=i[t[n]]}return r}return{create:t,resolve:n}}),r(De,[I,T,y,Be,A,C,h,m,u,k],function(e,t,n,r,i,o,a,s,l,c){return function(u){function d(e,t){try{u.getDoc().execCommand(e,!1,t)}catch(n){}}function f(){var e=u.getDoc().documentMode;return e?e:6}function h(e){return e.isDefaultPrevented()}function p(e){var t,n;e.dataTransfer&&(u.selection.isCollapsed()&&"IMG"==e.target.tagName&&Q.select(e.target),t=u.selection.getContent(),t.length>0&&(n=oe+escape(u.id)+","+escape(t),e.dataTransfer.setData(ae,n)))}function m(e){var t;return e.dataTransfer&&(t=e.dataTransfer.getData(ae),t&&t.indexOf(oe)>=0)?(t=t.substr(oe.length).split(","),{id:unescape(t[0]),html:unescape(t[1])}):null}function g(e){u.queryCommandSupported("mceInsertClipboardContent")?u.execCommand("mceInsertClipboardContent",!1,{content:e}):u.execCommand("mceInsertContent",!1,e)}function v(){function i(e){var t=C.schema.getBlockElements(),n=u.getBody();if("BR"!=e.nodeName)return!1;for(e=e;e!=n&&!t[e.nodeName];e=e.parentNode)if(e.nextSibling)return!1;return!0}function o(e,t){var n;for(n=e.nextSibling;n&&n!=t;n=n.nextSibling)if((3!=n.nodeType||0!==X.trim(n.data).length)&&n!==t)return!1;return n===t}function a(e,t,r){var o,a,s;for(s=C.schema.getNonEmptyElements(),o=new n(r||e,e);a=o[t?"next":"prev"]();){if(s[a.nodeName]&&!i(a))return a;if(3==a.nodeType&&a.data.length>0)return a}}function c(e){var n,r,i,o,s;if(!e.collapsed&&(n=C.getParent(t.getNode(e.startContainer,e.startOffset),C.isBlock),r=C.getParent(t.getNode(e.endContainer,e.endOffset),C.isBlock),s=u.schema.getTextBlockElements(),n!=r&&s[n.nodeName]&&s[r.nodeName]&&"false"!==C.getContentEditable(n)&&"false"!==C.getContentEditable(r)))return e.deleteContents(),i=a(n,!1),o=a(r,!0),C.isEmpty(r)||X(n).append(r.childNodes),X(r).remove(),i?1==i.nodeType?"BR"==i.nodeName?(e.setStartBefore(i),e.setEndBefore(i)):(e.setStartAfter(i),e.setEndAfter(i)):(e.setStart(i,i.data.length),e.setEnd(i,i.data.length)):o&&(1==o.nodeType?(e.setStartBefore(o),e.setEndBefore(o)):(e.setStart(o,0),e.setEnd(o,0))),x.setRng(e),!0}function d(e,n){var r,i,s,l,c,d;if(!e.collapsed)return e;if(c=e.startContainer,d=e.startOffset,3==c.nodeType)if(n){if(d0)return e;if(r=t.getNode(e.startContainer,e.startOffset),s=C.getParent(r,C.isBlock),i=a(u.getBody(),n,r),l=C.getParent(i,C.isBlock),!r||!i)return e;if(l&&s!=l)if(n){if(!o(s,l))return e;1==r.nodeType?"BR"==r.nodeName?e.setStartBefore(r):e.setStartAfter(r):e.setStart(r,r.data.length),1==i.nodeType?e.setEnd(i,0):e.setEndBefore(i)}else{if(!o(l,s))return e;1==i.nodeType?"BR"==i.nodeName?e.setStartBefore(i):e.setStartAfter(i):e.setStart(i,i.data.length),1==r.nodeType?e.setEnd(r,0):e.setEndBefore(r)}return e}function f(e){var t=x.getRng();return t=d(t,e),c(t)?!0:void 0}function v(e,t){function n(e,n){return m=X(n).parents().filter(function(e,t){return!!u.schema.getTextInlineElements()[t.nodeName]}),l=e.cloneNode(!1),m=s.map(m,function(e){return e=e.cloneNode(!1),l.hasChildNodes()?(e.appendChild(l.firstChild),l.appendChild(e)):l.appendChild(e),l.appendChild(e),e}),m.length?(p=C.create("br"),m[0].appendChild(p),C.replace(l,e),t.setStartBefore(p),t.setEndBefore(p),u.selection.setRng(t),p):null}function i(e){return e&&u.schema.getTextBlockElements()[e.tagName]}var o,a,l,c,d,f,h,p,m;if(t.collapsed&&(f=t.startContainer,h=t.startOffset,a=C.getParent(f,C.isBlock),i(a)))if(1==f.nodeType){if(f=f.childNodes[h],f&&"BR"!=f.tagName)return;if(d=e?a.nextSibling:a.previousSibling,C.isEmpty(a)&&i(d)&&C.isEmpty(d)&&n(a,f))return C.remove(d),!0}else if(3==f.nodeType){if(o=r.create(a,f),c=a.cloneNode(!0),f=r.resolve(c,o),e){if(h>=f.data.length)return;f.deleteData(h,1)}else{if(0>=h)return;f.deleteData(h-1,1)}if(C.isEmpty(c))return n(a,f)}}function y(e){var t,n,r;f(e)||(s.each(u.getBody().getElementsByTagName("*"),function(e){"SPAN"==e.tagName&&e.setAttribute("mce-data-marked",1),!e.hasAttribute("data-mce-style")&&e.hasAttribute("style")&&u.dom.setAttrib(e,"style",u.dom.getAttrib(e,"style"))}),t=new w(function(){}),t.observe(u.getDoc(),{childList:!0,attributes:!0,subtree:!0,attributeFilter:["style"]}),u.getDoc().execCommand(e?"ForwardDelete":"Delete",!1,null),n=u.selection.getRng(),r=n.startContainer.parentNode,s.each(t.takeRecords(),function(e){if(C.isChildOf(e.target,u.getBody())){if("style"==e.attributeName){var t=e.target.getAttribute("data-mce-style");t?e.target.setAttribute("style",t):e.target.removeAttribute("style")}s.each(e.addedNodes,function(e){if("SPAN"==e.nodeName&&!e.getAttribute("mce-data-marked")){var t,i;e==r&&(t=n.startOffset,i=e.firstChild),C.remove(e,!0),i&&(n.setStart(i,t),n.setEnd(i,t),u.selection.setRng(n))}})}}),t.disconnect(),s.each(u.dom.select("span[mce-data-marked]"),function(e){e.removeAttribute("mce-data-marked")}))}var b=u.getDoc(),C=u.dom,x=u.selection,w=window.MutationObserver,N,E;w||(N=!0,w=function(){function e(e){var t=e.relatedNode||e.target;n.push({target:t,addedNodes:[t]})}function t(e){var t=e.relatedNode||e.target;n.push({target:t,attributeName:e.attrName})}var n=[],r;this.observe=function(n){r=n,r.addEventListener("DOMSubtreeModified",e,!1),r.addEventListener("DOMNodeInsertedIntoDocument",e,!1),r.addEventListener("DOMNodeInserted",e,!1),r.addEventListener("DOMAttrModified",t,!1)},this.disconnect=function(){r.removeEventListener("DOMSubtreeModified",e,!1),r.removeEventListener("DOMNodeInsertedIntoDocument",e,!1),r.removeEventListener("DOMNodeInserted",e,!1),r.removeEventListener("DOMAttrModified",t,!1)},this.takeRecords=function(){return n}}),u.on("keydown",function(e){var t=e.keyCode==G,n=e.ctrlKey||e.metaKey;if(!h(e)&&(t||e.keyCode==K)){var r=u.selection.getRng(),i=r.startContainer,o=r.startOffset;if(t&&e.shiftKey)return;if(v(t,r))return void e.preventDefault();if(!n&&r.collapsed&&3==i.nodeType&&(t?o0))return;e.preventDefault(),n&&u.selection.getSel().modify("extend",t?"forward":"backward",e.metaKey?"lineboundary":"word"),y(t)}}),u.on("keypress",function(t){if(!h(t)&&!x.isCollapsed()&&t.charCode>31&&!e.metaKeyPressed(t)){var n,r,i,o,a,s;n=u.selection.getRng(),s=String.fromCharCode(t.charCode),t.preventDefault(),r=X(n.startContainer).parents().filter(function(e,t){return!!u.schema.getTextInlineElements()[t.nodeName]}),y(!0),r=r.filter(function(e,t){return!X.contains(u.getBody(),t)}),r.length?(i=C.createFragment(),r.each(function(e,t){t=t.cloneNode(!1),i.hasChildNodes()?(t.appendChild(i.firstChild),i.appendChild(t)):(a=t,i.appendChild(t)),i.appendChild(t)}),a.appendChild(u.getDoc().createTextNode(s)),o=C.getParent(n.startContainer,C.isBlock),C.isEmpty(o)?X(o).empty().append(i):n.insertNode(i),n.setStart(a.firstChild,1),n.setEnd(a.firstChild,1),u.selection.setRng(n)):u.selection.setContent(s)}}),u.addCommand("Delete",function(){y()}),u.addCommand("ForwardDelete",function(){y(!0)}),N||(u.on("dragstart",function(e){E=x.getRng(),p(e)}),u.on("drop",function(e){if(!h(e)){var n=m(e);n&&(e.preventDefault(),l.setEditorTimeout(u,function(){var r=t.getCaretRangeFromPoint(e.x,e.y,b);E&&(x.setRng(E),E=null),y(),x.setRng(r),g(n.html)}))}}),u.on("cut",function(e){h(e)||!e.clipboardData||u.selection.isCollapsed()||(e.preventDefault(),e.clipboardData.clearData(),e.clipboardData.setData("text/html",u.selection.getContent()),e.clipboardData.setData("text/plain",u.selection.getContent({format:"text"})),l.setEditorTimeout(u,function(){y(!0)}))}))}function y(){function e(e){var t=J.create("body"),n=e.cloneContents();return t.appendChild(n),Q.serializer.serialize(t,{format:"html"})}function n(n){if(!n.setStart){if(n.item)return!1;var r=n.duplicate();return r.moveToElementText(u.getBody()),t.compareRanges(n,r)}var i=e(n),o=J.createRng();o.selectNode(u.getBody());var a=e(o);return i===a}u.on("keydown",function(e){var t=e.keyCode,r,i;if(!h(e)&&(t==G||t==K)){if(r=u.selection.isCollapsed(),i=u.getBody(),r&&!J.isEmpty(i))return;if(!r&&!n(u.selection.getRng()))return;e.preventDefault(),u.setContent(""),i.firstChild&&J.isBlock(i.firstChild)?u.selection.setCursorLocation(i.firstChild,0):u.selection.setCursorLocation(i,0),u.nodeChanged()}})}function b(){u.shortcuts.add("meta+a",null,"SelectAll")}function C(){u.settings.content_editable||J.bind(u.getDoc(),"mousedown mouseup",function(e){var t;if(e.target==u.getDoc().documentElement)if(t=Q.getRng(),u.getBody().focus(),"mousedown"==e.type){if(c.isCaretContainer(t.startContainer))return;Q.placeCaretAt(e.clientX,e.clientY)}else Q.setRng(t)})}function x(){u.on("keydown",function(e){if(!h(e)&&e.keyCode===K){if(!u.getBody().getElementsByTagName("hr").length)return;if(Q.isCollapsed()&&0===Q.getRng(!0).startOffset){var t=Q.getNode(),n=t.previousSibling;if("HR"==t.nodeName)return J.remove(t),void e.preventDefault();n&&n.nodeName&&"hr"===n.nodeName.toLowerCase()&&(J.remove(n),e.preventDefault())}}})}function w(){window.Range.prototype.getClientRects||u.on("mousedown",function(e){if(!h(e)&&"HTML"===e.target.nodeName){var t=u.getBody();t.blur(),l.setEditorTimeout(u,function(){t.focus()})}})}function N(){u.on("click",function(e){var t=e.target;/^(IMG|HR)$/.test(t.nodeName)&&"false"!==J.getContentEditableParent(t)&&(e.preventDefault(),Q.getSel().setBaseAndExtent(t,0,t,1),u.nodeChanged()),"A"==t.nodeName&&J.hasClass(t,"mce-item-anchor")&&(e.preventDefault(),Q.select(t))})}function E(){function e(){var e=J.getAttribs(Q.getStart().cloneNode(!1));return function(){var t=Q.getStart();t!==u.getBody()&&(J.setAttrib(t,"style",null),Y(e,function(e){t.setAttributeNode(e.cloneNode(!0))}))}}function t(){return!Q.isCollapsed()&&J.getParent(Q.getStart(),J.isBlock)!=J.getParent(Q.getEnd(),J.isBlock)}u.on("keypress",function(n){var r;return h(n)||8!=n.keyCode&&46!=n.keyCode||!t()?void 0:(r=e(),u.getDoc().execCommand("delete",!1,null),r(),n.preventDefault(),!1)}),J.bind(u.getDoc(),"cut",function(n){var r;!h(n)&&t()&&(r=e(),l.setEditorTimeout(u,function(){r()}))})}function _(){document.body.setAttribute("role","application")}function S(){u.on("keydown",function(e){if(!h(e)&&e.keyCode===K&&Q.isCollapsed()&&0===Q.getRng(!0).startOffset){var t=Q.getNode().previousSibling;if(t&&t.nodeName&&"table"===t.nodeName.toLowerCase())return e.preventDefault(),!1}})}function k(){f()>7||(d("RespectVisibilityInDesign",!0),u.contentStyles.push(".mceHideBrInPre pre br {display: none}"),J.addClass(u.getBody(),"mceHideBrInPre"),ee.addNodeFilter("pre",function(e){for(var t=e.length,n,r,o,a;t--;)for(n=e[t].getAll("br"),r=n.length;r--;)o=n[r],a=o.prev,a&&3===a.type&&"\n"!=a.value.charAt(a.value-1)?a.value+="\n":o.parent.insert(new i("#text",3),o,!0).value="\n"}),te.addNodeFilter("pre",function(e){for(var t=e.length,n,r,i,o;t--;)for(n=e[t].getAll("br"),r=n.length;r--;)i=n[r],o=i.prev,o&&3==o.type&&(o.value=o.value.replace(/\r?\n$/,""))}))}function T(){J.bind(u.getBody(),"mouseup",function(){var e,t=Q.getNode();"IMG"==t.nodeName&&((e=J.getStyle(t,"width"))&&(J.setAttrib(t,"width",e.replace(/[^0-9%]+/g,"")),J.setStyle(t,"width","")),(e=J.getStyle(t,"height"))&&(J.setAttrib(t,"height",e.replace(/[^0-9%]+/g,"")),J.setStyle(t,"height","")))})}function R(){u.on("keydown",function(t){var n,r,i,o,a;if(!h(t)&&t.keyCode==e.BACKSPACE&&(n=Q.getRng(),r=n.startContainer,i=n.startOffset,o=J.getRoot(),a=r,n.collapsed&&0===i)){for(;a&&a.parentNode&&a.parentNode.firstChild==a&&a.parentNode!=o;)a=a.parentNode;"BLOCKQUOTE"===a.tagName&&(u.formatter.toggle("blockquote",null,a),n=J.createRng(),n.setStart(r,0),n.setEnd(r,0),Q.setRng(n))}})}function A(){function e(){u._refreshContentEditable(),d("StyleWithCSS",!1),d("enableInlineTableEditing",!1),Z.object_resizing||d("enableObjectResizing",!1)}Z.readonly||u.on("BeforeExecCommand MouseDown",e)}function B(){function e(){Y(J.select("a"),function(e){var t=e.parentNode,n=J.getRoot();if(t.lastChild===e){for(;t&&!J.isBlock(t);){if(t.parentNode.lastChild!==t||t===n)return;t=t.parentNode}J.add(t,"br",{"data-mce-bogus":1})}})}u.on("SetContent ExecCommand",function(t){("setcontent"==t.type||"mceInsertLink"===t.command)&&e()})}function D(){Z.forced_root_block&&u.on("init",function(){d("DefaultParagraphSeparator",Z.forced_root_block)})}function M(){u.on("keydown",function(e){var t;h(e)||e.keyCode!=K||(t=u.getDoc().selection.createRange(),t&&t.item&&(e.preventDefault(),u.undoManager.beforeChange(),J.remove(t.item(0)),u.undoManager.add()))})}function L(){var e;f()>=10&&(e="",Y("p div h1 h2 h3 h4 h5 h6".split(" "),function(t,n){e+=(n>0?",":"")+t+":empty"}),u.contentStyles.push(e+"{padding-right: 1px !important}"))}function P(){f()<9&&(ee.addNodeFilter("noscript",function(e){for(var t=e.length,n,r;t--;)n=e[t],r=n.firstChild,r&&n.attr("data-mce-innertext",r.value)}),te.addNodeFilter("noscript",function(e){for(var t=e.length,n,r,a;t--;)n=e[t],r=e[t].firstChild,r?r.value=o.decode(r.value):(a=n.attributes.map["data-mce-innertext"],a&&(n.attr("data-mce-innertext",null), +r=new i("#text",3),r.value=a,r.raw=!0,n.append(r)))}))}function H(){function e(e,t){var n=i.createTextRange();try{n.moveToPoint(e,t)}catch(r){n=null}return n}function t(t){var r;t.button?(r=e(t.x,t.y),r&&(r.compareEndPoints("StartToStart",a)>0?r.setEndPoint("StartToStart",a):r.setEndPoint("EndToEnd",a),r.select())):n()}function n(){var e=r.selection.createRange();a&&!e.item&&0===e.compareEndPoints("StartToEnd",e)&&a.select(),J.unbind(r,"mouseup",n),J.unbind(r,"mousemove",t),a=o=0}var r=J.doc,i=r.body,o,a,s;r.documentElement.unselectable=!0,J.bind(r,"mousedown contextmenu",function(i){if("HTML"===i.target.nodeName){if(o&&n(),s=r.documentElement,s.scrollHeight>s.clientHeight)return;o=1,a=e(i.x,i.y),a&&(J.bind(r,"mouseup",n),J.bind(r,"mousemove",t),J.getRoot().focus(),a.select())}})}function O(){u.on("keyup focusin mouseup",function(t){65==t.keyCode&&e.metaKeyPressed(t)||Q.normalize()},!0)}function I(){u.contentStyles.push("img:-moz-broken {-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}")}function F(){u.inline||u.on("keydown",function(){document.activeElement==document.body&&u.getWin().focus()})}function z(){u.inline||(u.contentStyles.push("body {min-height: 150px}"),u.on("click",function(e){var t;if("HTML"==e.target.nodeName){if(a.ie>11)return void u.getBody().focus();t=u.selection.getRng(),u.getBody().focus(),u.selection.setRng(t),u.selection.normalize(),u.nodeChanged()}}))}function W(){a.mac&&u.on("keydown",function(t){!e.metaKeyPressed(t)||t.shiftKey||37!=t.keyCode&&39!=t.keyCode||(t.preventDefault(),u.selection.getSel().modify("move",37==t.keyCode?"backward":"forward","lineboundary"))})}function V(){d("AutoUrlDetect",!1)}function U(){u.on("click",function(e){var t=e.target;do if("A"===t.tagName)return void e.preventDefault();while(t=t.parentNode)}),u.contentStyles.push(".mce-content-body {-webkit-touch-callout: none}")}function $(){u.on("init",function(){u.dom.bind(u.getBody(),"submit",function(e){e.preventDefault()})})}function q(){ee.addNodeFilter("br",function(e){for(var t=e.length;t--;)"Apple-interchange-newline"==e[t].attr("class")&&e[t].remove()})}function j(){u.on("dragstart",function(e){p(e)}),u.on("drop",function(e){if(!h(e)){var n=m(e);if(n&&n.id!=u.id){e.preventDefault();var r=t.getCaretRangeFromPoint(e.x,e.y,u.getDoc());Q.setRng(r),g(n.html)}}})}var Y=s.each,X=u.$,K=e.BACKSPACE,G=e.DELETE,J=u.dom,Q=u.selection,Z=u.settings,ee=u.parser,te=u.serializer,ne=a.gecko,re=a.ie,ie=a.webkit,oe="data:text/mce-internal,",ae=re?"Text":"URL";R(),y(),O(),ie&&(v(),C(),N(),D(),$(),S(),q(),a.iOS?(F(),z(),U()):b()),re&&a.ie<11&&(x(),_(),k(),T(),M(),L(),P(),H()),a.ie>=11&&(z(),S()),a.ie&&(b(),V(),j()),ne&&(x(),w(),E(),A(),B(),I(),W(),S())}}),r(Me,[oe,w,m],function(e,t,n){function r(e,t){return"selectionchange"==t?e.getDoc():!e.inline&&/^mouse|click|contextmenu|drop|dragover|dragend/.test(t)?e.getDoc().documentElement:e.settings.event_root?(e.eventRoot||(e.eventRoot=o.select(e.settings.event_root)[0]),e.eventRoot):e.getBody()}function i(e,t){function n(e){return!e.hidden&&!e.readonly}var i=r(e,t),s;if(e.delegates||(e.delegates={}),!e.delegates[t])if(e.settings.event_root){if(a||(a={},e.editorManager.on("removeEditor",function(){var t;if(!e.editorManager.activeEditor&&a){for(t in a)e.dom.unbind(r(e,t));a=null}})),a[t])return;s=function(r){for(var i=r.target,a=e.editorManager.editors,s=a.length;s--;){var l=a[s].getBody();(l===i||o.isChildOf(i,l))&&n(a[s])&&a[s].fire(t,r)}},a[t]=s,o.bind(i,t,s)}else s=function(r){n(e)&&e.fire(t,r)},o.bind(i,t,s),e.delegates[t]=s}var o=t.DOM,a,s={bindPendingEventDelegates:function(){var e=this;n.each(e._pendingNativeEvents,function(t){i(e,t)})},toggleNativeEvent:function(e,t){var n=this;"focus"!=e&&"blur"!=e&&(t?n.initialized?i(n,e):n._pendingNativeEvents?n._pendingNativeEvents.push(e):n._pendingNativeEvents=[e]:n.initialized&&(n.dom.unbind(r(n,e),e,n.delegates[e]),delete n.delegates[e]))},unbindAllNativeEvents:function(){var e=this,t;if(e.delegates){for(t in e.delegates)e.dom.unbind(r(e,t),t,e.delegates[t]);delete e.delegates}e.inline||(e.getBody().onload=null,e.dom.unbind(e.getWin()),e.dom.unbind(e.getDoc())),e.dom.unbind(e.getBody()),e.dom.unbind(e.getContainer())}};return s=n.extend({},e,s)}),r(Le,[],function(){function e(e,t,n){try{e.getDoc().execCommand(t,!1,n)}catch(r){}}function t(t,n){var r=t.readonly?"readonly":"design";n!=r&&("readonly"==n?(t.selection.controlSelection.hideResizeRect(),t.readonly=!0,t.getBody().contentEditable=!1):(t.readonly=!1,t.getBody().contentEditable=!0,e(t,"StyleWithCSS",!1),e(t,"enableInlineTableEditing",!1),e(t,"enableObjectResizing",!1),t.focus(),t.nodeChanged()),t.fire("SwitchMode",{mode:n}))}return{setMode:t}}),r(Pe,[m,h],function(e,t){var n=e.each,r=e.explode,i={f9:120,f10:121,f11:122},o=e.makeMap("alt,ctrl,shift,meta,access");return function(a){function s(e,s,l,c){var u,d,f;f={func:l,scope:c||a,desc:a.translate(s)},n(r(e,"+"),function(e){e in o?f[e]=!0:/^[0-9]{2,}$/.test(e)?f.keyCode=parseInt(e,10):(f.charCode=e.charCodeAt(0),f.keyCode=i[e]||e.toUpperCase().charCodeAt(0))}),u=[f.keyCode];for(d in o)f[d]?u.push(d):f[d]=!1;return f.id=u.join(","),f.access&&(f.alt=!0,t.mac?f.ctrl=!0:f.shift=!0),f.meta&&(t.mac?f.meta=!0:(f.ctrl=!0,f.meta=!1)),f}var l=this,c={};a.on("keyup keypress keydown",function(e){(e.altKey||e.ctrlKey||e.metaKey)&&!e.isDefaultPrevented()&&n(c,function(t){return t.ctrl==e.ctrlKey&&t.meta==e.metaKey&&t.alt==e.altKey&&t.shift==e.shiftKey&&(e.keyCode==t.keyCode||e.charCode&&e.charCode==t.charCode)?(e.preventDefault(),"keydown"==e.type&&t.func.call(t.scope),!0):void 0})}),l.add=function(t,i,o,l){var u;return u=o,"string"==typeof o?o=function(){a.execCommand(u,!1,null)}:e.isArray(u)&&(o=function(){a.execCommand(u[0],u[1],u[2])}),n(r(t.toLowerCase()),function(e){var t=s(e,i,o,l);c[t.id]=t}),!0},l.remove=function(e){var t=s(e);return c[t.id]?(delete c[t.id],!0):!1}}}),r(He,[c,m,z],function(e,t,n){return function(r){function i(e){var t,n;return n={"image/jpeg":"jpg","image/jpg":"jpg","image/gif":"gif","image/png":"png"},t=n[e.blob().type.toLowerCase()]||"dat",e.id()+"."+t}function o(e,t){return e?e.replace(/\/$/,"")+"/"+t.replace(/^\//,""):t}function a(e){return{id:e.id,blob:e.blob,base64:e.base64,filename:n.constant(i(e))}}function s(e,t,n,a){var s,l,c;s=new XMLHttpRequest,s.open("POST",r.url),s.withCredentials=r.credentials,c=a(),s.upload.onprogress=function(e){var t=Math.round(e.loaded/e.total*100);c.progressBar.value(t)},s.onload=function(){var e;return c.close(),200!=s.status?void n("HTTP Error: "+s.status):(e=JSON.parse(s.responseText),e&&"string"==typeof e.location?void t(o(r.basePath,e.location)):void n("Invalid JSON: "+s.responseText))},l=new FormData,l.append("file",e.blob(),i(e)),s.send(l)}function l(){return new e(function(e){e([])})}function c(e){return e.then(function(e){return e})["catch"](function(e){return e})}function u(e,t,n){var r=e(n),i=c(r);return delete p[t],p[t]=i,i}function d(e,n){return t.map(e,function(e){var t=e.id();return p[t]?p[t]:u(n,t,e)})}function f(t,n){function i(t){return new e(function(e){var i=r.handler;i(a(t),function(n){e({url:n,blobInfo:t,status:!0})},function(n){e({url:"",blobInfo:t,status:!1,error:n})},n)})}var o=d(t,i);return e.all(o)}function h(e,t){return r.url||r.handler!==s?f(e,t):l()}var p={};return r=t.extend({credentials:!1,handler:s},r),{upload:h}}}),r(Oe,[c],function(e){function t(t){return new e(function(e){var n=new XMLHttpRequest;n.open("GET",t,!0),n.responseType="blob",n.onload=function(){200==this.status&&e(this.response)},n.send()})}function n(e){var t,n;return e=decodeURIComponent(e).split(","),n=/data:([^;]+)/.exec(e[0]),n&&(t=n[1]),{type:t,data:e[1]}}function r(t){return new e(function(e){var r,i,o;t=n(t);try{r=atob(t.data)}catch(a){return void e(new Blob([]))}for(i=new Uint8Array(r.length),o=0;o0}function s(e){return 0>e}function l(e,n,r,i,o){var l=new t(e,i);if(s(n)){if(C(e)&&(e=l.prev(!0),r(e)))return e;for(;e=l.prev(o);)if(r(e))return e}if(a(n)){if(C(e)&&(e=l.next(!0),r(e)))return e;for(;e=l.next(o);)if(r(e))return e}return null}function c(e,t){for(e=e.parentNode;e&&e!=t;e=e.parentNode)if(b(e))return e;return t}function u(e,t){for(;e&&e!=t;){if(x(e))return e;e=e.parentNode}return null}function d(e,t,n){return u(e.container(),n)==u(t.container(),n)}function f(e,t,n){return c(e.container(),n)==c(t.container(),n)}function h(e,t){var n,r;return t?(n=t.container(),r=t.offset(),E(n)?n.childNodes[r+e]:null):null}function p(e,t){var n=t.ownerDocument.createRange();return e?(n.setStartBefore(t),n.setEndBefore(t)):(n.setStartAfter(t),n.setEndAfter(t)),n}function m(e,t,n){return u(t,e)==u(n,e)}function g(e,t,n){var r,i;for(i=e?"previousSibling":"nextSibling";n&&n!=t;){if(r=n[i],w(r)&&(r=r[i]),C(r)){if(m(t,r,n))return r;break}if(_(r))break;n=n.parentNode}return null}function v(e,t,r){var o,a,s,l,c=N(g,!0,t),u=N(g,!1,t);if(a=r.startContainer,s=r.startOffset,i.isCaretContainerBlock(a)){if(E(a)||(a=a.parentNode),l=a.getAttribute("data-mce-caret"),"before"==l&&(o=a.nextSibling,C(o)))return S(o);if("after"==l&&(o=a.previousSibling,C(o)))return k(o)}if(!r.collapsed)return r;if(n.isText(a)){if(w(a)){if(1===e){if(o=u(a))return S(o);if(o=c(a))return k(o)}if(-1===e){if(o=c(a))return k(o);if(o=u(a))return S(o)}return r}if(i.endsWithCaretContainer(a)&&s>=a.data.length-1)return 1===e&&(o=u(a))?S(o):r;if(i.startsWithCaretContainer(a)&&1>=s)return-1===e&&(o=c(a))?k(o):r;if(s===a.data.length)return o=u(a),o?S(o):r;if(0===s)return o=c(a),o?k(o):r}return r}function y(e,t){return C(h(e,t))}var b=n.isContentEditableTrue,C=n.isContentEditableFalse,x=n.matchStyleValues("display","block table table-cell table-caption"),w=i.isCaretContainer,N=e.curry,E=n.isElement,_=o.isCaretCandidate,S=N(p,!0),k=N(p,!1);return{isForwards:a,isBackwards:s,findNode:l,getEditingHost:c,getParentBlock:u,isInSameBlock:d,isInSameEditingHost:f,isBeforeContentEditableFalse:N(y,0),isAfterContentEditableFalse:N(y,-1),normalizeRange:v}}),r(Ve,[_,W,$,We,p,z],function(e,t,n,r,i,o){function a(e,t){for(var n=[];e&&e!=t;)n.push(e),e=e.parentNode;return n}function s(e,t){return e.hasChildNodes()&&t0)return n(y,--b);if(h(e)&&b0&&(x=s(y,b-1),m(x)))return!g(x)&&(w=r.findNode(x,e,v,x))?d(w)?n(w,w.data.length):n.after(w):d(x)?n(x,x.data.length):n.before(x);if(h(e)&&b0&&(n&&(l*=-1),r.left+=l,r.right+=l),r}function l(){var n,r,o,a,s;for(n=i("*[contentEditable=false]",t),a=0;a
    ').css(l).appendTo(t),o&&m.addClass("mce-visual-caret-before"),d(),c=a.ownerDocument.createRange(),f=g.firstChild,c.setStart(f,0),c.setEnd(f,1),c):(g=e.insertInline(a,o),c=a.ownerDocument.createRange(),s(g.nextSibling)?(c.setStart(g,0),c.setEnd(g,0)):(c.setStart(g,1),c.setEnd(g,1)),c)}function u(){l(),g&&(e.remove(g),g=null),m&&(m.remove(),m=null),clearInterval(p)}function d(){p=a.setInterval(function(){i("div.mce-visual-caret",t).toggleClass("mce-visual-caret-hidden")},500)}function f(){a.clearInterval(p)}function h(){return".mce-visual-caret {position: absolute;background-color: black;background-color: currentcolor;}.mce-visual-caret-hidden {display: none;}*[data-mce-caret] {position: absolute;left: -1000px;right: auto;top: 0;margin: 0;padding: 0;}"}var p,m,g;return{show:c,hide:u,getCss:h,destroy:f}}}),r($e,[p,_,V],function(e,t,n){function r(i){function o(t){return e.map(t,function(e){return e=n.clone(e),e.node=i,e})}if(e.isArray(i))return e.reduce(i,function(e,t){return e.concat(r(t))},[]);if(t.isElement(i))return o(i.getClientRects());if(t.isText(i)){var a=i.ownerDocument.createRange();return a.setStart(i,0),a.setEnd(i,i.data.length),o(a.getClientRects())}}return{getClientRects:r}}),r(qe,[z,p,$e,W,We,Ve,$,V],function(e,t,n,r,i,o,a,s){function l(e,t,n,o){for(;o=i.findNode(o,e,r.isEditableCaretCandidate,t);)if(n(o))return}function c(e,r,i,o,a,s){function c(o){var s,l,c;for(c=n.getClientRects(o),-1==e&&(c=c.reverse()),s=0;s0&&r(l,t.last(f))&&u++,l.line=u,a(l))return!0;f.push(l)}}var u=0,d,f=[],h;return(h=t.last(s.getClientRects()))?(d=s.getNode(),c(d),l(e,o,c,d),f):f}function u(e,t){return t.line>e}function d(e,t){return t.line===e}function f(e,n,r,i){function l(n){return 1==e?t.last(n.getClientRects()):t.last(n.getClientRects())}var c=new o(n),u,d,f,h,p=[],m=0,g,v;1==e?(u=c.next,d=s.isBelow,f=s.isAbove,h=a.after(i)):(u=c.prev,d=s.isAbove,f=s.isBelow,h=a.before(i)),v=l(h);do if(h.isVisible()&&(g=l(h),!f(g,v))){if(p.length>0&&d(g,t.last(p))&&m++,g=s.clone(g),g.position=h,g.line=m,r(g))return p;p.push(g)}while(h=u(h));return p}var h=e.curry,p=h(c,-1,s.isAbove,s.isBelow),m=h(c,1,s.isBelow,s.isAbove);return{upUntil:p,downUntil:m,positionsUntil:f,isAboveLine:h(u),isLine:h(d)}}),r(je,[z,p,_,$e,V,We,W],function(e,t,n,r,i,o,a){function s(e,t){return Math.abs(e.left-t)}function l(e,t){return Math.abs(e.right-t)}function c(e,n){function r(e,t){return e>=t.left&&e<=t.right}return t.reduce(e,function(e,t){var i,o;return i=Math.min(s(e,n),l(e,n)),o=Math.min(s(t,n),l(t,n)),r(n,t)?t:r(n,e)?e:o==i&&m(t.node)?t:i>o?t:e})}function u(e,t,n,r){for(;r=g(r,e,a.isEditableCaretCandidate,t);)if(n(r))return}function d(e,n){function o(e,i){var o;return o=t.filter(r.getClientRects(i),function(t){return!e(t,n)}),a=a.concat(o),0===o.length}var a=[];return a.push(n),u(-1,e,v(o,i.isAbove),n.node),u(1,e,v(o,i.isBelow),n.node),a}function f(e){return t.filter(t.toArray(e.getElementsByTagName("*")),m)}function h(e,t){return{node:e.node,before:s(e,t)=e.top&&i<=e.bottom}),a=c(o,n),a&&(a=c(d(e,a),n),a&&m(a.node))?h(a,n):null}var m=n.isContentEditableFalse,g=o.findNode,v=e.curry;return{findClosestClientRect:c,findLineNodeRects:d,closestCaret:p}}),r(Ye,[_],function(e){function t(e){function t(e){return n(e)}function r(t){c(e.getBody()).css("cursor",t)}function i(t){return t==h.element||e.dom.isChildOf(t,h.element)?!1:n(t)?!1:!0}function o(t){var n,i,o,a,s=0,l=0,u,d,p,m;0===t.button&&(n=t.screenX-h.screenX,i=t.screenY-h.screenY,u=Math.max(Math.abs(n),Math.abs(i)),!h.dragging&&u>10&&(h.dragging=!0,r("default"),h.clone=h.element.cloneNode(!0),o=f.getPos(h.element),h.relX=h.clientX-o.x,h.relY=h.clientY-o.y,h.width=h.element.offsetWidth,h.height=h.element.offsetHeight,c(h.clone).css({width:h.width,height:h.height}).removeAttr("data-mce-selected"),h.ghost=c("
    ").css({position:"absolute",opacity:.5,overflow:"hidden",width:h.width,height:h.height}).attr({"data-mce-bogus":"all",unselectable:"on",contenteditable:"false"}).addClass("mce-drag-container mce-reset").append(h.clone).appendTo(e.getBody())[0],a=e.dom.getViewPort(e.getWin()),h.maxX=a.w,h.maxY=a.h),h.dragging&&(e.selection.placeCaretAt(t.clientX,t.clientY),d=h.clientX+n-h.relX,p=h.clientY+i+5,d+h.width>h.maxX&&(s=d+h.width-h.maxX),p+h.height>h.maxY&&(l=p+h.height-h.maxY),m="BODY"!=e.getBody().nodeName?e.getBody().getBoundingClientRect():{left:0,top:0},c(h.ghost).css({left:d-m.left,top:p-m.top,width:h.width-s,height:h.height-l})))}function a(){h.dragging&&(e.selection.setRng(e.selection.getSel().getRangeAt(0)),i(e.selection.getNode())&&e.undoManager.transact(function(){e.insertContent(f.getOuterHTML(h.element)),c(h.element).remove()})),l()}function s(n){if(l(),t(n.target)){if(e.fire("dragstart",{target:n.target}).isDefaultPrevented())return;e.on("mousemove",o),e.on("mouseup",a),u!=d&&(f.bind(u,"mousemove",o),f.bind(u,"mouseup",a)),h={screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY,element:n.target}}}function l(){c(h.ghost).remove(),r(null),e.off("mousemove",o),e.off("mouseup",l),u!=d&&(f.unbind(u,"mousemove",o),f.unbind(u,"mouseup",l)),h={}}var c=e.$,u=document,d=e.getDoc(),f=e.dom,h={};e.on("mousedown",s)}var n=e.isContentEditableFalse;return{init:t}}),r(Xe,[h,Ve,$,k,We,Ue,qe,je,_,T,I,z,p,u,Ye],function(e,t,n,r,i,o,a,s,l,c,u,d,f,h,p){function m(e,t){for(;t=e(t);)if(t.isVisible())return t;return t}function g(c){function d(e){return c.dom.isBlock(e)}function g(e){c.selection.setRng(e)}function E(){return c.selection.getRng()}function _(e,t){c.selection.scrollIntoView(e,t)}function S(e,t,n){var r;return r=c.fire("ShowCaret",{target:t,direction:e,before:n}),r.isDefaultPrevented()?null:(_(t,-1===e),Q.show(n,t))}function k(e){var t;return t=c.fire("ObjectSelected",{target:e}),t.isDefaultPrevented()?null:(Q.hide(),T(e))}function T(e){var t=e.ownerDocument.createRange();return t.selectNode(e),t}function R(e,t){var n=i.isInSameBlock(e,t);return!n&&l.isBr(e.getNode())?!0:n}function A(e,t){return t=i.normalizeRange(e,X,t),-1==e?n.fromRangeStart(t):n.fromRangeEnd(t)}function B(e){return r.isCaretContainerBlock(e.startContainer)}function D(e,t,n,r){var i,o,a,s;return!r.collapsed&&(i=N(r),b(i))?S(e,i,-1==e):(s=B(r),o=A(e,r),n(o)?k(o.getNode(-1==e)):(o=t(o))?n(o)?S(e,o.getNode(-1==e),1==e):(a=t(o),n(a)&&R(o,a)?S(e,a.getNode(-1==e),1==e):s?F(o.toRange()):null):s?r:null)}function M(e,t,n){var r,i,o,l,c,u,d,h,p;if(p=N(n),r=A(e,n),i=t(X,a.isAboveLine(1),r),o=f.filter(i,a.isLine(1)),c=f.last(r.getClientRects()),w(r)&&(p=r.getNode()),x(r)&&(p=r.getNode(!0)),!c)return null;if(u=c.left,l=s.findClosestClientRect(o,u),l&&b(l.node))return d=Math.abs(u-l.left),h=Math.abs(u-l.right),S(e,l.node,h>d);if(p){var m=a.positionsUntil(e,X,a.isAboveLine(1),p);if(l=s.findClosestClientRect(f.filter(m,a.isLine(1)),u))return F(l.position.toRange());if(l=f.last(f.filter(m,a.isLine(0))))return F(l.position.toRange())}}function L(t,r){function i(){var t=c.dom.create(c.settings.forced_root_block);return(!e.ie||e.ie>=11)&&(t.innerHTML='
    '),t}var o,a,s;if(r.collapsed&&c.settings.forced_root_block){if(o=c.dom.getParent(r.startContainer,"PRE"),!o)return;a=1==t?G(n.fromRangeStart(r)):J(n.fromRangeStart(r)),a||(s=i(),1==t?c.$(o).after(s):c.$(o).before(s),c.selection.select(s,!0),c.selection.collapse())}}function P(e,t,n,r){var i;return(i=D(e,t,n,r))?i:(i=L(e,r),i?i:null)}function H(e,t,n){var r;return(r=M(e,t,n))?r:(r=L(e,n),r?r:null)}function O(){return te("*[data-mce-caret]")[0]}function I(e){e=te(e),e.attr("data-mce-caret")&&(Q.hide(),e.removeAttr("data-mce-caret"),e.removeAttr("data-mce-bogus"),e.removeAttr("style"),g(E()),_(e[0]))}function F(e){var t;return e&&e.collapsed?(e=i.normalizeRange(1,X,e),t=n.fromRangeStart(e),b(t.getNode())?S(1,t.getNode(),!t.isAtEnd()):b(t.getNode(!0))?S(1,t.getNode(!0),!1):(Q.hide(),e)):e}function z(e){var t,i,o,a;return b(e)?(b(e.previousSibling)&&(o=e.previousSibling),i=J(n.before(e)),i||(t=G(n.after(e))),t&&C(t.getNode())&&(a=t.getNode()),r.remove(e.previousSibling),r.remove(e.nextSibling),c.dom.remove(e),j(),c.dom.isEmpty(c.getBody())?(c.setContent(""),void c.focus()):o?n.after(o).toRange():a?n.before(a).toRange():i?i.toRange():t?t.toRange():null):null}function W(e,t,n){var r,i;return!n.collapsed&&(r=N(n),b(r))?F(z(r)):(i=A(e,n),t(i)?F(z(i.getNode(-1==e))):void 0)}function V(){function e(e){var t=e(E());return t?(g(t),!0):!1}function t(e){for(var t=c.getBody();e&&e!=t;){if(y(e)||b(e))return e;e=e.parentNode}return null}function r(){var e,r=t(c.selection.getNode());y(r)&&d(r)&&c.dom.isEmpty(r)&&(e=c.dom.create("br",{"data-mce-bogus":"1"}),c.$(r).empty().append(e),c.selection.setRng(n.before(e).toRange()))}function i(e){var t=O();if(t)return"compositionstart"==e.type?(e.preventDefault(),e.stopPropagation(),void I(t)):void(" "!=t.innerHTML&&I(t))}function o(e){var t;switch(e.keyCode){case u.DELETE:t=r();break;case u.BACKSPACE:t=r()}t&&e.preventDefault()}var l=v(P,1,G,w),f=v(P,-1,J,x),m=v(W,1,w),C=v(W,-1,x),N=v(H,-1,a.upUntil),_=v(H,1,a.downUntil);c.on("mouseup",function(){var e=E();e.collapsed&&g(F(e))}),c.on("mousedown",function(e){var n;if(n=t(e.target))b(n)?(e.preventDefault(),q(k(n),!1)):c.selection.placeCaretAt(e.clientX,e.clientY);else{j(),Q.hide();var r=s.closestCaret(X,e.clientX,e.clientY);r&&(e.preventDefault(),c.getBody().focus(),g(S(1,r.node,r.before)))}}),c.on("keydown",function(t){var n;if(!u.modifierPressed(t)){switch(t.keyCode){case u.RIGHT:n=e(l);break;case u.DOWN:n=e(_);break;case u.LEFT:n=e(f);break;case u.UP:n=e(N);break;case u.DELETE:n=e(m);break;case u.BACKSPACE:n=e(C);break;default:n=b(c.selection.getNode())}n&&t.preventDefault()}}),c.on("keyup compositionstart",function(e){i(e),o(e)},!0),c.on("cut",function(){var e=c.selection.getNode();b(e)&&h.setEditorTimeout(c,function(){g(F(z(e)))})}),c.on("getSelectionRange",function(e){var t=e.range;if(ee){if(!ee.parentNode)return void(ee=null);t=t.cloneRange(),t.selectNode(ee),e.range=t}}),c.on("setSelectionRange",function(e){var t;t=q(e.range),t&&(e.range=t)}),c.on("focus",function(){h.setEditorTimeout(c,function(){c.selection.setRng(F(c.selection.getRng()))})}),p.init(c)}function U(){var e=c.contentStyles,t=".mce-content-body";e.push(Q.getCss()),e.push(t+" .mce-offscreen-selection {position: absolute;left: -9999999999px;width: 100pxheight: 100px}"+t+" *[contentEditable=false] {cursor: default;}"+t+" *[contentEditable=true] {cursor: text;}")}function $(e){return r.isCaretContainer(e.startContainer)||r.isCaretContainer(e.endContainer)}function q(e,t){var n,r=c.$,i=c.dom,o,a,s,l,u,d,f;if(!e)return j(),null;if(e.collapsed){if(j(),!$(e)){if(f=A(1,e),b(f.getNode()))return S(1,f.getNode(),!f.isAtEnd());if(b(f.getNode(!0)))return S(1,f.getNode(!0),!1)}return null}return s=e.startContainer,l=e.startOffset,u=e.endOffset,3==s.nodeType&&0==l&&b(s.parentNode)&&(s=s.parentNode,l=i.nodeIndex(s),s=s.parentNode),1!=s.nodeType?(j(),null):(u==l+1&&(n=s.childNodes[l]),b(n)?t!==!1&&(d=c.fire("ObjectSelected",{target:n}),d.isDefaultPrevented())?(j(),null):(o=r("#"+Z),0===o.length&&(o=r('
    ').attr("id",Z),o.appendTo(c.getBody())),o.empty().append("\xa0").append(n.cloneNode(!0)).append("\xa0").css({top:i.getPos(n,c.getBody()).y}),e=c.dom.createRng(),e.setStart(o[0].firstChild,1),e.setEnd(o[0].lastChild,0),c.getBody().focus(),o[0].focus(),a=c.selection.getSel(),a.removeAllRanges(),a.addRange(e),c.$("*[data-mce-selected]").removeAttr("data-mce-selected"),n.setAttribute("data-mce-selected",1),ee=n,e):(j(),null))}function j(){ee&&(ee.removeAttribute("data-mce-selected"),c.$("#"+Z).remove(),ee=null)}function Y(){Q.destroy(),ee=null}var X=c.getBody(),K=new t(X),G=v(m,K.next),J=v(m,K.prev),Q=new o(c.getBody(),d),Z="sel-"+c.dom.uniqueId(),ee,te=c.$;return e.ceFalse&&(V(),U()),{showBlockCaretContainer:I,destroy:Y}}var v=d.curry,y=l.isContentEditableTrue,b=l.isContentEditableFalse,C=l.isElement,x=i.isAfterContentEditableFalse,w=i.isBeforeContentEditableFalse,N=c.getSelectedNode;return g}),r(Ke,[w,g,E,R,A,H,P,Y,G,J,Q,Z,ee,te,N,d,_e,Ae,B,M,De,h,m,u,Me,Le,Pe,ze,Xe],function(e,n,r,i,o,a,s,l,c,u,d,f,h,p,m,g,v,y,b,C,x,w,N,E,_,S,k,T,R){function A(e,t,i){var o=this,a,s;a=o.documentBaseUrl=i.documentBaseURL,s=i.baseURI,o.settings=t=L({id:e,theme:"modern",delta_width:0,delta_height:0,popup_css:"",plugins:"",document_base_url:a,add_form_submit_trigger:!0,submit_patch:!0,add_unload_trigger:!0,convert_urls:!0,relative_urls:!0,remove_script_host:!0,object_resizing:!0,doctype:"",visual:!0,font_size_style_values:"xx-small,x-small,small,medium,large,x-large,xx-large",font_size_legacy_values:"xx-small,small,medium,large,x-large,xx-large,300%",forced_root_block:"p",hidden_input:!0,padd_empty_editor:!0,render_ui:!0,indentation:"30px",inline_styles:!0,convert_fonts_to_spans:!0,indent:"simple",indent_before:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",indent_after:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",validate:!0,entity_encoding:"named",url_converter:o.convertURL,url_converter_scope:o,ie7_compat:!0},t),r.language=t.language||"en",r.languageLoad=t.language_load,r.baseURL=i.baseURL,o.id=t.id=e,o.setDirty(!1),o.plugins={},o.documentBaseURI=new p(t.document_base_url||a,{base_uri:s}),o.baseURI=s,o.contentCSS=[],o.contentStyles=[],o.shortcuts=new k(o),o.loadedCSS={},o.editorCommands=new h(o),t.target&&(o.targetElm=t.target),o.suffix=i.suffix,o.editorManager=i,o.inline=t.inline,t.cache_suffix&&(w.cacheSuffix=t.cache_suffix.replace(/^[\?\&]+/,"")),t.override_viewport===!1&&(w.overrideViewPort=!1),i.fire("SetupEditor",o),o.execCallback("setup",o),o.$=n.overrideDefaults(function(){return{context:o.inline?o.getBody():o.getDoc(),element:o.getBody()}})}var B=e.DOM,D=r.ThemeManager,M=r.PluginManager,L=N.extend,P=N.each,H=N.explode,O=N.inArray,I=N.trim,F=N.resolve,z=g.Event,W=w.gecko,V=w.ie;return A.prototype={render:function(){function e(){B.unbind(window,"ready",e),n.render()}function t(){var e=m.ScriptLoader;if(r.language&&"en"!=r.language&&!r.language_url&&(r.language_url=n.editorManager.baseURL+"/langs/"+r.language+".js"),r.language_url&&e.add(r.language_url),r.theme&&"function"!=typeof r.theme&&"-"!=r.theme.charAt(0)&&!D.urls[r.theme]){var t=r.theme_url;t=t?n.documentBaseURI.toAbsolute(t):"themes/"+r.theme+"/theme"+o+".js",D.load(r.theme,t)}N.isArray(r.plugins)&&(r.plugins=r.plugins.join(" ")),P(r.external_plugins,function(e,t){M.load(t,e),r.plugins+=" "+t}),P(r.plugins.split(/[ ,]/),function(e){if(e=I(e),e&&!M.urls[e])if("-"==e.charAt(0)){e=e.substr(1,e.length);var t=M.dependencies(e);P(t,function(e){var t={prefix:"plugins/",resource:e,suffix:"/plugin"+o+".js"};e=M.createUrl(t,e),M.load(e.resource,e)})}else M.load(e,{prefix:"plugins/",resource:e,suffix:"/plugin"+o+".js"})}),e.loadQueue(function(){n.removed||n.init()})}var n=this,r=n.settings,i=n.id,o=n.suffix;if(!z.domLoaded)return void B.bind(window,"ready",e);if(n.getElement()&&w.contentEditable){r.inline?n.inline=!0:(n.orgVisibility=n.getElement().style.visibility,n.getElement().style.visibility="hidden");var a=n.getElement().form||B.getParent(i,"form");a&&(n.formElement=a,r.hidden_input&&!/TEXTAREA|INPUT/i.test(n.getElement().nodeName)&&(B.insertAfter(B.create("input",{type:"hidden",name:i}),i),n.hasHiddenInput=!0),n.formEventDelegate=function(e){n.fire(e.type,e)},B.bind(a,"submit reset",n.formEventDelegate),n.on("reset",function(){n.setContent(n.startContent,{format:"raw"})}),!r.submit_patch||a.submit.nodeType||a.submit.length||a._mceOldSubmit||(a._mceOldSubmit=a.submit,a.submit=function(){return n.editorManager.triggerSave(), +n.setDirty(!1),a._mceOldSubmit(a)})),n.windowManager=new v(n),n.notificationManager=new y(n),"xml"==r.encoding&&n.on("GetContent",function(e){e.save&&(e.content=B.encode(e.content))}),r.add_form_submit_trigger&&n.on("submit",function(){n.initialized&&n.save()}),r.add_unload_trigger&&(n._beforeUnload=function(){!n.initialized||n.destroyed||n.isHidden()||n.save({format:"raw",no_events:!0,set_dirty:!1})},n.editorManager.on("BeforeUnload",n._beforeUnload)),t()}},init:function(){function e(n){var r=M.get(n),i,o;if(i=M.urls[n]||t.documentBaseUrl.replace(/\/$/,""),n=I(n),r&&-1===O(m,n)){if(P(M.dependencies(n),function(t){e(t)}),t.plugins[n])return;o=new r(t,i,t.$),t.plugins[n]=o,o.init&&(o.init(t,i),m.push(n))}}var t=this,n=t.settings,r=t.getElement(),i,o,a,s,l,c,u,d,f,h,p,m=[];if(this.editorManager.i18n.setCode(n.language),t.rtl=n.rtl_ui||this.editorManager.i18n.rtl,t.editorManager.add(t),n.aria_label=n.aria_label||B.getAttrib(r,"aria-label",t.getLang("aria.rich_text_area")),n.theme&&("function"!=typeof n.theme?(n.theme=n.theme.replace(/-/,""),c=D.get(n.theme),t.theme=new c(t,D.urls[n.theme]),t.theme.init&&t.theme.init(t,D.urls[n.theme]||t.documentBaseUrl.replace(/\/$/,""),t.$)):t.theme=n.theme),P(n.plugins.replace(/\-/g,"").split(/[ ,]/),e),n.render_ui&&t.theme&&(t.orgDisplay=r.style.display,"function"!=typeof n.theme?(i=n.width||r.style.width||r.offsetWidth,o=n.height||r.style.height||r.offsetHeight,a=n.min_height||100,h=/^[0-9\.]+(|px)$/i,h.test(""+i)&&(i=Math.max(parseInt(i,10),100)),h.test(""+o)&&(o=Math.max(parseInt(o,10),a)),l=t.theme.renderUI({targetNode:r,width:i,height:o,deltaWidth:n.delta_width,deltaHeight:n.delta_height}),n.content_editable||(o=(l.iframeHeight||o)+("number"==typeof o?l.deltaHeight||0:""),a>o&&(o=a))):(l=n.theme(t,r),l.editorContainer.nodeType&&(l.editorContainer=l.editorContainer.id=l.editorContainer.id||t.id+"_parent"),l.iframeContainer.nodeType&&(l.iframeContainer=l.iframeContainer.id=l.iframeContainer.id||t.id+"_iframecontainer"),o=l.iframeHeight||r.offsetHeight),t.editorContainer=l.editorContainer),n.content_css&&P(H(n.content_css),function(e){t.contentCSS.push(t.documentBaseURI.toAbsolute(e))}),n.content_style&&t.contentStyles.push(n.content_style),n.content_editable)return r=s=l=null,t.initContentBody();for(t.iframeHTML=n.doctype+"",n.document_base_url!=t.documentBaseUrl&&(t.iframeHTML+=''),!w.caretAfter&&n.ie7_compat&&(t.iframeHTML+=''),t.iframeHTML+='',p=0;p',t.loadedCSS[g]=!0}d=n.body_id||"tinymce",-1!=d.indexOf("=")&&(d=t.getParam("body_id","","hash"),d=d[t.id]||d),f=n.body_class||"",-1!=f.indexOf("=")&&(f=t.getParam("body_class","","hash"),f=f[t.id]||""),n.content_security_policy&&(t.iframeHTML+=''),t.iframeHTML+='
    ';var v='javascript:(function(){document.open();document.domain="'+document.domain+'";var ed = window.parent.tinymce.get("'+t.id+'");document.write(ed.iframeHTML);document.close();ed.initContentBody(true);})()';document.domain!=location.hostname&&w.ie&&w.ie<12&&(u=v);var y=B.create("iframe",{id:t.id+"_ifr",frameBorder:"0",allowTransparency:"true",title:t.editorManager.translate("Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help"),style:{width:"100%",height:o,display:"block"}});if(y.onload=function(){y.onload=null,t.fire("load")},B.setAttrib(y,"src",u||'javascript:""'),t.contentAreaContainer=l.iframeContainer,t.iframeElement=y,s=B.add(l.iframeContainer,y),V)try{t.getDoc()}catch(b){s.src=u=v}l.editorContainer&&(B.get(l.editorContainer).style.display=t.orgDisplay,t.hidden=B.isHidden(l.editorContainer)),t.getElement().style.display="none",B.setAttrib(t.id,"aria-hidden",!0),u||t.initContentBody(),r=s=l=null},initContentBody:function(t){var n=this,r=n.settings,s=n.getElement(),h=n.getDoc(),p,m;r.inline||(n.getElement().style.visibility=n.orgVisibility),t||r.content_editable||(h.open(),h.write(n.iframeHTML),h.close()),r.content_editable&&(n.on("remove",function(){var e=this.getBody();B.removeClass(e,"mce-content-body"),B.removeClass(e,"mce-edit-focus"),B.setAttrib(e,"contentEditable",null)}),B.addClass(s,"mce-content-body"),n.contentDocument=h=r.content_document||document,n.contentWindow=r.content_window||window,n.bodyElement=s,r.content_document=r.content_window=null,r.root_name=s.nodeName.toLowerCase()),p=n.getBody(),p.disabled=!0,n.readonly=r.readonly,n.readonly||(n.inline&&"static"==B.getStyle(p,"position",!0)&&(p.style.position="relative"),p.contentEditable=n.getParam("content_editable_state",!0)),p.disabled=!1,n.editorUpload=new T(n),n.schema=new b(r),n.dom=new e(h,{keep_values:!0,url_converter:n.convertURL,url_converter_scope:n,hex_colors:r.force_hex_style_colors,class_filter:r.class_filter,update_styles:!0,root_element:n.inline?n.getBody():null,collect:r.content_editable,schema:n.schema,onSetAttrib:function(e){n.fire("SetAttrib",e)}}),n.parser=new C(r,n.schema),n.parser.addAttributeFilter("src,href,style,tabindex",function(e,t){for(var r=e.length,i,o=n.dom,a,s;r--;)if(i=e[r],a=i.attr(t),s="data-mce-"+t,!i.attributes.map[s]){if(0===a.indexOf("data:")||0===a.indexOf("blob:"))continue;"style"===t?(a=o.serializeStyle(o.parseStyle(a),i.name),a.length||(a=null),i.attr(s,a),i.attr(t,a)):"tabindex"===t?(i.attr(s,a),i.attr(t,null)):i.attr(s,n.convertURL(a,t,i.name))}}),n.parser.addNodeFilter("script",function(e){for(var t=e.length,n,r;t--;)n=e[t],r=n.attr("type")||"no/type",0!==r.indexOf("mce-")&&n.attr("type","mce-"+r)}),n.parser.addNodeFilter("#cdata",function(e){for(var t=e.length,n;t--;)n=e[t],n.type=8,n.name="#comment",n.value="[CDATA["+n.value+"]]"}),n.parser.addNodeFilter("p,h1,h2,h3,h4,h5,h6,div",function(e){for(var t=e.length,r,i=n.schema.getNonEmptyElements();t--;)r=e[t],r.isEmpty(i)&&(r.append(new o("br",1)).shortEnded=!0)}),n.serializer=new a(r,n),n.selection=new l(n.dom,n.getWin(),n.serializer,n),n.formatter=new c(n),n.undoManager=new u(n),n.forceBlocks=new f(n),n.enterKey=new d(n),n._nodeChangeDispatcher=new i(n),n._selectionOverrides=new R(n),n.fire("PreInit"),r.browser_spellcheck||r.gecko_spellcheck||(h.body.spellcheck=!1,B.setAttrib(p,"spellcheck","false")),n.fire("PostRender"),n.quirks=new x(n),r.directionality&&(p.dir=r.directionality),r.nowrap&&(p.style.whiteSpace="nowrap"),r.protect&&n.on("BeforeSetContent",function(e){P(r.protect,function(t){e.content=e.content.replace(t,function(e){return""})})}),n.on("SetContent",function(){n.addVisual(n.getBody())}),r.padd_empty_editor&&n.on("PostProcess",function(e){e.content=e.content.replace(/^(]*>( | |\s|\u00a0|)<\/p>[\r\n]*|
    [\r\n]*)$/,"")}),n.load({initial:!0,format:"html"}),n.startContent=n.getContent({format:"raw"}),n.initialized=!0,n.bindPendingEventDelegates(),n.fire("init"),n.focus(!0),n.nodeChanged({initial:!0}),n.execCallback("init_instance_callback",n),n.contentStyles.length>0&&(m="",P(n.contentStyles,function(e){m+=e+"\r\n"}),n.dom.addStyle(m)),P(n.contentCSS,function(e){n.loadedCSS[e]||(n.dom.loadCSS(e),n.loadedCSS[e]=!0)}),r.auto_focus&&E.setEditorTimeout(n,function(){var e;e=r.auto_focus===!0?n:n.editorManager.get(r.auto_focus),e.destroyed||e.focus()},100),s=h=p=null},focus:function(e){function t(e){return n.dom.getParent(e,function(e){return"true"===n.dom.getContentEditable(e)})}var n=this,r=n.selection,i=n.settings.content_editable,o,a,s=n.getDoc(),l=n.getBody(),c;if(!e){if(o=r.getRng(),o.item&&(a=o.item(0)),n._refreshContentEditable(),c=t(r.getNode()),n.$.contains(l,c))return c.focus(),r.normalize(),void n.editorManager.setActive(n);if(i||(w.opera||n.getBody().focus(),n.getWin().focus()),W||i){if(l.setActive)try{l.setActive()}catch(u){l.focus()}else l.focus();i&&r.normalize()}a&&a.ownerDocument==s&&(o=s.body.createControlRange(),o.addElement(a),o.select())}n.editorManager.setActive(n)},execCallback:function(e){var t=this,n=t.settings[e],r;if(n)return t.callbackLookup&&(r=t.callbackLookup[e])&&(n=r.func,r=r.scope),"string"==typeof n&&(r=n.replace(/\.\w+$/,""),r=r?F(r):0,n=F(n),t.callbackLookup=t.callbackLookup||{},t.callbackLookup[e]={func:n,scope:r}),n.apply(r||t,Array.prototype.slice.call(arguments,1))},translate:function(e){var t=this.settings.language||"en",n=this.editorManager.i18n;return e?n.data[t+"."+e]||e.replace(/\{\#([^\}]+)\}/g,function(e,r){return n.data[t+"."+r]||"{#"+r+"}"}):""},getLang:function(e,n){return this.editorManager.i18n.data[(this.settings.language||"en")+"."+e]||(n!==t?n:"{#"+e+"}")},getParam:function(e,t,n){var r=e in this.settings?this.settings[e]:t,i;return"hash"===n?(i={},"string"==typeof r?P(r.indexOf("=")>0?r.split(/[;,](?![^=;,]*(?:[;,]|$))/):r.split(","),function(e){e=e.split("="),e.length>1?i[I(e[0])]=I(e[1]):i[I(e[0])]=I(e)}):i=r,i):r},nodeChanged:function(e){this._nodeChangeDispatcher.nodeChanged(e)},addButton:function(e,t){var n=this;t.cmd&&(t.onclick=function(){n.execCommand(t.cmd)}),t.text||t.icon||(t.icon=e),n.buttons=n.buttons||{},t.tooltip=t.tooltip||t.title,n.buttons[e]=t},addMenuItem:function(e,t){var n=this;t.cmd&&(t.onclick=function(){n.execCommand(t.cmd)}),n.menuItems=n.menuItems||{},n.menuItems[e]=t},addContextToolbar:function(e,t){var n=this,r;n.contextToolbars=n.contextToolbars||[],"string"==typeof e&&(r=e,e=function(e){return n.dom.is(e,r)}),n.contextToolbars.push({predicate:e,items:t})},addCommand:function(e,t,n){this.editorCommands.addCommand(e,t,n)},addQueryStateHandler:function(e,t,n){this.editorCommands.addQueryStateHandler(e,t,n)},addQueryValueHandler:function(e,t,n){this.editorCommands.addQueryValueHandler(e,t,n)},addShortcut:function(e,t,n,r){this.shortcuts.add(e,t,n,r)},execCommand:function(e,t,n,r){return this.editorCommands.execCommand(e,t,n,r)},queryCommandState:function(e){return this.editorCommands.queryCommandState(e)},queryCommandValue:function(e){return this.editorCommands.queryCommandValue(e)},queryCommandSupported:function(e){return this.editorCommands.queryCommandSupported(e)},show:function(){var e=this;e.hidden&&(e.hidden=!1,e.inline?e.getBody().contentEditable=!0:(B.show(e.getContainer()),B.hide(e.id)),e.load(),e.fire("show"))},hide:function(){var e=this,t=e.getDoc();e.hidden||(V&&t&&!e.inline&&t.execCommand("SelectAll"),e.save(),e.inline?(e.getBody().contentEditable=!1,e==e.editorManager.focusedEditor&&(e.editorManager.focusedEditor=null)):(B.hide(e.getContainer()),B.setStyle(e.id,"display",e.orgDisplay)),e.hidden=!0,e.fire("hide"))},isHidden:function(){return!!this.hidden},setProgressState:function(e,t){this.fire("ProgressState",{state:e,time:t})},load:function(e){var n=this,r=n.getElement(),i;return r?(e=e||{},e.load=!0,i=n.setContent(r.value!==t?r.value:r.innerHTML,e),e.element=r,e.no_events||n.fire("LoadContent",e),e.element=r=null,i):void 0},save:function(e){var t=this,n=t.getElement(),r,i;if(n&&t.initialized)return e=e||{},e.save=!0,e.element=n,r=e.content=t.getContent(e),e.no_events||t.fire("SaveContent",e),"raw"==e.format&&t.fire("RawSaveContent",e),r=e.content,/TEXTAREA|INPUT/i.test(n.nodeName)?n.value=r:(t.inline||(n.innerHTML=r),(i=B.getParent(t.id,"form"))&&P(i.elements,function(e){return e.name==t.id?(e.value=r,!1):void 0})),e.element=n=null,e.set_dirty!==!1&&t.setDirty(!1),r},setContent:function(e,t){var n=this,r=n.getBody(),i,o;return t=t||{},t.format=t.format||"html",t.set=!0,t.content=e,t.no_events||n.fire("BeforeSetContent",t),e=t.content,0===e.length||/^\s+$/.test(e)?(o=V&&11>V?"":'
    ',"TABLE"==r.nodeName?e=""+o+"":/^(UL|OL)$/.test(r.nodeName)&&(e="
  • "+o+"
  • "),i=n.settings.forced_root_block,i&&n.schema.isValidChild(r.nodeName.toLowerCase(),i.toLowerCase())?(e=o,e=n.dom.createHTML(i,n.settings.forced_root_block_attrs,e)):V||e||(e='
    '),n.dom.setHTML(r,e),n.fire("SetContent",t)):("raw"!==t.format&&(e=new s({validate:n.validate},n.schema).serialize(n.parser.parse(e,{isRootContent:!0}))),t.content=I(e),n.dom.setHTML(r,t.content),t.no_events||n.fire("SetContent",t)),t.content},getContent:function(e){var t=this,n,r=t.getBody();return e=e||{},e.format=e.format||"html",e.get=!0,e.getInner=!0,e.no_events||t.fire("BeforeGetContent",e),n="raw"==e.format?t.serializer.getTrimmedContent():"text"==e.format?r.innerText||r.textContent:t.serializer.serialize(r,e),"text"!=e.format?e.content=I(n):e.content=n,e.no_events||t.fire("GetContent",e),e.content},insertContent:function(e,t){t&&(e=L({content:e},t)),this.execCommand("mceInsertContent",!1,e)},isDirty:function(){return!this.isNotDirty},setDirty:function(e){var t=!this.isNotDirty;this.isNotDirty=!e,e&&e!=t&&this.fire("dirty")},setMode:function(e){S.setMode(this,e)},getContainer:function(){var e=this;return e.container||(e.container=B.get(e.editorContainer||e.id+"_parent")),e.container},getContentAreaContainer:function(){return this.contentAreaContainer},getElement:function(){return this.targetElm||(this.targetElm=B.get(this.id)),this.targetElm},getWin:function(){var e=this,t;return e.contentWindow||(t=e.iframeElement,t&&(e.contentWindow=t.contentWindow)),e.contentWindow},getDoc:function(){var e=this,t;return e.contentDocument||(t=e.getWin(),t&&(e.contentDocument=t.document)),e.contentDocument},getBody:function(){return this.bodyElement||this.getDoc().body},convertURL:function(e,t,n){var r=this,i=r.settings;return i.urlconverter_callback?r.execCallback("urlconverter_callback",e,n,!0,t):!i.convert_urls||n&&"LINK"==n.nodeName||0===e.indexOf("file:")||0===e.length?e:i.relative_urls?r.documentBaseURI.toRelative(e):e=r.documentBaseURI.toAbsolute(e,i.remove_script_host)},addVisual:function(e){var n=this,r=n.settings,i=n.dom,o;e=e||n.getBody(),n.hasVisual===t&&(n.hasVisual=r.visual),P(i.select("table,a",e),function(e){var t;switch(e.nodeName){case"TABLE":return o=r.visual_table_class||"mce-item-table",t=i.getAttrib(e,"border"),void(t&&"0"!=t||!n.hasVisual?i.removeClass(e,o):i.addClass(e,o));case"A":return void(i.getAttrib(e,"href",!1)||(t=i.getAttrib(e,"name")||e.id,o=r.visual_anchor_class||"mce-item-anchor",t&&n.hasVisual?i.addClass(e,o):i.removeClass(e,o)))}}),n.fire("VisualAid",{element:e,hasVisual:n.hasVisual})},remove:function(){var e=this;e.removed||(e.save(),e.removed=1,e.unbindAllNativeEvents(),e.hasHiddenInput&&B.remove(e.getElement().nextSibling),e.inline||(V&&10>V&&e.getDoc().execCommand("SelectAll",!1,null),B.setStyle(e.id,"display",e.orgDisplay),e.getBody().onload=null),e.fire("remove"),e.editorManager.remove(e),B.remove(e.getContainer()),e._selectionOverrides.destroy(),e.editorUpload.destroy(),e.destroy())},destroy:function(e){var t=this,n;if(!t.destroyed){if(!e&&!t.removed)return void t.remove();e||(t.editorManager.off("beforeunload",t._beforeUnload),t.theme&&t.theme.destroy&&t.theme.destroy(),t.selection.destroy(),t.dom.destroy()),n=t.formElement,n&&(n._mceOldSubmit&&(n.submit=n._mceOldSubmit,n._mceOldSubmit=null),B.unbind(n,"submit reset",t.formEventDelegate)),t.contentAreaContainer=t.formElement=t.container=t.editorContainer=null,t.bodyElement=t.contentDocument=t.contentWindow=null,t.iframeElement=t.targetElm=null,t.selection&&(t.selection=t.selection.win=t.selection.dom=t.selection.dom.doc=null),t.destroyed=1}},uploadImages:function(e){return this.editorUpload.uploadImages(e)},_scanForImages:function(){return this.editorUpload.scanForImages()},_refreshContentEditable:function(){var e=this,t,n;e._isHidden()&&(t=e.getBody(),n=t.parentNode,n.removeChild(t),n.appendChild(t),t.focus())},_isHidden:function(){var e;return W?(e=this.selection.getSel(),!e||!e.rangeCount||0===e.rangeCount):0}},L(A.prototype,_),A}),r(Ge,[],function(){var e={},t="en";return{setCode:function(e){e&&(t=e,this.rtl=this.data[e]?"rtl"===this.data[e]._dir:!1)},getCode:function(){return t},rtl:!1,add:function(t,n){var r=e[t];r||(e[t]=r={});for(var i in n)r[i]=n[i];this.setCode(t)},translate:function(n){var r;if(r=e[t],r||(r={}),"undefined"==typeof n)return n;if("string"!=typeof n&&n.raw)return n.raw;if(n.push){var i=n.slice(1);n=(r[n[0]]||n[0]).replace(/\{([0-9]+)\}/g,function(e,t){return i[t]})}return(r[n]||n).replace(/{context:\w+}$/,"")},data:e}}),r(Je,[w,u,h],function(e,t,n){function r(e){function l(){try{return document.activeElement}catch(e){return document.body}}function c(e,t){if(t&&t.startContainer){if(!e.isChildOf(t.startContainer,e.getRoot())||!e.isChildOf(t.endContainer,e.getRoot()))return;return{startContainer:t.startContainer,startOffset:t.startOffset,endContainer:t.endContainer,endOffset:t.endOffset}}return t}function u(e,t){var n;return t.startContainer?(n=e.getDoc().createRange(),n.setStart(t.startContainer,t.startOffset),n.setEnd(t.endContainer,t.endOffset)):n=t,n}function d(e){return!!s.getParent(e,r.isEditorUIElement)}function f(r){var f=r.editor;f.on("init",function(){(f.inline||n.ie)&&("onbeforedeactivate"in document&&n.ie<9?f.dom.bind(f.getBody(),"beforedeactivate",function(e){if(e.target==f.getBody())try{f.lastRng=f.selection.getRng()}catch(t){}}):f.on("nodechange mouseup keyup",function(e){var t=l();"nodechange"==e.type&&e.selectionChange||(t&&t.id==f.id+"_ifr"&&(t=f.getBody()),f.dom.isChildOf(t,f.getBody())&&(f.lastRng=f.selection.getRng()))}),n.webkit&&!i&&(i=function(){var t=e.activeEditor;if(t&&t.selection){var n=t.selection.getRng();n&&!n.collapsed&&(f.lastRng=n)}},s.bind(document,"selectionchange",i)))}),f.on("setcontent",function(){f.lastRng=null}),f.on("mousedown",function(){f.selection.lastFocusBookmark=null}),f.on("focusin",function(){var t=e.focusedEditor,n;f.selection.lastFocusBookmark&&(n=u(f,f.selection.lastFocusBookmark),f.selection.lastFocusBookmark=null,f.selection.setRng(n)),t!=f&&(t&&t.fire("blur",{focusedEditor:f}),e.setActive(f),e.focusedEditor=f,f.fire("focus",{blurredEditor:t}),f.focus(!0)),f.lastRng=null}),f.on("focusout",function(){t.setEditorTimeout(f,function(){var t=e.focusedEditor;d(l())||t!=f||(f.fire("blur",{focusedEditor:null}),e.focusedEditor=null,f.selection&&(f.selection.lastFocusBookmark=null))})}),o||(o=function(t){var n=e.activeEditor;n&&t.target.ownerDocument==document&&(n.selection&&t.target!=n.getBody()&&(n.selection.lastFocusBookmark=c(n.dom,n.lastRng)),t.target==document.body||d(t.target)||e.focusedEditor!=n||(n.fire("blur",{focusedEditor:null}),e.focusedEditor=null))},s.bind(document,"focusin",o)),f.inline&&!a&&(a=function(t){var n=e.activeEditor;if(n.inline&&!n.dom.isChildOf(t.target,n.getBody())){var r=n.selection.getRng();r.collapsed||(n.lastRng=r)}},s.bind(document,"mouseup",a))}function h(t){e.focusedEditor==t.editor&&(e.focusedEditor=null),e.activeEditor||(s.unbind(document,"selectionchange",i),s.unbind(document,"focusin",o),s.unbind(document,"mouseup",a),i=o=a=null)}e.on("AddEditor",f),e.on("RemoveEditor",h)}var i,o,a,s=e.DOM;return r.isEditorUIElement=function(e){return-1!==e.className.toString().indexOf("mce-")},r}),r(Qe,[Ke,g,w,te,h,m,oe,Ge,Je],function(e,t,n,r,i,o,a,s,l){function c(e){m(b.editors,function(t){t.fire("ResizeWindow",e)})}function u(e,n){n!==C&&(n?t(window).on("resize",c):t(window).off("resize",c),C=n)}function d(e){var t=b.editors,n;delete t[e.id];for(var r=0;r0&&m(p(e),function(e){var n;(n=h.get(e))?r(e,t,n):m(document.forms,function(n){m(n.elements,function(n){n.name===e&&(e="mce_editor_"+v++,h.setAttrib(n,"id",e),r(e,t,n))})})});break;case"textareas":case"specific_textareas":m(h.select("textarea"),function(e){t.editor_deselector&&o(e,t.editor_deselector)||(!t.editor_selector||o(e,t.editor_selector))&&r(n(e),t,e)})}t.oninit&&(e=s=0,m(l,function(t){s++,t.initialized?e++:t.on("init",function(){e++,e==s&&i("oninit")}),e==s&&i("oninit")}))}var s=this,l=[];s.settings=t,h.bind(window,"ready",a)},get:function(e){return arguments.length?e in this.editors?this.editors[e]:null:this.editors},add:function(e){var t=this,n=t.editors;return n[e.id]=e,n.push(e),u(n,!0),t.activeEditor=e,t.fire("AddEditor",{editor:e}),y||(y=function(){t.fire("BeforeUnload")},h.bind(window,"beforeunload",y)),e},createEditor:function(t,n){return this.add(new e(t,n,this))},remove:function(e){var t=this,n,r=t.editors,i;{if(e)return"string"==typeof e?(e=e.selector||e,void m(h.select(e),function(e){i=r[e.id],i&&t.remove(i)})):(i=e,r[i.id]?(d(i)&&t.fire("RemoveEditor",{editor:i}),r.length||h.unbind(window,"beforeunload",y),i.remove(),u(r,r.length>0),i):null);for(n=r.length-1;n>=0;n--)t.remove(r[n])}},execCommand:function(t,n,r){var i=this,o=i.get(r);switch(t){case"mceAddEditor":return i.get(r)||new e(r,i.settings,i).render(),!0;case"mceRemoveEditor":return o&&o.remove(),!0;case"mceToggleEditor":return o?(o.isHidden()?o.show():o.hide(),!0):(i.execCommand("mceAddEditor",0,r),!0)}return i.activeEditor?i.activeEditor.execCommand(t,n,r):!1},triggerSave:function(){m(this.editors,function(e){e.save()})},addI18n:function(e,t){s.add(e,t)},translate:function(e){return s.translate(e)},setActive:function(e){var t=this.activeEditor;this.activeEditor!=e&&(t&&t.fire("deactivate",{relatedTarget:e}),e.fire("activate",{relatedTarget:t})),this.activeEditor=e}},g(b,a),b.setup(),window.tinymce=window.tinyMCE=b,b}),r(Ze,[Qe,m],function(e,t){var n=t.each,r=t.explode;e.on("AddEditor",function(e){var t=e.editor;t.on("preInit",function(){function e(e,t){n(t,function(t,n){t&&s.setStyle(e,n,t)}),s.rename(e,"span")}function i(e){s=t.dom,l.convert_fonts_to_spans&&n(s.select("font,u,strike",e.node),function(e){o[e.nodeName.toLowerCase()](s,e)})}var o,a,s,l=t.settings;l.inline_styles&&(a=r(l.font_size_legacy_values),o={font:function(t,n){e(n,{backgroundColor:n.style.backgroundColor,color:n.color,fontFamily:n.face,fontSize:a[parseInt(n.size,10)-1]})},u:function(n,r){"html4"===t.settings.schema&&e(r,{textDecoration:"underline"})},strike:function(t,n){e(n,{textDecoration:"line-through"})}},t.on("PreProcess SetContent",i))})})}),r(et,[oe,m],function(e,t){var n={send:function(e){function r(){!e.async||4==i.readyState||o++>1e4?(e.success&&1e4>o&&200==i.status?e.success.call(e.success_scope,""+i.responseText,i,e):e.error&&e.error.call(e.error_scope,o>1e4?"TIMED_OUT":"GENERAL",i,e),i=null):setTimeout(r,10)}var i,o=0;if(e.scope=e.scope||this,e.success_scope=e.success_scope||e.scope,e.error_scope=e.error_scope||e.scope,e.async=e.async===!1?!1:!0,e.data=e.data||"",i=new XMLHttpRequest){if(i.overrideMimeType&&i.overrideMimeType(e.content_type),i.open(e.type||(e.data?"POST":"GET"),e.url,e.async),e.crossDomain&&(i.withCredentials=!0),e.content_type&&i.setRequestHeader("Content-Type",e.content_type),e.requestheaders&&t.each(e.requestheaders,function(e){i.setRequestHeader(e.key,e.value)}),i.setRequestHeader("X-Requested-With","XMLHttpRequest"),i=n.fire("beforeSend",{xhr:i,settings:e}).xhr,i.send(e.data),!e.async)return r();setTimeout(r,10)}}};return t.extend(n,e),n}),r(tt,[],function(){function e(t,n){var r,i,o,a;if(n=n||'"',null===t)return"null";if(o=typeof t,"string"==o)return i="\bb t\nn\ff\rr\"\"''\\\\",n+t.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g,function(e,t){return'"'===n&&"'"===e?e:(r=i.indexOf(t),r+1?"\\"+i.charAt(r+1):(e=t.charCodeAt().toString(16),"\\u"+"0000".substring(e.length)+e))})+n;if("object"==o){if(t.hasOwnProperty&&"[object Array]"===Object.prototype.toString.call(t)){for(r=0,i="[";r0?",":"")+e(t[r],n);return i+"]"}i="{";for(a in t)t.hasOwnProperty(a)&&(i+="function"!=typeof t[a]?(i.length>1?","+n:n)+a+n+":"+e(t[a],n):"");return i+"}"}return""+t}return{serialize:e,parse:function(e){try{return window[String.fromCharCode(101)+"val"]("("+e+")")}catch(t){}}}}),r(nt,[tt,et,m],function(e,t,n){function r(e){this.settings=i({},e),this.count=0}var i=n.extend;return r.sendRPC=function(e){return(new r).send(e)},r.prototype={send:function(n){var r=n.error,o=n.success;n=i(this.settings,n),n.success=function(t,i){t=e.parse(t),"undefined"==typeof t&&(t={error:"JSON Parse error."}),t.error?r.call(n.error_scope||n.scope,t.error,i):o.call(n.success_scope||n.scope,t.result)},n.error=function(e,t){r&&r.call(n.error_scope||n.scope,e,t)},n.data=e.serialize({id:n.id||"c"+this.count++,method:n.method,params:n.params}),n.content_type="application/json",t.send(n)}},r}),r(rt,[w],function(e){return{callbacks:{},count:0,send:function(n){var r=this,i=e.DOM,o=n.count!==t?n.count:r.count,a="tinymce_jsonp_"+o;r.callbacks[o]=function(e){i.remove(a),delete r.callbacks[o],n.callback(e)},i.add(i.doc.body,"script",{id:a,src:n.url,type:"text/javascript"}),r.count++}}}),r(it,[],function(){function e(){s=[];for(var e in a)s.push(e);i.length=s.length}function n(){function n(e){var n,r;return r=e!==t?u+e:i.indexOf(",",u),-1===r||r>i.length?null:(n=i.substring(u,r),u=r+1,n)}var r,i,s,u=0;if(a={},c){o.load(l),i=o.getAttribute(l)||"";do{var d=n();if(null===d)break;if(r=n(parseInt(d,32)||0),null!==r){if(d=n(),null===d)break;s=n(parseInt(d,32)||0),r&&(a[r]=s)}}while(null!==r);e()}}function r(){var t,n="";if(c){for(var r in a)t=a[r],n+=(n?",":"")+r.length.toString(32)+","+r+","+t.length.toString(32)+","+t;o.setAttribute(l,n);try{o.save(l)}catch(i){}e()}}var i,o,a,s,l,c;try{if(window.localStorage)return localStorage}catch(u){}return l="tinymce",o=document.documentElement,c=!!o.addBehavior,c&&o.addBehavior("#default#userData"),i={key:function(e){return s[e]},getItem:function(e){return e in a?a[e]:null},setItem:function(e,t){a[e]=""+t,r()},removeItem:function(e){delete a[e],r()},clear:function(){a={},r()}},n(),i}),r(ot,[w,d,N,E,m,h],function(e,t,n,r,i,o){var a=window.tinymce;return a.DOM=e.DOM,a.ScriptLoader=n.ScriptLoader,a.PluginManager=r.PluginManager,a.ThemeManager=r.ThemeManager,a.dom=a.dom||{},a.dom.Event=t.Event,i.each(i,function(e,t){a[t]=e}),i.each("isOpera isWebKit isIE isGecko isMac".split(" "),function(e){a[e]=o[e.substr(2).toLowerCase()]}),{}}),r(at,[ne,m],function(e,t){return e.extend({Defaults:{firstControlClass:"first",lastControlClass:"last"},init:function(e){this.settings=t.extend({},this.Defaults,e)},preRender:function(e){e.bodyClasses.add(this.settings.containerClass)},applyClasses:function(e){var t=this,n=t.settings,r,i,o,a;r=n.firstControlClass,i=n.lastControlClass,e.each(function(e){e.classes.remove(r).remove(i).add(n.controlClass),e.visible()&&(o||(o=e),a=e)}),o&&o.classes.add(r),a&&a.classes.add(i)},renderHtml:function(e){var t=this,n="";return t.applyClasses(e.items()),e.items().each(function(e){n+=e.renderHtml()}),n},recalc:function(){},postRender:function(){},isNative:function(){return!1}})}),r(st,[at],function(e){return e.extend({Defaults:{containerClass:"abs-layout",controlClass:"abs-layout-item"},recalc:function(e){e.items().filter(":visible").each(function(e){var t=e.settings;e.layoutRect({x:t.x,y:t.y,w:t.w,h:t.h}),e.recalc&&e.recalc()})},renderHtml:function(e){return'
    '+this._super(e)}})}),r(lt,[ke],function(e){return e.extend({Defaults:{classes:"widget btn",role:"button"},init:function(e){var t=this,n;t._super(e),e=t.settings,n=t.settings.size,t.on("click mousedown",function(e){e.preventDefault()}),t.on("touchstart",function(e){t.fire("click",e),e.preventDefault()}),e.subtype&&t.classes.add(e.subtype),n&&t.classes.add("btn-"+n),e.icon&&t.icon(e.icon)},icon:function(e){return arguments.length?(this.state.set("icon",e),this):this.state.get("icon")},repaint:function(){var e=this.getEl().firstChild,t;e&&(t=e.style,t.width=t.height="100%"),this._super()},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix,r=e.state.get("icon"),i,o=e.state.get("text"),a="";return i=e.settings.image,i?(r="none","string"!=typeof i&&(i=window.getSelection?i[0]:i[1]),i=" style=\"background-image: url('"+i+"')\""):i="",o&&(e.classes.add("btn-has-text"),a=''+e.encode(o)+""),r=e.settings.icon?n+"ico "+n+"i-"+r:"",'
    "},bindStates:function(){function e(e){var i=n("span."+r,t.getEl());e?(i[0]||(n("button:first",t.getEl()).append(''),i=n("span."+r,t.getEl())),i.html(t.encode(e))):i.remove(),t.classes.toggle("btn-has-text",!!e)}var t=this,n=t.$,r=t.classPrefix+"txt";return t.state.on("change:text",function(t){e(t.value)}),t.state.on("change:icon",function(n){var r=n.value,i=t.classPrefix;t.settings.icon=r,r=r?i+"ico "+i+"i-"+t.settings.icon:"";var o=t.getEl().firstChild,a=o.getElementsByTagName("i")[0];r?(a&&a==o.firstChild||(a=document.createElement("i"),o.insertBefore(a,o.firstChild)),a.className=r):a&&o.removeChild(a),e(t.state.get("text"))}),t._super()}})}),r(ct,[ge],function(e){return e.extend({Defaults:{defaultType:"button",role:"group"},renderHtml:function(){var e=this,t=e._layout;return e.classes.add("btn-group"),e.preRender(),t.preRender(e),'
    '+(e.settings.html||"")+t.renderHtml(e)+"
    "}})}),r(ut,[ke],function(e){return e.extend({Defaults:{classes:"checkbox",role:"checkbox",checked:!1},init:function(e){var t=this;t._super(e),t.on("click mousedown",function(e){e.preventDefault()}),t.on("click",function(e){e.preventDefault(),t.disabled()||t.checked(!t.checked())}),t.checked(t.settings.checked)},checked:function(e){return arguments.length?(this.state.set("checked",e),this):this.state.get("checked")},value:function(e){return arguments.length?this.checked(e):this.checked()},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix;return'
    '+e.encode(e.state.get("text"))+"
    "},bindStates:function(){function e(e){t.classes.toggle("checked",e),t.aria("checked",e)}var t=this;return t.state.on("change:text",function(e){t.getEl("al").firstChild.data=t.translate(e.value)}),t.state.on("change:checked change:value",function(n){ +t.fire("change"),e(n.value)}),t.state.on("change:icon",function(e){var n=e.value,r=t.classPrefix;if("undefined"==typeof n)return t.settings.icon;t.settings.icon=n,n=n?r+"ico "+r+"i-"+t.settings.icon:"";var i=t.getEl().firstChild,o=i.getElementsByTagName("i")[0];n?(o&&o==i.firstChild||(o=document.createElement("i"),i.insertBefore(o,i.firstChild)),o.className=n):o&&i.removeChild(o)}),t.state.get("checked")&&e(!0),t._super()}})}),r(dt,[ke,pe,ce,g],function(e,t,n,r){return e.extend({init:function(e){var t=this;t._super(e),e=t.settings,t.classes.add("combobox"),t.subinput=!0,t.ariaTarget="inp",e.menu=e.menu||e.values,e.menu&&(e.icon="caret"),t.on("click",function(n){var i=n.target,o=t.getEl();if(r.contains(o,i)||i==o)for(;i&&i!=o;)i.id&&-1!=i.id.indexOf("-open")&&(t.fire("action"),e.menu&&(t.showMenu(),n.aria&&t.menu.items()[0].focus())),i=i.parentNode}),t.on("keydown",function(e){"INPUT"==e.target.nodeName&&13==e.keyCode&&t.parents().reverse().each(function(n){var r=t.state.get("value"),i=t.getEl("inp").value;return e.preventDefault(),t.state.set("value",i),r!=i&&t.fire("change"),n.hasEventListeners("submit")&&n.toJSON?(n.fire("submit",{data:n.toJSON()}),!1):void 0})}),t.on("keyup",function(e){"INPUT"==e.target.nodeName&&t.state.set("value",e.target.value)})},showMenu:function(){var e=this,n=e.settings,r;e.menu||(r=n.menu||[],r.length?r={type:"menu",items:r}:r.type=r.type||"menu",e.menu=t.create(r).parent(e).renderTo(e.getContainerElm()),e.fire("createmenu"),e.menu.reflow(),e.menu.on("cancel",function(t){t.control===e.menu&&e.focus()}),e.menu.on("show hide",function(t){t.control.items().each(function(t){t.active(t.value()==e.value())})}).fire("show"),e.menu.on("select",function(t){e.value(t.control.value())}),e.on("focusin",function(t){"INPUT"==t.target.tagName.toUpperCase()&&e.menu.hide()}),e.aria("expanded",!0)),e.menu.show(),e.menu.layoutRect({w:e.layoutRect().w}),e.menu.moveRel(e.getEl(),e.isRtl()?["br-tr","tr-br"]:["bl-tl","tl-bl"])},focus:function(){this.getEl("inp").focus()},repaint:function(){var e=this,t=e.getEl(),i=e.getEl("open"),o=e.layoutRect(),a,s;a=i?o.w-n.getSize(i).width-10:o.w-10;var l=document;return l.all&&(!l.documentMode||l.documentMode<=8)&&(s=e.layoutRect().h-2+"px"),r(t.firstChild).css({width:a,lineHeight:s}),e._super(),e},postRender:function(){var e=this;return r(this.getEl("inp")).on("change",function(t){e.state.set("value",t.target.value),e.fire("change",t)}),e._super()},renderHtml:function(){var e=this,t=e._id,n=e.settings,r=e.classPrefix,i=e.state.get("value")||"",o,a,s="",l="";return"spellcheck"in n&&(l+=' spellcheck="'+n.spellcheck+'"'),n.maxLength&&(l+=' maxlength="'+n.maxLength+'"'),n.size&&(l+=' size="'+n.size+'"'),n.subtype&&(l+=' type="'+n.subtype+'"'),e.disabled()&&(l+=' disabled="disabled"'),o=n.icon,o&&"caret"!=o&&(o=r+"ico "+r+"i-"+n.icon),a=e.state.get("text"),(o||a)&&(s='
    ",e.classes.add("has-open")),'
    '+s+"
    "},value:function(e){return arguments.length?(this.state.set("value",e),this):(this.state.get("rendered")&&this.state.set("value",this.getEl("inp").value),this.state.get("value"))},bindStates:function(){var e=this;return e.state.on("change:value",function(t){e.getEl("inp").value!=t.value&&(e.getEl("inp").value=t.value)}),e.state.on("change:disabled",function(t){e.getEl("inp").disabled=t.value}),e._super()},remove:function(){r(this.getEl("inp")).off(),this._super()}})}),r(ft,[dt],function(e){return e.extend({init:function(e){var t=this;e.spellcheck=!1,e.onaction&&(e.icon="none"),t._super(e),t.classes.add("colorbox"),t.on("change keyup postrender",function(){t.repaintColor(t.value())})},repaintColor:function(e){var t=this.getEl().getElementsByTagName("i")[0];if(t)try{t.style.background=e}catch(n){}},bindStates:function(){var e=this;return e.state.on("change:value",function(t){e._rendered&&e.repaintColor(t.value)}),e._super()}})}),r(ht,[lt,we],function(e,t){return e.extend({showPanel:function(){var e=this,n=e.settings;if(e.active(!0),e.panel)e.panel.show();else{var r=n.panel;r.type&&(r={layout:"grid",items:r}),r.role=r.role||"dialog",r.popover=!0,r.autohide=!0,r.ariaRoot=!0,e.panel=new t(r).on("hide",function(){e.active(!1)}).on("cancel",function(t){t.stopPropagation(),e.focus(),e.hidePanel()}).parent(e).renderTo(e.getContainerElm()),e.panel.fire("show"),e.panel.reflow()}e.panel.moveRel(e.getEl(),n.popoverAlign||(e.isRtl()?["bc-tr","bc-tc"]:["bc-tl","bc-tc"]))},hidePanel:function(){var e=this;e.panel&&e.panel.hide()},postRender:function(){var e=this;return e.aria("haspopup",!0),e.on("click",function(t){t.control===e&&(e.panel&&e.panel.visible()?e.hidePanel():(e.showPanel(),e.panel.focus(!!t.aria)))}),e._super()},remove:function(){return this.panel&&(this.panel.remove(),this.panel=null),this._super()}})}),r(pt,[ht,w],function(e,t){var n=t.DOM;return e.extend({init:function(e){this._super(e),this.classes.add("colorbutton")},color:function(e){return e?(this._color=e,this.getEl("preview").style.backgroundColor=e,this):this._color},resetColor:function(){return this._color=null,this.getEl("preview").style.backgroundColor=null,this},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix,r=e.state.get("text"),i=e.settings.icon?n+"ico "+n+"i-"+e.settings.icon:"",o=e.settings.image?" style=\"background-image: url('"+e.settings.image+"')\"":"",a="";return r&&(e.classes.add("btn-has-text"),a=''+e.encode(r)+""),'
    '},postRender:function(){var e=this,t=e.settings.onclick;return e.on("click",function(r){r.aria&&"down"==r.aria.key||r.control!=e||n.getParent(r.target,"."+e.classPrefix+"open")||(r.stopImmediatePropagation(),t.call(e,r))}),delete e.settings.onclick,e._super()}})}),r(mt,[],function(){function e(e){function i(e,i,o){var a,s,l,c,u,d;return a=0,s=0,l=0,e/=255,i/=255,o/=255,u=t(e,t(i,o)),d=n(e,n(i,o)),u==d?(l=u,{h:0,s:0,v:100*l}):(c=e==u?i-o:o==u?e-i:o-e,a=e==u?3:o==u?1:5,a=60*(a-c/(d-u)),s=(d-u)/d,l=d,{h:r(a),s:r(100*s),v:r(100*l)})}function o(e,i,o){var a,s,l,c;if(e=(parseInt(e,10)||0)%360,i=parseInt(i,10)/100,o=parseInt(o,10)/100,i=n(0,t(i,1)),o=n(0,t(o,1)),0===i)return void(d=f=h=r(255*o));switch(a=e/60,s=o*i,l=s*(1-Math.abs(a%2-1)),c=o-s,Math.floor(a)){case 0:d=s,f=l,h=0;break;case 1:d=l,f=s,h=0;break;case 2:d=0,f=s,h=l;break;case 3:d=0,f=l,h=s;break;case 4:d=l,f=0,h=s;break;case 5:d=s,f=0,h=l;break;default:d=f=h=0}d=r(255*(d+c)),f=r(255*(f+c)),h=r(255*(h+c))}function a(){function e(e){return e=parseInt(e,10).toString(16),e.length>1?e:"0"+e}return"#"+e(d)+e(f)+e(h)}function s(){return{r:d,g:f,b:h}}function l(){return i(d,f,h)}function c(e){var t;return"object"==typeof e?"r"in e?(d=e.r,f=e.g,h=e.b):"v"in e&&o(e.h,e.s,e.v):(t=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)[^\)]*\)/gi.exec(e))?(d=parseInt(t[1],10),f=parseInt(t[2],10),h=parseInt(t[3],10)):(t=/#([0-F]{2})([0-F]{2})([0-F]{2})/gi.exec(e))?(d=parseInt(t[1],16),f=parseInt(t[2],16),h=parseInt(t[3],16)):(t=/#([0-F])([0-F])([0-F])/gi.exec(e))&&(d=parseInt(t[1]+t[1],16),f=parseInt(t[2]+t[2],16),h=parseInt(t[3]+t[3],16)),d=0>d?0:d>255?255:d,f=0>f?0:f>255?255:f,h=0>h?0:h>255?255:h,u}var u=this,d=0,f=0,h=0;e&&c(e),u.toRgb=s,u.toHsv=l,u.toHex=a,u.parse=c}var t=Math.min,n=Math.max,r=Math.round;return e}),r(gt,[ke,ve,ce,mt],function(e,t,n,r){return e.extend({Defaults:{classes:"widget colorpicker"},init:function(e){this._super(e)},postRender:function(){function e(e,t){var r=n.getPos(e),i,o;return i=t.pageX-r.x,o=t.pageY-r.y,i=Math.max(0,Math.min(i/e.clientWidth,1)),o=Math.max(0,Math.min(o/e.clientHeight,1)),{x:i,y:o}}function i(e,t){var i=(360-e.h)/360;n.css(d,{top:100*i+"%"}),t||n.css(h,{left:e.s+"%",top:100-e.v+"%"}),f.style.background=new r({s:100,v:100,h:e.h}).toHex(),s.color().parse({s:e.s,v:e.v,h:e.h})}function o(t){var n;n=e(f,t),c.s=100*n.x,c.v=100*(1-n.y),i(c),s.fire("change")}function a(t){var n;n=e(u,t),c=l.toHsv(),c.h=360*(1-n.y),i(c,!0),s.fire("change")}var s=this,l=s.color(),c,u,d,f,h;u=s.getEl("h"),d=s.getEl("hp"),f=s.getEl("sv"),h=s.getEl("svp"),s._repaint=function(){c=l.toHsv(),i(c)},s._super(),s._svdraghelper=new t(s._id+"-sv",{start:o,drag:o}),s._hdraghelper=new t(s._id+"-h",{start:a,drag:a}),s._repaint()},rgb:function(){return this.color().toRgb()},value:function(e){var t=this;return arguments.length?(t.color().parse(e),void(t._rendered&&t._repaint())):t.color().toHex()},color:function(){return this._color||(this._color=new r),this._color},renderHtml:function(){function e(){var e,t,n="",i,a;for(i="filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=",a=o.split(","),e=0,t=a.length-1;t>e;e++)n+='
    ';return n}var t=this,n=t._id,r=t.classPrefix,i,o="#ff0000,#ff0080,#ff00ff,#8000ff,#0000ff,#0080ff,#00ffff,#00ff80,#00ff00,#80ff00,#ffff00,#ff8000,#ff0000",a="background: -ms-linear-gradient(top,"+o+");background: linear-gradient(to bottom,"+o+");";return i='
    '+e()+'
    ','
    '+i+"
    "}})}),r(vt,[ke],function(e){return e.extend({init:function(e){var t=this;e.delimiter||(e.delimiter="\xbb"),t._super(e),t.classes.add("path"),t.canFocus=!0,t.on("click",function(e){var n,r=e.target;(n=r.getAttribute("data-index"))&&t.fire("select",{value:t.row()[n],index:n})}),t.row(t.settings.row)},focus:function(){var e=this;return e.getEl().firstChild.focus(),e},row:function(e){return arguments.length?(this.state.set("row",e),this):this.state.get("row")},renderHtml:function(){var e=this;return'
    '+e._getDataPathHtml(e.state.get("row"))+"
    "},bindStates:function(){var e=this;return e.state.on("change:row",function(t){e.innerHtml(e._getDataPathHtml(t.value))}),e._super()},_getDataPathHtml:function(e){var t=this,n=e||[],r,i,o="",a=t.classPrefix;for(r=0,i=n.length;i>r;r++)o+=(r>0?'":"")+'
    '+n[r].name+"
    ";return o||(o='
    \xa0
    '),o}})}),r(yt,[vt,Qe],function(e,t){return e.extend({postRender:function(){function e(e){if(1===e.nodeType){if("BR"==e.nodeName||e.getAttribute("data-mce-bogus"))return!0;if("bookmark"===e.getAttribute("data-mce-type"))return!0}return!1}var n=this,r=t.activeEditor;return r.settings.elementpath!==!1&&(n.on("select",function(e){r.focus(),r.selection.select(this.row()[e.index].element),r.nodeChanged()}),r.on("nodeChange",function(t){for(var i=[],o=t.parents,a=o.length;a--;)if(1==o[a].nodeType&&!e(o[a])){var s=r.fire("ResolveName",{name:o[a].nodeName.toLowerCase(),target:o[a]});if(s.isDefaultPrevented()||i.push({name:s.name,element:o[a]}),s.isPropagationStopped())break}n.row(i)})),n._super()}})}),r(bt,[ge],function(e){return e.extend({Defaults:{layout:"flex",align:"center",defaults:{flex:1}},renderHtml:function(){var e=this,t=e._layout,n=e.classPrefix;return e.classes.add("formitem"),t.preRender(e),'
    '+(e.settings.title?'
    '+e.settings.title+"
    ":"")+'
    '+(e.settings.html||"")+t.renderHtml(e)+"
    "}})}),r(Ct,[ge,bt,m],function(e,t,n){return e.extend({Defaults:{containerCls:"form",layout:"flex",direction:"column",align:"stretch",flex:1,padding:20,labelGap:30,spacing:10,callbacks:{submit:function(){this.submit()}}},preRender:function(){var e=this,r=e.items();e.settings.formItemDefaults||(e.settings.formItemDefaults={layout:"flex",autoResize:"overflow",defaults:{flex:1}}),r.each(function(r){var i,o=r.settings.label;o&&(i=new t(n.extend({items:{type:"label",id:r._id+"-l",text:o,flex:0,forId:r._id,disabled:r.disabled()}},e.settings.formItemDefaults)),i.type="formitem",r.aria("labelledby",r._id+"-l"),"undefined"==typeof r.settings.flex&&(r.settings.flex=1),e.replace(r,i),i.add(r))})},submit:function(){return this.fire("submit",{data:this.toJSON()})},postRender:function(){var e=this;e._super(),e.fromJSON(e.settings.data)},bindStates:function(){function e(){var e=0,n=[],r,i,o;if(t.settings.labelGapCalc!==!1)for(o="children"==t.settings.labelGapCalc?t.find("formitem"):t.items(),o.filter("formitem").each(function(t){var r=t.items()[0],i=r.getEl().clientWidth;e=i>e?i:e,n.push(r)}),i=t.settings.labelGap||0,r=n.length;r--;)n[r].settings.minWidth=e+i}var t=this;t._super(),t.on("show",e),e()}})}),r(xt,[Ct],function(e){return e.extend({Defaults:{containerCls:"fieldset",layout:"flex",direction:"column",align:"stretch",flex:1,padding:"25 15 5 15",labelGap:30,spacing:10,border:1},renderHtml:function(){var e=this,t=e._layout,n=e.classPrefix;return e.preRender(),t.preRender(e),'
    '+(e.settings.title?''+e.settings.title+"":"")+'
    '+(e.settings.html||"")+t.renderHtml(e)+"
    "}})}),r(wt,[dt,m],function(e,t){return e.extend({init:function(e){var n=this,r=tinymce.activeEditor,i=r.settings,o,a,s;e.spellcheck=!1,s=i.file_picker_types||i.file_browser_callback_types,s&&(s=t.makeMap(s,/[, ]/)),(!s||s[e.filetype])&&(a=i.file_picker_callback,!a||s&&!s[e.filetype]?(a=i.file_browser_callback,!a||s&&!s[e.filetype]||(o=function(){a(n.getEl("inp").id,n.value(),e.filetype,window)})):o=function(){var i=n.fire("beforecall").meta;i=t.extend({filetype:e.filetype},i),a.call(r,function(e,t){n.value(e).fire("change",{meta:t})},n.value(),i)}),o&&(e.icon="browse",e.onaction=o),n._super(e)}})}),r(Nt,[st],function(e){return e.extend({recalc:function(e){var t=e.layoutRect(),n=e.paddingBox;e.items().filter(":visible").each(function(e){e.layoutRect({x:n.left,y:n.top,w:t.innerW-n.right-n.left,h:t.innerH-n.top-n.bottom}),e.recalc&&e.recalc()})}})}),r(Et,[st],function(e){return e.extend({recalc:function(e){var t,n,r,i,o,a,s,l,c,u,d,f,h,p,m,g,v=[],y,b,C,x,w,N,E,_,S,k,T,R,A,B,D,M,L,P,H,O,I,F,z=Math.max,W=Math.min;for(r=e.items().filter(":visible"),i=e.layoutRect(),o=e.paddingBox,a=e.settings,f=e.isRtl()?a.direction||"row-reversed":a.direction,s=a.align,l=e.isRtl()?a.pack||"end":a.pack,c=a.spacing||0,("row-reversed"==f||"column-reverse"==f)&&(r=r.set(r.toArray().reverse()),f=f.split("-")[0]),"column"==f?(S="y",E="h",_="minH",k="maxH",R="innerH",T="top",A="deltaH",B="contentH",H="left",L="w",D="x",M="innerW",P="minW",O="right",I="deltaW",F="contentW"):(S="x",E="w",_="minW",k="maxW",R="innerW",T="left",A="deltaW",B="contentW",H="top",L="h",D="y",M="innerH",P="minH",O="bottom",I="deltaH",F="contentH"),d=i[R]-o[T]-o[T],N=u=0,t=0,n=r.length;n>t;t++)h=r[t],p=h.layoutRect(),m=h.settings,g=m.flex,d-=n-1>t?c:0,g>0&&(u+=g,p[k]&&v.push(h),p.flex=g),d-=p[_],y=o[H]+p[P]+o[O],y>N&&(N=y);if(x={},0>d?x[_]=i[_]-d+i[A]:x[_]=i[R]-d+i[A],x[P]=N+i[I],x[B]=i[R]-d,x[F]=N,x.minW=W(x.minW,i.maxW),x.minH=W(x.minH,i.maxH),x.minW=z(x.minW,i.startMinWidth),x.minH=z(x.minH,i.startMinHeight),!i.autoResize||x.minW==i.minW&&x.minH==i.minH){for(C=d/u,t=0,n=v.length;n>t;t++)h=v[t],p=h.layoutRect(),b=p[k],y=p[_]+p.flex*C,y>b?(d-=p[k]-p[_],u-=p.flex,p.flex=0,p.maxFlexSize=b):p.maxFlexSize=0;for(C=d/u,w=o[T],x={},0===u&&("end"==l?w=d+o[T]:"center"==l?(w=Math.round(i[R]/2-(i[R]-d)/2)+o[T],0>w&&(w=o[T])):"justify"==l&&(w=o[T],c=Math.floor(d/(r.length-1)))),x[D]=o[H],t=0,n=r.length;n>t;t++)h=r[t],p=h.layoutRect(),y=p.maxFlexSize||p[_],"center"===s?x[D]=Math.round(i[M]/2-p[L]/2):"stretch"===s?(x[L]=z(p[P]||0,i[M]-o[H]-o[O]),x[D]=o[H]):"end"===s&&(x[D]=i[M]-p[L]-o.top),p.flex>0&&(y+=p.flex*C),x[E]=y,x[S]=w,h.layoutRect(x),h.recalc&&h.recalc(),w+=y+c}else if(x.w=x.minW,x.h=x.minH,e.layoutRect(x),this.recalc(e),null===e._lastRect){var V=e.parent();V&&(V._lastRect=null,V.recalc())}}})}),r(_t,[at],function(e){return e.extend({Defaults:{containerClass:"flow-layout",controlClass:"flow-layout-item",endClass:"break"},recalc:function(e){e.items().filter(":visible").each(function(e){e.recalc&&e.recalc()})},isNative:function(){return!0}})}),r(St,[he,ke,we,m,Qe,h],function(e,t,n,r,i,o){function a(e){function t(t,n){return function(){var r=this;e.on("nodeChange",function(i){var o=e.formatter,a=null;s(i.parents,function(e){return s(t,function(t){return n?o.matchNode(e,n,{value:t.value})&&(a=t.value):o.matchNode(e,t.value)&&(a=t.value),a?!1:void 0}),a?!1:void 0}),r.value(a)})}}function r(e){e=e.replace(/;$/,"").split(";");for(var t=e.length;t--;)e[t]=e[t].split("=");return e}function i(){function t(e){var n=[];if(e)return s(e,function(e){var o={text:e.title,icon:e.icon};if(e.items)o.menu=t(e.items);else{var a=e.format||"custom"+r++;e.format||(e.name=a,i.push(e)),o.format=a,o.cmd=e.cmd}n.push(o)}),n}function n(){var n;return n=t(e.settings.style_formats_merge?e.settings.style_formats?o.concat(e.settings.style_formats):o:e.settings.style_formats||o)}var r=0,i=[],o=[{title:"Headings",items:[{title:"Heading 1",format:"h1"},{title:"Heading 2",format:"h2"},{title:"Heading 3",format:"h3"},{title:"Heading 4",format:"h4"},{title:"Heading 5",format:"h5"},{title:"Heading 6",format:"h6"}]},{title:"Inline",items:[{title:"Bold",icon:"bold",format:"bold"},{title:"Italic",icon:"italic",format:"italic"},{title:"Underline",icon:"underline",format:"underline"},{title:"Strikethrough",icon:"strikethrough",format:"strikethrough"},{title:"Superscript",icon:"superscript",format:"superscript"},{title:"Subscript",icon:"subscript",format:"subscript"},{title:"Code",icon:"code",format:"code"}]},{title:"Blocks",items:[{title:"Paragraph",format:"p"},{title:"Blockquote",format:"blockquote"},{title:"Div",format:"div"},{title:"Pre",format:"pre"}]},{title:"Alignment",items:[{title:"Left",icon:"alignleft",format:"alignleft"},{title:"Center",icon:"aligncenter",format:"aligncenter"},{title:"Right",icon:"alignright",format:"alignright"},{title:"Justify",icon:"alignjustify",format:"alignjustify"}]}];return e.on("init",function(){s(i,function(t){e.formatter.register(t.name,t)})}),{type:"menu",items:n(),onPostRender:function(t){e.fire("renderFormatsMenu",{control:t.control})},itemDefaults:{preview:!0,textStyle:function(){return this.settings.format?e.formatter.getCssText(this.settings.format):void 0},onPostRender:function(){var t=this;t.parent().on("show",function(){var n,r;n=t.settings.format,n&&(t.disabled(!e.formatter.canApply(n)),t.active(e.formatter.match(n))),r=t.settings.cmd,r&&t.active(e.queryCommandState(r))})},onclick:function(){this.settings.format&&c(this.settings.format),this.settings.cmd&&e.execCommand(this.settings.cmd)}}}}function o(t){return function(){var n=this;e.formatter?e.formatter.formatChanged(t,function(e){n.active(e)}):e.on("init",function(){e.formatter.formatChanged(t,function(e){n.active(e)})})}}function a(t){return function(){function n(){return e.undoManager?e.undoManager[t]():!1}var r=this;t="redo"==t?"hasRedo":"hasUndo",r.disabled(!n()),e.on("Undo Redo AddUndo TypingUndo ClearUndos SwitchMode",function(){r.disabled(e.readonly||!n())})}}function l(){var t=this;e.on("VisualAid",function(e){t.active(e.hasVisual)}),t.active(e.hasVisual)}function c(t){t.control&&(t=t.control.value()),t&&e.execCommand("mceToggleFormat",!1,t)}var u;u=i(),s({bold:"Bold",italic:"Italic",underline:"Underline",strikethrough:"Strikethrough",subscript:"Subscript",superscript:"Superscript"},function(t,n){e.addButton(n,{tooltip:t,onPostRender:o(n),onclick:function(){c(n)}})}),s({outdent:["Decrease indent","Outdent"],indent:["Increase indent","Indent"],cut:["Cut","Cut"],copy:["Copy","Copy"],paste:["Paste","Paste"],help:["Help","mceHelp"],selectall:["Select all","SelectAll"],removeformat:["Clear formatting","RemoveFormat"],visualaid:["Visual aids","mceToggleVisualAid"],newdocument:["New document","mceNewDocument"]},function(t,n){e.addButton(n,{tooltip:t[0],cmd:t[1]})}),s({blockquote:["Blockquote","mceBlockQuote"],numlist:["Numbered list","InsertOrderedList"],bullist:["Bullet list","InsertUnorderedList"],subscript:["Subscript","Subscript"],superscript:["Superscript","Superscript"],alignleft:["Align left","JustifyLeft"],aligncenter:["Align center","JustifyCenter"],alignright:["Align right","JustifyRight"],alignjustify:["Justify","JustifyFull"],alignnone:["No alignment","JustifyNone"]},function(t,n){e.addButton(n,{tooltip:t[0],cmd:t[1],onPostRender:o(n)})}),e.addButton("undo",{tooltip:"Undo",onPostRender:a("undo"),cmd:"undo"}),e.addButton("redo",{tooltip:"Redo",onPostRender:a("redo"),cmd:"redo"}),e.addMenuItem("newdocument",{text:"New document",icon:"newdocument",cmd:"mceNewDocument"}),e.addMenuItem("undo",{text:"Undo",icon:"undo",shortcut:"Meta+Z",onPostRender:a("undo"),cmd:"undo"}),e.addMenuItem("redo",{text:"Redo",icon:"redo",shortcut:"Meta+Y",onPostRender:a("redo"),cmd:"redo"}),e.addMenuItem("visualaid",{text:"Visual aids",selectable:!0,onPostRender:l,cmd:"mceToggleVisualAid"}),e.addButton("remove",{tooltip:"Remove",icon:"remove",cmd:"Delete"}),s({cut:["Cut","Cut","Meta+X"],copy:["Copy","Copy","Meta+C"],paste:["Paste","Paste","Meta+V"],selectall:["Select all","SelectAll","Meta+A"],bold:["Bold","Bold","Meta+B"],italic:["Italic","Italic","Meta+I"],underline:["Underline","Underline"],strikethrough:["Strikethrough","Strikethrough"],subscript:["Subscript","Subscript"],superscript:["Superscript","Superscript"],removeformat:["Clear formatting","RemoveFormat"]},function(t,n){e.addMenuItem(n,{text:t[0],icon:n,shortcut:t[2],cmd:t[1]})}),e.on("mousedown",function(){n.hideAll()}),e.addButton("styleselect",{type:"menubutton",text:"Formats",menu:u}),e.addButton("formatselect",function(){var n=[],i=r(e.settings.block_formats||"Paragraph=p;Heading 1=h1;Heading 2=h2;Heading 3=h3;Heading 4=h4;Heading 5=h5;Heading 6=h6;Preformatted=pre");return s(i,function(t){n.push({text:t[0],value:t[1],textStyle:function(){return e.formatter.getCssText(t[1])}})}),{type:"listbox",text:i[0][0],values:n,fixedWidth:!0,onselect:c,onPostRender:t(n)}}),e.addButton("fontselect",function(){var n="Andale Mono=andale mono,monospace;Arial=arial,helvetica,sans-serif;Arial Black=arial black,sans-serif;Book Antiqua=book antiqua,palatino,serif;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,palatino,serif;Helvetica=helvetica,arial,sans-serif;Impact=impact,sans-serif;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco,monospace;Times New Roman=times new roman,times,serif;Trebuchet MS=trebuchet ms,geneva,sans-serif;Verdana=verdana,geneva,sans-serif;Webdings=webdings;Wingdings=wingdings,zapf dingbats",i=[],o=r(e.settings.font_formats||n);return s(o,function(e){i.push({text:{raw:e[0]},value:e[1],textStyle:-1==e[1].indexOf("dings")?"font-family:"+e[1]:""})}),{type:"listbox",text:"Font Family",tooltip:"Font Family",values:i,fixedWidth:!0,onPostRender:t(i,"fontname"),onselect:function(t){t.control.settings.value&&e.execCommand("FontName",!1,t.control.settings.value)}}}),e.addButton("fontsizeselect",function(){var n=[],r="8pt 10pt 12pt 14pt 18pt 24pt 36pt",i=e.settings.fontsize_formats||r;return s(i.split(" "),function(e){var t=e,r=e,i=e.split("=");i.length>1&&(t=i[0],r=i[1]),n.push({text:t,value:r})}),{type:"listbox",text:"Font Sizes",tooltip:"Font Sizes",values:n,fixedWidth:!0,onPostRender:t(n,"fontsize"),onclick:function(t){t.control.settings.value&&e.execCommand("FontSize",!1,t.control.settings.value)}}}),e.addMenuItem("formats",{text:"Formats",menu:u})}var s=r.each;i.on("AddEditor",function(t){t.editor.rtl&&(e.rtl=!0),a(t.editor)}),e.translate=function(e){return i.translate(e)},t.tooltips=!o.iOS}),r(kt,[st],function(e){return e.extend({recalc:function(e){var t,n,r,i,o,a,s,l,c,u,d,f,h,p,m,g,v,y,b,C,x,w,N,E=[],_=[],S,k,T,R,A,B;t=e.settings,i=e.items().filter(":visible"),o=e.layoutRect(),r=t.columns||Math.ceil(Math.sqrt(i.length)),n=Math.ceil(i.length/r),y=t.spacingH||t.spacing||0,b=t.spacingV||t.spacing||0,C=t.alignH||t.align,x=t.alignV||t.align,g=e.paddingBox,A="reverseRows"in t?t.reverseRows:e.isRtl(),C&&"string"==typeof C&&(C=[C]),x&&"string"==typeof x&&(x=[x]);for(d=0;r>d;d++)E.push(0);for(f=0;n>f;f++)_.push(0);for(f=0;n>f;f++)for(d=0;r>d&&(u=i[f*r+d],u);d++)c=u.layoutRect(),S=c.minW,k=c.minH,E[d]=S>E[d]?S:E[d],_[f]=k>_[f]?k:_[f];for(T=o.innerW-g.left-g.right,w=0,d=0;r>d;d++)w+=E[d]+(d>0?y:0),T-=(d>0?y:0)+E[d];for(R=o.innerH-g.top-g.bottom,N=0,f=0;n>f;f++)N+=_[f]+(f>0?b:0),R-=(f>0?b:0)+_[f];if(w+=g.left+g.right,N+=g.top+g.bottom,l={},l.minW=w+(o.w-o.innerW),l.minH=N+(o.h-o.innerH),l.contentW=l.minW-o.deltaW,l.contentH=l.minH-o.deltaH,l.minW=Math.min(l.minW,o.maxW),l.minH=Math.min(l.minH,o.maxH),l.minW=Math.max(l.minW,o.startMinWidth),l.minH=Math.max(l.minH,o.startMinHeight),!o.autoResize||l.minW==o.minW&&l.minH==o.minH){o.autoResize&&(l=e.layoutRect(l),l.contentW=l.minW-o.deltaW,l.contentH=l.minH-o.deltaH);var D;D="start"==t.packV?0:R>0?Math.floor(R/n):0;var M=0,L=t.flexWidths;if(L)for(d=0;dd;d++)E[d]+=L?L[d]*P:P;for(p=g.top,f=0;n>f;f++){for(h=g.left,s=_[f]+D,d=0;r>d&&(B=A?f*r+r-1-d:f*r+d,u=i[B],u);d++)m=u.settings,c=u.layoutRect(),a=Math.max(E[d],c.startMinWidth),c.x=h,c.y=p,v=m.alignH||(C?C[d]||C[0]:null),"center"==v?c.x=h+a/2-c.w/2:"right"==v?c.x=h+a-c.w:"stretch"==v&&(c.w=a),v=m.alignV||(x?x[d]||x[0]:null),"center"==v?c.y=p+s/2-c.h/2:"bottom"==v?c.y=p+s-c.h:"stretch"==v&&(c.h=s),u.layoutRect(c),h+=a+y,u.recalc&&u.recalc();p+=s+b}}else if(l.w=l.minW,l.h=l.minH,e.layoutRect(l),this.recalc(e),null===e._lastRect){var H=e.parent();H&&(H._lastRect=null,H.recalc())}}})}),r(Tt,[ke,u],function(e,t){return e.extend({renderHtml:function(){var e=this;return e.classes.add("iframe"),e.canFocus=!1,''},src:function(e){this.getEl().src=e},html:function(e,n){var r=this,i=this.getEl().contentWindow.document.body;return i?(i.innerHTML=e,n&&n()):t.setTimeout(function(){r.html(e)}),this}})}),r(Rt,[ke,ce],function(e,t){return e.extend({init:function(e){var t=this;t._super(e),t.classes.add("widget").add("label"),t.canFocus=!1,e.multiline&&t.classes.add("autoscroll"),e.strong&&t.classes.add("strong")},initLayoutRect:function(){var e=this,n=e._super();if(e.settings.multiline){var r=t.getSize(e.getEl());r.width>n.maxW&&(n.minW=n.maxW,e.classes.add("multiline")),e.getEl().style.width=n.minW+"px",n.startMinH=n.h=n.minH=Math.min(n.maxH,t.getSize(e.getEl()).height)}return n},repaint:function(){var e=this;return e.settings.multiline||(e.getEl().style.lineHeight=e.layoutRect().h+"px"),e._super()},renderHtml:function(){var e=this,t=e.settings.forId;return'"},bindStates:function(){var e=this;return e.state.on("change:text",function(t){e.innerHtml(e.encode(t.value))}),e._super()}})}),r(At,[ge],function(e){return e.extend({Defaults:{role:"toolbar",layout:"flow"},init:function(e){var t=this;t._super(e),t.classes.add("toolbar")},postRender:function(){var e=this;return e.items().each(function(e){e.classes.add("toolbar-item")}),e._super()}})}),r(Bt,[At],function(e){return e.extend({Defaults:{role:"menubar",containerCls:"menubar",ariaRoot:!0,defaults:{type:"menubutton"}}})}),r(Dt,[lt,pe,Bt],function(e,t,n){function r(e,t){for(;e;){if(t===e)return!0;e=e.parentNode}return!1}var i=e.extend({init:function(e){var t=this;t._renderOpen=!0,t._super(e),e=t.settings,t.classes.add("menubtn"),e.fixedWidth&&t.classes.add("fixed-width"),t.aria("haspopup",!0),t.state.set("menu",e.menu||t.render())},showMenu:function(){var e=this,n;return e.menu&&e.menu.visible()?e.hideMenu():(e.menu||(n=e.state.get("menu")||[],n.length?n={type:"menu",items:n}:n.type=n.type||"menu",n.renderTo?e.menu=n.parent(e).show().renderTo():e.menu=t.create(n).parent(e).renderTo(),e.fire("createmenu"),e.menu.reflow(),e.menu.on("cancel",function(t){t.control.parent()===e.menu&&(t.stopPropagation(),e.focus(),e.hideMenu())}),e.menu.on("select",function(){e.focus()}),e.menu.on("show hide",function(t){t.control==e.menu&&e.activeMenu("show"==t.type),e.aria("expanded","show"==t.type)}).fire("show")),e.menu.show(),e.menu.layoutRect({w:e.layoutRect().w}),void e.menu.moveRel(e.getEl(),e.isRtl()?["br-tr","tr-br"]:["bl-tl","tl-bl"]))},hideMenu:function(){var e=this;e.menu&&(e.menu.items().each(function(e){e.hideMenu&&e.hideMenu()}),e.menu.hide())},activeMenu:function(e){this.classes.toggle("active",e)},renderHtml:function(){var e=this,t=e._id,r=e.classPrefix,i=e.settings.icon,o,a=e.state.get("text"),s="";return o=e.settings.image,o?(i="none","string"!=typeof o&&(o=window.getSelection?o[0]:o[1]),o=" style=\"background-image: url('"+o+"')\""):o="",a&&(e.classes.add("btn-has-text"),s=''+e.encode(a)+""),i=e.settings.icon?r+"ico "+r+"i-"+i:"",e.aria("role",e.parent()instanceof n?"menuitem":"button"),'
    '},postRender:function(){var e=this;return e.on("click",function(t){t.control===e&&r(t.target,e.getEl())&&(e.showMenu(),t.aria&&e.menu.items()[0].focus())}),e.on("mouseenter",function(t){var n=t.control,r=e.parent(),o;n&&r&&n instanceof i&&n.parent()==r&&(r.items().filter("MenuButton").each(function(e){e.hideMenu&&e!=n&&(e.menu&&e.menu.visible()&&(o=!0),e.hideMenu())}),o&&(n.focus(),n.showMenu()))}),e._super()},bindStates:function(){var e=this;return e.state.on("change:menu",function(){e.menu&&e.menu.remove(),e.menu=null}),e._super()},remove:function(){this._super(),this.menu&&this.menu.remove()}});return i}),r(Mt,[ke,pe,h],function(e,t,n){return e.extend({Defaults:{border:0,role:"menuitem"},init:function(e){var t=this,n;t._super(e),e=t.settings,t.classes.add("menu-item"),e.menu&&t.classes.add("menu-item-expand"),e.preview&&t.classes.add("menu-item-preview"),n=t.state.get("text"),("-"===n||"|"===n)&&(t.classes.add("menu-item-sep"),t.aria("role","separator"),t.state.set("text","-")),e.selectable&&(t.aria("role","menuitemcheckbox"),t.classes.add("menu-item-checkbox"),e.icon="selected"),e.preview||e.selectable||t.classes.add("menu-item-normal"),t.on("mousedown",function(e){e.preventDefault()}),e.menu&&!e.ariaHideMenu&&t.aria("haspopup",!0)},hasMenus:function(){return!!this.settings.menu},showMenu:function(){var e=this,n=e.settings,r,i=e.parent();if(i.items().each(function(t){t!==e&&t.hideMenu()}),n.menu){r=e.menu,r?r.show():(r=n.menu,r.length?r={type:"menu",items:r}:r.type=r.type||"menu",i.settings.itemDefaults&&(r.itemDefaults=i.settings.itemDefaults),r=e.menu=t.create(r).parent(e).renderTo(),r.reflow(),r.on("cancel",function(t){t.stopPropagation(), +e.focus(),r.hide()}),r.on("show hide",function(e){e.control.items().each(function(e){e.active(e.settings.selected)})}).fire("show"),r.on("hide",function(t){t.control===r&&e.classes.remove("selected")}),r.submenu=!0),r._parentMenu=i,r.classes.add("menu-sub");var o=r.testMoveRel(e.getEl(),e.isRtl()?["tl-tr","bl-br","tr-tl","br-bl"]:["tr-tl","br-bl","tl-tr","bl-br"]);r.moveRel(e.getEl(),o),r.rel=o,o="menu-sub-"+o,r.classes.remove(r._lastRel).add(o),r._lastRel=o,e.classes.add("selected"),e.aria("expanded",!0)}},hideMenu:function(){var e=this;return e.menu&&(e.menu.items().each(function(e){e.hideMenu&&e.hideMenu()}),e.menu.hide(),e.aria("expanded",!1)),e},renderHtml:function(){function e(e){var t,r,i={};for(i=n.mac?{alt:"⌥",ctrl:"⌘",shift:"⇧",meta:"⌘"}:{meta:"Ctrl"},e=e.split("+"),t=0;t'+("-"!==a?'\xa0":"")+("-"!==a?''+a+"":"")+(c?'
    '+c+"
    ":"")+(i.menu?'
    ':"")+"
    "},postRender:function(){var e=this,t=e.settings,n=t.textStyle;if("function"==typeof n&&(n=n.call(this)),n){var r=e.getEl("text");r&&r.setAttribute("style",n)}return e.on("mouseenter click",function(n){n.control===e&&(t.menu||"click"!==n.type?(e.showMenu(),n.aria&&e.menu.focus(!0)):(e.fire("select"),e.parent().hideAll()))}),e._super(),e},active:function(e){return"undefined"!=typeof e&&this.aria("checked",e),this._super(e)},remove:function(){this._super(),this.menu&&this.menu.remove()}})}),r(Lt,[we,Mt,m],function(e,t,n){return e.extend({Defaults:{defaultType:"menuitem",border:1,layout:"stack",role:"application",bodyRole:"menu",ariaRoot:!0},init:function(e){var t=this;if(e.autohide=!0,e.constrainToViewport=!0,e.itemDefaults)for(var r=e.items,i=r.length;i--;)r[i]=n.extend({},e.itemDefaults,r[i]);t._super(e),t.classes.add("menu")},repaint:function(){return this.classes.toggle("menu-align",!0),this._super(),this.getEl().style.height="",this.getEl("body").style.height="",this},cancel:function(){var e=this;e.hideAll(),e.fire("select")},hideAll:function(){var e=this;return this.find("menuitem").exec("hideMenu"),e._super()},preRender:function(){var e=this;return e.items().each(function(t){var n=t.settings;return n.icon||n.image||n.selectable?(e._hasIcons=!0,!1):void 0}),e._super()}})}),r(Pt,[Dt,Lt],function(e,t){return e.extend({init:function(e){function t(r){for(var a=0;a0&&(o=r[0].text,n.state.set("value",r[0].value)),n.state.set("menu",r)),n.state.set("text",e.text||o),n.classes.add("listbox"),n.on("select",function(t){var r=t.control;a&&(t.lastControl=a),e.multiple?r.active(!r.active()):n.value(t.control.value()),a=r})},bindStates:function(){function e(e,n){e instanceof t&&e.items().each(function(e){e.hasMenus()||e.active(e.value()===n)})}function n(e,t){var r;if(e)for(var i=0;i'},postRender:function(){var e=this;e._super(),e.resizeDragHelper=new t(this._id,{start:function(){e.fire("ResizeStart")},drag:function(t){"both"!=e.settings.direction&&(t.deltaX=0),e.fire("Resize",t)},stop:function(){e.fire("ResizeEnd")}})},remove:function(){return this.resizeDragHelper&&this.resizeDragHelper.destroy(),this._super()}})}),r(It,[ke],function(e){function t(e){var t="";if(e)for(var n=0;n'+e[n]+"";return t}return e.extend({Defaults:{classes:"selectbox",role:"selectbox",options:[]},init:function(e){var t=this;t._super(e),t.settings.size&&(t.size=t.settings.size),t.settings.options&&(t._options=t.settings.options)},options:function(e){return arguments.length?(this.state.set("options",e),this):this.state.get("options")},renderHtml:function(){var e=this,n,r="";return n=t(e._options),e.size&&(r=' size = "'+e.size+'"'),'"},bindStates:function(){var e=this;return e.state.on("change:options",function(n){e.getEl().innerHTML=t(n.value)}),e._super()}})}),r(Ft,[ke,ve,ce],function(e,t,n){function r(e,t,n){return t>e&&(e=t),e>n&&(e=n),e}function i(e,t){var r,i,o,a,s;"v"==e.settings.orientation?(a="top",o="height",i="h"):(a="left",o="width",i="w"),r=(e.layoutRect()[i]||100)-n.getSize(e.getEl("handle"))[o],s=r*((t-e._minValue)/(e._maxValue-e._minValue))+"px",e.getEl("handle").style[a]=s,e.getEl("handle").style.height=e.layoutRect().h+"px"}return e.extend({init:function(e){var t=this;e.previewFilter||(e.previewFilter=function(e){return Math.round(100*e)/100}),t._super(e),t.classes.add("slider"),"v"==e.orientation&&t.classes.add("vertical"),t._minValue=e.minValue||0,t._maxValue=e.maxValue||100,t._initValue=t.state.get("value")},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix;return'
    '},reset:function(){this.value(this._initValue).repaint()},postRender:function(){var e=this,i,o,a=0,s,l,c,u,d,f,h,p;l=e._minValue,c=e._maxValue,s=e.value(),"v"==e.settings.orientation?(d="screenY",f="top",h="height",p="h"):(d="screenX",f="left",h="width",p="w"),e._super(),e._dragHelper=new t(e._id,{handle:e._id+"-handle",start:function(t){i=t[d],o=parseInt(e.getEl("handle").style[f],10),u=(e.layoutRect()[p]||100)-n.getSize(e.getEl("handle"))[h],e.fire("dragstart",{value:s})},drag:function(t){var n=t[d]-i,h=e.getEl("handle");a=r(o+n,0,u),h.style[f]=a+"px",s=l+a/u*(c-l),e.value(s),e.tooltip().text(""+e.settings.previewFilter(s)).show().moveRel(h,"bc tc"),e.fire("drag",{value:s})},stop:function(){e.tooltip().hide(),e.fire("dragend",{value:s})}})},repaint:function(){this._super(),i(this,this.value())},bindStates:function(){var e=this;return e.state.on("change:value",function(t){i(e,t.value)}),e._super()}})}),r(zt,[ke],function(e){return e.extend({renderHtml:function(){var e=this;return e.classes.add("spacer"),e.canFocus=!1,'
    '}})}),r(Wt,[Dt,ce,g],function(e,t,n){return e.extend({Defaults:{classes:"widget btn splitbtn",role:"button"},repaint:function(){var e=this,r=e.getEl(),i=e.layoutRect(),o,a;return e._super(),o=r.firstChild,a=r.lastChild,n(o).css({width:i.w-t.getSize(a).width,height:i.h-2}),n(a).css({height:i.h-2}),e},activeMenu:function(e){var t=this;n(t.getEl().lastChild).toggleClass(t.classPrefix+"active",e)},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix,r,i=e.state.get("icon"),o=e.state.get("text"),a="";return r=e.settings.image,r?(i="none","string"!=typeof r&&(r=window.getSelection?r[0]:r[1]),r=" style=\"background-image: url('"+r+"')\""):r="",i=e.settings.icon?n+"ico "+n+"i-"+i:"",o&&(e.classes.add("btn-has-text"),a=''+e.encode(o)+""),'
    '},postRender:function(){var e=this,t=e.settings.onclick;return e.on("click",function(e){var n=e.target;if(e.control==this)for(;n;){if(e.aria&&"down"!=e.aria.key||"BUTTON"==n.nodeName&&-1==n.className.indexOf("open"))return e.stopImmediatePropagation(),void(t&&t.call(this,e));n=n.parentNode}}),delete e.settings.onclick,e._super()}})}),r(Vt,[_t],function(e){return e.extend({Defaults:{containerClass:"stack-layout",controlClass:"stack-layout-item",endClass:"break"},isNative:function(){return!0}})}),r(Ut,[be,g,ce],function(e,t,n){return e.extend({Defaults:{layout:"absolute",defaults:{type:"panel"}},activateTab:function(e){var n;this.activeTabId&&(n=this.getEl(this.activeTabId),t(n).removeClass(this.classPrefix+"active"),n.setAttribute("aria-selected","false")),this.activeTabId="t"+e,n=this.getEl("t"+e),n.setAttribute("aria-selected","true"),t(n).addClass(this.classPrefix+"active"),this.items()[e].show().fire("showtab"),this.reflow(),this.items().each(function(t,n){e!=n&&t.hide()})},renderHtml:function(){var e=this,t=e._layout,n="",r=e.classPrefix;return e.preRender(),t.preRender(e),e.items().each(function(t,i){var o=e._id+"-t"+i;t.aria("role","tabpanel"),t.aria("labelledby",o),n+='"}),'
    '+n+'
    '+t.renderHtml(e)+"
    "},postRender:function(){var e=this;e._super(),e.settings.activeTab=e.settings.activeTab||0,e.activateTab(e.settings.activeTab),this.on("click",function(t){var n=t.target.parentNode;if(t.target.parentNode.id==e._id+"-head")for(var r=n.childNodes.length;r--;)n.childNodes[r]==t.target&&e.activateTab(r)})},initLayoutRect:function(){var e=this,t,r,i;r=n.getSize(e.getEl("head")).width,r=0>r?0:r,i=0,e.items().each(function(e){r=Math.max(r,e.layoutRect().minW),i=Math.max(i,e.layoutRect().minH)}),e.items().each(function(e){e.settings.x=0,e.settings.y=0,e.settings.w=r,e.settings.h=i,e.layoutRect({x:0,y:0,w:r,h:i})});var o=n.getSize(e.getEl("head")).height;return e.settings.minWidth=r,e.settings.minHeight=i+o,t=e._super(),t.deltaH+=o,t.innerH=t.h-t.deltaH,t}})}),r($t,[ke],function(e){return e.extend({init:function(e){var t=this;t._super(e),t.classes.add("textbox"),e.multiline?t.classes.add("multiline"):(t.on("keydown",function(e){var n;13==e.keyCode&&(e.preventDefault(),t.parents().reverse().each(function(e){return e.toJSON?(n=e,!1):void 0}),t.fire("submit",{data:n.toJSON()}))}),t.on("keyup",function(e){t.state.set("value",e.target.value)}))},repaint:function(){var e=this,t,n,r,i,o=0,a;t=e.getEl().style,n=e._layoutRect,a=e._lastRepaintRect||{};var s=document;return!e.settings.multiline&&s.all&&(!s.documentMode||s.documentMode<=8)&&(t.lineHeight=n.h-o+"px"),r=e.borderBox,i=r.left+r.right+8,o=r.top+r.bottom+(e.settings.multiline?8:0),n.x!==a.x&&(t.left=n.x+"px",a.x=n.x),n.y!==a.y&&(t.top=n.y+"px",a.y=n.y),n.w!==a.w&&(t.width=n.w-i+"px",a.w=n.w),n.h!==a.h&&(t.height=n.h-o+"px",a.h=n.h),e._lastRepaintRect=a,e.fire("repaint",{},!1),e},renderHtml:function(){var e=this,t=e._id,n=e.settings,r=e.encode(e.state.get("value"),!1),i="";return"spellcheck"in n&&(i+=' spellcheck="'+n.spellcheck+'"'),n.maxLength&&(i+=' maxlength="'+n.maxLength+'"'),n.size&&(i+=' size="'+n.size+'"'),n.subtype&&(i+=' type="'+n.subtype+'"'),e.disabled()&&(i+=' disabled="disabled"'),n.multiline?'":'"},value:function(e){return arguments.length?(this.state.set("value",e),this):(this.state.get("rendered")&&this.state.set("value",this.getEl().value),this.state.get("value"))},postRender:function(){var e=this;e._super(),e.$el.on("change",function(t){e.state.set("value",t.target.value),e.fire("change",t)})},bindStates:function(){var e=this;return e.state.on("change:value",function(t){e.getEl().value!=t.value&&(e.getEl().value=t.value)}),e.state.on("change:disabled",function(t){e.getEl().disabled=t.value}),e._super()},remove:function(){this.$el.off(),this._super()}})}),r(qt,[g,he,u],function(e,t,n){return function(r,i){var o=this,a,s=t.classPrefix;o.show=function(t,l){return o.hide(),a=!0,n.setTimeout(function(){a&&(e(r).append('
    '),l&&l())},t),o},o.hide=function(){var e=r.lastChild;return e&&-1!=e.className.indexOf("throbber")&&e.parentNode.removeChild(e),a=!1,o}}}),a([l,c,u,d,f,h,m,g,v,y,C,w,N,E,T,A,B,D,M,L,P,H,I,F,j,Y,G,J,ee,te,ne,re,oe,se,le,fe,he,pe,me,ge,ve,ye,be,Ce,xe,we,Ne,Ee,_e,Se,ke,Te,Re,Ae,Me,Pe,Ke,Ge,Je,Qe,et,tt,nt,rt,it,ot,at,st,lt,ct,ut,dt,ft,ht,pt,mt,gt,vt,yt,bt,Ct,xt,wt,Nt,Et,_t,St,kt,Tt,Rt,At,Bt,Dt,Mt,Lt,Pt,Ht,Ot,It,Ft,zt,Wt,Vt,Ut,$t,qt])}(this); \ No newline at end of file diff --git a/assets/js/upload.inc.js b/assets/js/upload.inc.js new file mode 100755 index 0000000..ffeffd1 --- /dev/null +++ b/assets/js/upload.inc.js @@ -0,0 +1,142 @@ +UploadAPI = function(uri) { + this.uri=null; + this.fallback_frame_id='upload-api-fallback-frame'; + + if (typeof(uri)!='undefined') + this.uri=uri; +}; + +UploadAPI.prototype.init=function(form) { + if (!this.uri && form.action.length>0) + this.uri=form.action; + else if (!this.uri) + this.uri=window.location.href; + + try { + this.initLevel2(form); + } catch(err) { + this.initFallback(form); + } +}; + +UploadAPI.prototype.initLevel2=function(form) { + var formData=new FormData(form); + var xhr = new XMLHttpRequest(); + xhr.open(form.method,this.uri); + //xhr.setRequestHeader("Content-type", "multipart/form-data"); + xhr.onreadystatechange=this.bind(this.handleState,this,xhr,form); + xhr.upload.onprogress=this.bind(this.handleProgress,this); + + xhr.send(formData); + this.disableForm(form); +}; + +UploadAPI.prototype.initFallback=function(form) { + var frame=null; + try { + frame=document.createElement(''. + '
    ' + ); + + $this->setOnFocusJSCallback( + $this->createJSCallback( + 'desk_call(dash_web_focus, this);' + ) + ); + + $this->setOnBlurJSCallback( + $this->createJSCallback( + 'desk_call(dash_web_blur, this);' + ) + ); + + $this->setOnOpenJSCallback( + $this->createJSCallback( + 'desk_call(dash_web_open, this);' + ) + ); + + $this->addVariables(array( + 'dash_web_home_page_url' => Zira\Helper::url('/',true, true), + 'dash_web_admin_url' => Zira\Helper::url('dash', true, true), + 'dash_web_wnd' => $this->getJSClassName() + )); + + $this->includeJS('dash/web'); + } +} \ No newline at end of file diff --git a/dash/windows/widget.php b/dash/windows/widget.php new file mode 100644 index 0000000..23cdf09 --- /dev/null +++ b/dash/windows/widget.php @@ -0,0 +1,81 @@ +setIconClass(self::$_icon_class); + $this->setTitle(Zira\Locale::t(self::$_title)); + $this->setSidebarEnabled(false); + + $this->setSaveActionEnabled(true); + } + + public function create() { + $this->setOnLoadJSCallback( + $this->createJSCallback( + 'desk_window_form_init(this);' + ) + ); + } + + public function load() { + if (empty($this->item)) { + return array('error' => Zira\Locale::t('An error occurred')); + } + if (!Permission::check(Permission::TO_CHANGE_LAYOUT)) { + return array('error' => Zira\Locale::t('Permission denied')); + } + + $available_widgets = Widgets::getAvailableWidgets(); + $form = new \Dash\Forms\Widget(); + + if (is_numeric($this->item)) { + $widget = new Zira\Models\Widget($this->item); + if (!$widget->loaded() || !array_key_exists($widget->name, $available_widgets)) { + return array('error' => Zira\Locale::t('An error occurred')); + } + if (!$available_widgets[$widget->name]->isEditable()) { + return array('error' => Zira\Locale::t('An error occurred')); + } + $values = $widget->toArray(); + if ($values['category_id']===null) { + $values['category_id'] = -1; + } + + $this->setTitle(Zira\Locale::t('Widget').' - '.Zira\Locale::tm($available_widgets[$widget->name]->getTitle(), $widget->module)); + } else { + if (!array_key_exists($this->item, $available_widgets)) { + return array('error' => Zira\Locale::t('An error occurred')); + } + if (!$available_widgets[$this->item]->isEditable()) { + return array('error' => Zira\Locale::t('An error occurred')); + } + $values = array( + 'id' => $this->item, + 'placeholder' => $available_widgets[$this->item]->getPlaceholder(), + 'category_id' => -1 + ); + + $module = strtolower(substr($this->item, 1, strpos($this->item, '\\', 1)-1)); + $this->setTitle(Zira\Locale::t(self::$_title).' - '.Zira\Locale::tm($available_widgets[$this->item]->getTitle(), $module)); + } + $form->setValues($values); + + $this->setBodyContent($form); + } +} \ No newline at end of file diff --git a/dash/windows/widgets.php b/dash/windows/widgets.php new file mode 100644 index 0000000..0f85bed --- /dev/null +++ b/dash/windows/widgets.php @@ -0,0 +1,224 @@ +setIconClass(self::$_icon_class); + $this->setTitle(Zira\Locale::t(self::$_title)); + $this->setSidebarEnabled(false); + $this->setBodyViewListVertical(true); + } + + public function create() { + $placeholders_menu = array(); + $placeholders = Zira\Models\Widget::getPlaceholders(); + foreach($placeholders as $placeholder_id=>$placeholder_name) { + $placeholders_menu []= $this->createMenuDropdownItem($placeholder_name, 'glyphicon glyphicon-filter', 'desk_call(dash_widgets_placeholders_filter, this, element);', 'placeholders', false, array('placeholder'=>$placeholder_id)); + } + + $this->setMenuItems(array( + $this->createMenuItem(Zira\Locale::t('Actions'), array( + $this->createMenuDropdownItem(Zira\Locale::t('Deactivate'), 'glyphicon glyphicon-minus-sign', 'desk_call(dash_widgets_deactivate, this);', 'delete', true, array('typo'=>'deactivate')), + $this->createMenuDropdownItem(Zira\Locale::t('Activate'), 'glyphicon glyphicon-ok-circle', 'desk_call(dash_widgets_activate, this);', 'delete', true, array('typo'=>'activate')), + $this->createMenuDropdownSeparator(), + $this->createMenuDropdownItem(Zira\Locale::t('Edit'), 'glyphicon glyphicon-pencil', 'desk_call(dash_widgets_edit, this);', 'edit', true, array('typo'=>'edit')), + $this->createMenuDropdownItem(Zira\Locale::t('Copy'), 'glyphicon glyphicon-duplicate', 'desk_call(dash_widgets_copy, this);', 'edit', true, array('typo'=>'copy')), + $this->createMenuDropdownItem($this->_delete_action_text, 'glyphicon glyphicon-remove-circle', 'desk_window_delete_items(this);', 'delete'), + $this->createMenuDropdownSeparator(), + $this->createMenuDropdownItem(Zira\Locale::t('Up'), 'glyphicon glyphicon-triangle-top', 'desk_call(dash_widgets_up, this);', 'edit', true, array('typo'=>'up')), + $this->createMenuDropdownItem(Zira\Locale::t('Down'), 'glyphicon glyphicon-triangle-bottom', 'desk_call(dash_widgets_down, this);', 'edit', true, array('typo'=>'down')) + )), + $this->createMenuItem(Zira\Locale::t('Placeholders'), $placeholders_menu) + )); + + $this->setContextMenuItems(array( + $this->createContextMenuItem(Zira\Locale::t('Deactivate'), 'glyphicon glyphicon-minus-sign', 'desk_call(dash_widgets_deactivate, this);', 'delete', true, array('typo'=>'deactivate')), + $this->createContextMenuItem(Zira\Locale::t('Activate'), 'glyphicon glyphicon-ok-circle', 'desk_call(dash_widgets_activate, this);', 'delete', true, array('typo'=>'activate')), + $this->createContextMenuSeparator(), + $this->createContextMenuItem(Zira\Locale::t('Edit'), 'glyphicon glyphicon-pencil', 'desk_call(dash_widgets_edit, this);', 'edit', true, array('typo'=>'edit')), + $this->createContextMenuItem(Zira\Locale::t('Copy'), 'glyphicon glyphicon-duplicate', 'desk_call(dash_widgets_copy, this);', 'edit', true, array('typo'=>'copy')), + $this->createContextMenuItem($this->_delete_action_text, 'glyphicon glyphicon-remove-circle', 'desk_window_delete_items(this);', 'delete'), + $this->createContextMenuSeparator(), + $this->createContextMenuItem(Zira\Locale::t('Up'), 'glyphicon glyphicon-triangle-top', 'desk_call(dash_widgets_up, this);', 'edit', true, array('typo'=>'up')), + $this->createContextMenuItem(Zira\Locale::t('Down'), 'glyphicon glyphicon-triangle-bottom', 'desk_call(dash_widgets_down, this);', 'edit', true, array('typo'=>'down')) + )); + + $this->setOnSelectJSCallback( + $this->createJSCallback( + 'desk_call(dash_widgets_select, this);' + ) + ); + + $this->addDefaultOnLoadScript( + 'desk_call(dash_widgets_load, this);' + ); + + $this->setOnEditItemJSCallback( + $this->createJSCallback( + 'desk_call(dash_widgets_edit, this);' + ) + ); + + $this->setOnDeleteItemsJSCallback( + $this->createJSCallback( + 'desk_call(dash_widgets_delete, this);' + ) + ); + + $this->setOnOpenJSCallback( + $this->createJSCallback( + 'desk_call(dash_widgets_drag, this);' + ) + ); + + $this->setOnDropJSCallback( + $this->createJSCallback( + 'desk_call(dash_widgets_drop, this, element);' + ) + ); + + $this->setData(array( + 'placeholder' => null + )); + + $this->addVariables(array( + 'dash_widget_status_active_id' => Zira\Models\Widget::STATUS_ACTIVE, + 'dash_widget_status_not_active_id' => Zira\Models\Widget::STATUS_NOT_ACTIVE, + 'dash_widgets_blank_src' => Zira\Helper::imgUrl('blank.png'), + 'dash_widgets_widget_wnd' => Dash::getInstance()->getWindowJSName(Widget::getClass()) + )); + + $this->includeJS('dash/widgets'); + } + + public static function getAvailableModuleWidgets($module) { + $dir = ROOT_DIR . DIRECTORY_SEPARATOR . $module . DIRECTORY_SEPARATOR . 'widgets'; + if (!file_exists($dir) || !is_dir($dir)) return array(); + $widgets = array(); + $d = opendir($dir); + while(($f=readdir($d))!==false) { + if ($f=='.' || $f=='..' || is_dir($dir. DIRECTORY_SEPARATOR . $f)) continue; + if (!preg_match('/^([a-zA-Z0-9]+)\.php$/', $f, $matches)) continue; + $class = '\\'.ucfirst($module).'\\Widgets\\'.ucfirst($matches[1]); + try { + if (class_exists($class)) { + $widget = new $class; + if ($widget instanceof Zira\Widget) { + $widgets [$class]= $widget; + } else { + unset($widget); + } + } + } catch(\Exception $e) { + Zira\Log::exception($e); + } + } + closedir($d); + return $widgets; + } + + public static function getAvailableWidgets() { + $available_widgets = array(); + $active_modules = array_merge(array('zira'),Zira\Config::get('modules')); + foreach ($active_modules as $module) { + $widgets = self::getAvailableModuleWidgets($module); + if (!empty($widgets)) { + $available_widgets = array_merge($available_widgets, $widgets); + } + } + return $available_widgets; + } + + public function load() { + if (!Permission::check(Permission::TO_CHANGE_LAYOUT)) { + return array('error' => Zira\Locale::t('Permission denied')); + } + + $placeholders = Zira\Models\Widget::getPlaceholders(); + $placeholder = Zira\Request::post('placeholder'); + if ($placeholder && !array_key_exists($placeholder, $placeholders)) { + $placeholder = null; + } + + $categories = Zira\Models\Category::getArray(false); + $_categories = array( + -1 => Zira\Locale::t('All pages'), + 0 => Zira\Locale::t('Home page') + ); + $categories = $_categories + $categories; + + $available_widgets = self::getAvailableWidgets(); + + $active_widgets = array(); + $inactive_widgets = array(); + $user_widgets = array(); + $db_widgets = Zira\Models\Widget::getCollection()->order_by('sort_order', 'asc')->get(); + foreach($db_widgets as $widget) { + if (!array_key_exists($widget->name, $available_widgets)) continue; + if ($widget->active == Zira\Models\Widget::STATUS_ACTIVE) { + $active_widgets []= $widget; + } else { + $inactive_widgets []= $widget; + } + $user_widgets []= $widget->name; + } + $other_widgets = array(); + foreach ($available_widgets as $class=>$widget) { + if (in_array($class, $user_widgets)) continue; + $other_widgets [$class]= $widget; + } + $widgets = array_merge($active_widgets, $inactive_widgets); + + $items = array(); + foreach ($widgets as $widget) { + $_widget = $available_widgets[$widget->name]; + if (!$_widget->isEditable()) continue; + if ($placeholder && $widget->placeholder!=$placeholder) continue; + $_widget->setData($widget->params); + $title = Zira\Locale::tm($_widget->getTitle(), $widget->module); + $suffix = ''; + if (!$placeholder) $suffix .= ' - '.$placeholders[$widget->placeholder]; + $category_id = $widget->category_id; + if ($category_id === null) $category_id = -1; + $suffix .= ' - '.$categories[$category_id]; + $items[]=$this->createBodyItem($title, $title.$suffix, Zira\Helper::imgUrl('drag.png'), $widget->id, null, false, array('activated'=>$widget->active,'installed'=>true,'sort_order'=>$widget->sort_order)); + } + foreach ($other_widgets as $class=>$widget) { + if (!$widget->isEditable() || $widget->isDynamic()) continue; + if ($placeholder && $widget->getPlaceholder()!=$placeholder) continue; + $module = strtolower(substr($class, 1, strpos($class, '\\', 1)-1)); + $title = Zira\Locale::tm($widget->getTitle(),$module); + $suffix = ''; + if (!$placeholder) $suffix .= ' - '.$placeholders[$widget->getPlaceholder()]; + $suffix .= ' - '.$categories[-1]; + $items[]=$this->createBodyItem($title, $title.$suffix, Zira\Helper::imgUrl('drag.png'), $class, null, false, array('activated'=>Zira\Models\Widget::STATUS_NOT_ACTIVE,'installed'=>false)); + } + + $this->setBodyItems($items); + + if ($placeholder) { + $this->setTitle(Zira\Locale::t(self::$_title).' - '.$placeholders[$placeholder]); + } else { + $this->setTitle(Zira\Locale::t(self::$_title)); + } + + $this->setData(array( + 'placeholder' => $placeholder + )); + } +} \ No newline at end of file diff --git a/dash/windows/window.php b/dash/windows/window.php new file mode 100644 index 0000000..d1f1af6 --- /dev/null +++ b/dash/windows/window.php @@ -0,0 +1,843 @@ + null, + 'left' => null, + 'right' => null, + 'bottom' => null, + 'width' => null, + 'height' => null, + 'auto' => false, + 'resize' => true, + 'animate' => true, + 'maximized' => false, + 'sidebar' => true, + 'sidebar_width' => null, + 'toolbar' => true, + 'viewSwitcher' => false, + 'bodyViewList' => false, + 'icon_class' => 'glyphicon glyphicon-th-large', + 'title' => null, + 'menuItems' => [], + 'toolbarItems' => [], + 'toolbarContent' => '', + 'sidebarItems' => [], + 'sidebarContent' => '', + 'bodyItems' => [], + 'bodyContent' => '', + 'bodyFullContent' => '', + 'footerContent' => '', + 'contextMenuItems' => [], + 'onOpen' => null, + 'onLoad' => null, + 'onFocus' => null, + 'onSelect' => null, + 'onClose' => null, + 'onBlur' => null, + 'onDrop' => null, + 'onCreateItem' => null, + 'onEditItem' => null, + 'onDeleteItems' => null, + 'onUpdateContent' => null, + 'onSave' => null, + 'onResize' => null, + 'load' => null, + 'data' => null, + 'nocache' => false, + 'singleInstance' => false, + 'help_url' => null + ); + + abstract public function init(); + abstract public function create(); + + public function __construct() { + $this->_js_name = Dash\Dash::getInstance()->getWindowJSName(self::getClass()); + if (empty($this->_js_name)) throw new \Exception('Failed to construct window: ' . self::getClass()); + } + + public function build() { + $this->setDefaultMenuTitle(Locale::t('Actions')); + $this->setCreateActionText(Locale::t('Create')); + $this->setEditActionText(Locale::t('Edit')); + $this->setDeleteActionText(Locale::t('Delete')); + $this->setSaveActionText(Locale::t('Save')); + $this->setAutoSizing(true); + $this->init(); + if (method_exists($this, 'load')) { + $this->setLoadURL(Helper::url('dash/index/load')); + } + if ($this->_save_action_enabled || method_exists($this, 'save')) { + $this->setOnSaveJSCallback( + $this->createJSCallback( + 'var data = desk_window_content(this);'. + 'desk_window_request(this, \''.Helper::url('dash/index/save').'\', data);' + ) + ); + } + if (!empty($this->_options['onSave'])) { + $this->addDefaultMenuDropdownItem( + $this->createMenuDropdownItem($this->_save_action_text, 'glyphicon glyphicon-floppy-disk', 'desk_window_save(this);', 'save') + ); + $this->addDefaultToolbarItem( + $this->createToolbarButton($this->_save_action_text, $this->_save_action_text, 'glyphicon glyphicon-floppy-disk', 'desk_window_save(this);', 'save') + ); + } + if (!empty($this->_create_action_window_class)) { + $this->setOnCreateItemJSCallback( + $this->createJSCallback( + 'var data = {\'onClose\':function(){desk_window_reload_all(\''.$this->getJSClassName().'\');}};'. + Dash\Dash::getInstance()->getWindowJSName($this->_create_action_window_class).'(data);' + ) + ); + } + if (!empty($this->_options['onCreateItem'])) { + $this->addDefaultMenuDropdownItem( + $this->createMenuDropdownItem($this->_create_action_text, 'glyphicon glyphicon-file', 'desk_window_create_item(this);', 'create') + ); + $this->addDefaultContextMenuItem( + $this->createContextMenuItem($this->_create_action_text, 'glyphicon glyphicon-file', 'desk_window_create_item(this);', 'create') + ); + $this->addDefaultSidebarItem( + $this->createSidebarItem($this->_create_action_text, 'glyphicon glyphicon-file', 'desk_window_create_item(this);', 'create') + ); + } + if (!empty($this->_edit_action_window_class)) { + $this->setOnEditItemJSCallback( + $this->createJSCallback( + 'var data = {\'data\':desk_window_selected(this,1),\'onClose\':function(){desk_window_reload_all(\''.$this->getJSClassName().'\');}};'. + Dash\Dash::getInstance()->getWindowJSName($this->_edit_action_window_class).'(data);' + ) + ); + } + if (!empty($this->_options['onEditItem'])) { + $this->addDefaultMenuDropdownItem( + $this->createMenuDropdownItem($this->_edit_action_text, 'glyphicon glyphicon-pencil', 'desk_window_edit_item(this)', 'edit') + ); + $this->addDefaultContextMenuItem( + $this->createContextMenuItem($this->_edit_action_text, 'glyphicon glyphicon-pencil', 'desk_window_edit_item(this)', 'edit') + ); + } + if ($this->_delete_action_enabled || method_exists($this, 'delete')) { + $this->setOnDeleteItemsJSCallback( + $this->createJSCallback( + 'var data = desk_window_selected(this);'. + 'desk_window_request(this, \''.Helper::url('dash/index/delete').'\', data);' + ) + ); + } + if (!empty($this->_options['onDeleteItems'])) { + $this->addDefaultMenuDropdownItem( + $this->createMenuDropdownItem($this->_delete_action_text, 'glyphicon glyphicon-remove-circle', 'desk_window_delete_items(this);', 'delete') + ); + $this->addDefaultContextMenuItem( + $this->createContextMenuItem($this->_delete_action_text, 'glyphicon glyphicon-remove-circle', 'desk_window_delete_items(this);', 'delete') + ); + } + if (property_exists($this, 'search')) { + $this->addDefaultToolbarItem( + $this->createToolbarInput(Locale::t('Search'), Locale::t('Search'), 'glyphicon glyphicon-search', 'var text=$(element).val();desk_window_search(this, text);', 'search') + ); + $this->addDefaultOnLoadScript('desk_window_search_init(this);'); + } + if (method_exists($this, 'load') && $this->_reload_button) { + $this->addDefaultToolbarItem( + $this->createToolbarButton(null, Locale::t('Reload'), 'glyphicon glyphicon-repeat', 'desk_window_reload(this);', 'reload') + ); + } + if (property_exists($this, 'page')) { + $this->addDefaultToolbarItem( + $this->createToolbarButtonGroup(array( + $this->createToolbarButton(null, Locale::t('Previous'), 'glyphicon glyphicon-arrow-left', 'desk_window_pagination_prev(this);', 'pagination-prev', true), + $this->createToolbarButton(null, Locale::t('Next'), 'glyphicon glyphicon-arrow-right', 'desk_window_pagination_next(this);', 'pagination-next', true) + ), true) + ); + $this->addDefaultOnLoadScript('desk_window_pagination_init(this);'); + } + if (property_exists($this, 'order')) { + $this->addDefaultToolbarItem( + $this->createToolbarButtonGroup(array( + $this->createToolbarButton(null, Locale::t('Sort descending'), 'glyphicon glyphicon-sort-by-attributes-alt', 'desk_window_sort_desc(this);', 'order-desc', true), + $this->createToolbarButton(null, Locale::t('Sort ascending'), 'glyphicon glyphicon-sort-by-attributes', 'desk_window_sort_asc(this);', 'order-asc', true) + ), true) + ); + $this->addDefaultOnLoadScript('desk_window_sorter_init(this);'); + } + + $this->create(); + + if (!empty($this->_default_onload_scripts)) { + $this->setOnLoadJSCallback( + $this->createJSCallback( + implode(' ', $this->_default_onload_scripts) + ), + true + ); + } + + if ($this->_options['data']==null) $this->setData(array()); + } + + public static function getParentClass() { + return get_class(); + } + + public static function getClass() { + return get_called_class(); + } + + public function getJSClassName() { + return $this->_js_name; + } + + public function getOptions() { + return $this->_options; + } + + public function resetOptions() { + $this->_options = array(); + } + + public function setDefaultMenuTitle($title) { + $this->_default_menu_title = (string)$title; + } + + public function setDefaultMenu(array $menu) { + $this->_default_menu = $menu; + } + + public function getDefaultMenu() { + return $this->_default_menu; + } + + public function addDefaultMenuItem(array $menuItem) { + $this->_default_menu []= $menuItem; + } + + public function setDefaultMenuDropdown(array $menu) { + $this->_default_menu_dropdown = $menu; + } + + public function getDefaultMenuTitle() { + return $this->_default_menu_title; + } + + public function getDefaultMenuDropdown() { + return $this->_default_menu_dropdown; + } + + public function addDefaultMenuDropdownItem(array $menuItem) { + $this->_default_menu_dropdown []= $menuItem; + } + + public function setDefaultContextMenu(array $menu) { + $this->_default_context_menu = $menu; + } + + public function getDefaultContextMenu() { + return $this->_default_context_menu; + } + + public function addDefaultContextMenuItem(array $menuItem) { + $this->_default_context_menu []= $menuItem; + } + + public function setDefaultToolbar(array $toolbar) { + $this->_default_toolbar = $toolbar; + } + + public function getDefaultToolbar() { + return $this->_default_toolbar; + } + + public function addDefaultToolbarItem(array $toolbarItem) { + $this->_default_toolbar []= $toolbarItem; + } + + public function setDefaultSidebar(array $sidebar) { + $this->_default_sidebar = $sidebar; + } + + public function getDefaultSidebar() { + return $this->_default_sidebar; + } + + public function addDefaultSidebarItem(array $sidebarItem) { + $this->_default_sidebar []= $sidebarItem; + } + + public function setCreateActionText($text) { + $this->_create_action_text = (string)$text; + } + + public function setEditActionText($text) { + $this->_edit_action_text = (string)$text; + } + + public function setDeleteActionText($text) { + $this->_delete_action_text = (string)$text; + } + + public function setSaveActionText($text) { + $this->_save_action_text = (string)$text; + } + + public function setCreateActionWindowClass($class) { + if (!method_exists($class,'getParentClass') || $class::getParentClass()!='Dash\Windows\Window') throw new \Exception('Invalid window class passed'); + $this->_create_action_window_class = $class; + } + + public function setEditActionWindowClass($class) { + if (!method_exists($class,'getParentClass') || $class::getParentClass()!='Dash\Windows\Window') throw new \Exception('Invalid window class passed'); + $this->_edit_action_window_class = $class; + } + + public function setSaveActionEnabled($enabled) { + $this->_save_action_enabled = (bool)$enabled; + } + + public function setDeleteActionEnabled($enabled) { + $this->_delete_action_enabled = (bool)$enabled; + } + + public function addDefaultOnLoadScript($js) { + if (substr($js, -1)!=';') $js.=';'; + $this->_default_onload_scripts[]=$js; + } + + public function getDefaultOnLoadScripts() { + return implode(' ', $this->_default_onload_scripts); + } + + public function setSelectionLinksEnabled($enabled) { + $this->_selection_links = (bool)$enabled; + } + + public static function setCallbackStringMode($mode) { + self::$_callback_string_mode = (bool)$mode; + } + + protected function setOption($name, $value) { + $this->_options[$name] = $value; + } + + public function setTop($value) { + $this->setOption('top', intval($value)); + } + + public function setLeft($value) { + $this->setOption('left', intval($value)); + } + + public function setRight($value) { + $this->setOption('right', intval($value)); + } + + public function setBottom($value) { + $this->setOption('bottom', intval($value)); + } + + public function setWidth($value) { + $this->setOption('width', intval($value)); + } + + public function setHeight($value) { + $this->setOption('height', intval($value)); + } + + public function setAutoSizing($value) { + $this->setOption('auto', boolval($value)); + } + + public function setResizing($value) { + $this->setOption('resize', boolval($value)); + } + + public function setAnimating($value) { + $this->setOption('animate', boolval($value)); + } + + public function setMaximized($value) { + $this->setOption('maximized', boolval($value)); + } + + public function setSidebarEnabled($value) { + $this->setOption('sidebar', boolval($value)); + } + + public function setSidebarWidth($value) { + $this->setOption('sidebar_width', intval($value)); + } + + public function setToolbarEnabled($value) { + $this->setOption('toolbar', boolval($value)); + } + + public function setViewSwitcherEnabled($value) { + $this->setOption('viewSwitcher', boolval($value)); + } + + public function setBodyViewListVertical($value) { + $this->setOption('bodyViewList', boolval($value)); + } + + public function setIconClass($value) { + $this->setOption('icon_class', (string)$value); + } + + public function setTitle($value) { + $this->setOption('title', (string)$value); + } + + public function setMenuItems(array $value) { + $this->setOption('menuItems', $value); + } + + public function setToolbarItems(array $value) { + $this->setOption('toolbarItems', $value); + } + + public function setSidebarItems(array $value) { + $this->setOption('sidebarItems', $value); + } + + public function setBodyItems(array $value) { + $this->setOption('bodyItems', $value); + } + + public function setContextMenuItems(array $value) { + $this->setOption('contextMenuItems', $value); + } + + public function setToolbarContent($value) { + $this->setOption('toolbarContent', (string)$value); + } + + public function setSidebarContent($value) { + $this->setOption('sidebarContent', (string)$value); + } + + public function setBodyContent($value) { + $this->setOption('bodyContent', (string)$value); + } + + public function setBodyFullContent($value) { + $this->setOption('bodyFullContent', (string)$value); + } + + public function setFooterContent($value) { + $this->setOption('footerContent', (string)$value); + } + + public function setOnOpenJSCallback($value) { + $this->setOption('onOpen', (string)$value); + } + + public function setOnLoadJSCallback($value, $force=false) { + if (!$force && (property_exists($this, 'page') || property_exists($this, 'order'))) throw new \Exception('Cannot setOnLoadJSCallback. Use addDefaultOnLoadScript instead.'); + $this->setOption('onLoad', (string)$value); + } + + public function setOnFocusJSCallback($value) { + $this->setOption('onFocus', (string)$value); + } + + public function setOnBlurJSCallback($value) { + $this->setOption('onBlur', (string)$value); + } + + public function setOnSelectJSCallback($value) { + $this->setOption('onSelect', (string)$value); + } + + public function setOnDropJSCallback($value) { + $this->setOption('onDrop', (string)$value); + } + + public function setOnCloseJSCallback($value) { + $this->setOption('onClose', (string)$value); + } + + public function setOnCreateItemJSCallback($value) { + $this->setOption('onCreateItem', (string)$value); + } + + public function setOnEditItemJSCallback($value) { + $this->setOption('onEditItem', (string)$value); + } + + public function setOnDeleteItemsJSCallback($value) { + $this->setOption('onDeleteItems', (string)$value); + } + + public function setOnSaveJSCallback($value) { + $this->setOption('onSave', (string)$value); + } + + public function setOnUpdateContentJSCallback($value) { + $this->setOption('onUpdateContent', (string)$value); + } + + public function setOnResizeJSCallback($value) { + $this->setOption('onResize', (string)$value); + } + + public function setLoadURL($value) { + $this->setOption('load', (string)$value); + } + + public function setData(array $value) { + $value['token'] = Dash\Dash::getToken(); + $this->setOption('data', $value); + } + + public function setNoCache($value) { + $this->setOption('nocache', (bool)$value); + } + + + public function setSingleInstance($value) { + $this->setOption('singleInstance', (bool)$value); + } + + public function setReloadButtonEnabled($reload_button) { + $this->_reload_button = (bool)$reload_button; + } + + public function createJSCallback($js) { + if (empty($js)) return null; + if (self::$_callback_string_mode) { + return $this->createJSCallbackString($js); + } else { + return $this->createJSCallbackFunction($js); + } + } + + public function createJSCallbackFunction($js) { + $js = trim($js); + if (substr($js,-1)!=';') $js .= ';'; + return 'function(element){'.$js.'}'; + } + + public function createJSCallbackString($js) { + $js = trim($js); + if (substr($js,-1)!=';') $js .= ';'; + //return 'new Function(\'element\', \''.$js.'\')'; + return '(function(element){'.$js.'})'; + } + + public function createMenuItem($title, array $dropdownItems) { + return array( + 'title' => (string)$title, + 'items' => $dropdownItems + ); + } + + public function createMenuDropdownItem($title, $icon_class, $js, $action_name=null, $disabled=false, array $extra = array()) { + return array_merge(array( + 'title' => (string)$title, + 'icon_class' => (string)$icon_class, + 'callback' => $this->createJSCallback($js), + 'action' => (string)$action_name, + 'disabled' => (bool)$disabled + ), $extra); + } + + public function createMenuDropdownSeparator() { + return array( + 'type' => 'separator' + ); + } + + public function createContextMenuItem($title, $icon_class, $js, $action_name=null, $disabled=false, array $extra = array()) { + return array_merge(array( + 'title' => (string)$title, + 'icon_class' => (string)$icon_class, + 'callback' => $this->createJSCallback($js), + 'action' => (string)$action_name, + 'disabled' => (bool)$disabled + ), $extra); + } + + public function createContextMenuSeparator() { + return array( + 'type' => 'separator' + ); + } + + public function createToolbarButton($title, $tooltip, $icon_class, $js, $action_name=null, $disabled=false, $align_right=false, array $extra = array()) { + return array_merge(array( + 'title' => (string)$title, + 'tooltip' => (string)$tooltip, + 'icon_class' => (string)$icon_class, + 'align' => $align_right ? 'right' : 'left', + 'callback' => $this->createJSCallback($js), + 'action' => (string)$action_name, + 'disabled' => (bool)$disabled + ), $extra); + } + + public function createToolbarInput($title, $tooltip, $icon_class, $js, $action_name=null, $disabled=false, $align_right=false, array $extra = array()) { + return array_merge(array( + 'type' => 'input', + 'title' => (string)$title, + 'tooltip' => (string)$tooltip, + 'icon_class' => (string)$icon_class, + 'align' => $align_right ? 'right' : 'left', + 'callback' => $this->createJSCallback($js), + 'action' => (string)$action_name, + 'disabled' => (bool)$disabled + ), $extra); + } + + public function createToolbarButtonGroup(array $buttons, $align_right=false, array $extra = array()) { + return array_merge(array( + 'type' => 'button_group', + 'align' => $align_right ? 'right' : 'left', + 'items' => $buttons + ), $extra); + } + + public function createSidebarItem($title, $icon_class, $js, $action_name=null, $disabled=false, array $extra = array()) { + return array_merge(array( + 'title' => (string)$title, + 'icon_class' => (string)$icon_class, + 'callback' => $this->createJSCallback($js), + 'action' => (string)$action_name, + 'disabled' => (bool)$disabled + ), $extra); + } + + public function createSidebarSeparator() { + return array( + 'type' => 'separator' + ); + } + + public function createBodyItem($title, $tooltip, $src, $data=null, $js=null, $disabled=false, array $extra = array()) { + return array_merge(array( + 'title' => (string)$title, + 'tooltip' => (string)$tooltip, + 'src' => (string)$src, + 'callback' => $this->createJSCallback($js), + 'data' => $data, + 'disabled' => (bool)$disabled + ), $extra); + } + + public function createBodyFolderItem($title, $tooltip, $data=null, $js=null, $disabled=false, array $extra = array()) { + return array_merge(array( + 'type' => 'folder', + 'title' => (string)$title, + 'tooltip' => (string)$tooltip, + 'callback' => $this->createJSCallback($js), + 'data' => $data, + 'disabled' => (bool)$disabled + ), $extra); + } + + public function createBodyFileItem($title, $tooltip, $data=null, $js=null, $disabled=false, array $extra = array()) { + return array_merge(array( + 'type' => 'file', + 'title' => (string)$title, + 'tooltip' => (string)$tooltip, + 'callback' => $this->createJSCallback($js), + 'data' => $data, + 'disabled' => (bool)$disabled + ), $extra); + } + + public function createBodyArchiveItem($title, $tooltip, $data=null, $js=null, $disabled=false, array $extra = array()) { + return array_merge(array( + 'type' => 'archive', + 'title' => (string)$title, + 'tooltip' => (string)$tooltip, + 'callback' => $this->createJSCallback($js), + 'data' => $data, + 'disabled' => (bool)$disabled + ), $extra); + } + + public function generateOptions() { + $js = "\t".'{'; + $stack = array(); + $stack_indexes = array(); + $stack_objects = array(); + $stack[]=$this->_options; + $stack_indexes[]=0; + $stack_objects[]=false; + $is_object = false; + while(count($stack)>0) { + $index = count($stack)-1; + $prefix = "\r\n".str_repeat("\t", $index+2); + $total = count($stack[$index]); + $co = 0; + if ($stack_indexes[$index]>0 && $is_object) { + $js .= $prefix.'}'; + } else if ($stack_indexes[$index]>0) { + $js .= $prefix.']'; + } + if ($stack_indexes[$index]>0 && $stack_indexes[$index]<$total) { + $js .= ','; + } + if ($stack_indexes[$index]<$total) { + foreach($stack[$index] as $option_name=>$option_value) { + $co++; + if ($co<=$stack_indexes[$index]) continue; + $js .= $prefix; + if (!is_int($option_name)) { + $js .= "'".$option_name."': "; + if (is_array($option_value)) $js .= $prefix; + } + if (is_array($option_value) && (is_int(key($option_value)) || empty($option_value))) { + $js .= '['; + $is_object = false; + } else if (is_array($option_value)) { + $js .= '{'; + $is_object = true; + } + if (is_array($option_value)) { + $stack_indexes[$index] = $co; + $stack[]=$option_value; + $stack_indexes[]=0; + $stack_objects[]=$is_object; + $co=0; + break; + } else if (is_int($option_value)) { + $js .= $option_value; + } else if (is_bool($option_value)) { + $js .= $option_value ? 'true': 'false'; + } else if (is_null($option_value)) { + $js .= 'null'; + } else { + if ($option_name=='callback' || strpos($option_name,'on')===0) { + $js .= $option_value; + } else { + $js .= "'".$option_value."'"; + } + } + if ($co<$total) $js .= ','; + } + } else { + $co = $total; + } + if ($co==$total) { + array_pop($stack); + array_pop($stack_indexes); + $is_object = array_pop($stack_objects); + } + } + $js .= "\r\n\t".'}'; + $stack = null; + $stack_indexes = null; + $stack_objects = null; + return $js; + } + + public function setExtraJS($js) { + if (substr(trim($js),-1)!=';') $js=trim($js).';'; + $this->_extra_js = $js; + } + + public function addStrings(array $strings) { + foreach($strings as $str) { + Dash\Dash::getInstance()->registerWindowString($str); + } + } + + public function addVariables(array $vars, $once = false) { + foreach($vars as $name=>$val) { + if ($once) { + Dash\Dash::getInstance()->registerWindowVariableOnce($name, $val); + } else { + Dash\Dash::getInstance()->registerWindowVariable($name, $val); + } + } + } + + public function includeJS($path) { + Dash\Dash::getInstance()->registerWindowScript($path); + } + + public function render() { + if (empty($this->_options['menuItems']) && (!empty($this->_default_menu) || !empty($this->_default_menu_dropdown))) { + if (!empty($this->_default_menu_dropdown)) { + $this->addDefaultMenuItem( + $this->createMenuItem($this->_default_menu_title, $this->_default_menu_dropdown) + ); + } + $this->setMenuItems($this->_default_menu); + } + if ($this->_selection_links) { + if (!empty($this->_default_context_menu)) { + $this->addDefaultContextMenuItem( + $this->createContextMenuSeparator() + ); + } + $this->addDefaultContextMenuItem( + $this->createContextMenuItem(Locale::t('Select all'), 'glyphicon glyphicon-ok-sign', 'desk_window_select_items(this);', 'select') + ); + $this->addDefaultContextMenuItem( + $this->createContextMenuItem(Locale::t('Unselect all'), 'glyphicon glyphicon-ok-circle', 'desk_window_unselect_items(this);', 'select') + ); + } + if (empty($this->_options['contextMenuItems']) && !empty($this->_default_context_menu)) { + $this->setContextMenuItems($this->_default_context_menu); + } + if (empty($this->_options['toolbarItems']) && !empty($this->_default_toolbar)) { + $this->setToolbarItems($this->_default_toolbar); + } + if (empty($this->_options['sidebarItems']) && !empty($this->_default_sidebar)) { + $this->setSidebarItems($this->_default_sidebar); + } + if ($this->_help_url) { + $this->setOption('help_url', $this->_help_url); + } + $js = 'var '.$this->getJSClassName().' = function(data) {'."\r\n\t"; + $js .= 'desk_window('.'\''.$this->getJSClassName().'\','."\r\n".$this->generateOptions().', data);'."\r\n"; + $js .= '};'."\r\n"; + $js .= $this->_extra_js; + + return $js; + } + + public function __toString() { + return $this->render(); + } +} \ No newline at end of file diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..63a807afbd805a04a379669450c9576a5f005292 GIT binary patch literal 1150 zcmZ{jSxggA6oyAIlAwva$dg-QOnfmhaY58b3K3{&g|@U5Yv}@XXelj=1K192sR}_X zxIipb1T_LuP!L&EghG^EgYx2oqTxZKF-8q0An5T-OB+aVCf}TU&$<79@7$S75Nq%b z2_f*goyb^A5TOJ?>_RYw8E+oLs+W{=FhI%)+nF4*cjKx9Fqt8a`d`VDm$LUKkm4w7 z&%OGvk^Tpf!+q_MV*{OgYV1WTJoVD(Recg7b|0|jDrcTQY5g+X*EY*A(%(Ka)O&xR zswBTf&OIQprEu1)D#oOUb0|j04qrG=XF_jV9dx^D5GVAsIH9Al8ZH*=7qv;OLcQ!* zK%OFQg-y09Ay6h@*^-YR1ra+Ou9njhw5zekpw zw=PW*?T`y2L6H~*DFPNa?C62oar9xlUJgBiy355-kRJc7Ano`jMqEhpJsw3maiC5f zXCtMtK%R&JHKIAm24|%ib&p}U;{F5&=3<|DFujE0NoQrs) zE`8)YZKv2-bt`#CxgY1~!kv1(Rx_+^B#iXQ|mItG`71nqI9so+wfa z15cCuPTc1*U-5R8d8?z;KvkdBc30ap)7Q@D>2Fut*8A$dNXfjP#YFN$X^oIVf_*h6 zKJ97@s@x%+*#CfhM}8plp9qhR(f$Lp`iF-A literal 0 HcmV?d00001 diff --git a/htaccess.txt b/htaccess.txt new file mode 100644 index 0000000..f6e08e0 --- /dev/null +++ b/htaccess.txt @@ -0,0 +1,33 @@ +DirectoryIndex index.php index.html + +ErrorDocument 404 /404.html +ErrorDocument 403 /403.html + + + + Require all denied + + + Order deny,allow + Deny from all + + + + +RewriteEngine On +#RewriteBase / + +RewriteRule ^(?:cache|log)\b.* - [R=403,L] + +RewriteCond %{REQUEST_FILENAME} \.php$ +RewriteRule !index\.php.* - [R=403,L] + +RewriteCond %{REQUEST_FILENAME} !-f +RewriteRule ^assets/css/cache$ assets/css/index.php [L] + +RewriteCond %{REQUEST_FILENAME} !-f +RewriteRule ^assets/js/cache$ assets/js/index.php [L] + +RewriteCond %{REQUEST_FILENAME} !-f +RewriteRule .* index.php/$0 [L] + \ No newline at end of file diff --git a/index.php b/index.php new file mode 100644 index 0000000..97b818d --- /dev/null +++ b/index.php @@ -0,0 +1,53 @@ +shutdown(); + } else if (isset($error['type']) && $error['type']==E_ERROR) { + // trying to log fatal errors + $message = isset($error['message']) ? $error['message'] : 'unknown error'; + $file = isset($error['file']) ? $error['file'] : 'unknown file'; + $line = isset($error['line']) ? $error['line'] : 'unknown line'; + Zira\Log::write('Fatal error: '.$message.' in '.$file.':'.$line); + } +} +register_shutdown_function('shutdown_handler'); + +spl_autoload_extensions('.php'); +spl_autoload_register(); + +try { + \Zira\Config::setSystemDefaults($config); + unset($config); + Zira::getInstance()->bootstrap(); +} catch (Exception $e) { + Zira\Response::exception($e); +} \ No newline at end of file diff --git a/install/check/index.php b/install/check/index.php new file mode 100644 index 0000000..405d8f1 --- /dev/null +++ b/install/check/index.php @@ -0,0 +1,2 @@ +getToken(), $field); + if (Zira\Request::post($_field)===null && Zira\Session::get($field)) { + Zira\Request::setPost($_field, Zira\Session::get($field)); + } +} + +// checking previous form +if (!$form->isValid()) { + return array( + 'error' => $form->getError() + ); +} else { + // saving form data + foreach($infoFields as $field) { + Zira\Session::set($field, $form->getValue($field)); + } +} + +$form = new \Install\Forms\Configuration(); +$form->setValues(Zira\Session::getArray()); +if (!Zira\Session::get('db_type')) $form->setValue('db_type', 'mysql'); +if (!Zira\Session::get('db_host')) $form->setValue('db_host', 'localhost'); +if (!Zira\Session::get('db_port')) $form->setValue('db_port', '3306'); +if (!Zira\Session::get('db_file')) $form->setValue('db_file', '../zira.db'); +if (!Zira\Session::get('db_prefix')) $form->setValue('db_prefix', 'zira_'); +if (!Zira\Session::get('root_dir')) $form->setValue('root_dir', '.'); +if (!Zira\Session::get('base_url')) { + $uri = trim($_SERVER['REQUEST_URI'],'/'); + $uri = preg_replace('/^([^\?]+).*$/', '$1', $uri); + $uri_parts = explode('/', $uri); + if ($uri_parts[count($uri_parts)-1] == 'index.php') array_pop($uri_parts); + if ($uri_parts[count($uri_parts)-1] == 'install') array_pop($uri_parts); + $base_url = '/' . implode('/', $uri_parts); + $form->setValue('base_url', $base_url); +} + +return array( + 'content' => Zira\Helper::tag('p', Zira\Locale::t('Zira CMS stores data in database. Currently, MySQL 5 and SQLite 3 are supported.')). + (string)$form, + 'script' => 'if (zira_install_clean_url) {'. + '$(\'#zira_install_clean_url_input\').val(1);'. + '} else {'. + '$(\'#zira_install_clean_url_input\').val(0);'. + '}'. + 'zira_install_database_select = function() {'. + 'var zira_init_db_type = $(\'#zira-install-db-type-select\').val();'. + 'if (zira_init_db_type == \'mysql\') {'. + '$(\'#zira-install-mysql-credentials\').show();'. + '$(\'#zira-install-sqlite-credentials\').hide();'. + '} else if (zira_init_db_type == \'sqlite\') {'. + '$(\'#zira-install-mysql-credentials\').hide();'. + '$(\'#zira-install-sqlite-credentials\').show();'. + '}'. + '};'. + 'zira_install_database_select();' +); \ No newline at end of file diff --git a/install/credentials.php b/install/credentials.php new file mode 100644 index 0000000..499dc5f --- /dev/null +++ b/install/credentials.php @@ -0,0 +1,16 @@ +setValues(Zira\Session::getArray()); + +return array( + 'content' => Zira\Helper::tag('p', Zira\Locale::t('Your website must have unique name and slogan!')). + (string)$form +); \ No newline at end of file diff --git a/install/default.php b/install/default.php new file mode 100644 index 0000000..118d7fb --- /dev/null +++ b/install/default.php @@ -0,0 +1,50 @@ + 'UTC', + 'clean_url' => true, + 'language' => 'ru', + 'languages' => array('ru'), + 'detect_language' => false, + 'db_translates' => false, + 'theme' => 'default', + 'layout' => 'layout', + 'modules' => array(), + 'caching' => false, + 'cache_lifetime' => 3600, + 'thumbs_width' => 200, + 'thumbs_height' => 150, + 'watermark_enabled' => false, + 'watermark' => '', + 'use_smtp' => false, + 'smtp_host' => 'smtp.gmail.com', + 'smtp_port' => 587, + 'smtp_secure' => 'tls', + 'smtp_username' => '', + 'smtp_password' => '', + 'email_from' => 'info@'.$_SERVER['HTTP_HOST'], + 'email_from_name' => $_SERVER['HTTP_HOST'], + 'feedback_email' => 'info@'.$_SERVER['HTTP_HOST'], + 'date_format' => 'd.m.Y', + 'datepicker_date_format' => 'DD.MM.YYYY', + 'user_photo_min_width' => 250, + 'user_photo_min_height' => 250, + 'user_photo_max_width' => 700, + 'user_photo_max_height' => 700, + 'user_thumb_width' => 100, + 'user_thumb_height' => 100, + 'gzip' => true, + 'site_name' => 'Zira', + 'site_title' => 'Zira CMS', + 'site_slogan' => '', + 'site_logo' => 'assets/images/zira.png', + 'site_copyright' => '', + 'site_keywords' => '', + 'site_description' => '', + 'site_window_title' => true, + 'config_version' => 1 +); \ No newline at end of file diff --git a/install/environment.php b/install/environment.php new file mode 100644 index 0000000..4607aba --- /dev/null +++ b/install/environment.php @@ -0,0 +1,143 @@ +(floatval($phpversion)>=5.5 ? 'glyphicon glyphicon-ok-sign system-ok' : 'glyphicon glyphicon-warning-sign system-warning'))); + +$pdo_installed = class_exists('PDO'); +if ($pdo_installed) { + $pdo_drivers = \PDO::getAvailableDrivers(); +} else { + $supported = false; +} +$pdo = Zira\Helper::tag('span',null,array('class'=>($pdo_installed ? 'glyphicon glyphicon-ok-sign system-ok' : 'glyphicon glyphicon-warning-sign system-warning'))); +$pdo .= ' PDO: '.($pdo_installed ? implode(', ',$pdo_drivers) : Zira\Locale::t('not supported')); + +$gdversion = 0; +if (function_exists('gd_info')) { + $gd_info = gd_info(); + $gdversion = $gd_info['GD Version'] ; +} +if (!$gdversion) $supported = false; +$gd = Zira\Helper::tag('span',null,array('class'=>($gdversion ? 'glyphicon glyphicon-ok-sign system-ok' : 'glyphicon glyphicon-warning-sign system-warning'))); +$gd .= ' GD '.($gdversion ? $gdversion : Zira\Locale::t('not supported')); + +$zip_supported = class_exists('ZipArchive'); +$zip = Zira\Helper::tag('span',null,array('class'=>($zip_supported ? 'glyphicon glyphicon-ok-sign system-ok' : 'glyphicon glyphicon-warning-sign system-warning'))); +$zip .= ' ZIP '.($zip_supported ? Zira\Locale::t('supported') : Zira\Locale::t('not supported')); + +$gzip_supported = function_exists('gzencode') && !@ini_get('zlib.output_compression'); +$gzip = Zira\Helper::tag('span',null,array('class'=>($gzip_supported ? 'glyphicon glyphicon-ok-sign system-ok' : 'glyphicon glyphicon-warning-sign system-warning'))); +$gzip .= ' GZIP '.($gzip_supported ? Zira\Locale::t('supported') : Zira\Locale::t('not supported')); + +$openssl_supported = function_exists('openssl_random_pseudo_bytes'); +if (!$openssl_supported) $supported = false; +$openssl = Zira\Helper::tag('span',null,array('class'=>($openssl_supported ? 'glyphicon glyphicon-ok-sign system-ok' : 'glyphicon glyphicon-warning-sign system-warning'))); +$openssl .= ' OpenSSL '.($openssl_supported ? Zira\Locale::t('supported') : Zira\Locale::t('not supported')); + +$mbstring_supported = function_exists('mb_check_encoding'); +if (!$mbstring_supported) $supported = false; +$mbstring = Zira\Helper::tag('span',null,array('class'=>($mbstring_supported ? 'glyphicon glyphicon-ok-sign system-ok' : 'glyphicon glyphicon-warning-sign system-warning'))); +$mbstring .= ' mbstring '.($mbstring_supported ? Zira\Locale::t('supported') : Zira\Locale::t('not supported')); + +$json_supported = function_exists('json_encode'); +if (!$json_supported) $supported = false; +$json = Zira\Helper::tag('span',null,array('class'=>($json_supported ? 'glyphicon glyphicon-ok-sign system-ok' : 'glyphicon glyphicon-warning-sign system-warning'))); +$json .= ' JSON '.($json_supported ? Zira\Locale::t('supported') : Zira\Locale::t('not supported')); + +$cache_dir_writatable = is_writable(ROOT_DIR . DIRECTORY_SEPARATOR . CACHE_DIR); +if (!$cache_dir_writatable) $supported = false; +$cache_dir = Zira\Helper::tag('span',null,array('class'=>($cache_dir_writatable ? 'glyphicon glyphicon-ok-sign system-ok' : 'glyphicon glyphicon-warning-sign system-warning'))); +$cache_dir .= ' '.Zira\Locale::t('%s directory','cache').' '.($cache_dir_writatable ? Zira\Locale::t('is writable') : Zira\Locale::t('is not writable')); + +$log_dir_writatable = is_writable(ROOT_DIR . DIRECTORY_SEPARATOR . LOG_DIR); +if (!$log_dir_writatable) $supported = false; +$log_dir = Zira\Helper::tag('span',null,array('class'=>($log_dir_writatable ? 'glyphicon glyphicon-ok-sign system-ok' : 'glyphicon glyphicon-warning-sign system-warning'))); +$log_dir .= ' '.Zira\Locale::t('%s directory','log').' '.($log_dir_writatable ? Zira\Locale::t('is writable') : Zira\Locale::t('is not writable')); + +$upload_dir_writatable = is_writable(ROOT_DIR . DIRECTORY_SEPARATOR . UPLOADS_DIR); +if (!$upload_dir_writatable) $supported = false; +$upload_dir = Zira\Helper::tag('span',null,array('class'=>($upload_dir_writatable ? 'glyphicon glyphicon-ok-sign system-ok' : 'glyphicon glyphicon-warning-sign system-warning'))); +$upload_dir .= ' '.Zira\Locale::t('%s directory','uploads').' '.($upload_dir_writatable ? Zira\Locale::t('is writable') : Zira\Locale::t('is not writable')); + +$htaccess_exists = file_exists(ROOT_DIR . DIRECTORY_SEPARATOR . '.htaccess'); +if (!$htaccess_exists) $supported = false; +$htaccess = Zira\Helper::tag('span',null,array('class'=>($htaccess_exists ? 'glyphicon glyphicon-ok-sign system-ok' : 'glyphicon glyphicon-warning-sign system-warning'))); +$htaccess .= ' '.Zira\Locale::t('File %s','.htaccess').' '.($htaccess_exists ? Zira\Locale::t('is exists') : Zira\Locale::t('is not exists')); + +$robots_exists = file_exists(ROOT_DIR . DIRECTORY_SEPARATOR . 'robots.txt'); +if (!$robots_exists) $supported = false; +$robots = Zira\Helper::tag('span',null,array('class'=>($robots_exists ? 'glyphicon glyphicon-ok-sign system-ok' : 'glyphicon glyphicon-warning-sign system-warning'))); +$robots .= ' '.Zira\Locale::t('File %s','robots.txt').' '.($robots_exists ? Zira\Locale::t('is exists') : Zira\Locale::t('is not exists')); + +$config_exists = file_exists(ROOT_DIR . DIRECTORY_SEPARATOR . 'config.php'); +$config_writatable = false; +if (!$config_exists) $supported = false; +else $config_writatable = is_writable(ROOT_DIR . DIRECTORY_SEPARATOR . 'config.php'); +if (!$config_writatable) $supported = false; +$config = Zira\Helper::tag('span',null,array('class'=>($config_exists && $config_writatable ? 'glyphicon glyphicon-ok-sign system-ok' : 'glyphicon glyphicon-warning-sign system-warning'))); +if (!$config_exists) $config .= ' '.Zira\Locale::t('File %s','config.php').' '.($config_exists ? Zira\Locale::t('is exists') : Zira\Locale::t('is not exists')); +else $config .= ' '.Zira\Locale::t('File %s','config.php').' '.($config_writatable ? Zira\Locale::t('is writeable') : Zira\Locale::t('is not writeable')); + +$response = array('content'=>Zira\Helper::tag('style', '.system-ok { color: green; } .system-warning { color: red; }'). + ($supported ? Zira\Helper::tag_open('h2').Zira\Helper::tag('span', null, array('class'=>'glyphicon glyphicon-ok-sign')).' '.Zira\Locale::t('System is ready to be installed').Zira\Helper::tag_close('h2') : Zira\Helper::tag('h2', Zira\Locale::t('Preparing to install'))). + Zira\Helper::tag_open('p').' '.Zira\Helper::tag_close('p'). + (!$htaccess_exists || !$robots_exists || !$config_exists ? + Zira\Helper::tag('p', Zira\Locale::t('You have to rename the following files:')). + Zira\Helper::tag_open('ul'). + Zira\Helper::tag('li', 'htaccess.txt ⇨ .htaccess'). + Zira\Helper::tag('li', 'robots.src.txt ⇨ robots.txt'). + Zira\Helper::tag('li', 'config.src.php ⇨ config.php'). + Zira\Helper::tag_close('ul'). + Zira\Helper::tag_open('p').' '.Zira\Helper::tag_close('p') + : ''). + Zira\Helper::tag('p', Zira\Locale::t('Server test:')). + Zira\Helper::tag_open('ul', array('class'=>'system-options-list', 'style'=>'list-style-type: none; padding: 0px')). + Zira\Helper::tag_open('li').Zira\Helper::tag('span',null,array('class'=>'glyphicon glyphicon-info-sign')).' '.$os_name.' / '.$server_name.Zira\Helper::tag_close('li'). + Zira\Helper::tag_open('li').$php_prefix.' PHP '.$phpversion.Zira\Helper::tag_close('li'). + Zira\Helper::tag_open('li').$pdo.Zira\Helper::tag_close('li'). + Zira\Helper::tag_open('li').$gd.Zira\Helper::tag_close('li'). + Zira\Helper::tag_open('li').$zip.Zira\Helper::tag_close('li'). + Zira\Helper::tag_open('li').$gzip.Zira\Helper::tag_close('li'). + Zira\Helper::tag_open('li').$openssl.Zira\Helper::tag_close('li'). + Zira\Helper::tag_open('li').$mbstring.Zira\Helper::tag_close('li'). + Zira\Helper::tag_open('li').$json.Zira\Helper::tag_close('li'). + Zira\Helper::tag_open('li').Zira\Helper::tag('span',null,array('class'=>'glyphicon glyphicon-question-sign')).' '.Zira\Locale::t('Clean URLs').' '.Zira\Helper::tag('span',Zira\Locale::t('is being checked...'),array('id'=>'sys-info-clean-url-option')).Zira\Helper::tag_close('li'). + Zira\Helper::tag_open('li').$cache_dir.Zira\Helper::tag_close('li'). + Zira\Helper::tag_open('li').$log_dir.Zira\Helper::tag_close('li'). + Zira\Helper::tag_open('li').$upload_dir.Zira\Helper::tag_close('li'). + Zira\Helper::tag_open('li').$htaccess.Zira\Helper::tag_close('li'). + Zira\Helper::tag_open('li').$robots.Zira\Helper::tag_close('li'). + Zira\Helper::tag_open('li').$config.Zira\Helper::tag_close('li'). + Zira\Helper::tag_close('ul'), + 'script' => + 'zira_install_clean_url = false;'. + '$.get(\''.Zira\Helper::baseUrl('install/check/1').'\', function(response){'. + 'if (response) zira_install_clean_url = true;'. + '}).always(function(){'. + 'if (zira_install_clean_url) {'. + '$(\'#sys-info-clean-url-option\').text(\''.Zira\Locale::t('supported').'\');'. + '$(\'#sys-info-clean-url-option\').parent().children(\'.glyphicon\').removeClass(\'glyphicon-question-sign\').addClass(\'glyphicon-ok-sign\').addClass(\'system-ok\');'. + '} else {'. + '$(\'#sys-info-clean-url-option\').text(\''.Zira\Locale::t('not supported').'\');'. + '$(\'#sys-info-clean-url-option\').parent().children(\'.glyphicon\').removeClass(\'glyphicon-question-sign\').addClass(\'glyphicon-warning-sign\').addClass(\'system-warning\');'. + '}'. + '});' +); + +if (!$supported) $response['error'] = !$htaccess_exists || !$robots_exists || !$config_exists ? Zira\Locale::t('Filesystem need to be prepared for installation') : Zira\Locale::t('Zira installer cannot continue'); + +return $response; \ No newline at end of file diff --git a/install/forms/configuration.php b/install/forms/configuration.php new file mode 100644 index 0000000..e771cd3 --- /dev/null +++ b/install/forms/configuration.php @@ -0,0 +1,77 @@ +_id); + } + + protected function _init() { + $this->setTitle(Locale::t('Configuration')); + $this->setDescription(Locale::t('Please fill out form fields')); + } + + protected function _render() { + $html = $this->open(); + $html .= Helper::tag_open('div', array('class'=>'form-group')); + $html .= Helper::tag('label', Locale::t('Database').':', array('class'=>'col-sm-3 control-label')); + $html .= Helper::tag_close('div'); + + $html .= $this->select(Locale::t('Type').'*', 'db_type', array('mysql'=>'MySQL', 'sqlite'=>'SQLite'), array('onchange'=>'zira_install_database_select()', 'id'=>'zira-install-db-type-select')); + + $html .= Helper::tag_open('div', array('id'=>'zira-install-mysql-credentials')); + $html .= $this->input(Locale::t('Server').'*', 'db_host'); + $html .= $this->input(Locale::t('Port').'*', 'db_port'); + $html .= $this->input(Locale::t('Name').'*', 'db_name'); + $html .= $this->input(Locale::t('User').'*', 'db_username'); + $html .= $this->input(Locale::t('Password'), 'db_password'); + $html .= Helper::tag_close('div'); + + $html .= Helper::tag_open('div', array('id'=>'zira-install-sqlite-credentials')); + $html .= $this->input(Locale::t('File').'*', 'db_file'); + $html .= Helper::tag_close('div'); + + $html .= $this->input(Locale::t('Table prefix').'*', 'db_prefix', array('title'=>Locale::t('change to unique string'))); + $html .= Helper::tag('div', null, array('style'=>'margin: 40px 0px')); + $html .= Helper::tag_open('div', array('class'=>'form-group')); + $html .= Helper::tag('label', Locale::t('Website').':', array('class'=>'col-sm-3 control-label')); + $html .= Helper::tag_close('div'); + $html .= $this->input(Locale::t('Document root').'*', 'root_dir', array('title'=>Locale::t('change only if a problem occurres'))); + $html .= $this->input(Locale::t('Base URL').'*', 'base_url', array('title'=>Locale::t('change only if it was detected incorrectly'))); + $html .= $this->input(Locale::t('Console password'), 'console_password', array('placeholder'=>Locale::t('min. %s chars',8), 'title'=>Locale::t('leave blank if you\'re not planning to use console'))); + $html .= $this->hidden('clean_url', array('id'=>'zira_install_clean_url_input')); + $html .= $this->close(); + return $html; + } + + protected function _validate() { + $validator = $this->getValidator(); + + $db_type = $this->getValue('db_type'); + if ($db_type == 'mysql') { + $validator->registerString('db_host', null, 255, true, Locale::t('Please fill out form fields')); + $validator->registerNumber('db_port', 1, null, true, Locale::t('Please fill out form fields')); + $validator->registerString('db_name', null, 255, true, Locale::t('Please fill out form fields')); + $validator->registerString('db_username', null, 255, true, Locale::t('Please fill out form fields')); + } else if ($db_type == 'sqlite') { + $validator->registerString('db_file', null, 255, true, Locale::t('Please fill out form fields')); + } + + $validator->registerString('db_prefix', null, 255, true, Locale::t('Please fill out form fields')); + $validator->registerString('root_dir', null, 255, true, Locale::t('Please fill out form fields')); + $validator->registerString('base_url', null, 255, true, Locale::t('Please fill out form fields')); + $validator->registerString('console_password', 8, 255, false, Locale::t('Console password is too short')); + } +} \ No newline at end of file diff --git a/install/forms/credentials.php b/install/forms/credentials.php new file mode 100644 index 0000000..fd31652 --- /dev/null +++ b/install/forms/credentials.php @@ -0,0 +1,64 @@ +_id); + } + + protected function _init() { + $this->setTitle(Locale::t('Required information')); + $this->setDescription(Locale::t('Please fill out form fields')); + } + + protected function _render() { + $html = $this->open(); + $html .= $this->input(Locale::t('Website name').'*', 'site_name'); + $html .= $this->input(Locale::t('Website slogan').'*', 'site_slogan'); + $html .= $this->input(Locale::t('Contact Email').'*', 'email_from'); + $html .= $this->input(Locale::t('Secret key').'*', 'secret', array('placeholder'=>Locale::t('min. %s chars',8),'title'=>Locale::t('enter random chars'))); + $html .= Helper::tag('div', null, array('style'=>'margin: 40px 0px')); + $html .= Helper::tag_open('div', array('class'=>'form-group')); + $html .= Helper::tag('label', Locale::t('Administrator').':', array('class'=>'col-sm-3 control-label')); + $html .= Helper::tag_close('div'); + $html .= $this->input(Locale::t('First name').'*', 'firstname'); + $html .= $this->input(Locale::t('Last name').'*', 'secondname'); + $html .= $this->input(Locale::t('Login').'*', 'username'); + $html .= $this->input(Locale::t('Password').'*', 'password'); + $html .= $this->input(Locale::t('Email').'*', 'email'); + $html .= $this->close(); + return $html; + } + + protected function _validate() { + $validator = $this->getValidator(); + + $validator->registerString('site_name', null, 255, true, Locale::t('Please fill out form fields')); + $validator->registerNoTags('site_name', Locale::t('Invalid character detected')); + $validator->registerString('site_slogan', null, 255, true, Locale::t('Please fill out form fields')); + $validator->registerNoTags('site_slogan', Locale::t('Invalid character detected')); + $validator->registerEmail('email_from', true, Locale::t('Invalid email')); + $validator->registerString('secret', 8, 255, true, Locale::t('Secret key is too short')); + $validator->registerString('firstname', null, 255, true, Locale::t('Please fill out form fields')); + $validator->registerNoTags('firstname', Locale::t('Invalid character detected')); + $validator->registerString('secondname', null, 255, true, Locale::t('Please fill out form fields')); + $validator->registerNoTags('secondname', Locale::t('Invalid character detected')); + $validator->registerString('username', \Zira\User::LOGIN_MIN_CHARS, \Zira\User::LOGIN_MAX_CHARS, true, Locale::t('Invalid username')); + $validator->registerRegexp('username', \Zira\User::REGEXP_LOGIN, Locale::t('Login must contain only letters and numbers')); + $validator->registerString('password', \Zira\User::PASSWORD_MIN_CHARS, \Zira\User::PASSWORD_MAX_CHARS,true,Locale::t('Invalid password')); + $validator->registerRegexp('password', \Zira\User::REGEXP_PASSWORD, Locale::t('Password contain bad characters')); + $validator->registerEmail('email', true, Locale::t('Invalid email')); + } +} \ No newline at end of file diff --git a/install/index.php b/install/index.php new file mode 100644 index 0000000..5425ae1 --- /dev/null +++ b/install/index.php @@ -0,0 +1,204 @@ +count($steps)) $step=0; +$process = isset($_GET['process']) ? intval($_GET['process']) : 0; + +if (!defined('ROOT_DIR')) define('ROOT_DIR','..'); +if (!defined('BASE_URL')) define('BASE_URL', '..'); +if (!defined('SECRET')) define('SECRET', 'zIraTmPseCret'); + +Zira\Session::start(); +Zira\Locale::load($language, 'install'); + +if ($process<=0 && $step>0) { + $response = include('.' . DIRECTORY_SEPARATOR . $steps[$step-1] . '.php'); + echo json_encode($response); + Zira\Session::close(); + exit; +} else if ($process>0) { + $response = include('.' . DIRECTORY_SEPARATOR . 'operate.php'); + echo json_encode($response); + Zira\Session::close(); + exit; +} + +Zira\View::setTheme(DEFAULT_THEME); +Zira\View::setRenderJsStrings(false); +Zira\View::setRenderBreadcrumbs(false); +Zira\View::addDefaultAssets(); +Zira\View::addThemeAssets(); +Zira\View::addWidget('\Zira\Widgets\Logo'); + +Zira\Config::set('language', $language); +Zira\Config::set('languages', $languages); +Zira\Config::set('site_name', 'Zira CMS'); +Zira\Config::set('site_slogan', ''); +Zira\Config::set('site_logo', 'assets/images/zira.png'); + +Zira\Helper::setAddingLanguageToUrl(false); +$html = Zira\Helper::tag_open('ul', array('id'=>'language-switcher')); +foreach($languages as $_language) { + if ($_language == $language) $class='active'; + else $class = ''; + $html .= Zira\Helper::tag_open('li'); + $html .= Zira\Helper::tag('a', Zira\Helper::html(ucfirst($_language)), array('href'=>'?lang='.Zira\Helper::html($_language), 'class'=>$class)); + $html .= Zira\Helper::tag_close('li'); +} +$html .= Zira\Helper::tag_close('ul'); +Zira\View::addHTML($html, Zira\View::VAR_HEADER); + +$init_content = Zira\Helper::tag_open('div', array('id'=>'zira-install-container')). + Zira\Helper::tag('h2', Zira\Locale::t('Welcome to Zira CMS installer')). + Zira\Helper::tag_open('p').' '.Zira\Helper::tag_close('p'). + Zira\Helper::tag('p', Zira\Locale::t('Zira CMS is a lightweight, flexible and easy to use content management system.')). + Zira\Helper::tag('p', Zira\Locale::t('Installing Zira CMS, you get the most commonly used features right out of the box.')). + Zira\Helper::tag('p', Zira\Locale::t('No need for extra downloads and plugins setup.')). + Zira\Helper::tag('p', Zira\Locale::t('Zira CMS brings desktop experience to your website - no web development skills required!')). + Zira\Helper::tag_open('p').' '.Zira\Helper::tag_close('p'). + Zira\Helper::tag('p', Zira\Locale::t('Main features:')). + Zira\Helper::tag_open('ul'). + Zira\Helper::tag('li', Zira\Locale::t('Simple management')). + Zira\Helper::tag('li', Zira\Locale::t('Fast and flexible')). + Zira\Helper::tag('li', Zira\Locale::t('SEO friendly')). + Zira\Helper::tag('li', Zira\Locale::t('Free of charge')). + Zira\Helper::tag_close('ul'). + Zira\Helper::tag_open('div', array('style'=>'margin:40px 0px 100px')). + Zira\Helper::tag('button', Zira\Locale::t('Install'), array('class'=>'btn btn-primary', 'id'=>'zira-install-start-btn')). + Zira\Helper::tag_close('div'). + Zira\Helper::tag_close('div'). + Zira\Helper::tag_open('div', array('id'=>'zira-install-pager', 'class'=>'btn-group', 'style'=>'display:none;margin:40px 0px 100px')). + Zira\Helper::tag('button', '⇦ '.Zira\Locale::t('Backward'), array('class'=>'btn btn-default', 'id'=>'zira-install-backward-btn', 'disabled'=>'disabled')). + Zira\Helper::tag('button', Zira\Locale::t('Forward').' ⇨', array('class'=>'btn btn-primary', 'id'=>'zira-install-forward-btn', 'disabled'=>'disabled')). + Zira\Helper::tag_close('div'); + +$init_js = Zira\Helper::tag_open('script',array('type'=>'text/javascript')). + 'zira_strings = {\'Error\':\''.Zira\Locale::t('Error').'\', \'Message\':\''.Zira\Locale::t('Message').'\', \'Close\':\''.Zira\Locale::t('Close').'\', \'Please wait\': \''.Zira\Locale::t('Please wait').'\'};'. + 'zira_install_clean_url = false;'. + '(function($){'. + 'zira_install_page = 0;'. + 'zira_process_page = 0;'. + 'zira_install_init = function() {'. + 'if (zira_install_page>1) $(\'#zira-install-backward-btn\').removeAttr(\'disabled\');'. + 'else $(\'#zira-install-backward-btn\').attr(\'disabled\', \'disabled\');'. + 'if (zira_install_page<'.count($steps).') $(\'#zira-install-forward-btn\').removeAttr(\'disabled\');'. + 'else $(\'#zira-install-forward-btn\').attr(\'disabled\', \'disabled\');'. + '$(\'form\').submit(function(e){'. + 'e.stopPropagation(); e.preventDefault();'. + 'zira_install_forward();'. + '});'. + '};'. + 'zira_install_backward = function() {'. + '$(\'#zira-install-backward-btn\').attr(\'disabled\', \'disabled\');'. + '$(\'#zira-install-forward-btn\').attr(\'disabled\', \'disabled\');'. + 'zira_install_page--;'. + 'zira_install_request();'. + '};'. + 'zira_install_forward = function() {'. + '$(\'#zira-install-backward-btn\').attr(\'disabled\', \'disabled\');'. + '$(\'#zira-install-forward-btn\').attr(\'disabled\', \'disabled\');'. + 'zira_install_page++;'. + 'zira_install_request();'. + '};'. + 'zira_install_request = function() {'. + '$(\'body\').css(\'cursor\',\'wait\');'. + 'var data = {};'. + 'var form = $(\'#zira-install-container\').find(\'form\');'. + 'if ($(form).length>0) {'. + 'var formData = $(form).eq(0).serializeArray();'. + 'for (var i=0; i Zira\Locale::t('Installation'), + Zira\View::VAR_CONTENT => $init_content . $init_js +), $view_file, $layout_file); + +Zira\Session::close(); \ No newline at end of file diff --git a/install/layout.php b/install/layout.php new file mode 100644 index 0000000..132cf5b --- /dev/null +++ b/install/layout.php @@ -0,0 +1,55 @@ + + + + + + + + + + +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    + + + + +
    + +
    +
    + +
    + + + \ No newline at end of file diff --git a/install/license.php b/install/license.php new file mode 100644 index 0000000..9de9b95 --- /dev/null +++ b/install/license.php @@ -0,0 +1,22 @@ + Zira\Helper::tag('h2', Zira\Locale::t('Agreement')). + Zira\Helper::tag_open('p').' '.Zira\Helper::tag_close('p'). + Zira\Helper::tag('p', Zira\Locale::t('By installing Zira CMS you are agree to the following terms and conditions:')). + Zira\Helper::tag_open('p').' '.Zira\Helper::tag_close('p'). + Zira\Helper::tag('p', Zira\Locale::t('Zira CMS is a free software and can be used in both commercial and non-commercial projects without limitation.')). + Zira\Helper::tag_open('p').Zira\Locale::t('You can modify system files for your needs, but Zira CMS\' copyright string with active link to %s must exists on every generated page.',Zira\Helper::tag('a','http://dro1d.ru', array('href'=>'http://dro1d.ru','target'=>'_blank'))).Zira\Helper::tag_close('p'). + Zira\Helper::tag_open('p').Zira\Locale::t('If this doesn\'t fit your needs, you may want to purchase a license. Please visit our %s for further details.',Zira\Helper::tag('a',Zira\Locale::t('website'), array('href'=>'http://dro1d.ru','target'=>'_blank'))).Zira\Helper::tag_close('p'). + Zira\Helper::tag_open('p').Zira\Locale::t('If you have any questions, feel free to %s.',Zira\Helper::tag('a',Zira\Locale::t('contact us'), array('href'=>'http://dro1d.ru/contact','target'=>'_blank'))).Zira\Helper::tag_close('p'). + Zira\Helper::tag('p', Zira\Locale::t('Don\'t forget to visit our forum and share your impressions with other users.')). + Zira\Helper::tag_open('p').' '.Zira\Helper::tag_close('p'). + Zira\Helper::tag('p', Zira\Locale::t('Ready to proceed ?')) +); \ No newline at end of file diff --git a/install/operate.php b/install/operate.php new file mode 100644 index 0000000..c945875 --- /dev/null +++ b/install/operate.php @@ -0,0 +1,362 @@ +$total_processes) throw new \Exception('Unknown task'); + + $data = Zira\Session::get('zira_data'); + if (empty($data)) throw new \Exception('No data recieved'); + + // defining constants + foreach ($constants as $field) { + if (!isset($data[$field])) throw new \Exception('No data recieved'); + $const = strtoupper($field); + if (!defined($const)) define($const, $data[$field]); + } + + // connecting to database + Zira\Db\Loader::initialize(); + Zira\Db\Db::open(); + + if ($process == 1) { + // creating db tables + $dir = ROOT_DIR . DIRECTORY_SEPARATOR . 'zira' . DIRECTORY_SEPARATOR . 'install'; + $tables = array(); + $d = opendir($dir); + while (($f = readdir($d)) !== false) { + if ($f == '.' || $f == '..' || is_dir($dir . DIRECTORY_SEPARATOR . $f)) continue; + if (!preg_match('/^([a-zA-Z0-9]+)\.php$/', $f, $matches)) continue; + $class = '\\Zira\\Install\\' . ucfirst($matches[1]); + try { + if (class_exists($class)) { + $table = new $class; + if ($table instanceof Zira\Db\Table) { + $tables [] = $table; + } else { + unset($table); + } + } + } catch (\Exception $e) { + + } + } + closedir($d); + + if (!empty($tables)) { + foreach ($tables as $table) { + $table->install(); + } + } + + $message = Zira\Locale::t('Creating user'); + } else if ($process == 2) { + // creating user + if (empty($data['username']) || + empty($data['password']) || + empty($data['email']) || + empty($data['firstname']) || + empty($data['secondname']) + ) { + throw new \Exception('No user data'); + } + $user = new Zira\Models\User(); + + $user->group_id = Zira\User::GROUP_SUPERADMIN; + $user->username = $data['username']; + $user->email = $data['email']; + $user->password = Zira\User::getHashedUserToken($data['password']); + $user->firstname = $data['firstname']; + $user->secondname = $data['secondname']; + $user->verified = Zira\Models\User::STATUS_VERIFIED; + $user->active = Zira\Models\User::STATUS_ACTIVE; + $user->date_created = date('Y-m-d H:i:s'); + $user->date_logged = date('Y-m-d H:i:s'); + $user->code = Zira\User::generateRememberCode($user->username, $user->email); + $user->save(); + + $message = Zira\Locale::t('Creating home page'); + } else if ($process == 3) { + // creating home page + $record = new Zira\Models\Record(); + $record->category_id = 0; + $record->name = Zira\Locale::t('home'); + $record->title = Zira\Locale::t('Home page'); + $record->description = Zira\Locale::t('Welcome to Zira CMS!'); + $record->content = Zira\Helper::tag('p', Zira\Locale::t('Welcome to Zira CMS!')). + Zira\Helper::tag_open('p').' '.Zira\Helper::tag_close('p'). + Zira\Helper::tag('p', Zira\Locale::t('Zira CMS is a lightweight, flexible and easy to use content management system.')). + Zira\Helper::tag('p', Zira\Locale::t('Installing Zira CMS, you get the most commonly used features right out of the box.')). + Zira\Helper::tag('p', Zira\Locale::t('No need for extra downloads and plugins setup.')). + Zira\Helper::tag('p', Zira\Locale::t('Zira CMS brings desktop experience to your website - no web development skills required!')). + Zira\Helper::tag_open('p').' '.Zira\Helper::tag_close('p'). + Zira\Helper::tag_open('p').Zira\Locale::t('If you have any questions, feel free to %s.',Zira\Helper::tag('a',Zira\Locale::t('contact us'), array('href'=>'http://dro1d.ru/contact','target'=>'_blank'))).Zira\Helper::tag_close('p'). + Zira\Helper::tag('p', Zira\Locale::t('Don\'t forget to visit our forum and share your impressions with other users.')) + ; + $record->language = $language; + $record->access_check = 0; + $record->published = Zira\Models\Record::STATUS_PUBLISHED; + $record->front_page = Zira\Models\Record::STATUS_NOT_FRONT_PAGE; + $record->author_id = 1; + $record->creation_date = date('Y-m-d H:i:s'); + $record->modified_date = date('Y-m-d H:i:s'); + $record->save(); + + // settings + if (!empty($data['site_name'])) { + $optionObj = new Zira\Models\Option(); + $optionObj->name = 'home_window_title'; + $optionObj->value = $data['site_name']; + $optionObj->module = 'zira'; + $optionObj->save(); + } + + $optionObj = new Zira\Models\Option(); + $optionObj->name = 'home_layout'; + $optionObj->value = Zira\View::LAYOUT_RIGHT_SIDEBAR; + $optionObj->module = 'zira'; + $optionObj->save(); + + $optionObj = new Zira\Models\Option(); + $optionObj->name = 'home_record_name'; + $optionObj->value = Zira\Locale::t('home'); + $optionObj->module = 'zira'; + $optionObj->save(); + $message = Zira\Locale::t('Creating news category'); + } else if ($process == 4) { + // creating news category + $category = new Zira\Models\Category(); + $category->name = Zira\Locale::t('news'); + $category->title = Zira\Locale::t('News'); + $category->layout = Zira\View::LAYOUT_RIGHT_SIDEBAR; + $category->parent_id = 0; + $category->access_check = 0; + $category->display_author = 1; + $category->display_date = 1; + $category->rating_enabled = 1; + $category->records_list = 1; + $category->save(); + + $record = new Zira\Models\Record(); + $record->category_id = $category->id; + $record->name = Zira\Locale::t('launch'); + $record->title = Zira\Locale::t('Our new website is now open!'); + $record->description = Zira\Locale::t('Our website is now open for visitors.'); + $record->content = Zira\Helper::tag('p', Zira\Locale::t('Our website is now open for visitors.')).Zira\Helper::tag('p', Zira\Locale::t('This is an example page created by installer.')); + $record->language = $language; + $record->access_check = 0; + $record->published = Zira\Models\Record::STATUS_PUBLISHED; + $record->front_page = Zira\Models\Record::STATUS_NOT_FRONT_PAGE; + $record->author_id = 1; + $record->creation_date = date('Y-m-d H:i:s'); + $record->modified_date = date('Y-m-d H:i:s'); + $record->save(); + + $max_order = Zira\Models\Widget::getCollection()->max('sort_order')->get('mx'); + + $widget = new Zira\Models\Widget(); + $widget->name = Zira\Models\Category::WIDGET_CLASS; + $widget->module = 'zira'; + $widget->placeholder = Zira\Models\Category::WIDGET_PLACEHOLDER; + $widget->params = $category->id; + $widget->category_id = 0; + $widget->sort_order = ++$max_order; + $widget->active = Zira\Models\Widget::STATUS_ACTIVE; + $widget->save(); + + $message = Zira\Locale::t('Creating menu'); + } else if ($process == 5) { + // creating menu + $menuItem = new Zira\Models\Menu(); + $menuItem->menu_id = Zira\Menu::MENU_PRIMARY; + $menuItem->parent_id = 0; + $menuItem->sort_order = 1; + $menuItem->url = '/'; + $menuItem->title = 'Home'; + $menuItem->external = 0; + $menuItem->active = Zira\Models\Menu::STATUS_ACTIVE; + $menuItem->save(); + + $menuItem = new Zira\Models\Menu(); + $menuItem->menu_id = Zira\Menu::MENU_PRIMARY; + $menuItem->parent_id = 0; + $menuItem->sort_order = 2; + $menuItem->url = Zira\Locale::t('news'); + $menuItem->language = $language; + $menuItem->title = Zira\Locale::t('News'); + $menuItem->external = 0; + $menuItem->active = Zira\Models\Menu::STATUS_ACTIVE; + $menuItem->save(); + + $menuItem = new Zira\Models\Menu(); + $menuItem->menu_id = Zira\Menu::MENU_FOOTER; + $menuItem->parent_id = 0; + $menuItem->sort_order = 3; + $menuItem->url = '/'; + $menuItem->title = 'Home'; + $menuItem->external = 0; + $menuItem->active = Zira\Models\Menu::STATUS_ACTIVE; + $menuItem->save(); + + $menuItem = new Zira\Models\Menu(); + $menuItem->menu_id = Zira\Menu::MENU_FOOTER; + $menuItem->parent_id = 0; + $menuItem->sort_order = 4; + $menuItem->url = 'contact'; + $menuItem->title = 'Contacts'; + $menuItem->external = 0; + $menuItem->active = Zira\Models\Menu::STATUS_ACTIVE; + $menuItem->save(); + + $menuItem = new Zira\Models\Menu(); + $menuItem->menu_id = Zira\Menu::MENU_FOOTER; + $menuItem->parent_id = 0; + $menuItem->sort_order = 5; + $menuItem->url = 'sitemap'; + $menuItem->title = 'Site map'; + $menuItem->external = 0; + $menuItem->active = Zira\Models\Menu::STATUS_ACTIVE; + $menuItem->save(); + + $message = Zira\Locale::t('Writing settings to %s', 'config.php'); + } else if ($process == 6) { + // writing config + if (empty($data['root_dir']) || empty($data['base_url'])) { + throw new \Exception('No data'); + } + $head = '/**'."\r\n". + ' * Zira CMS'."\r\n". + ' * config.php'."\r\n". + ' * (c)'.date('Y').' http://dro1d.ru'."\r\n". + ' */'."\r\n"; + $info = '/**'."\r\n". + ' * Defined during installation on '.date('Y-m-d')."\r\n". + ' */'."\r\n"; + $config = 'const ROOT_DIR = \''.$data['root_dir'].'\';'."\r\n". + 'const BASE_URL = \''.$data['base_url'].'\';'."\r\n". + 'const SECRET = \''.$data['secret'].'\';'."\r\n". + 'const DB_TYPE = \''.DB_TYPE.'\';'."\r\n"; + if (DB_TYPE == 'mysql') { + $config .= + 'const DB_HOST = \'' . DB_HOST . '\';' . "\r\n" . + 'const DB_PORT = ' . DB_PORT . ';' . "\r\n" . + 'const DB_NAME = \'' . DB_NAME . '\';' . "\r\n" . + 'const DB_USERNAME = \'' . DB_USERNAME . '\';' . "\r\n" . + 'const DB_PASSWORD = \'' . DB_PASSWORD . '\';' . "\r\n"; + } else if (DB_TYPE == 'sqlite') { + $db_file = DB_FILE; + if (substr($db_file, 0, 6)=='../../') { + $db_file = substr($db_file, 3); + } + $config .= 'const DB_FILE = \'' . $db_file . '\';' . "\r\n"; + } + $config .= 'const DB_PREFIX = \''.DB_PREFIX.'\';'."\r\n". + 'const CONSOLE_PASSWORD = \''.(CONSOLE_PASSWORD ? md5(rawurlencode(CONSOLE_PASSWORD)) : '').'\';'."\r\n"; + + if (!isset($data['clean_url']) || + empty($data['email_from']) || + empty($data['site_name']) || + empty($data['site_slogan']) + ) { + throw new \Exception('No site info'); + } + $settings = @include('default.php'); + if (empty($settings) || !is_array($settings)) throw new \Exception('Bad defaults'); + $settings['clean_url'] = $data['clean_url']; + $settings['language'] = $language; + $settings['languages'] = array($language); + $settings['email_from'] = $data['email_from']; + $settings['email_from_name'] = $data['site_name']; + $settings['feedback_email'] = $data['email_from']; + $settings['site_name'] = $data['site_name']; + $settings['site_title'] = $data['site_name']; + $settings['site_slogan'] = $data['site_slogan']; + + $defaults = '/**'."\r\n". + ' * System default settings'."\r\n". + ' */'."\r\n". + 'return array('."\r\n"; + $default_strs = array(); + foreach ($settings as $key => $value) { + if (is_int($value)) { + $default_strs []= "\t'".$key."' => ".$value; + } else if (is_bool($value)) { + $default_strs []= "\t'".$key."' => ".($value ? 'true' : 'false'); + } else if (is_string($value)) { + $default_strs []= "\t'".$key."' => '".$value."'"; + } else if (is_array($value)) { + $_value = 'array('; + if (!empty($value)) { + $_value .= "'".implode("', '", $value)."'"; + } + $_value .= ')'; + $default_strs []= "\t'".$key."' => ".$_value; + } else { + throw new \Exception('Unknown type'); + } + } + $defaults .= implode(",\r\n", $default_strs)."\r\n"; + $defaults .= ');'."\r\n"; + + file_put_contents(ROOT_DIR . DIRECTORY_SEPARATOR . 'config.php', ' 'zira_modal_progress_update(' . $percent . ');' . + '$(\'#zira-install-container\').append(\''.Zira\Helper::tag('p', '- '.$message).'\');'. + 'zira_process_page++;' . + 'window.setTimeout(\'zira_install_request();\', 1000);' + ); + } else { + // Done! + return array( + 'content' => Zira\Helper::tag('h2', Zira\Locale::t('Congratulations!')). + Zira\Helper::tag_open('p').' '.Zira\Helper::tag_close('p'). + Zira\Helper::tag('p', Zira\Locale::t('Zira CMS is successfully installed.')). + Zira\Helper::tag_open('p').' '.Zira\Helper::tag_close('p'). + Zira\Helper::tag('p', Zira\Locale::t('For security reasons turn off write permissions of %s file.', 'config.php')). + Zira\Helper::tag_open('p').Zira\Locale::t('Please visit our %s for detailed information.', Zira\Helper::tag('a', Zira\Locale::t('website'), array('href'=>'http://dro1d.ru','target'=>'_blank'))).Zira\Helper::tag_close('p'). + Zira\Helper::tag_open('p').' '.Zira\Helper::tag_close('p'). + Zira\Helper::tag_open('p').Zira\Locale::t('Go to your new %s!', Zira\Helper::tag('a', Zira\Locale::t('website'), array('href'=>$data['base_url']))).Zira\Helper::tag_close('p'), + 'script' => 'zira_modal_progress_hide();' + ); + } +} else { + // something went wrong + return array( + 'error' => Zira\Locale::t('An error occurred') + ); +} \ No newline at end of file diff --git a/install/process.php b/install/process.php new file mode 100644 index 0000000..4f041f0 --- /dev/null +++ b/install/process.php @@ -0,0 +1,135 @@ +getToken(), $field); + if (Zira\Request::post($_field)===null && Zira\Session::get($field)) { + Zira\Request::setPost($_field, Zira\Session::get($field)); + } +} + +// checking previous form +if (!$form->isValid()) { + return array( + 'error' => $form->getError() + ); +} else { + // saving form data + foreach($constants as $field) { + Zira\Session::set($field, $form->getValue($field)); + } +} + +$data = array(); +$data['clean_url'] = (bool)$form->getValue('clean_url'); +$error = false; + +// checking collected data before installation +$info = array( + 'site_name', + 'site_slogan', + 'email_from', + 'secret', + 'firstname', + 'secondname', + 'username', + 'password', + 'email' +); +foreach($info as $field) { + if (!Zira\Session::get($field)) { + $error = Zira\Locale::t('Please check the specified data once again.'); + break; + } + $data[$field] = Zira\Session::get($field); +} +// checking constants once again +if (!$error) { + foreach ($constants as $field) { + if (Zira\Session::get($field)===null) { + $error = Zira\Locale::t('Please check the specified data once again.'); + break; + } + $data[$field] = Zira\Session::get($field); + } +} +// checking root_dir + +if (!$error && $data['root_dir']!='.') { + $data['root_dir'] = rtrim($data['root_dir'], '/\\'); + if (!file_exists($data['root_dir'] . DIRECTORY_SEPARATOR . 'zira.php')) { + $error = Zira\Locale::t('Incorrect document root is specified.'); + } +} +// checking base url +if (!$error && $data['base_url']!='/') { + $data['base_url'] = '/'.trim($data['base_url'],'/'); + $asset_path = realpath(dirname(__FILE__)) . DIRECTORY_SEPARATOR . rtrim(str_repeat('..' . DIRECTORY_SEPARATOR, count(explode('/',$data['base_url']))), DIRECTORY_SEPARATOR) . str_replace('/', DIRECTORY_SEPARATOR, rtrim($data['base_url'], '/') . '/assets/images/zira.png'); + if (!file_exists($asset_path)) { + $error = Zira\Locale::t('Incorrect base url is specified.'); + } +} +// trying to connect to db +if (!$error) { + foreach($constants as $field) { + if (!isset($data[$field])) continue; + $const = strtoupper($field); + if ($field == 'db_file' && !empty($data[$field]) && substr($data[$field], 0, 3)=='../') { + $data[$field] = '../'.$data[$field]; + } + if (!defined($const)) define($const, $data[$field]); + } + try { + Zira\Db\Loader::initialize(); + Zira\Db\Db::open(); + Zira\Db\Db::close(); + } catch(\Exception $e) { + if ($data['db_type']=='sqlite') { + $error = Zira\Locale::t('Failed to create database file.'); + } else { + $error = Zira\Locale::t('Failed to connect to database.'); + } + } +} + +if (!$error) { + // ready to install + Zira\Session::set('zira_data', $data); + return array( + 'content' => Zira\Helper::tag('p', Zira\Locale::t('Please wait...')). + Zira\Helper::tag_open('p').' '.Zira\Helper::tag_close('p'). + Zira\Helper::tag('p', '- '.Zira\Locale::t('Creating database tables')), + 'script' => '$(\'#zira-install-backward-btn\').attr(\'disabled\', \'disabled\');'. + '$(\'#zira-install-forward-btn\').attr(\'disabled\', \'disabled\');'. + '$(\'#zira-install-pager\').remove();'. + 'zira_modal_progress(\''.Zira\Locale::t('Installation').'\');'. + 'zira_process_page++;'. + 'window.setTimeout(\'zira_install_request();\', 1000);' + ); +} else { + return array( + 'error' => Zira\Locale::t('An error occurred').'. '.$error + ); +} \ No newline at end of file diff --git a/key.pub b/key.pub new file mode 100644 index 0000000..14329d8 --- /dev/null +++ b/key.pub @@ -0,0 +1,6 @@ +-----BEGIN PUBLIC KEY----- +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+b6Qg9qbcHORgCb2xOIUNC9Ly +mmNY2WfQSGkpgTTXxdoIiUs2Rex9x6uDpyHD26I7u5lVDBOG0zZqob+IrPzGOmZH +Zr92vXc3SFxBZJ1IHraVeRdGV0hdSA7JKdtgpU46vO90QMaVG5+0QVyIc4Ir/oCQ +49X8o97/VEgeQb71IQIDAQAB +-----END PUBLIC KEY----- diff --git a/languages/en/dash.js.php b/languages/en/dash.js.php new file mode 100644 index 0000000..207cc1e --- /dev/null +++ b/languages/en/dash.js.php @@ -0,0 +1,5 @@ + array('Deactivated %s user', 'Deactivated %s users'), + 'Activated %s users' => array('Activated %s user', 'Activated %s users'), + 'Deactivated %s groups' => array('Deactivated %s group', 'Deactivated %s groups'), + 'Activated %s groups' => array('Activated %s group', 'Activated %s groups'), + 'Deleted %s groups' => array('Deleted %s group', 'Deleted %s groups'), + 'Deactivated %s widgets' => array('Deactivated %s widget', 'Deactivated %s widgets'), + 'Activated %s widgets' => array('Activated %s widget', 'Activated %s widgets'), + 'Activated %s comments' => array('Activated %s comment', 'Activated %s comments'), + '%s comments was posted' => array('%s comment was posted', '%s comments was posted'), + 'max. length: %s chars' => array('max. length: %s char', 'max. length: %s chars') +); \ No newline at end of file diff --git a/languages/en/en.js.php b/languages/en/en.js.php new file mode 100644 index 0000000..207cc1e --- /dev/null +++ b/languages/en/en.js.php @@ -0,0 +1,5 @@ + 'English', + 'Added %s files' => array('Added %s file', 'Added %s files'), + 'Message should contain at least %s characters' => array('Message should contain at least %s character', 'Message should contain at least %s characters') +); \ No newline at end of file diff --git a/languages/en/zira.php b/languages/en/zira.php new file mode 100644 index 0000000..06cc40b --- /dev/null +++ b/languages/en/zira.php @@ -0,0 +1,5 @@ + array('At least %s character required','At least %s characters required'), +); \ No newline at end of file diff --git a/languages/ru/dash.js.php b/languages/ru/dash.js.php new file mode 100644 index 0000000..5e9544c --- /dev/null +++ b/languages/ru/dash.js.php @@ -0,0 +1,28 @@ + 'Закрыть', + 'Sending' => 'Отправка', + 'Message' => 'Сообщение', + 'Error' => 'Ошибка', + 'Confirmation' => 'Подтверждение', + 'Yes' => 'Да', + 'No' => 'Нет', + 'Cancel' => 'Отмена', + 'Please wait' => 'Пожалуйста, подождите', + 'Load failed' => 'Ошибка загрузки', + 'Are you sure ?' => 'Вы уверены ?', + 'An error occurred' => 'Возникла ошибка', + 'Window' => 'Окно', + 'Help' => 'Помощь', + 'Left Sidebar' => 'Левая колонка', + 'Toolbar' => 'Панель инструментов', + 'Snap to left side' => 'Показывать слева', + 'Snap to right side' => 'Показывать справа', + 'Delete' => 'Удалить', + 'Create' => 'Создать', + 'Edit' => 'Редактировать', + 'from' => 'из', + 'Maximum upload size:' => 'Максимальный размер загрузки:', + 'Sorry, but it seems that your browser is not supported.' => 'Извините, но похоже, ваш браузер не поддерживается.' +); \ No newline at end of file diff --git a/languages/ru/dash.php b/languages/ru/dash.php new file mode 100644 index 0000000..14fc922 --- /dev/null +++ b/languages/ru/dash.php @@ -0,0 +1,354 @@ + 'Действия', + 'Delete' => 'Удалить', + 'Create' => 'Создать', + 'Select all' => 'Выделить всё', + 'Unselect all' => 'Снять выделение', + 'Save' => 'Сохранить', + 'Sort descending' => 'Сортировать по убыванию', + 'Sort ascending' => 'Сортировать по возрастанию', + 'Load current page' => 'Загрузить текущую страницу', + 'URL address' => 'URL адрес', + 'Reload' => 'Перезагрузить', + 'Initialization' => 'Инициализация', + 'Up' => 'Вверх', + 'Down' => 'Вниз', + 'Permission denied' => 'Нет прав доступа', + 'Invalid file' => 'Некорректный файл', + 'Invalid image' => 'Некорректное изображение', + 'Invalid directory' => 'Некорректная директория', + 'Deleted successfully' => 'Удалено успешно', + 'New folder' => 'Новая папка', + 'Enter name' => 'Введите имя', + 'Folder must be empty' => 'Папка должна быть пустой', + 'File or directory with such name already exists' => 'Файл или директория с таким именем уже существует', + 'Upload' => 'Загрузить', + 'Rename' => 'Переименовать', + 'Upload from URL' => 'Загрузить из URL', + 'Enter URL address' => 'Введите URL адрес', + 'Load failed' => 'Ошибка загрузки', + 'Download' => 'Скачать', + 'Copy' => 'Копировать', + 'Enter folder path' => 'Введите путь к папке', + 'Folder not found' => 'Папка не найдена', + 'Create archive' => 'Создать архив', + 'Enter archive name' => 'Введите название архива', + 'Added %s files' => array('Добавлен %s файл', 'Добавлено %s файла', 'Добавлено %s файлов'), + 'Extract' => 'Извлечь', + 'Information' => 'Информация', + 'Select' => 'Выбрать', + 'Image editor' => 'Редактор изображения', + 'Zoom In' => 'Увеличить', + 'Zoom Out' => 'Уменьшить', + 'Change width' => 'Изменить ширину', + 'Change height' => 'Изменить высоту', + 'Image width' => 'Ширина изображения', + 'Image height' => 'Высота изображения', + 'Crop' => 'Обрезка', + 'Cut' => 'Обрезать', + 'Aspect ratio' => 'Соотношение сторон', + 'Replace image ?' => 'Заменить изображение ?', + 'Save as' => 'Сохранить как', + 'Crop width' => 'Обрезать по ширине', + 'Crop height' => 'Обрезать по высоте', + 'Text editor' => 'Текстовый редактор', + 'HTML editor' => 'HTML редактор', + 'Create text file' => 'Создать текстовый файл', + 'Create HTML file' => 'Создать HTML файл', + 'Open as text' => 'Открыть как текст', + 'New user' => 'Новый пользователь', + 'User not found' => 'Пользователь не найден', + 'Group not found' => 'Группа не найдена', + 'Invalid username' => 'Некорректный логин', + 'Invalid email' => 'Некорректный email', + 'Invalid password' => 'Некорректный пароль', + 'At least %s characters required' => array('Введите минимум %s символ','Введите минимум %s символа','Введите минимум %s символов'), + 'Enter a valid email' => 'Укажите существующий email', + 'Login must contain only letters and numbers' => 'Логин должен содержать только буквы и цифры', + 'Password contain bad characters' => 'Пароль содержит некорректный символ', + 'Specified login already exists' => 'Указанный логин уже существует', + 'Specified email already exists' => 'Указанный email уже существует', + 'Please enter first name' => 'Пожалуйста, укажите имя', + 'Please enter second name' => 'Пожалуйста, укажите фамилию', + 'Phone should be specified in international format' => 'Телефон должен быть указан в международном формате', + 'verified' => 'проверен', + 'active' => 'активен', + 'hidden' => 'скрыт', + 'Change avatar' => 'Сменить аватару', + 'Delete avatar' => 'Удалить аватару', + 'Deactivate' => 'Деактивировать', + 'Activate' => 'Активировать', + 'Deactivated %s users' => array('Деактивирован %s пользователь', 'Деактивировано %s пользователя', 'Деактивировано %s пользователей'), + 'Activated %s users' => array('Активирован %s пользователь', 'Активировано %s пользователя', 'Активировано %s пользователей'), + 'Deactivated %s groups' => array('Деактивирована %s группа', 'Деактивировано %s группы', 'Деактивировано %s групп'), + 'Activated %s groups' => array('Активирована %s группа', 'Активировано %s группы', 'Активировано %s групп'), + 'Deleted %s groups' => array('Удалена %s группа', 'Удалено %s группы', 'Удалено %s групп'), + 'Verified user' => 'Подтвержденный пользователь', + 'Not verified user' => 'Не подтвержденный пользователь', + 'Show avatar' => 'Просмотр аватары', + 'Groups' => 'Группы', + 'Permissions' => 'Права доступа', + 'Access system dashboard' => 'Доступ к панеле управления', + 'Execute system tasks' => 'Выполнять системные задачи', + 'Change system options' => 'Изменять настройки системы', + 'Change theme layout' => 'Изменять макет темы', + 'Create users' => 'Создавать пользователей', + 'Edit users' => 'Редактировать пользователей', + 'Delete users' => 'Удалять пользователей', + 'Upload files' => 'Загружать файлы', + 'Delete files' => 'Удалять файлы', + 'View files list' => 'Просматривать список файлов', + 'Upload images' => 'Загружать изображения', + 'Delete images' => 'Удалять изображения', + 'View images list' => 'Просматривать список изображений', + 'Create records' => 'Создавать записи', + 'Edit records' => 'Редактировать записи', + 'Delete records' => 'Удалять записи', + 'View records list' => 'Просматривать список записей', + 'View record' => 'Просматривать запись', + 'Permissions of group "%s"' => 'Права доступа группы "%s"', + 'Thumbs width' => 'Ширина миниатюр', + 'Thumbs height' => 'Высота миниатюр', + 'Watermark' => 'Водяной знак', + 'Enable watermark' => 'Включить водяной знак', + 'PHP date format' => 'Формат даты PHP', + 'JS date format' => 'Формат даты JS', + 'Caching' => 'Кэширование', + 'Cache lifetime (sec.)' => 'Время жизни кэша (сек.)', + 'Clean URLs' => 'ЧПУ', + 'GZIP compression' => 'GZIP компрессия', + 'Add watermark' => 'Добавить водяной знак', + 'Send from email' => 'Отправлять от Email', + 'Send from name' => 'Отправлять от имени', + 'Use SMTP server' => 'Использовать SMTP', + 'SMTP host' => 'SMTP сервер', + 'SMTP port' => 'SMTP порт', + 'SMTP connection' => 'SMTP соединение', + 'SMTP username' => 'SMTP пользователь', + 'SMTP password' => 'SMTP пароль', + 'Email confirmation message' => 'Сообщение подтверждения Email', + 'Password recovery message' => 'Сообщение восстановления пароля', + 'New password message' => 'Сообщение нового пароля', + 'Supported variables: %s' => 'Поддерживаемые переменные: %s', + 'Sticky top bar' => 'Закрепить верхнюю панель', + 'Photo min. width' => 'Мин. ширина фото', + 'Photo min. height' => 'Мин. высота фото', + 'Photo max. width' => 'Макс. ширина фото', + 'Photo max. height' => 'Макс. высота фото', + 'Thumb width' => 'Ширина миниатюры', + 'Thumb height' => 'Высота миниатюры', + 'Allow sign-up' => 'Разрешить регистрацию', + 'Access user profiles' => 'Доступ к профилям', + 'Allow login change' => 'Разрешить смену логина', + 'Verify email' => 'Проверять Email', + 'Check user browser' => 'Проверять браузер', + 'Invalid value "%s"' => 'Некорректное значение "%s"', + 'Make default' => 'Сделать по-умолчанию', + 'Translates' => 'Переводы', + 'Custom translates' => 'Пользовательские переводы', + 'String already exists' => 'Строка уже существует', + 'Enter translate' => 'Введите перевод', + 'Enter string to translate' => 'Введите строку для перевода', + 'DB translates' => 'Переводы БД', + 'DB translates are not enabled' => 'Переводы БД не включены', + 'User' => 'Пользователь', + 'Author: %s' => 'Автор: %s', + 'Preview' => 'Предпросмотр', + 'Install' => 'Установить', + 'Uninstall' => 'Удалить', + 'Remove module from database ?' => 'Удалить модуль из базы данных ?', + 'Cannot install activated module' => 'Невозможно установить активированный модуль', + 'Cannot uninstall activated module' => 'Невозможно удалить активированный модуль', + 'Failed to install module' => 'При установке модуля возникла ошибка', + 'Failed to uninstall module' => 'При удалении модуля возникла ошибка', + 'Module successfully installed' => 'Модуль установлен успешно', + 'Module successfully uninstalled' => 'Модуль удалён успешно', + 'Module is already installed' => 'Модуль уже установлен', + 'Module is not installed' => 'Модуль не установлен', + 'Website title' => 'Название сайта', + 'Website slogan' => 'Слоган сайта', + 'Website logo' => 'Логотип сайта', + 'Copyright string' => 'Строка авторских прав', + 'Show website name in window title' => 'Показывать название сайта в заголовке окна', + 'Open' => 'Открыть', + 'Please wait ...' => 'Пожалуйста, подождите ...', + 'supported' => 'поддерживается', + 'not supported' => 'не поддерживается', + 'Memory limit' => 'Лимит памяти', + 'Max. upload size' => 'Макс. размер загрузки', + '%s directory' => 'Директория %s', + 'is writable' => 'доступна для записи', + 'is not writable' => 'не доступна для записи', + 'is protected' => 'защищен', + 'is not protected' => 'не защищен', + 'is being checked...' => 'проверяется...', + 'Version: %s' => 'Версия: %s', + 'Database dump' => 'Дамп базы данных', + 'System files' => 'Системные файлы', + 'last run %s' => 'последний раз запускался %s', + 'never run' => 'никогда не запускался', + 'Server time: %s' => 'Время сервера: %s', + 'Category' => 'Категория', + 'Category: %s' => 'Категория: %s', + 'New category' => 'Новая категория', + 'System name' => 'Системное имя', + 'Layout' => 'Схема', + 'Title' => 'Заголовок', + 'Category with such name already exists' => 'Категория с таким именем уже существует', + 'Layout with both left and right sidebars' => 'Схема с левой и правой колонками', + 'Layout with left sidebar' => 'Схема с левой колонкой', + 'Layout with right sidebar' => 'Схема с правой колонкой', + 'Layout without sidebars' => 'Схема без колонок', + 'Deactivated %s widgets' => array('Деактивирован %s виджет', 'Деактивировано %s виджета', 'Деактивировано %s виджетов'), + 'Activated %s widgets' => array('Активирован %s виджет', 'Активировано %s виджета', 'Активировано %s виджетов'), + 'Placeholders' => 'Расположения', + 'HEAD tag' => 'Тег HEAD', + 'BODY tag top' => 'Начало тега BODY', + 'Header' => 'Шапка', + 'Left sidebar' => 'Левая колонка', + 'Right sidebar' => 'Правая колонка', + 'Before content' => 'Перед материалом', + 'After content' => 'После материала', + 'Footer' => 'Подвал', + 'BODY tag bottom' => 'Конец тега BODY', + 'Placeholder' => 'Расположение', + 'Page' => 'Страница', + 'All pages' => 'Все страницы', + 'Widget' => 'Виджет', + 'show on record pages only' => 'показывать только на страницах записей', + 'Default layout' => 'Схема по-умолчанию', + 'Detect language' => 'Определять язык', + 'Keywords' => 'Ключевые слова', + 'Description' => 'Описание', + 'max. %s characters' => 'макс. %s символов', + 'Window title' => 'Заголовок окна', + 'Clear all' => 'Очистить все', + 'Clear cache' => 'Очистить кэш', + 'Cache cleared' => 'Кэш очищен', + 'Server time' => 'Серверное время', + 'Local time' => 'Локальное время', + 'Show image' => 'Просмотр изображения', + 'File' => 'Файл', + 'Timezone' => 'Часовой пояс', + 'Block' => 'Блок', + 'New block' => 'Новый блок', + 'Content' => 'Содержимое', + 'Use template' => 'Использовать шаблон', + 'Widget placeholder' => 'Расположение виджета', + 'Create widget' => 'Создать виджет', + 'Editor' => 'Редактор', + 'Edit as text' => 'Редактировать как текст', + 'Edit as HTML' => 'Редактировать как HTML', + 'Open text' => 'Открыть текст', + 'Open HTML' => 'Открыть HTML', + 'Restrict access' => 'Ограничить доступ', + 'Enable comments' => 'Включить комментарии', + 'Enable rating' => 'Включить рейтинг', + 'Display author' => 'Показывать автора', + 'Display date' => 'Показывать дату', + 'New record' => 'Новая запись', + 'Record' => 'Запись', + 'Record: %s' => 'Запись: %s', + 'Language' => 'Язык', + 'Publish' => 'Опубликовать', + 'Show on front page' => 'Показать на главной', + 'Record with such name already exists' => 'Запись с таким именем уже существует', + 'Edit code' => 'Редактировать код', + 'Open editor' => 'Открыть редактор', + 'Edit description' => 'Редактировать описание', + 'Enter description' => 'Введите описание', + 'Attach picture' => 'Прикрепить изображение', + 'SEO tags' => 'SEO теги', + 'View page' => 'Просмотр страницы', + 'Open page' => 'Открыть страницу', + 'Cannot delete category that contains records' => 'Невозможно удалить категорию, содержащую записи', + 'Gallery' => 'Галерея', + 'Image' => 'Изображение', + 'Add image' => 'Добавить изображение', + 'Enter category' => 'Введите категорию', + 'Category not found' => 'Категория не найдена', + 'Move' => 'Переместить', + 'Picture' => 'Изображение', + 'Show slider' => 'Показывать слайдер', + 'Show gallery' => 'Показывать галерею', + 'numbers and letters in lower case' => 'буквы и цифры в нижнем регистре', + 'saved to drafts' => 'сохранено в черновики', + 'Load saved draft ?' => 'Загрузить сохранённый черновик ?', + 'Records limit' => 'Лимит записей', + 'Category records limit' => 'Лимит записей категории', + 'Display records' => 'Показывать записи', + 'Category sorting' => 'Сортировка категорий', + 'ascending' => 'по возрастанию', + 'descending' => 'по убыванию', + 'by name' => 'по имени', + 'Link record' => 'Привязать запись', + 'Enter system name' => 'Введите системное имя', + 'Filter' => 'Фильтр', + 'Do not apply filter' => 'Не применять фильтр', + 'Display on category page only' => 'Показывать только на странице категории', + 'Display on record page only' => 'Показывать только на странице записи', + 'Show child category records' => 'Показывать записи дочерних категорий', + 'Category records' => 'Записи категории', + 'Top records' => 'Топ записей', + 'Category previous records' => 'Предыдущие записи категории', + 'Most discussed records' => 'Самые обсуждаемые записи', + 'All languages' => 'Все языки', + 'System settings' => 'Настройки системы', + 'User settings' => 'Настройки пользователей', + 'Website settings' => 'Настройки сайта', + 'Records settings' => 'Настройки записей', + 'Home page settings' => 'Настройки главной страницы', + 'Comments settings' => 'Настройки комментариев', + 'Nesting level' => 'Уровень вложенности', + 'Comments limit' => 'Лимит комментариев', + 'Moderation' => 'Модерация', + 'Anonymous comments' => 'Анонимное комментирование', + 'Notification Email' => 'Email для оповещений', + 'Allow commenting' => 'Разрешить комментирование', + 'Always show CAPTCHA' => 'Всегда показывать CAPTCHA', + 'Moderate comments' => 'Модерировать комментарии', + 'New comment message' => 'Сообщение о новом комментарии', + 'Comment min. length' => 'Мин. длина комментария', + 'Comment' => 'Комментарий', + 'Activated %s comments' => array('Активирован %s комментарий', 'Активировано %s комментария', 'Активировано %s комментариев'), + 'Enable widgets' => 'Включить виджеты', + '%s comments was posted' => array('Оставлен %s комментарий', 'Оставлено %s комментария', 'Оставлено %s комментариев'), + 'Top menu' => 'Верхнее меню', + 'Bottom menu' => 'Нижнее меню', + 'New item' => 'Новый элемент', + 'Menu item' => 'Элемент меню', + 'New menu item' => 'Новый элемент меню', + 'Class' => 'Класс', + 'Open in new tab' => 'Открывать в новой вкладке', + 'Child items' => 'Дочерние элементы', + 'Secondary menu' => 'Вторичное меню', + 'Predefined classes: %s' => 'Доступные классы: %s', + 'Display item' => 'Показывать элемент', + 'Contact email' => 'Email для контактов', + 'Feedback message' => 'Сообщение обратной связи', + 'Full name / Company' => 'Ф.И.О. / Компания', + 'Enable Google Map' => 'Включить карту Google', + 'Enable Yandex Map' => 'Включить карту Яндекс', + 'Show Email' => 'Показывать Email', + 'Google Maps API key' => 'API ключ Google Maps', + 'Yandex Maps API key' => 'API ключ Яндекс Карт', + 'Latitude' => 'Широта', + 'Longitude' => 'Долгота', + 'Slider' => 'Слайдер', + 'New message notification' => 'Оповещение о новом сообщении', + 'View profile' => 'Открыть профиль', + 'max. length: %s chars' => array('макс. длина: %s символ', 'макс. длина: %s символа', 'макс. длина: %s символов'), + 'Subject' => 'Тема', + 'Start mailing' => 'Начать рассылку', + 'Subscribers' => 'Подписчики', + 'Successfully finished. Emails sent:' => 'Завершено успешно. Отправлено писем:', + 'Successfully finished. Messages sent:' => 'Завершено успешно. Отправлено сообщений:', + 'User menu' => 'Меню пользователя', + 'Remove assigned image' => 'Удалить прикрепленное изображение', + 'Version %s is available for download' => 'Версия %s доступна для скачивания', + 'File manager' => 'Файловый менеджер', + 'File or directory already exists' => 'Файл или директория уже существует', + 'Display records list' => 'Показывать список записей' +); \ No newline at end of file diff --git a/languages/ru/install.php b/languages/ru/install.php new file mode 100644 index 0000000..c0b759f --- /dev/null +++ b/languages/ru/install.php @@ -0,0 +1,120 @@ + 'Установка', + 'Welcome to Zira CMS installer' => 'Добро пожаловать в установщик Zira CMS', + 'Backward' => 'Назад', + 'Forward' => 'Дальше', + 'Install' => 'Установить', + 'Zira CMS is a lightweight, flexible and easy to use content management system.' => 'Zira CMS - это лёгкая, простая в управлении, и в то-же время гибкая система управления сайтом.', + 'Installing Zira CMS, you get the most commonly used features right out of the box.' => 'Устанавливая Zira CMS, вы получаете наиболее часто используемые функции сразу из коробки.', + 'No need for extra downloads and plugins setup.' => 'Нет необходимости в дополнительном скачивании и настройке плагинов.', + 'Zira CMS brings desktop experience to your website - no web development skills required!' => 'Zira CMS привносит возможности рабочего стола в ваш сайт - нет необходимости иметь опыт веб-разработки!', + 'Main features:' => 'Основные достоинства:', + 'Simple management' => 'Простое управление', + 'Fast and flexible' => 'Быстрота и гибкость', + 'SEO friendly' => 'Дружелюбность к SEO', + 'Free of charge' => 'Не требует денег', + 'Error' => 'Ошибка', + 'Message' => 'Сообщение', + 'Close' => 'Закрыть', + 'An error occurred' => 'Возникла ошибка', + 'supported' => 'поддерживается', + 'not supported' => 'не поддерживается', + '%s directory' => 'Директория %s', + 'is writable' => 'доступна для записи', + 'is not writable' => 'недоступна для записи', + 'Clean URLs' => 'ЧПУ', + 'is being checked...' => 'проверяется...', + 'Zira installer cannot continue' => 'Установка не может быть продолжена', + 'Preparing to install' => 'Подготовка к установке', + 'File %s' => 'Файл %s', + 'is exists' => 'найден', + 'is not exists' => 'не найден', + 'You have to rename the following files:' => 'Вы должны переименовать следующие файлы:', + 'File config.php should be empty.' => 'Файл config.php должен быть пустым.', + 'is writeable' => 'доступен для записи', + 'is not writeable' => 'недоступен для записи', + 'Filesystem need to be prepared for installation' => 'Файловая система должна быть подготовлена к установке', + 'System is ready to be installed' => 'Система готова к установке', + 'Agreement' => 'Соглашение', + 'By installing Zira CMS you are agree to the following terms and conditions:' => 'Устанавливая Zira CMS, вы соглашаетесь со следующими условиями:', + 'Zira CMS is a free software and can be used in both commercial and non-commercial projects without limitation.' => 'Zira CMS - это бесплатная система и может быть использована, как в коммерческих, так и в некоммерческих проектах без ограничений.', + 'You can modify system files for your needs, but Zira CMS\' copyright string with active link to %s must exists on every generated page.' => 'Вы можете модифицировать системные файлы для своих нужд, однако авторская строка Zira CMS с активной ссылкой на %s должна присутствовать на каждой сгенерированной странице.', + 'If this doesn\'t fit your needs, you may want to purchase a license. Please visit our %s for further details.' => 'Если это вам не подходит, вы можете приобрести лицензию. Пожалуйста посетите наш %s для дальнейших инструкций.', + 'website' => 'вебсайт', + 'If you have any questions, feel free to %s.' => 'Если у вас есть какие-либо вопросы, вы можете %s.', + 'contact us' => 'связаться с нами', + 'Don\'t forget to visit our forum and share your impressions with other users.' => 'Не забудьте посетить наш форум и поделиться своими впечатлениями с другими пользователями.', + 'Ready to proceed ?' => 'Готовы приступить ?', + 'Required information' => 'Необходимая информация', + 'Please fill out form fields' => 'Пожалуйста, заполните поля формы', + 'Website name' => 'Название сайта', + 'Website slogan' => 'Слоган сайта', + 'Invalid character detected' => 'Обнаружен некорректный символ', + 'Contact Email' => 'Контактный Email', + 'First name' => 'Имя', + 'Last name' => 'Фамилия', + 'Login' => 'Логин', + 'Email' => 'Email', + 'Secret key' => 'Секретный ключ', + 'Administrator' => 'Администратор', + 'Invalid email' => 'Некорректный email', + 'Secret key is too short' => 'Секретный ключ слишком короткий', + 'min. %s chars' => 'мин. %s символов', + 'Console password is too short' => 'Пароль от консоли слишком короткий', + 'Configuration' => 'Конфигурация', + 'Database' => 'База данных', + 'Server' => 'Сервер', + 'Port' => 'Порт', + 'Name' => 'Имя', + 'User' => 'Пользователь', + 'Password' => 'Пароль', + 'Table prefix' => 'Префикс таблиц', + 'Website' => 'Вебсайт', + 'Document root' => 'Корневая директория', + 'Base URL' => 'Базовый URL', + 'Console password' => 'Пароль от консоли', + 'Invalid username' => 'Некорректный логин', + 'Login must contain only letters and numbers' => 'Логин должен содержать только буквы и цифры', + 'Invalid password' => 'Некорректный пароль', + 'Password contain bad characters' => 'Пароль содержит некорректный символ', + 'change only if a problem occurres' => 'измените, если возникнут проблемы', + 'change only if it was detected incorrectly' => 'измените, если определено неверно', + 'leave blank if you\'re not planning to use console' => 'оставьте пустым, если вам не нужна консоль', + 'change to unique string' => 'измените на уникальную строку', + 'enter random chars' => 'введите произвольные символы', + 'Your website must have unique name and slogan!' => 'Ваш сайт должен иметь уникальное название и слоган!', + 'Zira CMS stores data in database. Currently, MySQL 5 and SQLite 3 are supported.' => 'Zira CMS хранит информацию в базе данных. Поддерживаются MySQL 5 и SQLite 3.', + 'Server test:' => 'Проверка сервера:', + 'Please check the specified data once again.' => 'Пожалуйста, проверьте введенные данные еще раз.', + 'Incorrect document root is specified.' => 'Указана некорректная корневая директория.', + 'Incorrect base url is specified.' => 'Указан некорректный базовый URL.', + 'Failed to connect to database.' => 'Невозможно подключиться к базе данных.', + 'Please wait...' => 'Пожалуйста, подождите...', + 'Please wait' => 'Пожалуйста, подождите', + 'Congratulations!' => 'Поздравляем!', + 'Zira CMS is successfully installed.' => 'Zira CMS успешно установлена.', + 'For security reasons turn off write permissions of %s file.' => 'В целях безопасности, защитите файл %s от записи.', + 'Please visit our %s for detailed information.' => 'Пожалуйста, посетите наш %s для получения более подробной информации.', + 'Go to your new %s!' => 'Перейти на ваш новый %s!', + 'Creating database tables' => 'Создание таблиц базы данных', + 'Writing settings to %s' => 'Запись настроек в %s', + 'Creating user' => 'Создание пользователя', + 'Creating home page' => 'Создание главной страницы', + 'Creating news category' => 'Создание категории новостей', + 'Creating menu' => 'Создание меню', + 'Creating news widget' => 'Создание виджета новостей', + 'home' => 'главная', + 'Home page' => 'Главная страница', + 'Welcome to Zira CMS!' => 'Добро пожаловать в Zira CMS!', + 'This is an example page created by installer.' => 'Это пример страницы, созданный установщиком.', + 'news' => 'новости', + 'News' => 'Новости', + 'launch' => 'открытие', + 'Our new website is now open!' => 'Наш новый вебсайт заработал!', + 'Our website is now open for visitors.' => 'Наш вебсайт теперь открыт для посетителей.', + 'File' => 'Файл', + 'Type' => 'Тип', + 'Failed to create database file.' => 'Невозможно создать файл базы данных.' +); \ No newline at end of file diff --git a/languages/ru/oauth.php b/languages/ru/oauth.php new file mode 100644 index 0000000..feae7cf --- /dev/null +++ b/languages/ru/oauth.php @@ -0,0 +1,26 @@ + 'Социальные сети', + 'Connect your website to social networks' => 'Подключите свой сайт к социальным сетям', + 'Login with social networks' => 'Авторизация через социальные сети', + 'Facebook App ID' => 'ID приложения в Facebook', + 'Facebook App Secret' => 'Секретный код приложения в Facebook', + 'Enable Facebook authentication' => 'Включить авторизацию через Facebook', + 'Sorry, this user is disabled' => 'Извините, этот пользователь заблокирован', + 'You have to grant access to your profile' => 'Вы должны предоставить доступ к вашему профилю', + 'Vkontakte App ID' => 'ID приложения в Вконтакте', + 'Vkontakte App Secret' => 'Секретный код приложения в Вконтакте', + 'Enable Vkontakte authentication' => 'Включить авторизацию через Вконтакте', + 'Login with: %s' => 'Войти с помощью: %s', + 'Facebook Page URL' => 'URL страницы на Facebook', + 'Facebook page widget' => 'Виджет страницы на Facebook', + 'Facebook comments widget' => 'Виджет комментариев Facebook', + 'Vkontakte Group ID' => 'ID группы Вконтакте', + 'Vkontakte group widget' => 'Виджет группы Вконтакте', + 'Vkontakte comments widget' => 'Виджет комментариев Вконтакте', + 'Your new account' => 'Ваш новый аккаунт', + 'Hello %s !' => 'Привет %s !', + 'We created an account for you on %s.' => 'Мы создали для вас аккаунт на %s.', + 'Your new password: %s' => 'Ваш новый пароль: %s', + 'You recieved this message, because you logged in to %s first time, using your social network account.' => 'Вы получили это письмо, потому-что вы в первый раз авторизовались на %s, использовав свой аккаунт в социальной сети.' +); \ No newline at end of file diff --git a/languages/ru/ru.js.php b/languages/ru/ru.js.php new file mode 100644 index 0000000..2c9ada5 --- /dev/null +++ b/languages/ru/ru.js.php @@ -0,0 +1,19 @@ + 'Закрыть', + 'Sending' => 'Отправка', + 'Message' => 'Сообщение', + 'Error' => 'Ошибка', + 'Confirmation' => 'Подтверждение', + 'Yes' => 'Да', + 'No' => 'Нет', + 'Cancel' => 'Отмена', + 'Please wait' => 'Пожалуйста, подождите', + 'Load failed' => 'Ошибка загрузки', + 'Are you sure ?' => 'Вы уверены ?', + 'An error occurred' => 'Возникла ошибка', + 'Reply to' => 'Ответ на', + 'Reason' => 'Причина', + 'Please specify the reason' => 'Пожалуйста, укажите причину' +); \ No newline at end of file diff --git a/languages/ru/ru.php b/languages/ru/ru.php new file mode 100644 index 0000000..6e73cdc --- /dev/null +++ b/languages/ru/ru.php @@ -0,0 +1,130 @@ + 'Русский', + 'Page not found' => 'Страница не найдена', + 'Access denied' => 'Доступ запрещен', + 'An error occurred' => 'Возникла ошибка', + 'Browse' => 'Обзор', + 'Close' => 'Закрыть', + 'Sending' => 'Отправка', + 'Message' => 'Сообщение', + 'Error' => 'Ошибка', + 'Please wait' => 'Пожалуйста, подождите', + 'Home' => 'Главная', + 'Sign Up' => 'Регистрация', + 'Sign In' => 'Авторизация', + 'User Signup' => 'Регистрация пользователя', + 'Pick a username and password' => 'Выберите логин и пароль', + 'Submit' => 'Отправить', + 'Username' => 'Логин', + 'Email' => 'Email', + 'Username or Email' => 'Логин или Email', + 'Password' => 'Пароль', + 'Repeat password' => 'Повторите пароль', + 'Enter result' => 'Введите результат', + 'Wrong CAPTCHA result' => 'Неверный результат кода безопасности', + 'User profile' => 'Профиль пользователя', + 'Profile' => 'Личный кабинет', + 'User name' => 'Имя пользователя', + 'First name' => 'Имя', + 'Second name' => 'Фамилия', + 'not specified' => 'не указано', + 'Location' => 'Расположение', + 'Country' => 'Страна', + 'City' => 'Город', + 'Street' => 'Улица', + 'Date of birth' => 'Дата рождения', + 'Phone' => 'Телефон', + 'Group' => 'Группа', + 'Sign-up date' => 'Дата регистрации', + 'Last login date' => 'Дата последнего посещения', + 'Photo' => 'Фото', + 'unknown' => 'неизвестно', + 'Super-Administrators' => 'Супер-администраторы', + 'Administrators' => 'Администраторы', + 'Users' => 'Пользователи', + 'Guests' => 'Гости', + 'User information' => 'Информация о пользователе', + 'Successfully saved' => 'Сохранено успешно', + 'Logout' => 'Выйти', + 'Edit' => 'Редактировать', + 'Invalid character specified' => 'Введен некорректный символ', + 'Invalid date format' => 'Некорректный формат даты', + 'Avatar' => 'Аватара', + 'Verify' => 'Подтвердить', + 'Search' => 'Поиск', + 'Previous' => 'Предыдущие', + 'Next' => 'Следующие', + 'Home page' => 'Главная страница', + 'System dashboard' => 'Панель управления', + 'Dashboard' => 'Панель управления', + 'System' => 'Система', + 'Settings' => 'Настройки', + 'Modules' => 'Модули', + 'Website' => 'Сайт', + 'Web page' => 'Веб-страница', + 'Terminal' => 'Консоль', + 'File Manager' => 'Файловый менеджер', + 'Yes' => 'Да', + 'No' => 'Нет', + 'Confirmation' => 'Подтверждение', + 'OK' => 'OK', + 'Cancel' => 'Отмена', + 'Mail settings' => 'Почтовые настройки', + 'Languages' => 'Языки', + 'Localisation' => 'Локализация', + 'Themes' => 'Темы', + 'Powered by %s' => 'Работает на %s', + 'Error logs' => 'Логи ошибок', + 'Cache' => 'Кэш', + 'Cron' => 'Крон', + 'Categories' => 'Категории', + 'Category: %s' => 'Категория: %s', + 'Widgets' => 'Виджеты', + 'Blocks' => 'Блоки', + 'Records' => 'Записи', + 'Rating: %s' => 'Рейтинг: %s', + 'Comments: %s' => 'Комментарии: %s', + 'Last updated' => 'Последнее обновление', + 'Author' => 'Автор', + 'Gallery' => 'Галерея', + 'Social buttons' => 'Социальные кнопки', + 'View more' => 'Смотреть еще', + 'Page title' => 'Заголовок страницы', + 'Mail' => 'Почта', + 'Top rated' => 'Лучшее', + 'View also' => 'Смотрите также', + 'Most discussed' => 'Обсуждаемое', + 'Comments' => 'Комментарии', + 'Leave a comment' => 'Оставить комментарий', + 'Message should contain at least %s characters' => array('Сообщение должно содержать, хотя-бы, %s символ', 'Сообщение должно содержать, хотя-бы, %s символа', 'Сообщение должно содержать, хотя-бы, %s символов'), + 'Message contains bad character' => 'Сообщение содержит некорректный символ', + 'Thank you. Your message was published' => 'Спасибо. Ваше сообщение опубликовано', + 'Thank you. Your message is awaiting moderation' => 'Спасибо. Ваше сообщение ожидает модерации', + 'Guest' => 'Гость', + 'Reply' => 'Ответить', + '%s to leave a comment' => '%s, чтобы оставить комментарий', + 'Login' => 'Авторизуйтесь', + 'moderator' => 'модератор', + 'New comment was posted' => 'Оставлен новый комментарий', + 'New comment was posted on: %s' => 'Новый комментарий оставлен на: %s', + 'Page URL address: %s' => 'URL адрес страницы: %s', + 'Comment text' => 'Текст комментария', + 'You recieved this message, because your Email address is specified as a notification Email on %s' => 'Вы получили это сообщение, потому-что ваш адрес указан как Email для оповещения на %s', + 'Name' => 'Имя', + 'Invalid name' => 'Некорректное имя', + 'Sorry, your comment is too big' => 'Извините, ваш комментарий слишком длинный', + 'Menu' => 'Меню', + 'Contacts' => 'Контакты', + 'Up' => 'Наверх', + 'Address' => 'Адрес', + 'Vkontakte' => 'Вконтакте', + 'Log In' => 'Войти', + 'Messages' => 'Сообщения', + 'Invalid token' => 'Неверный токен', + 'Posts' => 'Сообщения', + 'Mailing' => 'Рассылка', + 'Authorization' => 'Авторизация', + 'Site map' => 'Карта сайта' +); \ No newline at end of file diff --git a/languages/ru/zira.php b/languages/ru/zira.php new file mode 100644 index 0000000..e471f57 --- /dev/null +++ b/languages/ru/zira.php @@ -0,0 +1,121 @@ + 'Некорректный логин', + 'Invalid email' => 'Некорректный email', + 'Invalid password' => 'Некорректный пароль', + 'Passwords do not match' => 'Пароли не совпадают', + 'At least %s characters required' => array('Введите минимум %s символ','Введите минимум %s символа','Введите минимум %s символов'), + 'Enter a valid email' => 'Укажите существующий email', + 'Enter password again' => 'Введите пароль еще раз', + 'Login must contain only letters and numbers' => 'Логин должен содержать только буквы и цифры', + 'Password contain bad characters' => 'Пароль содержит некорректный символ', + 'Specified login already exists' => 'Указанный логин уже существует', + 'Specified email already exists' => 'Указанный email уже существует', + 'Email confirmation' => 'Подтверждение почтового адреса', + 'Verification' => 'Верификация', + 'Hello %s !' => 'Привет %s !', + 'Please confirm your Email address.' => 'Пожалуйста, подтвердите ваш Email адрес.', + 'Your verification code: %s' => 'Ваш код подтверждения: %s', + 'Enter code on the following page %s' => 'Введите код на следующей странице %s', + 'You recieved this message, because your Email address was specified during registration process on %s' => 'Вы получили это письмо, потому-что ваш Email адрес был указан в процессе регистрации на %s', + 'Enter your username or email' => 'Введите ваш логин или Email', + 'Email or password incorrect' => 'Неверный Email или пароль', + 'Username or password incorrect' => 'Неверный логин или пароль', + 'Verification code was sent to your Email address' => 'Код подтверждения был отправлен на ваш почтовый адрес', + 'Verification code' => 'Код подтверждения', + 'Incorrect verification code' => 'Неверный код подтверждения', + 'Did not recieve verification code ?' => 'Не получили код подтверждения ?', + 'Send confirmation code' => 'Отправка кода подтверждения', + 'User not found' => 'Пользователь не найден', + 'Remember me' => 'Запомнить меня', + 'Please enter your first name' => 'Пожалуйста, укажите ваше имя', + 'Please enter your second name' => 'Пожалуйста, укажите вашу фамилию', + 'Forgot password ?' => 'Забыли пароль ?', + 'Recovery' => 'Восстановление', + 'Password recovery' => 'Восстановление пароля', + 'Verification code will be sent to your Email address' => 'Код подтверждения будет отправлен на ваш почтовый адрес', + 'We recieved password recovery request for your account.' => 'Мы получили запрос на восстановление пароля к вашему аккаунту.', + 'You recieved this message, because your Email address or login was specified during password recovery process on %s. If it was not you, ignore this message' => 'Вы получили это письмо, потому-что ваш Email или логин был указан в процессе восстановления пароля на %s. Если это были не вы, игнорируйте это сообщение', + 'Your new password: %s' => 'Ваш новый пароль: %s', + 'You can now sign in on the following page %s' => 'Теперь вы можете авторизоваться на следуюшей странице %s', + 'You recieved this message, because your Email address or login was specified during password recovery process on %s' => 'Вы получили это письмо, потому-что ваш Email или логин был указан в процессе восстановления пароля на %s', + 'Your new password' => 'Ваш новый пароль', + 'Change password' => 'Смена пароля', + 'New password' => 'Новый пароль', + 'Current password' => 'Текущий пароль', + 'Current password incorrect' => 'Неверный текущий пароль', + 'Edit profile' => 'Редактировать профиль', + 'Edit email' => 'Изменить Email', + 'Edit password' => 'Изменить пароль', + 'Change email' => 'Смена почтового адреса', + 'Change profile' => 'Редактирование профиля', + 'Information' => 'Информация', + 'Please enter your first name and second name' => 'Пожалуйста, укажите ваше имя и фамилию', + 'Phone should be specified in international format' => 'Телефон должен быть указан в международном формате', + 'Edit photo' => 'Изменить фото', + 'Change photo' => 'Смена фото', + 'Allowed file extensions: %s' => 'Допустимые расширения файлов: %s', + 'Invalid image file' => 'Некорректный файл изображения', + 'Delete photo' => 'Удалить фото', + 'Remove photo' => 'Удаление фото', + 'Please enter your password' => 'Пожалуйста, введите пароль', + 'Change username' => 'Смена логина', + 'Edit username' => 'Изменить логин', + 'Edit avatar' => 'Редактировать аватару', + 'Change avatar' => 'Редактирование аватары', + 'Select your desired area' => 'Выберите желаемую область фотографии', + 'Photo size should be at least %s pixels' => 'Фотография должна быть размером не меньше %s пикселей', + 'Cron executed less than an hour ago' => 'Крон запускался меньше часа назад', + 'Database cleaned up' => 'База данных почищена', + 'Languages panel' => 'Языковая панель', + 'Logo' => 'Логотип', + 'Invalid search text' => 'Некорректный текст для поиска', + 'Search text contains bad character' => 'Текст для поиска содержит некорректный символ', + 'Search results' => 'Результаты поиска', + 'Your search did not match any documents' => 'По вашему запросу ничего не найдено', + 'Search this site' => 'Поиск по сайту', + 'Enter search text' => 'Введите текст для поиска', + 'Feedback' => 'Обратная связь', + 'Please specify your name and Email address' => 'Пожалуйста, укажите ваше имя и почтовый адрес', + 'Sorry, your message is too big' => 'Извините, ваше сообщение слишком длинное', + 'You recieved this message, because your Email address is specified as a contact email on %s' => 'Вы получили это сообщение, потому-что ваш адрес указан как Email для контактов на %s', + 'Name: %s' => 'Имя: %s', + 'Email: %s' => 'Email: %s', + 'Sorry, could not send your message. Try later' => 'Извините, ваше сообщение не отправлено. Попробуйте позже', + 'Thank you. Your message was sent' => 'Спасибо. Ваше сообщение отправлено', + 'not specified' => 'не указано', + 'Sorry, contacts are not specified' => 'Извините, контакты не указаны', + 'Send message' => 'Отправить сообщение', + 'New message' => 'Новое сообщение', + 'Subject' => 'Тема', + 'Message to: %s' => 'Сообщение для: %s', + 'Please specify the subject of your message' => 'Пожалуйста, укажите тему вашего сообщения', + 'Message sent' => 'Сообщение отправлено', + 'Subject contains bad character' => 'Тема содержит некорректный символ', + 'User deleted' => 'Пользователь удален', + 'You have no messages' => 'У вас нет сообщений', + 'My account' => 'Мой профиль', + 'You have new message' => 'У вас новое сообщение', + 'You have new message from %s.' => 'Вы получили новое сообщение от пользователя: %s.', + 'Log in %s to read it.' => 'Авторизуйтесь %s, чтобы прочитать его.', + 'You recieved this message, because you are subscribed to Email notifications on %s' => 'Вы получили это письмо, потому-что вы подписаны на Email оповещения на %s', + 'recieve notifications' => 'получать оповещения', + 'Mark as read' => 'Пометить как прочитанное', + 'Mark all as read' => 'Пометить все как прочитанное', + 'Delete' => 'Удалить', + 'Comments posted' => 'Оставлено комментариев', + 'Verified' => 'Проверен', + 'Add to black list' => 'Добавить в черный список', + 'Remove from black list' => 'Удалить из черного списка', + 'Sorry, you were added to black list. Reason: %s' => 'Извините, вы были добавлены в чёрный список. Причина: %s', + 'Sorry, you are in %s\'s black list' => 'Извините, вы в черном списке пользователя %s', + 'Please enter user login, full name or ID' => 'Пожалуйста, введите логин, полное имя или ID пользователя', + 'Please enter correct user login, full name or ID' => 'Пожалуйста, введите правильный логин, полное имя или ID пользователя', + 'User' => 'Пользователь', + 'Recipient' => 'Получатель', + 'Add recipient' => 'Добавить получателя', + 'Compose message' => 'Написать сообщение', + 'No recipients' => 'Нет получателей', + 'Conversation is closed' => 'Тема закрыта' +); \ No newline at end of file diff --git a/oauth/controllers/login.php b/oauth/controllers/login.php new file mode 100644 index 0000000..f2f0357 --- /dev/null +++ b/oauth/controllers/login.php @@ -0,0 +1,220 @@ +includeFacebookSdk(); + + $enabled = Zira\Config::get('oauth_fb_on'); + $app_id = Zira\Config::get('oauth_fb_app_id'); + $app_secret = Zira\Config::get('oauth_fb_app_secret'); + + if (!$enabled || !$app_id || !$app_secret) { + Zira\Response::forbidden(); + } + + $fb = new \Facebook\Facebook([ + 'app_id' => $app_id, + 'app_secret' => $app_secret, + 'default_graph_version' => 'v2.5', + ]); + + // getting access token + $jsHelper = $fb->getJavaScriptHelper(); + try { + $accessToken = $jsHelper->getAccessToken(); + } catch(\Facebook\Exceptions\FacebookResponseException $e) { + Zira\Response::exception($e); + } catch(\Facebook\Exceptions\FacebookSDKException $e) { + Zira\Response::exception($e); + } + + $fb->setDefaultAccessToken($accessToken); + + // getting user data + try { + $response = $fb->get(Oauth\Models\Oauth::FACEBOOK_API_URL); + $userNode = $response->getGraphUser(); + } catch(\Facebook\Exceptions\FacebookResponseException $e) { + Zira\Response::exception($e); + } catch(\Facebook\Exceptions\FacebookSDKException $e) { + Zira\Response::exception($e); + } + + $id = $userNode->getId(); + $name = $userNode->getName(); + $email = $userNode->getField('email'); + + if (empty($id) || empty($name)) { + Zira\Response::error(Zira\Locale::tm('You have to grant access to your profile', 'oauth')); + } + + // checking if user is already registered + $fb_user = Oauth\Models\Fbuser::getCollection() + ->where('fb_id','=',$id) + ->get(0); + + if (!$fb_user) { + // registering new user if not exists + if (!empty($email)) { + $user = Oauth\Models\Oauth::getUserByEmail($email); + } + if (empty($user)) { + // new user + $username = 'fb_' . $id; + $name_parts = explode(' ', $name); + if (count($name_parts) > 1) { + $firstname = array_shift($name_parts); + $secondname = implode(' ', $name_parts); + } else { + $firstname = $name; + $secondname = $name; + } + $user = Oauth\Models\Oauth::registerUser($username, $email ? $email : $id.'@facebook.com', $firstname, $secondname, !empty($email)); + } + + // saving facebook user + $fb_user = new Oauth\Models\Fbuser(); + $fb_user->user_id = $user->id; + $fb_user->fb_id = $id; + $fb_user->email = $email ? $email : ''; + $fb_user->profile_name = $name; + $fb_user->date_created = date('Y-m-d H:i:s'); + $fb_user->save(); + } else { + // getting existing user + $user = new Zira\Models\User($fb_user->user_id); + if (!$user->loaded()) { + Zira\Response::error(Zira\Locale::tm('Sorry, this user is disabled', 'oauth')); + } + } + + if (!Oauth\Models\Oauth::isUserActive($user, !empty($email))) { + Zira\Response::error(Zira\Locale::tm('Sorry, this user is disabled', 'oauth')); + } + + // logging in and redirecting + Zira\User::onUserLogin(false); + + $redirect = Zira\Request::get('redirect'); + if (!empty($redirect) && strpos($redirect,'//')===false && strpos($redirect, '.')===false) { + if ($redirect=='dash') Zira\Helper::setAddingLanguageToUrl(false); + Zira\Response::redirect($redirect); + } else { + Zira\Response::redirect('user/profile'); + } + } + + public function vkresponse() { + Zira\View::render(array( + 'code' => Zira\Request::get('code') + ),'oauth/vk-response'); + } + + public function vkontakte() { + $enabled = Zira\Config::get('oauth_vk_on'); + $app_id = Zira\Config::get('oauth_vk_app_id'); + $app_secret = Zira\Config::get('oauth_vk_app_secret'); + + if (!$enabled || !$app_id || !$app_secret) { + Zira\Response::forbidden(); + } + + $code = Zira\Request::get('code'); + if (empty($code)) { + Zira\Response::error(Zira\Locale::tm('You have to grant access to your profile', 'oauth')); + } + + // getting access token with user_id and email + $response = @file_get_contents(Oauth\Oauth::getVkontakteAccessTokenUrl($code)); + if (empty($response)) { + Zira\Response::error(Zira\Locale::tm('You have to grant access to your profile', 'oauth')); + } + $data = json_decode($response, true); + if (empty($data['user_id'])) { + Zira\Response::error(Zira\Locale::tm('You have to grant access to your profile', 'oauth')); + } + $id = $data['user_id']; + $email = !empty($data['email']) ? $data['email'] : ''; + + // checking if user is already registered + $vk_user = Oauth\Models\Vkuser::getCollection() + ->where('vk_id','=',$id) + ->get(0); + + if (!$vk_user) { + // getting profile name + $response = @file_get_contents(Oauth\Oauth::getVkontakteUserApiUrl($data['access_token'], $data['user_id'])); + if (empty($response)) { + Zira\Response::error(Zira\Locale::tm('You have to grant access to your profile', 'oauth')); + } + $info = json_decode($response, true); + if (empty($info['response']) || + !is_array($info['response']) || + count($info['response'])==0 || + empty($info['response'][0]['first_name']) || + empty($info['response'][0]['last_name']) + ) { + Zira\Response::error(Zira\Locale::tm('You have to grant access to your profile', 'oauth')); + } + $firstname = $info['response'][0]['first_name']; + $secondname = $info['response'][0]['last_name']; + + // registering new user if not exists + if (!empty($email)) { + $user = Oauth\Models\Oauth::getUserByEmail($email); + } + if (empty($user)) { + // new user + $username = 'vk_' . $id; + $user = Oauth\Models\Oauth::registerUser($username, $email ? $email : $id.'@vk.com', $firstname, $secondname, !empty($email)); + } + + // saving vk user + $vk_user = new Oauth\Models\Vkuser(); + $vk_user->user_id = $user->id; + $vk_user->vk_id = $id; + $vk_user->email = $email ? $email : ''; + $vk_user->profile_name = $firstname.' '.$secondname; + $vk_user->date_created = date('Y-m-d H:i:s'); + $vk_user->save(); + } else { + // getting existing user + $user = new Zira\Models\User($vk_user->user_id); + if (!$user->loaded()) { + Zira\Response::error(Zira\Locale::tm('Sorry, this user is disabled', 'oauth')); + } + } + + if (!Oauth\Models\Oauth::isUserActive($user, !empty($email))) { + Zira\Response::error(Zira\Locale::tm('Sorry, this user is disabled', 'oauth')); + } + + // logging in and redirecting + Zira\User::onUserLogin(false); + + $redirect = Zira\Request::get('redirect'); + if (!empty($redirect) && strpos($redirect,'//')===false && strpos($redirect, '.')===false) { + if ($redirect=='dash') Zira\Helper::setAddingLanguageToUrl(false); + Zira\Response::redirect($redirect); + } else { + Zira\Response::redirect('user/profile'); + } + } +} \ No newline at end of file diff --git a/oauth/facebook-sdk-v5/Authentication/AccessToken.php b/oauth/facebook-sdk-v5/Authentication/AccessToken.php new file mode 100644 index 0000000..582ea61 --- /dev/null +++ b/oauth/facebook-sdk-v5/Authentication/AccessToken.php @@ -0,0 +1,160 @@ +value = $accessToken; + if ($expiresAt) { + $this->setExpiresAtFromTimeStamp($expiresAt); + } + } + + /** + * Generate an app secret proof to sign a request to Graph. + * + * @param string $appSecret The app secret. + * + * @return string + */ + public function getAppSecretProof($appSecret) + { + return hash_hmac('sha256', $this->value, $appSecret); + } + + /** + * Getter for expiresAt. + * + * @return \DateTime|null + */ + public function getExpiresAt() + { + return $this->expiresAt; + } + + /** + * Determines whether or not this is an app access token. + * + * @return bool + */ + public function isAppAccessToken() + { + return strpos($this->value, '|') !== false; + } + + /** + * Determines whether or not this is a long-lived token. + * + * @return bool + */ + public function isLongLived() + { + if ($this->expiresAt) { + return $this->expiresAt->getTimestamp() > time() + (60 * 60 * 2); + } + + if ($this->isAppAccessToken()) { + return true; + } + + return false; + } + + /** + * Checks the expiration of the access token. + * + * @return boolean|null + */ + public function isExpired() + { + if ($this->getExpiresAt() instanceof \DateTime) { + return $this->getExpiresAt()->getTimestamp() < time(); + } + + if ($this->isAppAccessToken()) { + return false; + } + + return null; + } + + /** + * Returns the access token as a string. + * + * @return string + */ + public function getValue() + { + return $this->value; + } + + /** + * Returns the access token as a string. + * + * @return string + */ + public function __toString() + { + return $this->getValue(); + } + + /** + * Setter for expires_at. + * + * @param int $timeStamp + */ + protected function setExpiresAtFromTimeStamp($timeStamp) + { + $dt = new \DateTime(); + $dt->setTimestamp($timeStamp); + $this->expiresAt = $dt; + } +} diff --git a/oauth/facebook-sdk-v5/Authentication/AccessTokenMetadata.php b/oauth/facebook-sdk-v5/Authentication/AccessTokenMetadata.php new file mode 100644 index 0000000..f302a6d --- /dev/null +++ b/oauth/facebook-sdk-v5/Authentication/AccessTokenMetadata.php @@ -0,0 +1,390 @@ +metadata = $metadata['data']; + + $this->castTimestampsToDateTime(); + } + + /** + * Returns a value from the metadata. + * + * @param string $field The property to retrieve. + * @param mixed $default The default to return if the property doesn't exist. + * + * @return mixed + */ + public function getField($field, $default = null) + { + if (isset($this->metadata[$field])) { + return $this->metadata[$field]; + } + + return $default; + } + + /** + * Returns a value from the metadata. + * + * @param string $field The property to retrieve. + * @param mixed $default The default to return if the property doesn't exist. + * + * @return mixed + * + * @deprecated 5.0.0 getProperty() has been renamed to getField() + * @todo v6: Remove this method + */ + public function getProperty($field, $default = null) + { + return $this->getField($field, $default); + } + + /** + * Returns a value from a child property in the metadata. + * + * @param string $parentField The parent property. + * @param string $field The property to retrieve. + * @param mixed $default The default to return if the property doesn't exist. + * + * @return mixed + */ + public function getChildProperty($parentField, $field, $default = null) + { + if (!isset($this->metadata[$parentField])) { + return $default; + } + + if (!isset($this->metadata[$parentField][$field])) { + return $default; + } + + return $this->metadata[$parentField][$field]; + } + + /** + * Returns a value from the error metadata. + * + * @param string $field The property to retrieve. + * @param mixed $default The default to return if the property doesn't exist. + * + * @return mixed + */ + public function getErrorProperty($field, $default = null) + { + return $this->getChildProperty('error', $field, $default); + } + + /** + * Returns a value from the "metadata" metadata. *Brain explodes* + * + * @param string $field The property to retrieve. + * @param mixed $default The default to return if the property doesn't exist. + * + * @return mixed + */ + public function getMetadataProperty($field, $default = null) + { + return $this->getChildProperty('metadata', $field, $default); + } + + /** + * The ID of the application this access token is for. + * + * @return string|null + */ + public function getAppId() + { + return $this->getField('app_id'); + } + + /** + * Name of the application this access token is for. + * + * @return string|null + */ + public function getApplication() + { + return $this->getField('application'); + } + + /** + * Any error that a request to the graph api + * would return due to the access token. + * + * @return bool|null + */ + public function isError() + { + return $this->getField('error') !== null; + } + + /** + * The error code for the error. + * + * @return int|null + */ + public function getErrorCode() + { + return $this->getErrorProperty('code'); + } + + /** + * The error message for the error. + * + * @return string|null + */ + public function getErrorMessage() + { + return $this->getErrorProperty('message'); + } + + /** + * The error subcode for the error. + * + * @return int|null + */ + public function getErrorSubcode() + { + return $this->getErrorProperty('subcode'); + } + + /** + * DateTime when this access token expires. + * + * @return \DateTime|null + */ + public function getExpiresAt() + { + return $this->getField('expires_at'); + } + + /** + * Whether the access token is still valid or not. + * + * @return boolean|null + */ + public function getIsValid() + { + return $this->getField('is_valid'); + } + + /** + * DateTime when this access token was issued. + * + * Note that the issued_at field is not returned + * for short-lived access tokens. + * + * @see https://developers.facebook.com/docs/facebook-login/access-tokens#debug + * + * @return \DateTime|null + */ + public function getIssuedAt() + { + return $this->getField('issued_at'); + } + + /** + * General metadata associated with the access token. + * Can contain data like 'sso', 'auth_type', 'auth_nonce'. + * + * @return array|null + */ + public function getMetadata() + { + return $this->getField('metadata'); + } + + /** + * The 'sso' child property from the 'metadata' parent property. + * + * @return string|null + */ + public function getSso() + { + return $this->getMetadataProperty('sso'); + } + + /** + * The 'auth_type' child property from the 'metadata' parent property. + * + * @return string|null + */ + public function getAuthType() + { + return $this->getMetadataProperty('auth_type'); + } + + /** + * The 'auth_nonce' child property from the 'metadata' parent property. + * + * @return string|null + */ + public function getAuthNonce() + { + return $this->getMetadataProperty('auth_nonce'); + } + + /** + * For impersonated access tokens, the ID of + * the page this token contains. + * + * @return string|null + */ + public function getProfileId() + { + return $this->getField('profile_id'); + } + + /** + * List of permissions that the user has granted for + * the app in this access token. + * + * @return array + */ + public function getScopes() + { + return $this->getField('scopes'); + } + + /** + * The ID of the user this access token is for. + * + * @return string|null + */ + public function getUserId() + { + return $this->getField('user_id'); + } + + /** + * Ensures the app ID from the access token + * metadata is what we expect. + * + * @param string $appId + * + * @throws FacebookSDKException + */ + public function validateAppId($appId) + { + if ($this->getAppId() !== $appId) { + throw new FacebookSDKException('Access token metadata contains unexpected app ID.', 401); + } + } + + /** + * Ensures the user ID from the access token + * metadata is what we expect. + * + * @param string $userId + * + * @throws FacebookSDKException + */ + public function validateUserId($userId) + { + if ($this->getUserId() !== $userId) { + throw new FacebookSDKException('Access token metadata contains unexpected user ID.', 401); + } + } + + /** + * Ensures the access token has not expired yet. + * + * @throws FacebookSDKException + */ + public function validateExpiration() + { + if (!$this->getExpiresAt() instanceof \DateTime) { + return; + } + + if ($this->getExpiresAt()->getTimestamp() < time()) { + throw new FacebookSDKException('Inspection of access token metadata shows that the access token has expired.', 401); + } + } + + /** + * Converts a unix timestamp into a DateTime entity. + * + * @param int $timestamp + * + * @return \DateTime + */ + private function convertTimestampToDateTime($timestamp) + { + $dt = new \DateTime(); + $dt->setTimestamp($timestamp); + + return $dt; + } + + /** + * Casts the unix timestamps as DateTime entities. + */ + private function castTimestampsToDateTime() + { + foreach (static::$dateProperties as $key) { + if (isset($this->metadata[$key])) { + $this->metadata[$key] = $this->convertTimestampToDateTime($this->metadata[$key]); + } + } + } +} diff --git a/oauth/facebook-sdk-v5/Authentication/OAuth2Client.php b/oauth/facebook-sdk-v5/Authentication/OAuth2Client.php new file mode 100644 index 0000000..8e364ec --- /dev/null +++ b/oauth/facebook-sdk-v5/Authentication/OAuth2Client.php @@ -0,0 +1,292 @@ +app = $app; + $this->client = $client; + $this->graphVersion = $graphVersion ?: Facebook::DEFAULT_GRAPH_VERSION; + } + + /** + * Returns the last FacebookRequest that was sent. + * Useful for debugging and testing. + * + * @return FacebookRequest|null + */ + public function getLastRequest() + { + return $this->lastRequest; + } + + /** + * Get the metadata associated with the access token. + * + * @param AccessToken|string $accessToken The access token to debug. + * + * @return AccessTokenMetadata + */ + public function debugToken($accessToken) + { + $accessToken = $accessToken instanceof AccessToken ? $accessToken->getValue() : $accessToken; + $params = ['input_token' => $accessToken]; + + $this->lastRequest = new FacebookRequest( + $this->app, + $this->app->getAccessToken(), + 'GET', + '/debug_token', + $params, + null, + $this->graphVersion + ); + $response = $this->client->sendRequest($this->lastRequest); + $metadata = $response->getDecodedBody(); + + return new AccessTokenMetadata($metadata); + } + + /** + * Generates an authorization URL to begin the process of authenticating a user. + * + * @param string $redirectUrl The callback URL to redirect to. + * @param array $scope An array of permissions to request. + * @param string $state The CSPRNG-generated CSRF value. + * @param array $params An array of parameters to generate URL. + * @param string $separator The separator to use in http_build_query(). + * + * @return string + */ + public function getAuthorizationUrl($redirectUrl, $state, array $scope = [], array $params = [], $separator = '&') + { + $params += [ + 'client_id' => $this->app->getId(), + 'state' => $state, + 'response_type' => 'code', + 'sdk' => 'php-sdk-' . Facebook::VERSION, + 'redirect_uri' => $redirectUrl, + 'scope' => implode(',', $scope) + ]; + + return static::BASE_AUTHORIZATION_URL . '/' . $this->graphVersion . '/dialog/oauth?' . http_build_query($params, null, $separator); + } + + /** + * Get a valid access token from a code. + * + * @param string $code + * @param string $redirectUri + * + * @return AccessToken + * + * @throws FacebookSDKException + */ + public function getAccessTokenFromCode($code, $redirectUri = '') + { + $params = [ + 'code' => $code, + 'redirect_uri' => $redirectUri, + ]; + + return $this->requestAnAccessToken($params); + } + + /** + * Exchanges a short-lived access token with a long-lived access token. + * + * @param AccessToken|string $accessToken + * + * @return AccessToken + * + * @throws FacebookSDKException + */ + public function getLongLivedAccessToken($accessToken) + { + $accessToken = $accessToken instanceof AccessToken ? $accessToken->getValue() : $accessToken; + $params = [ + 'grant_type' => 'fb_exchange_token', + 'fb_exchange_token' => $accessToken, + ]; + + return $this->requestAnAccessToken($params); + } + + /** + * Get a valid code from an access token. + * + * @param AccessToken|string $accessToken + * @param string $redirectUri + * + * @return AccessToken + * + * @throws FacebookSDKException + */ + public function getCodeFromLongLivedAccessToken($accessToken, $redirectUri = '') + { + $params = [ + 'redirect_uri' => $redirectUri, + ]; + + $response = $this->sendRequestWithClientParams('/oauth/client_code', $params, $accessToken); + $data = $response->getDecodedBody(); + + if (!isset($data['code'])) { + throw new FacebookSDKException('Code was not returned from Graph.', 401); + } + + return $data['code']; + } + + /** + * Send a request to the OAuth endpoint. + * + * @param array $params + * + * @return AccessToken + * + * @throws FacebookSDKException + */ + protected function requestAnAccessToken(array $params) + { + $response = $this->sendRequestWithClientParams('/oauth/access_token', $params); + $data = $response->getDecodedBody(); + + if (!isset($data['access_token'])) { + throw new FacebookSDKException('Access token was not returned from Graph.', 401); + } + + // Graph returns two different key names for expiration time + // on the same endpoint. Doh! :/ + $expiresAt = 0; + if (isset($data['expires'])) { + // For exchanging a short lived token with a long lived token. + // The expiration time in seconds will be returned as "expires". + $expiresAt = time() + $data['expires']; + } elseif (isset($data['expires_in'])) { + // For exchanging a code for a short lived access token. + // The expiration time in seconds will be returned as "expires_in". + // See: https://developers.facebook.com/docs/facebook-login/access-tokens#long-via-code + $expiresAt = time() + $data['expires_in']; + } + + return new AccessToken($data['access_token'], $expiresAt); + } + + /** + * Send a request to Graph with an app access token. + * + * @param string $endpoint + * @param array $params + * @param string|null $accessToken + * + * @return FacebookResponse + * + * @throws FacebookResponseException + */ + protected function sendRequestWithClientParams($endpoint, array $params, $accessToken = null) + { + $params += $this->getClientParams(); + + $accessToken = $accessToken ?: $this->app->getAccessToken(); + + $this->lastRequest = new FacebookRequest( + $this->app, + $accessToken, + 'GET', + $endpoint, + $params, + null, + $this->graphVersion + ); + + return $this->client->sendRequest($this->lastRequest); + } + + /** + * Returns the client_* params for OAuth requests. + * + * @return array + */ + protected function getClientParams() + { + return [ + 'client_id' => $this->app->getId(), + 'client_secret' => $this->app->getSecret(), + ]; + } +} diff --git a/oauth/facebook-sdk-v5/Exceptions/FacebookAuthenticationException.php b/oauth/facebook-sdk-v5/Exceptions/FacebookAuthenticationException.php new file mode 100644 index 0000000..449cf93 --- /dev/null +++ b/oauth/facebook-sdk-v5/Exceptions/FacebookAuthenticationException.php @@ -0,0 +1,33 @@ +response = $response; + $this->responseData = $response->getDecodedBody(); + + $errorMessage = $this->get('message', 'Unknown error from Graph.'); + $errorCode = $this->get('code', -1); + + parent::__construct($errorMessage, $errorCode, $previousException); + } + + /** + * A factory for creating the appropriate exception based on the response from Graph. + * + * @param FacebookResponse $response The response that threw the exception. + * + * @return FacebookResponseException + */ + public static function create(FacebookResponse $response) + { + $data = $response->getDecodedBody(); + + if (!isset($data['error']['code']) && isset($data['code'])) { + $data = ['error' => $data]; + } + + $code = isset($data['error']['code']) ? $data['error']['code'] : null; + $message = isset($data['error']['message']) ? $data['error']['message'] : 'Unknown error from Graph.'; + + $previousException = null; + + if (isset($data['error']['error_subcode'])) { + switch ($data['error']['error_subcode']) { + // Other authentication issues + case 458: + case 459: + case 460: + case 463: + case 464: + case 467: + return new static($response, new FacebookAuthenticationException($message, $code)); + } + } + + switch ($code) { + // Login status or token expired, revoked, or invalid + case 100: + case 102: + case 190: + return new static($response, new FacebookAuthenticationException($message, $code)); + + // Server issue, possible downtime + case 1: + case 2: + return new static($response, new FacebookServerException($message, $code)); + + // API Throttling + case 4: + case 17: + case 341: + return new static($response, new FacebookThrottleException($message, $code)); + + // Duplicate Post + case 506: + return new static($response, new FacebookClientException($message, $code)); + } + + // Missing Permissions + if ($code == 10 || ($code >= 200 && $code <= 299)) { + return new static($response, new FacebookAuthorizationException($message, $code)); + } + + // OAuth authentication error + if (isset($data['error']['type']) && $data['error']['type'] === 'OAuthException') { + return new static($response, new FacebookAuthenticationException($message, $code)); + } + + // All others + return new static($response, new FacebookOtherException($message, $code)); + } + + /** + * Checks isset and returns that or a default value. + * + * @param string $key + * @param mixed $default + * + * @return mixed + */ + private function get($key, $default = null) + { + if (isset($this->responseData['error'][$key])) { + return $this->responseData['error'][$key]; + } + + return $default; + } + + /** + * Returns the HTTP status code + * + * @return int + */ + public function getHttpStatusCode() + { + return $this->response->getHttpStatusCode(); + } + + /** + * Returns the sub-error code + * + * @return int + */ + public function getSubErrorCode() + { + return $this->get('error_subcode', -1); + } + + /** + * Returns the error type + * + * @return string + */ + public function getErrorType() + { + return $this->get('type', ''); + } + + /** + * Returns the raw response used to create the exception. + * + * @return string + */ + public function getRawResponse() + { + return $this->response->getBody(); + } + + /** + * Returns the decoded response used to create the exception. + * + * @return array + */ + public function getResponseData() + { + return $this->responseData; + } + + /** + * Returns the response entity used to create the exception. + * + * @return FacebookResponse + */ + public function getResponse() + { + return $this->response; + } +} diff --git a/oauth/facebook-sdk-v5/Exceptions/FacebookSDKException.php b/oauth/facebook-sdk-v5/Exceptions/FacebookSDKException.php new file mode 100644 index 0000000..03219b0 --- /dev/null +++ b/oauth/facebook-sdk-v5/Exceptions/FacebookSDKException.php @@ -0,0 +1,33 @@ +app = new FacebookApp($appId, $appSecret); + + $httpClientHandler = null; + if (isset($config['http_client_handler'])) { + if ($config['http_client_handler'] instanceof FacebookHttpClientInterface) { + $httpClientHandler = $config['http_client_handler']; + } elseif ($config['http_client_handler'] === 'curl') { + $httpClientHandler = new FacebookCurlHttpClient(); + } elseif ($config['http_client_handler'] === 'stream') { + $httpClientHandler = new FacebookStreamHttpClient(); + } elseif ($config['http_client_handler'] === 'guzzle') { + $httpClientHandler = new FacebookGuzzleHttpClient(); + } else { + throw new \InvalidArgumentException('The http_client_handler must be set to "curl", "stream", "guzzle", or be an instance of Facebook\HttpClients\FacebookHttpClientInterface'); + } + } + + $enableBeta = isset($config['enable_beta_mode']) && $config['enable_beta_mode'] === true; + $this->client = new FacebookClient($httpClientHandler, $enableBeta); + + if (isset($config['url_detection_handler'])) { + if ($config['url_detection_handler'] instanceof UrlDetectionInterface) { + $this->urlDetectionHandler = $config['url_detection_handler']; + } else { + throw new \InvalidArgumentException('The url_detection_handler must be an instance of Facebook\Url\UrlDetectionInterface'); + } + } + + if (isset($config['pseudo_random_string_generator'])) { + if ($config['pseudo_random_string_generator'] instanceof PseudoRandomStringGeneratorInterface) { + $this->pseudoRandomStringGenerator = $config['pseudo_random_string_generator']; + } elseif ($config['pseudo_random_string_generator'] === 'mcrypt') { + $this->pseudoRandomStringGenerator = new McryptPseudoRandomStringGenerator(); + } elseif ($config['pseudo_random_string_generator'] === 'openssl') { + $this->pseudoRandomStringGenerator = new OpenSslPseudoRandomStringGenerator(); + } elseif ($config['pseudo_random_string_generator'] === 'urandom') { + $this->pseudoRandomStringGenerator = new UrandomPseudoRandomStringGenerator(); + } else { + throw new \InvalidArgumentException('The pseudo_random_string_generator must be set to "mcrypt", "openssl", or "urandom", or be an instance of Facebook\PseudoRandomString\PseudoRandomStringGeneratorInterface'); + } + } + + if (isset($config['persistent_data_handler'])) { + if ($config['persistent_data_handler'] instanceof PersistentDataInterface) { + $this->persistentDataHandler = $config['persistent_data_handler']; + } elseif ($config['persistent_data_handler'] === 'session') { + $this->persistentDataHandler = new FacebookSessionPersistentDataHandler(); + } elseif ($config['persistent_data_handler'] === 'memory') { + $this->persistentDataHandler = new FacebookMemoryPersistentDataHandler(); + } else { + throw new \InvalidArgumentException('The persistent_data_handler must be set to "session", "memory", or be an instance of Facebook\PersistentData\PersistentDataInterface'); + } + } + + if (isset($config['default_access_token'])) { + $this->setDefaultAccessToken($config['default_access_token']); + } + + if (isset($config['default_graph_version'])) { + $this->defaultGraphVersion = $config['default_graph_version']; + } else { + // @todo v6: Throw an InvalidArgumentException if "default_graph_version" is not set + $this->defaultGraphVersion = static::DEFAULT_GRAPH_VERSION; + } + } + + /** + * Returns the FacebookApp entity. + * + * @return FacebookApp + */ + public function getApp() + { + return $this->app; + } + + /** + * Returns the FacebookClient service. + * + * @return FacebookClient + */ + public function getClient() + { + return $this->client; + } + + /** + * Returns the OAuth 2.0 client service. + * + * @return OAuth2Client + */ + public function getOAuth2Client() + { + if (!$this->oAuth2Client instanceof OAuth2Client) { + $app = $this->getApp(); + $client = $this->getClient(); + $this->oAuth2Client = new OAuth2Client($app, $client, $this->defaultGraphVersion); + } + + return $this->oAuth2Client; + } + + /** + * Returns the last response returned from Graph. + * + * @return FacebookResponse|FacebookBatchResponse|null + */ + public function getLastResponse() + { + return $this->lastResponse; + } + + /** + * Returns the URL detection handler. + * + * @return UrlDetectionInterface + */ + public function getUrlDetectionHandler() + { + if (!$this->urlDetectionHandler instanceof UrlDetectionInterface) { + $this->urlDetectionHandler = new FacebookUrlDetectionHandler(); + } + + return $this->urlDetectionHandler; + } + + /** + * Returns the default AccessToken entity. + * + * @return AccessToken|null + */ + public function getDefaultAccessToken() + { + return $this->defaultAccessToken; + } + + /** + * Sets the default access token to use with requests. + * + * @param AccessToken|string $accessToken The access token to save. + * + * @throws \InvalidArgumentException + */ + public function setDefaultAccessToken($accessToken) + { + if (is_string($accessToken)) { + $this->defaultAccessToken = new AccessToken($accessToken); + + return; + } + + if ($accessToken instanceof AccessToken) { + $this->defaultAccessToken = $accessToken; + + return; + } + + throw new \InvalidArgumentException('The default access token must be of type "string" or Facebook\AccessToken'); + } + + /** + * Returns the default Graph version. + * + * @return string + */ + public function getDefaultGraphVersion() + { + return $this->defaultGraphVersion; + } + + /** + * Returns the redirect login helper. + * + * @return FacebookRedirectLoginHelper + */ + public function getRedirectLoginHelper() + { + return new FacebookRedirectLoginHelper( + $this->getOAuth2Client(), + $this->persistentDataHandler, + $this->urlDetectionHandler, + $this->pseudoRandomStringGenerator + ); + } + + /** + * Returns the JavaScript helper. + * + * @return FacebookJavaScriptHelper + */ + public function getJavaScriptHelper() + { + return new FacebookJavaScriptHelper($this->app, $this->client, $this->defaultGraphVersion); + } + + /** + * Returns the canvas helper. + * + * @return FacebookCanvasHelper + */ + public function getCanvasHelper() + { + return new FacebookCanvasHelper($this->app, $this->client, $this->defaultGraphVersion); + } + + /** + * Returns the page tab helper. + * + * @return FacebookPageTabHelper + */ + public function getPageTabHelper() + { + return new FacebookPageTabHelper($this->app, $this->client, $this->defaultGraphVersion); + } + + /** + * Sends a GET request to Graph and returns the result. + * + * @param string $endpoint + * @param AccessToken|string|null $accessToken + * @param string|null $eTag + * @param string|null $graphVersion + * + * @return FacebookResponse + * + * @throws FacebookSDKException + */ + public function get($endpoint, $accessToken = null, $eTag = null, $graphVersion = null) + { + return $this->sendRequest( + 'GET', + $endpoint, + $params = [], + $accessToken, + $eTag, + $graphVersion + ); + } + + /** + * Sends a POST request to Graph and returns the result. + * + * @param string $endpoint + * @param array $params + * @param AccessToken|string|null $accessToken + * @param string|null $eTag + * @param string|null $graphVersion + * + * @return FacebookResponse + * + * @throws FacebookSDKException + */ + public function post($endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null) + { + return $this->sendRequest( + 'POST', + $endpoint, + $params, + $accessToken, + $eTag, + $graphVersion + ); + } + + /** + * Sends a DELETE request to Graph and returns the result. + * + * @param string $endpoint + * @param array $params + * @param AccessToken|string|null $accessToken + * @param string|null $eTag + * @param string|null $graphVersion + * + * @return FacebookResponse + * + * @throws FacebookSDKException + */ + public function delete($endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null) + { + return $this->sendRequest( + 'DELETE', + $endpoint, + $params, + $accessToken, + $eTag, + $graphVersion + ); + } + + /** + * Sends a request to Graph for the next page of results. + * + * @param GraphEdge $graphEdge The GraphEdge to paginate over. + * + * @return GraphEdge|null + * + * @throws FacebookSDKException + */ + public function next(GraphEdge $graphEdge) + { + return $this->getPaginationResults($graphEdge, 'next'); + } + + /** + * Sends a request to Graph for the previous page of results. + * + * @param GraphEdge $graphEdge The GraphEdge to paginate over. + * + * @return GraphEdge|null + * + * @throws FacebookSDKException + */ + public function previous(GraphEdge $graphEdge) + { + return $this->getPaginationResults($graphEdge, 'previous'); + } + + /** + * Sends a request to Graph for the next page of results. + * + * @param GraphEdge $graphEdge The GraphEdge to paginate over. + * @param string $direction The direction of the pagination: next|previous. + * + * @return GraphEdge|null + * + * @throws FacebookSDKException + */ + public function getPaginationResults(GraphEdge $graphEdge, $direction) + { + $paginationRequest = $graphEdge->getPaginationRequest($direction); + if (!$paginationRequest) { + return null; + } + + $this->lastResponse = $this->client->sendRequest($paginationRequest); + + // Keep the same GraphNode subclass + $subClassName = $graphEdge->getSubClassName(); + $graphEdge = $this->lastResponse->getGraphEdge($subClassName, false); + + return count($graphEdge) > 0 ? $graphEdge : null; + } + + /** + * Sends a request to Graph and returns the result. + * + * @param string $method + * @param string $endpoint + * @param array $params + * @param AccessToken|string|null $accessToken + * @param string|null $eTag + * @param string|null $graphVersion + * + * @return FacebookResponse + * + * @throws FacebookSDKException + */ + public function sendRequest($method, $endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null) + { + $accessToken = $accessToken ?: $this->defaultAccessToken; + $graphVersion = $graphVersion ?: $this->defaultGraphVersion; + $request = $this->request($method, $endpoint, $params, $accessToken, $eTag, $graphVersion); + + return $this->lastResponse = $this->client->sendRequest($request); + } + + /** + * Sends a batched request to Graph and returns the result. + * + * @param array $requests + * @param AccessToken|string|null $accessToken + * @param string|null $graphVersion + * + * @return FacebookBatchResponse + * + * @throws FacebookSDKException + */ + public function sendBatchRequest(array $requests, $accessToken = null, $graphVersion = null) + { + $accessToken = $accessToken ?: $this->defaultAccessToken; + $graphVersion = $graphVersion ?: $this->defaultGraphVersion; + $batchRequest = new FacebookBatchRequest( + $this->app, + $requests, + $accessToken, + $graphVersion + ); + + return $this->lastResponse = $this->client->sendBatchRequest($batchRequest); + } + + /** + * Instantiates a new FacebookRequest entity. + * + * @param string $method + * @param string $endpoint + * @param array $params + * @param AccessToken|string|null $accessToken + * @param string|null $eTag + * @param string|null $graphVersion + * + * @return FacebookRequest + * + * @throws FacebookSDKException + */ + public function request($method, $endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null) + { + $accessToken = $accessToken ?: $this->defaultAccessToken; + $graphVersion = $graphVersion ?: $this->defaultGraphVersion; + + return new FacebookRequest( + $this->app, + $accessToken, + $method, + $endpoint, + $params, + $eTag, + $graphVersion + ); + } + + /** + * Factory to create FacebookFile's. + * + * @param string $pathToFile + * + * @return FacebookFile + * + * @throws FacebookSDKException + */ + public function fileToUpload($pathToFile) + { + return new FacebookFile($pathToFile); + } + + /** + * Factory to create FacebookVideo's. + * + * @param string $pathToFile + * + * @return FacebookVideo + * + * @throws FacebookSDKException + */ + public function videoToUpload($pathToFile) + { + return new FacebookVideo($pathToFile); + } +} diff --git a/oauth/facebook-sdk-v5/FacebookApp.php b/oauth/facebook-sdk-v5/FacebookApp.php new file mode 100644 index 0000000..84956ce --- /dev/null +++ b/oauth/facebook-sdk-v5/FacebookApp.php @@ -0,0 +1,101 @@ +id = $id; + $this->secret = $secret; + } + + /** + * Returns the app ID. + * + * @return string + */ + public function getId() + { + return $this->id; + } + + /** + * Returns the app secret. + * + * @return string + */ + public function getSecret() + { + return $this->secret; + } + + /** + * Returns an app access token. + * + * @return AccessToken + */ + public function getAccessToken() + { + return new AccessToken($this->id . '|' . $this->secret); + } + + /** + * Serializes the FacebookApp entity as a string. + * + * @return string + */ + public function serialize() + { + return serialize([$this->id, $this->secret]); + } + + /** + * Unserializes a string as a FacebookApp entity. + * + * @param string $serialized + */ + public function unserialize($serialized) + { + list($id, $secret) = unserialize($serialized); + + $this->__construct($id, $secret); + } +} diff --git a/oauth/facebook-sdk-v5/FacebookBatchRequest.php b/oauth/facebook-sdk-v5/FacebookBatchRequest.php new file mode 100644 index 0000000..33c489c --- /dev/null +++ b/oauth/facebook-sdk-v5/FacebookBatchRequest.php @@ -0,0 +1,303 @@ +add($requests); + } + + /** + * A a new request to the array. + * + * @param FacebookRequest|array $request + * @param string|null $name + * + * @return FacebookBatchRequest + * + * @throws \InvalidArgumentException + */ + public function add($request, $name = null) + { + if (is_array($request)) { + foreach ($request as $key => $req) { + $this->add($req, $key); + } + + return $this; + } + + if (!$request instanceof FacebookRequest) { + throw new \InvalidArgumentException('Argument for add() must be of type array or FacebookRequest.'); + } + + $this->addFallbackDefaults($request); + $requestToAdd = [ + 'name' => $name, + 'request' => $request, + ]; + + // File uploads + $attachedFiles = $this->extractFileAttachments($request); + if ($attachedFiles) { + $requestToAdd['attached_files'] = $attachedFiles; + } + $this->requests[] = $requestToAdd; + + return $this; + } + + /** + * Ensures that the FacebookApp and access token fall back when missing. + * + * @param FacebookRequest $request + * + * @throws FacebookSDKException + */ + public function addFallbackDefaults(FacebookRequest $request) + { + if (!$request->getApp()) { + $app = $this->getApp(); + if (!$app) { + throw new FacebookSDKException('Missing FacebookApp on FacebookRequest and no fallback detected on FacebookBatchRequest.'); + } + $request->setApp($app); + } + + if (!$request->getAccessToken()) { + $accessToken = $this->getAccessToken(); + if (!$accessToken) { + throw new FacebookSDKException('Missing access token on FacebookRequest and no fallback detected on FacebookBatchRequest.'); + } + $request->setAccessToken($accessToken); + } + } + + /** + * Extracts the files from a request. + * + * @param FacebookRequest $request + * + * @return string|null + * + * @throws FacebookSDKException + */ + public function extractFileAttachments(FacebookRequest $request) + { + if (!$request->containsFileUploads()) { + return null; + } + + $files = $request->getFiles(); + $fileNames = []; + foreach ($files as $file) { + $fileName = uniqid(); + $this->addFile($fileName, $file); + $fileNames[] = $fileName; + } + + $request->resetFiles(); + + // @TODO Does Graph support multiple uploads on one endpoint? + return implode(',', $fileNames); + } + + /** + * Return the FacebookRequest entities. + * + * @return array + */ + public function getRequests() + { + return $this->requests; + } + + /** + * Prepares the requests to be sent as a batch request. + * + * @return string + */ + public function prepareRequestsForBatch() + { + $this->validateBatchRequestCount(); + + $params = [ + 'batch' => $this->convertRequestsToJson(), + 'include_headers' => true, + ]; + $this->setParams($params); + } + + /** + * Converts the requests into a JSON(P) string. + * + * @return string + */ + public function convertRequestsToJson() + { + $requests = []; + foreach ($this->requests as $request) { + $attachedFiles = isset($request['attached_files']) ? $request['attached_files'] : null; + $requests[] = $this->requestEntityToBatchArray($request['request'], $request['name'], $attachedFiles); + } + + return json_encode($requests); + } + + /** + * Validate the request count before sending them as a batch. + * + * @throws FacebookSDKException + */ + public function validateBatchRequestCount() + { + $batchCount = count($this->requests); + if ($batchCount === 0) { + throw new FacebookSDKException('There are no batch requests to send.'); + } elseif ($batchCount > 50) { + // Per: https://developers.facebook.com/docs/graph-api/making-multiple-requests#limits + throw new FacebookSDKException('You cannot send more than 50 batch requests at a time.'); + } + } + + /** + * Converts a Request entity into an array that is batch-friendly. + * + * @param FacebookRequest $request The request entity to convert. + * @param string|null $requestName The name of the request. + * @param string|null $attachedFiles Names of files associated with the request. + * + * @return array + */ + public function requestEntityToBatchArray(FacebookRequest $request, $requestName = null, $attachedFiles = null) + { + $compiledHeaders = []; + $headers = $request->getHeaders(); + foreach ($headers as $name => $value) { + $compiledHeaders[] = $name . ': ' . $value; + } + + $batch = [ + 'headers' => $compiledHeaders, + 'method' => $request->getMethod(), + 'relative_url' => $request->getUrl(), + ]; + + // Since file uploads are moved to the root request of a batch request, + // the child requests will always be URL-encoded. + $body = $request->getUrlEncodedBody()->getBody(); + if ($body) { + $batch['body'] = $body; + } + + if (isset($requestName)) { + $batch['name'] = $requestName; + } + + if (isset($attachedFiles)) { + $batch['attached_files'] = $attachedFiles; + } + + // @TODO Add support for "omit_response_on_success" + // @TODO Add support for "depends_on" + // @TODO Add support for JSONP with "callback" + + return $batch; + } + + /** + * Get an iterator for the items. + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->requests); + } + + /** + * @inheritdoc + */ + public function offsetSet($offset, $value) + { + $this->add($value, $offset); + } + + /** + * @inheritdoc + */ + public function offsetExists($offset) + { + return isset($this->requests[$offset]); + } + + /** + * @inheritdoc + */ + public function offsetUnset($offset) + { + unset($this->requests[$offset]); + } + + /** + * @inheritdoc + */ + public function offsetGet($offset) + { + return isset($this->requests[$offset]) ? $this->requests[$offset] : null; + } +} diff --git a/oauth/facebook-sdk-v5/FacebookBatchResponse.php b/oauth/facebook-sdk-v5/FacebookBatchResponse.php new file mode 100644 index 0000000..5ea765e --- /dev/null +++ b/oauth/facebook-sdk-v5/FacebookBatchResponse.php @@ -0,0 +1,154 @@ +batchRequest = $batchRequest; + + $request = $response->getRequest(); + $body = $response->getBody(); + $httpStatusCode = $response->getHttpStatusCode(); + $headers = $response->getHeaders(); + parent::__construct($request, $body, $httpStatusCode, $headers); + + $responses = $response->getDecodedBody(); + $this->setResponses($responses); + } + + /** + * Returns an array of FacebookResponse entities. + * + * @return array + */ + public function getResponses() + { + return $this->responses; + } + + /** + * The main batch response will be an array of requests so + * we need to iterate over all the responses. + * + * @param array $responses + */ + public function setResponses(array $responses) + { + $this->responses = []; + + foreach ($responses as $key => $graphResponse) { + $this->addResponse($key, $graphResponse); + } + } + + /** + * Add a response to the list. + * + * @param int $key + * @param array|null $response + */ + public function addResponse($key, $response) + { + $originalRequestName = isset($this->batchRequest[$key]['name']) ? $this->batchRequest[$key]['name'] : $key; + $originalRequest = isset($this->batchRequest[$key]['request']) ? $this->batchRequest[$key]['request'] : null; + + $httpResponseBody = isset($response['body']) ? $response['body'] : null; + $httpResponseCode = isset($response['code']) ? $response['code'] : null; + $httpResponseHeaders = isset($response['headers']) ? $response['headers'] : []; + + $this->responses[$originalRequestName] = new FacebookResponse( + $originalRequest, + $httpResponseBody, + $httpResponseCode, + $httpResponseHeaders + ); + } + + /** + * @inheritdoc + */ + public function getIterator() + { + return new ArrayIterator($this->responses); + } + + /** + * @inheritdoc + */ + public function offsetSet($offset, $value) + { + $this->addResponse($offset, $value); + } + + /** + * @inheritdoc + */ + public function offsetExists($offset) + { + return isset($this->responses[$offset]); + } + + /** + * @inheritdoc + */ + public function offsetUnset($offset) + { + unset($this->responses[$offset]); + } + + /** + * @inheritdoc + */ + public function offsetGet($offset) + { + return isset($this->responses[$offset]) ? $this->responses[$offset] : null; + } +} diff --git a/oauth/facebook-sdk-v5/FacebookClient.php b/oauth/facebook-sdk-v5/FacebookClient.php new file mode 100644 index 0000000..b10762f --- /dev/null +++ b/oauth/facebook-sdk-v5/FacebookClient.php @@ -0,0 +1,250 @@ +httpClientHandler = $httpClientHandler ?: $this->detectHttpClientHandler(); + $this->enableBetaMode = $enableBeta; + } + + /** + * Sets the HTTP client handler. + * + * @param FacebookHttpClientInterface $httpClientHandler + */ + public function setHttpClientHandler(FacebookHttpClientInterface $httpClientHandler) + { + $this->httpClientHandler = $httpClientHandler; + } + + /** + * Returns the HTTP client handler. + * + * @return FacebookHttpClientInterface + */ + public function getHttpClientHandler() + { + return $this->httpClientHandler; + } + + /** + * Detects which HTTP client handler to use. + * + * @return FacebookHttpClientInterface + */ + public function detectHttpClientHandler() + { + return function_exists('curl_init') ? new FacebookCurlHttpClient() : new FacebookStreamHttpClient(); + } + + /** + * Toggle beta mode. + * + * @param boolean $betaMode + */ + public function enableBetaMode($betaMode = true) + { + $this->enableBetaMode = $betaMode; + } + + /** + * Returns the base Graph URL. + * + * @param boolean $postToVideoUrl Post to the video API if videos are being uploaded. + * + * @return string + */ + public function getBaseGraphUrl($postToVideoUrl = false) + { + if ($postToVideoUrl) { + return $this->enableBetaMode ? static::BASE_GRAPH_VIDEO_URL_BETA : static::BASE_GRAPH_VIDEO_URL; + } + + return $this->enableBetaMode ? static::BASE_GRAPH_URL_BETA : static::BASE_GRAPH_URL; + } + + /** + * Prepares the request for sending to the client handler. + * + * @param FacebookRequest $request + * + * @return array + */ + public function prepareRequestMessage(FacebookRequest $request) + { + $postToVideoUrl = $request->containsVideoUploads(); + $url = $this->getBaseGraphUrl($postToVideoUrl) . $request->getUrl(); + + // If we're sending files they should be sent as multipart/form-data + if ($request->containsFileUploads()) { + $requestBody = $request->getMultipartBody(); + $request->setHeaders([ + 'Content-Type' => 'multipart/form-data; boundary=' . $requestBody->getBoundary(), + ]); + } else { + $requestBody = $request->getUrlEncodedBody(); + $request->setHeaders([ + 'Content-Type' => 'application/x-www-form-urlencoded', + ]); + } + + return [ + $url, + $request->getMethod(), + $request->getHeaders(), + $requestBody->getBody(), + ]; + } + + /** + * Makes the request to Graph and returns the result. + * + * @param FacebookRequest $request + * + * @return FacebookResponse + * + * @throws FacebookSDKException + */ + public function sendRequest(FacebookRequest $request) + { + if (get_class($request) === 'FacebookRequest') { + $request->validateAccessToken(); + } + + list($url, $method, $headers, $body) = $this->prepareRequestMessage($request); + + // Since file uploads can take a while, we need to give more time for uploads + $timeOut = static::DEFAULT_REQUEST_TIMEOUT; + if ($request->containsFileUploads()) { + $timeOut = static::DEFAULT_FILE_UPLOAD_REQUEST_TIMEOUT; + } elseif ($request->containsVideoUploads()) { + $timeOut = static::DEFAULT_VIDEO_UPLOAD_REQUEST_TIMEOUT; + } + + // Should throw `FacebookSDKException` exception on HTTP client error. + // Don't catch to allow it to bubble up. + $rawResponse = $this->httpClientHandler->send($url, $method, $body, $headers, $timeOut); + + static::$requestCount++; + + $returnResponse = new FacebookResponse( + $request, + $rawResponse->getBody(), + $rawResponse->getHttpResponseCode(), + $rawResponse->getHeaders() + ); + + if ($returnResponse->isError()) { + throw $returnResponse->getThrownException(); + } + + return $returnResponse; + } + + /** + * Makes a batched request to Graph and returns the result. + * + * @param FacebookBatchRequest $request + * + * @return FacebookBatchResponse + * + * @throws FacebookSDKException + */ + public function sendBatchRequest(FacebookBatchRequest $request) + { + $request->prepareRequestsForBatch(); + $facebookResponse = $this->sendRequest($request); + + return new FacebookBatchResponse($request, $facebookResponse); + } +} diff --git a/oauth/facebook-sdk-v5/FacebookRequest.php b/oauth/facebook-sdk-v5/FacebookRequest.php new file mode 100644 index 0000000..5e4083f --- /dev/null +++ b/oauth/facebook-sdk-v5/FacebookRequest.php @@ -0,0 +1,536 @@ +setApp($app); + $this->setAccessToken($accessToken); + $this->setMethod($method); + $this->setEndpoint($endpoint); + $this->setParams($params); + $this->setETag($eTag); + $this->graphVersion = $graphVersion ?: Facebook::DEFAULT_GRAPH_VERSION; + } + + /** + * Set the access token for this request. + * + * @param AccessToken|string + * + * @return FacebookRequest + */ + public function setAccessToken($accessToken) + { + $this->accessToken = $accessToken; + if ($accessToken instanceof AccessToken) { + $this->accessToken = $accessToken->getValue(); + } + + return $this; + } + + /** + * Sets the access token with one harvested from a URL or POST params. + * + * @param string $accessToken The access token. + * + * @return FacebookRequest + * + * @throws FacebookSDKException + */ + public function setAccessTokenFromParams($accessToken) + { + $existingAccessToken = $this->getAccessToken(); + if (!$existingAccessToken) { + $this->setAccessToken($accessToken); + } elseif ($accessToken !== $existingAccessToken) { + throw new FacebookSDKException('Access token mismatch. The access token provided in the FacebookRequest and the one provided in the URL or POST params do not match.'); + } + + return $this; + } + + /** + * Return the access token for this request. + * + * @return string|null + */ + public function getAccessToken() + { + return $this->accessToken; + } + + /** + * Return the access token for this request an an AccessToken entity. + * + * @return AccessToken|null + */ + public function getAccessTokenEntity() + { + return $this->accessToken ? new AccessToken($this->accessToken) : null; + } + + /** + * Set the FacebookApp entity used for this request. + * + * @param FacebookApp|null $app + */ + public function setApp(FacebookApp $app = null) + { + $this->app = $app; + } + + /** + * Return the FacebookApp entity used for this request. + * + * @return FacebookApp + */ + public function getApp() + { + return $this->app; + } + + /** + * Generate an app secret proof to sign this request. + * + * @return string|null + */ + public function getAppSecretProof() + { + if (!$accessTokenEntity = $this->getAccessTokenEntity()) { + return null; + } + + return $accessTokenEntity->getAppSecretProof($this->app->getSecret()); + } + + /** + * Validate that an access token exists for this request. + * + * @throws FacebookSDKException + */ + public function validateAccessToken() + { + $accessToken = $this->getAccessToken(); + if (!$accessToken) { + throw new FacebookSDKException('You must provide an access token.'); + } + } + + /** + * Set the HTTP method for this request. + * + * @param string + * + * @return FacebookRequest + */ + public function setMethod($method) + { + $this->method = strtoupper($method); + } + + /** + * Return the HTTP method for this request. + * + * @return string + */ + public function getMethod() + { + return $this->method; + } + + /** + * Validate that the HTTP method is set. + * + * @throws FacebookSDKException + */ + public function validateMethod() + { + if (!$this->method) { + throw new FacebookSDKException('HTTP method not specified.'); + } + + if (!in_array($this->method, ['GET', 'POST', 'DELETE'])) { + throw new FacebookSDKException('Invalid HTTP method specified.'); + } + } + + /** + * Set the endpoint for this request. + * + * @param string + * + * @return FacebookRequest + * + * @throws FacebookSDKException + */ + public function setEndpoint($endpoint) + { + // Harvest the access token from the endpoint to keep things in sync + $params = FacebookUrlManipulator::getParamsAsArray($endpoint); + if (isset($params['access_token'])) { + $this->setAccessTokenFromParams($params['access_token']); + } + + // Clean the token & app secret proof from the endpoint. + $filterParams = ['access_token', 'appsecret_proof']; + $this->endpoint = FacebookUrlManipulator::removeParamsFromUrl($endpoint, $filterParams); + + return $this; + } + + /** + * Return the HTTP method for this request. + * + * @return string + */ + public function getEndpoint() + { + // For batch requests, this will be empty + return $this->endpoint; + } + + /** + * Generate and return the headers for this request. + * + * @return array + */ + public function getHeaders() + { + $headers = static::getDefaultHeaders(); + + if ($this->eTag) { + $headers['If-None-Match'] = $this->eTag; + } + + return array_merge($this->headers, $headers); + } + + /** + * Set the headers for this request. + * + * @param array $headers + */ + public function setHeaders(array $headers) + { + $this->headers = array_merge($this->headers, $headers); + } + + /** + * Sets the eTag value. + * + * @param string $eTag + */ + public function setETag($eTag) + { + $this->eTag = $eTag; + } + + /** + * Set the params for this request. + * + * @param array $params + * + * @return FacebookRequest + * + * @throws FacebookSDKException + */ + public function setParams(array $params = []) + { + if (isset($params['access_token'])) { + $this->setAccessTokenFromParams($params['access_token']); + } + + // Don't let these buggers slip in. + unset($params['access_token'], $params['appsecret_proof']); + + // @TODO Refactor code above with this + //$params = $this->sanitizeAuthenticationParams($params); + $params = $this->sanitizeFileParams($params); + $this->dangerouslySetParams($params); + + return $this; + } + + /** + * Set the params for this request without filtering them first. + * + * @param array $params + * + * @return FacebookRequest + */ + public function dangerouslySetParams(array $params = []) + { + $this->params = array_merge($this->params, $params); + + return $this; + } + + /** + * Iterate over the params and pull out the file uploads. + * + * @param array $params + * + * @return array + */ + public function sanitizeFileParams(array $params) + { + foreach ($params as $key => $value) { + if ($value instanceof FacebookFile) { + $this->addFile($key, $value); + unset($params[$key]); + } + } + + return $params; + } + + /** + * Add a file to be uploaded. + * + * @param string $key + * @param FacebookFile $file + */ + public function addFile($key, FacebookFile $file) + { + $this->files[$key] = $file; + } + + /** + * Removes all the files from the upload queue. + */ + public function resetFiles() + { + $this->files = []; + } + + /** + * Get the list of files to be uploaded. + * + * @return array + */ + public function getFiles() + { + return $this->files; + } + + /** + * Let's us know if there is a file upload with this request. + * + * @return boolean + */ + public function containsFileUploads() + { + return !empty($this->files); + } + + /** + * Let's us know if there is a video upload with this request. + * + * @return boolean + */ + public function containsVideoUploads() + { + foreach ($this->files as $file) { + if ($file instanceof FacebookVideo) { + return true; + } + } + + return false; + } + + /** + * Returns the body of the request as multipart/form-data. + * + * @return RequestBodyMultipart + */ + public function getMultipartBody() + { + $params = $this->getPostParams(); + + return new RequestBodyMultipart($params, $this->files); + } + + /** + * Returns the body of the request as URL-encoded. + * + * @return RequestBodyUrlEncoded + */ + public function getUrlEncodedBody() + { + $params = $this->getPostParams(); + + return new RequestBodyUrlEncoded($params); + } + + /** + * Generate and return the params for this request. + * + * @return array + */ + public function getParams() + { + $params = $this->params; + + $accessToken = $this->getAccessToken(); + if ($accessToken) { + $params['access_token'] = $accessToken; + $params['appsecret_proof'] = $this->getAppSecretProof(); + } + + return $params; + } + + /** + * Only return params on POST requests. + * + * @return array + */ + public function getPostParams() + { + if ($this->getMethod() === 'POST') { + return $this->getParams(); + } + + return []; + } + + /** + * The graph version used for this request. + * + * @return string + */ + public function getGraphVersion() + { + return $this->graphVersion; + } + + /** + * Generate and return the URL for this request. + * + * @return string + */ + public function getUrl() + { + $this->validateMethod(); + + $graphVersion = FacebookUrlManipulator::forceSlashPrefix($this->graphVersion); + $endpoint = FacebookUrlManipulator::forceSlashPrefix($this->getEndpoint()); + + $url = $graphVersion . $endpoint; + + if ($this->getMethod() !== 'POST') { + $params = $this->getParams(); + $url = FacebookUrlManipulator::appendParamsToUrl($url, $params); + } + + return $url; + } + + /** + * Return the default headers that every request should use. + * + * @return array + */ + public static function getDefaultHeaders() + { + return [ + 'User-Agent' => 'fb-php-' . Facebook::VERSION, + 'Accept-Encoding' => '*', + ]; + } +} diff --git a/oauth/facebook-sdk-v5/FacebookResponse.php b/oauth/facebook-sdk-v5/FacebookResponse.php new file mode 100644 index 0000000..ce55b14 --- /dev/null +++ b/oauth/facebook-sdk-v5/FacebookResponse.php @@ -0,0 +1,410 @@ +request = $request; + $this->body = $body; + $this->httpStatusCode = $httpStatusCode; + $this->headers = $headers; + + $this->decodeBody(); + } + + /** + * Return the original request that returned this response. + * + * @return FacebookRequest + */ + public function getRequest() + { + return $this->request; + } + + /** + * Return the FacebookApp entity used for this response. + * + * @return FacebookApp + */ + public function getApp() + { + return $this->request->getApp(); + } + + /** + * Return the access token that was used for this response. + * + * @return string|null + */ + public function getAccessToken() + { + return $this->request->getAccessToken(); + } + + /** + * Return the HTTP status code for this response. + * + * @return int + */ + public function getHttpStatusCode() + { + return $this->httpStatusCode; + } + + /** + * Return the HTTP headers for this response. + * + * @return array + */ + public function getHeaders() + { + return $this->headers; + } + + /** + * Return the raw body response. + * + * @return string + */ + public function getBody() + { + return $this->body; + } + + /** + * Return the decoded body response. + * + * @return array + */ + public function getDecodedBody() + { + return $this->decodedBody; + } + + /** + * Get the app secret proof that was used for this response. + * + * @return string|null + */ + public function getAppSecretProof() + { + return $this->request->getAppSecretProof(); + } + + /** + * Get the ETag associated with the response. + * + * @return string|null + */ + public function getETag() + { + return isset($this->headers['ETag']) ? $this->headers['ETag'] : null; + } + + /** + * Get the version of Graph that returned this response. + * + * @return string|null + */ + public function getGraphVersion() + { + return isset($this->headers['Facebook-API-Version']) ? $this->headers['Facebook-API-Version'] : null; + } + + /** + * Returns true if Graph returned an error message. + * + * @return boolean + */ + public function isError() + { + return isset($this->decodedBody['error']); + } + + /** + * Throws the exception. + * + * @throws FacebookSDKException + */ + public function throwException() + { + throw $this->thrownException; + } + + /** + * Instantiates an exception to be thrown later. + */ + public function makeException() + { + $this->thrownException = FacebookResponseException::create($this); + } + + /** + * Returns the exception that was thrown for this request. + * + * @return FacebookSDKException|null + */ + public function getThrownException() + { + return $this->thrownException; + } + + /** + * Convert the raw response into an array if possible. + * + * Graph will return 2 types of responses: + * - JSON(P) + * Most responses from Grpah are JSON(P) + * - application/x-www-form-urlencoded key/value pairs + * Happens on the `/oauth/access_token` endpoint when exchanging + * a short-lived access token for a long-lived access token + * - And sometimes nothing :/ but that'd be a bug. + */ + public function decodeBody() + { + $this->decodedBody = json_decode($this->body, true); + + if ($this->decodedBody === null) { + $this->decodedBody = []; + parse_str($this->body, $this->decodedBody); + } elseif (is_bool($this->decodedBody)) { + // Backwards compatibility for Graph < 2.1. + // Mimics 2.1 responses. + // @TODO Remove this after Graph 2.0 is no longer supported + $this->decodedBody = ['success' => $this->decodedBody]; + } elseif (is_numeric($this->decodedBody)) { + $this->decodedBody = ['id' => $this->decodedBody]; + } + + if (!is_array($this->decodedBody)) { + $this->decodedBody = []; + } + + if ($this->isError()) { + $this->makeException(); + } + } + + /** + * Instantiate a new GraphObject from response. + * + * @param string|null $subclassName The GraphNode sub class to cast to. + * + * @return \Facebook\GraphNodes\GraphObject + * + * @throws FacebookSDKException + * + * @deprecated 5.0.0 getGraphObject() has been renamed to getGraphNode() + * @todo v6: Remove this method + */ + public function getGraphObject($subclassName = null) + { + return $this->getGraphNode($subclassName); + } + + /** + * Instantiate a new GraphNode from response. + * + * @param string|null $subclassName The GraphNode sub class to cast to. + * + * @return \Facebook\GraphNodes\GraphNode + * + * @throws FacebookSDKException + */ + public function getGraphNode($subclassName = null) + { + $factory = new GraphNodeFactory($this); + + return $factory->makeGraphNode($subclassName); + } + + /** + * Convenience method for creating a GraphAlbum collection. + * + * @return \Facebook\GraphNodes\GraphAlbum + * + * @throws FacebookSDKException + */ + public function getGraphAlbum() + { + $factory = new GraphNodeFactory($this); + + return $factory->makeGraphAlbum(); + } + + /** + * Convenience method for creating a GraphPage collection. + * + * @return \Facebook\GraphNodes\GraphPage + * + * @throws FacebookSDKException + */ + public function getGraphPage() + { + $factory = new GraphNodeFactory($this); + + return $factory->makeGraphPage(); + } + + /** + * Convenience method for creating a GraphSessionInfo collection. + * + * @return \Facebook\GraphNodes\GraphSessionInfo + * + * @throws FacebookSDKException + */ + public function getGraphSessionInfo() + { + $factory = new GraphNodeFactory($this); + + return $factory->makeGraphSessionInfo(); + } + + /** + * Convenience method for creating a GraphUser collection. + * + * @return \Facebook\GraphNodes\GraphUser + * + * @throws FacebookSDKException + */ + public function getGraphUser() + { + $factory = new GraphNodeFactory($this); + + return $factory->makeGraphUser(); + } + + /** + * Convenience method for creating a GraphEvent collection. + * + * @return \Facebook\GraphNodes\GraphEvent + * + * @throws FacebookSDKException + */ + public function getGraphEvent() + { + $factory = new GraphNodeFactory($this); + + return $factory->makeGraphEvent(); + } + + /** + * Convenience method for creating a GraphGroup collection. + * + * @return \Facebook\GraphNodes\GraphGroup + * + * @throws FacebookSDKException + */ + public function getGraphGroup() + { + $factory = new GraphNodeFactory($this); + + return $factory->makeGraphGroup(); + } + + /** + * Instantiate a new GraphList from response. + * + * @param string|null $subclassName The GraphNode sub class to cast list items to. + * @param boolean $auto_prefix Toggle to auto-prefix the subclass name. + * + * @return \Facebook\GraphNodes\GraphList + * + * @throws FacebookSDKException + * + * @deprecated 5.0.0 getGraphList() has been renamed to getGraphEdge() + * @todo v6: Remove this method + */ + public function getGraphList($subclassName = null, $auto_prefix = true) + { + return $this->getGraphEdge($subclassName, $auto_prefix); + } + + /** + * Instantiate a new GraphEdge from response. + * + * @param string|null $subclassName The GraphNode sub class to cast list items to. + * @param boolean $auto_prefix Toggle to auto-prefix the subclass name. + * + * @return \Facebook\GraphNodes\GraphEdge + * + * @throws FacebookSDKException + */ + public function getGraphEdge($subclassName = null, $auto_prefix = true) + { + $factory = new GraphNodeFactory($this); + + return $factory->makeGraphEdge($subclassName, $auto_prefix); + } +} diff --git a/oauth/facebook-sdk-v5/FileUpload/FacebookFile.php b/oauth/facebook-sdk-v5/FileUpload/FacebookFile.php new file mode 100644 index 0000000..f8b9905 --- /dev/null +++ b/oauth/facebook-sdk-v5/FileUpload/FacebookFile.php @@ -0,0 +1,135 @@ +path = $filePath; + $this->open(); + } + + /** + * Closes the stream when destructed. + */ + public function __destruct() + { + $this->close(); + } + + /** + * Opens a stream for the file. + * + * @throws FacebookSDKException + */ + public function open() + { + if (!$this->isRemoteFile($this->path) && !is_readable($this->path)) { + throw new FacebookSDKException('Failed to create FacebookFile entity. Unable to read resource: ' . $this->path . '.'); + } + + $this->stream = fopen($this->path, 'r'); + + if (!$this->stream) { + throw new FacebookSDKException('Failed to create FacebookFile entity. Unable to open resource: ' . $this->path . '.'); + } + } + + /** + * Stops the file stream. + */ + public function close() + { + if (is_resource($this->stream)) { + fclose($this->stream); + } + } + + /** + * Return the contents of the file. + * + * @return string + */ + public function getContents() + { + return stream_get_contents($this->stream); + } + + /** + * Return the name of the file. + * + * @return string + */ + public function getFileName() + { + return basename($this->path); + } + + /** + * Return the mimetype of the file. + * + * @return string + */ + public function getMimetype() + { + return Mimetypes::getInstance()->fromFilename($this->path) ?: 'text/plain'; + } + + /** + * Returns true if the path to the file is remote. + * + * @param string $pathToFile + * + * @return boolean + */ + protected function isRemoteFile($pathToFile) + { + return preg_match('/^(https?|ftp):\/\/.*/', $pathToFile) === 1; + } +} diff --git a/oauth/facebook-sdk-v5/FileUpload/FacebookVideo.php b/oauth/facebook-sdk-v5/FileUpload/FacebookVideo.php new file mode 100644 index 0000000..1e8c55a --- /dev/null +++ b/oauth/facebook-sdk-v5/FileUpload/FacebookVideo.php @@ -0,0 +1,33 @@ + 'text/vnd.in3d.3dml', + '3g2' => 'video/3gpp2', + '3gp' => 'video/3gpp', + '7z' => 'application/x-7z-compressed', + 'aab' => 'application/x-authorware-bin', + 'aac' => 'audio/x-aac', + 'aam' => 'application/x-authorware-map', + 'aas' => 'application/x-authorware-seg', + 'abw' => 'application/x-abiword', + 'ac' => 'application/pkix-attr-cert', + 'acc' => 'application/vnd.americandynamics.acc', + 'ace' => 'application/x-ace-compressed', + 'acu' => 'application/vnd.acucobol', + 'acutc' => 'application/vnd.acucorp', + 'adp' => 'audio/adpcm', + 'aep' => 'application/vnd.audiograph', + 'afm' => 'application/x-font-type1', + 'afp' => 'application/vnd.ibm.modcap', + 'ahead' => 'application/vnd.ahead.space', + 'ai' => 'application/postscript', + 'aif' => 'audio/x-aiff', + 'aifc' => 'audio/x-aiff', + 'aiff' => 'audio/x-aiff', + 'air' => 'application/vnd.adobe.air-application-installer-package+zip', + 'ait' => 'application/vnd.dvb.ait', + 'ami' => 'application/vnd.amiga.ami', + 'apk' => 'application/vnd.android.package-archive', + 'application' => 'application/x-ms-application', + 'apr' => 'application/vnd.lotus-approach', + 'asa' => 'text/plain', + 'asax' => 'application/octet-stream', + 'asc' => 'application/pgp-signature', + 'ascx' => 'text/plain', + 'asf' => 'video/x-ms-asf', + 'ashx' => 'text/plain', + 'asm' => 'text/x-asm', + 'asmx' => 'text/plain', + 'aso' => 'application/vnd.accpac.simply.aso', + 'asp' => 'text/plain', + 'aspx' => 'text/plain', + 'asx' => 'video/x-ms-asf', + 'atc' => 'application/vnd.acucorp', + 'atom' => 'application/atom+xml', + 'atomcat' => 'application/atomcat+xml', + 'atomsvc' => 'application/atomsvc+xml', + 'atx' => 'application/vnd.antix.game-component', + 'au' => 'audio/basic', + 'avi' => 'video/x-msvideo', + 'aw' => 'application/applixware', + 'axd' => 'text/plain', + 'azf' => 'application/vnd.airzip.filesecure.azf', + 'azs' => 'application/vnd.airzip.filesecure.azs', + 'azw' => 'application/vnd.amazon.ebook', + 'bat' => 'application/x-msdownload', + 'bcpio' => 'application/x-bcpio', + 'bdf' => 'application/x-font-bdf', + 'bdm' => 'application/vnd.syncml.dm+wbxml', + 'bed' => 'application/vnd.realvnc.bed', + 'bh2' => 'application/vnd.fujitsu.oasysprs', + 'bin' => 'application/octet-stream', + 'bmi' => 'application/vnd.bmi', + 'bmp' => 'image/bmp', + 'book' => 'application/vnd.framemaker', + 'box' => 'application/vnd.previewsystems.box', + 'boz' => 'application/x-bzip2', + 'bpk' => 'application/octet-stream', + 'btif' => 'image/prs.btif', + 'bz' => 'application/x-bzip', + 'bz2' => 'application/x-bzip2', + 'c' => 'text/x-c', + 'c11amc' => 'application/vnd.cluetrust.cartomobile-config', + 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg', + 'c4d' => 'application/vnd.clonk.c4group', + 'c4f' => 'application/vnd.clonk.c4group', + 'c4g' => 'application/vnd.clonk.c4group', + 'c4p' => 'application/vnd.clonk.c4group', + 'c4u' => 'application/vnd.clonk.c4group', + 'cab' => 'application/vnd.ms-cab-compressed', + 'car' => 'application/vnd.curl.car', + 'cat' => 'application/vnd.ms-pki.seccat', + 'cc' => 'text/x-c', + 'cct' => 'application/x-director', + 'ccxml' => 'application/ccxml+xml', + 'cdbcmsg' => 'application/vnd.contact.cmsg', + 'cdf' => 'application/x-netcdf', + 'cdkey' => 'application/vnd.mediastation.cdkey', + 'cdmia' => 'application/cdmi-capability', + 'cdmic' => 'application/cdmi-container', + 'cdmid' => 'application/cdmi-domain', + 'cdmio' => 'application/cdmi-object', + 'cdmiq' => 'application/cdmi-queue', + 'cdx' => 'chemical/x-cdx', + 'cdxml' => 'application/vnd.chemdraw+xml', + 'cdy' => 'application/vnd.cinderella', + 'cer' => 'application/pkix-cert', + 'cfc' => 'application/x-coldfusion', + 'cfm' => 'application/x-coldfusion', + 'cgm' => 'image/cgm', + 'chat' => 'application/x-chat', + 'chm' => 'application/vnd.ms-htmlhelp', + 'chrt' => 'application/vnd.kde.kchart', + 'cif' => 'chemical/x-cif', + 'cii' => 'application/vnd.anser-web-certificate-issue-initiation', + 'cil' => 'application/vnd.ms-artgalry', + 'cla' => 'application/vnd.claymore', + 'class' => 'application/java-vm', + 'clkk' => 'application/vnd.crick.clicker.keyboard', + 'clkp' => 'application/vnd.crick.clicker.palette', + 'clkt' => 'application/vnd.crick.clicker.template', + 'clkw' => 'application/vnd.crick.clicker.wordbank', + 'clkx' => 'application/vnd.crick.clicker', + 'clp' => 'application/x-msclip', + 'cmc' => 'application/vnd.cosmocaller', + 'cmdf' => 'chemical/x-cmdf', + 'cml' => 'chemical/x-cml', + 'cmp' => 'application/vnd.yellowriver-custom-menu', + 'cmx' => 'image/x-cmx', + 'cod' => 'application/vnd.rim.cod', + 'com' => 'application/x-msdownload', + 'conf' => 'text/plain', + 'cpio' => 'application/x-cpio', + 'cpp' => 'text/x-c', + 'cpt' => 'application/mac-compactpro', + 'crd' => 'application/x-mscardfile', + 'crl' => 'application/pkix-crl', + 'crt' => 'application/x-x509-ca-cert', + 'cryptonote' => 'application/vnd.rig.cryptonote', + 'cs' => 'text/plain', + 'csh' => 'application/x-csh', + 'csml' => 'chemical/x-csml', + 'csp' => 'application/vnd.commonspace', + 'css' => 'text/css', + 'cst' => 'application/x-director', + 'csv' => 'text/csv', + 'cu' => 'application/cu-seeme', + 'curl' => 'text/vnd.curl', + 'cww' => 'application/prs.cww', + 'cxt' => 'application/x-director', + 'cxx' => 'text/x-c', + 'dae' => 'model/vnd.collada+xml', + 'daf' => 'application/vnd.mobius.daf', + 'dataless' => 'application/vnd.fdsn.seed', + 'davmount' => 'application/davmount+xml', + 'dcr' => 'application/x-director', + 'dcurl' => 'text/vnd.curl.dcurl', + 'dd2' => 'application/vnd.oma.dd2+xml', + 'ddd' => 'application/vnd.fujixerox.ddd', + 'deb' => 'application/x-debian-package', + 'def' => 'text/plain', + 'deploy' => 'application/octet-stream', + 'der' => 'application/x-x509-ca-cert', + 'dfac' => 'application/vnd.dreamfactory', + 'dic' => 'text/x-c', + 'dir' => 'application/x-director', + 'dis' => 'application/vnd.mobius.dis', + 'dist' => 'application/octet-stream', + 'distz' => 'application/octet-stream', + 'djv' => 'image/vnd.djvu', + 'djvu' => 'image/vnd.djvu', + 'dll' => 'application/x-msdownload', + 'dmg' => 'application/octet-stream', + 'dms' => 'application/octet-stream', + 'dna' => 'application/vnd.dna', + 'doc' => 'application/msword', + 'docm' => 'application/vnd.ms-word.document.macroenabled.12', + 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'dot' => 'application/msword', + 'dotm' => 'application/vnd.ms-word.template.macroenabled.12', + 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', + 'dp' => 'application/vnd.osgi.dp', + 'dpg' => 'application/vnd.dpgraph', + 'dra' => 'audio/vnd.dra', + 'dsc' => 'text/prs.lines.tag', + 'dssc' => 'application/dssc+der', + 'dtb' => 'application/x-dtbook+xml', + 'dtd' => 'application/xml-dtd', + 'dts' => 'audio/vnd.dts', + 'dtshd' => 'audio/vnd.dts.hd', + 'dump' => 'application/octet-stream', + 'dvi' => 'application/x-dvi', + 'dwf' => 'model/vnd.dwf', + 'dwg' => 'image/vnd.dwg', + 'dxf' => 'image/vnd.dxf', + 'dxp' => 'application/vnd.spotfire.dxp', + 'dxr' => 'application/x-director', + 'ecelp4800' => 'audio/vnd.nuera.ecelp4800', + 'ecelp7470' => 'audio/vnd.nuera.ecelp7470', + 'ecelp9600' => 'audio/vnd.nuera.ecelp9600', + 'ecma' => 'application/ecmascript', + 'edm' => 'application/vnd.novadigm.edm', + 'edx' => 'application/vnd.novadigm.edx', + 'efif' => 'application/vnd.picsel', + 'ei6' => 'application/vnd.pg.osasli', + 'elc' => 'application/octet-stream', + 'eml' => 'message/rfc822', + 'emma' => 'application/emma+xml', + 'eol' => 'audio/vnd.digital-winds', + 'eot' => 'application/vnd.ms-fontobject', + 'eps' => 'application/postscript', + 'epub' => 'application/epub+zip', + 'es3' => 'application/vnd.eszigno3+xml', + 'esf' => 'application/vnd.epson.esf', + 'et3' => 'application/vnd.eszigno3+xml', + 'etx' => 'text/x-setext', + 'exe' => 'application/x-msdownload', + 'exi' => 'application/exi', + 'ext' => 'application/vnd.novadigm.ext', + 'ez' => 'application/andrew-inset', + 'ez2' => 'application/vnd.ezpix-album', + 'ez3' => 'application/vnd.ezpix-package', + 'f' => 'text/x-fortran', + 'f4v' => 'video/x-f4v', + 'f77' => 'text/x-fortran', + 'f90' => 'text/x-fortran', + 'fbs' => 'image/vnd.fastbidsheet', + 'fcs' => 'application/vnd.isac.fcs', + 'fdf' => 'application/vnd.fdf', + 'fe_launch' => 'application/vnd.denovo.fcselayout-link', + 'fg5' => 'application/vnd.fujitsu.oasysgp', + 'fgd' => 'application/x-director', + 'fh' => 'image/x-freehand', + 'fh4' => 'image/x-freehand', + 'fh5' => 'image/x-freehand', + 'fh7' => 'image/x-freehand', + 'fhc' => 'image/x-freehand', + 'fig' => 'application/x-xfig', + 'fli' => 'video/x-fli', + 'flo' => 'application/vnd.micrografx.flo', + 'flv' => 'video/x-flv', + 'flw' => 'application/vnd.kde.kivio', + 'flx' => 'text/vnd.fmi.flexstor', + 'fly' => 'text/vnd.fly', + 'fm' => 'application/vnd.framemaker', + 'fnc' => 'application/vnd.frogans.fnc', + 'for' => 'text/x-fortran', + 'fpx' => 'image/vnd.fpx', + 'frame' => 'application/vnd.framemaker', + 'fsc' => 'application/vnd.fsc.weblaunch', + 'fst' => 'image/vnd.fst', + 'ftc' => 'application/vnd.fluxtime.clip', + 'fti' => 'application/vnd.anser-web-funds-transfer-initiation', + 'fvt' => 'video/vnd.fvt', + 'fxp' => 'application/vnd.adobe.fxp', + 'fxpl' => 'application/vnd.adobe.fxp', + 'fzs' => 'application/vnd.fuzzysheet', + 'g2w' => 'application/vnd.geoplan', + 'g3' => 'image/g3fax', + 'g3w' => 'application/vnd.geospace', + 'gac' => 'application/vnd.groove-account', + 'gdl' => 'model/vnd.gdl', + 'geo' => 'application/vnd.dynageo', + 'gex' => 'application/vnd.geometry-explorer', + 'ggb' => 'application/vnd.geogebra.file', + 'ggt' => 'application/vnd.geogebra.tool', + 'ghf' => 'application/vnd.groove-help', + 'gif' => 'image/gif', + 'gim' => 'application/vnd.groove-identity-message', + 'gmx' => 'application/vnd.gmx', + 'gnumeric' => 'application/x-gnumeric', + 'gph' => 'application/vnd.flographit', + 'gqf' => 'application/vnd.grafeq', + 'gqs' => 'application/vnd.grafeq', + 'gram' => 'application/srgs', + 'gre' => 'application/vnd.geometry-explorer', + 'grv' => 'application/vnd.groove-injector', + 'grxml' => 'application/srgs+xml', + 'gsf' => 'application/x-font-ghostscript', + 'gtar' => 'application/x-gtar', + 'gtm' => 'application/vnd.groove-tool-message', + 'gtw' => 'model/vnd.gtw', + 'gv' => 'text/vnd.graphviz', + 'gxt' => 'application/vnd.geonext', + 'h' => 'text/x-c', + 'h261' => 'video/h261', + 'h263' => 'video/h263', + 'h264' => 'video/h264', + 'hal' => 'application/vnd.hal+xml', + 'hbci' => 'application/vnd.hbci', + 'hdf' => 'application/x-hdf', + 'hh' => 'text/x-c', + 'hlp' => 'application/winhlp', + 'hpgl' => 'application/vnd.hp-hpgl', + 'hpid' => 'application/vnd.hp-hpid', + 'hps' => 'application/vnd.hp-hps', + 'hqx' => 'application/mac-binhex40', + 'hta' => 'application/octet-stream', + 'htc' => 'text/html', + 'htke' => 'application/vnd.kenameaapp', + 'htm' => 'text/html', + 'html' => 'text/html', + 'hvd' => 'application/vnd.yamaha.hv-dic', + 'hvp' => 'application/vnd.yamaha.hv-voice', + 'hvs' => 'application/vnd.yamaha.hv-script', + 'i2g' => 'application/vnd.intergeo', + 'icc' => 'application/vnd.iccprofile', + 'ice' => 'x-conference/x-cooltalk', + 'icm' => 'application/vnd.iccprofile', + 'ico' => 'image/x-icon', + 'ics' => 'text/calendar', + 'ief' => 'image/ief', + 'ifb' => 'text/calendar', + 'ifm' => 'application/vnd.shana.informed.formdata', + 'iges' => 'model/iges', + 'igl' => 'application/vnd.igloader', + 'igm' => 'application/vnd.insors.igm', + 'igs' => 'model/iges', + 'igx' => 'application/vnd.micrografx.igx', + 'iif' => 'application/vnd.shana.informed.interchange', + 'imp' => 'application/vnd.accpac.simply.imp', + 'ims' => 'application/vnd.ms-ims', + 'in' => 'text/plain', + 'ini' => 'text/plain', + 'ipfix' => 'application/ipfix', + 'ipk' => 'application/vnd.shana.informed.package', + 'irm' => 'application/vnd.ibm.rights-management', + 'irp' => 'application/vnd.irepository.package+xml', + 'iso' => 'application/octet-stream', + 'itp' => 'application/vnd.shana.informed.formtemplate', + 'ivp' => 'application/vnd.immervision-ivp', + 'ivu' => 'application/vnd.immervision-ivu', + 'jad' => 'text/vnd.sun.j2me.app-descriptor', + 'jam' => 'application/vnd.jam', + 'jar' => 'application/java-archive', + 'java' => 'text/x-java-source', + 'jisp' => 'application/vnd.jisp', + 'jlt' => 'application/vnd.hp-jlyt', + 'jnlp' => 'application/x-java-jnlp-file', + 'joda' => 'application/vnd.joost.joda-archive', + 'jpe' => 'image/jpeg', + 'jpeg' => 'image/jpeg', + 'jpg' => 'image/jpeg', + 'jpgm' => 'video/jpm', + 'jpgv' => 'video/jpeg', + 'jpm' => 'video/jpm', + 'js' => 'text/javascript', + 'json' => 'application/json', + 'kar' => 'audio/midi', + 'karbon' => 'application/vnd.kde.karbon', + 'kfo' => 'application/vnd.kde.kformula', + 'kia' => 'application/vnd.kidspiration', + 'kml' => 'application/vnd.google-earth.kml+xml', + 'kmz' => 'application/vnd.google-earth.kmz', + 'kne' => 'application/vnd.kinar', + 'knp' => 'application/vnd.kinar', + 'kon' => 'application/vnd.kde.kontour', + 'kpr' => 'application/vnd.kde.kpresenter', + 'kpt' => 'application/vnd.kde.kpresenter', + 'ksp' => 'application/vnd.kde.kspread', + 'ktr' => 'application/vnd.kahootz', + 'ktx' => 'image/ktx', + 'ktz' => 'application/vnd.kahootz', + 'kwd' => 'application/vnd.kde.kword', + 'kwt' => 'application/vnd.kde.kword', + 'lasxml' => 'application/vnd.las.las+xml', + 'latex' => 'application/x-latex', + 'lbd' => 'application/vnd.llamagraphics.life-balance.desktop', + 'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml', + 'les' => 'application/vnd.hhe.lesson-player', + 'lha' => 'application/octet-stream', + 'link66' => 'application/vnd.route66.link66+xml', + 'list' => 'text/plain', + 'list3820' => 'application/vnd.ibm.modcap', + 'listafp' => 'application/vnd.ibm.modcap', + 'log' => 'text/plain', + 'lostxml' => 'application/lost+xml', + 'lrf' => 'application/octet-stream', + 'lrm' => 'application/vnd.ms-lrm', + 'ltf' => 'application/vnd.frogans.ltf', + 'lvp' => 'audio/vnd.lucent.voice', + 'lwp' => 'application/vnd.lotus-wordpro', + 'lzh' => 'application/octet-stream', + 'm13' => 'application/x-msmediaview', + 'm14' => 'application/x-msmediaview', + 'm1v' => 'video/mpeg', + 'm21' => 'application/mp21', + 'm2a' => 'audio/mpeg', + 'm2v' => 'video/mpeg', + 'm3a' => 'audio/mpeg', + 'm3u' => 'audio/x-mpegurl', + 'm3u8' => 'application/vnd.apple.mpegurl', + 'm4a' => 'audio/mp4', + 'm4u' => 'video/vnd.mpegurl', + 'm4v' => 'video/mp4', + 'ma' => 'application/mathematica', + 'mads' => 'application/mads+xml', + 'mag' => 'application/vnd.ecowin.chart', + 'maker' => 'application/vnd.framemaker', + 'man' => 'text/troff', + 'mathml' => 'application/mathml+xml', + 'mb' => 'application/mathematica', + 'mbk' => 'application/vnd.mobius.mbk', + 'mbox' => 'application/mbox', + 'mc1' => 'application/vnd.medcalcdata', + 'mcd' => 'application/vnd.mcd', + 'mcurl' => 'text/vnd.curl.mcurl', + 'mdb' => 'application/x-msaccess', + 'mdi' => 'image/vnd.ms-modi', + 'me' => 'text/troff', + 'mesh' => 'model/mesh', + 'meta4' => 'application/metalink4+xml', + 'mets' => 'application/mets+xml', + 'mfm' => 'application/vnd.mfmp', + 'mgp' => 'application/vnd.osgeo.mapguide.package', + 'mgz' => 'application/vnd.proteus.magazine', + 'mid' => 'audio/midi', + 'midi' => 'audio/midi', + 'mif' => 'application/vnd.mif', + 'mime' => 'message/rfc822', + 'mj2' => 'video/mj2', + 'mjp2' => 'video/mj2', + 'mlp' => 'application/vnd.dolby.mlp', + 'mmd' => 'application/vnd.chipnuts.karaoke-mmd', + 'mmf' => 'application/vnd.smaf', + 'mmr' => 'image/vnd.fujixerox.edmics-mmr', + 'mny' => 'application/x-msmoney', + 'mobi' => 'application/x-mobipocket-ebook', + 'mods' => 'application/mods+xml', + 'mov' => 'video/quicktime', + 'movie' => 'video/x-sgi-movie', + 'mp2' => 'audio/mpeg', + 'mp21' => 'application/mp21', + 'mp2a' => 'audio/mpeg', + 'mp3' => 'audio/mpeg', + 'mp4' => 'video/mp4', + 'mp4a' => 'audio/mp4', + 'mp4s' => 'application/mp4', + 'mp4v' => 'video/mp4', + 'mpc' => 'application/vnd.mophun.certificate', + 'mpe' => 'video/mpeg', + 'mpeg' => 'video/mpeg', + 'mpg' => 'video/mpeg', + 'mpg4' => 'video/mp4', + 'mpga' => 'audio/mpeg', + 'mpkg' => 'application/vnd.apple.installer+xml', + 'mpm' => 'application/vnd.blueice.multipass', + 'mpn' => 'application/vnd.mophun.application', + 'mpp' => 'application/vnd.ms-project', + 'mpt' => 'application/vnd.ms-project', + 'mpy' => 'application/vnd.ibm.minipay', + 'mqy' => 'application/vnd.mobius.mqy', + 'mrc' => 'application/marc', + 'mrcx' => 'application/marcxml+xml', + 'ms' => 'text/troff', + 'mscml' => 'application/mediaservercontrol+xml', + 'mseed' => 'application/vnd.fdsn.mseed', + 'mseq' => 'application/vnd.mseq', + 'msf' => 'application/vnd.epson.msf', + 'msh' => 'model/mesh', + 'msi' => 'application/x-msdownload', + 'msl' => 'application/vnd.mobius.msl', + 'msty' => 'application/vnd.muvee.style', + 'mts' => 'model/vnd.mts', + 'mus' => 'application/vnd.musician', + 'musicxml' => 'application/vnd.recordare.musicxml+xml', + 'mvb' => 'application/x-msmediaview', + 'mwf' => 'application/vnd.mfer', + 'mxf' => 'application/mxf', + 'mxl' => 'application/vnd.recordare.musicxml', + 'mxml' => 'application/xv+xml', + 'mxs' => 'application/vnd.triscape.mxs', + 'mxu' => 'video/vnd.mpegurl', + 'n-gage' => 'application/vnd.nokia.n-gage.symbian.install', + 'n3' => 'text/n3', + 'nb' => 'application/mathematica', + 'nbp' => 'application/vnd.wolfram.player', + 'nc' => 'application/x-netcdf', + 'ncx' => 'application/x-dtbncx+xml', + 'ngdat' => 'application/vnd.nokia.n-gage.data', + 'nlu' => 'application/vnd.neurolanguage.nlu', + 'nml' => 'application/vnd.enliven', + 'nnd' => 'application/vnd.noblenet-directory', + 'nns' => 'application/vnd.noblenet-sealer', + 'nnw' => 'application/vnd.noblenet-web', + 'npx' => 'image/vnd.net-fpx', + 'nsf' => 'application/vnd.lotus-notes', + 'oa2' => 'application/vnd.fujitsu.oasys2', + 'oa3' => 'application/vnd.fujitsu.oasys3', + 'oas' => 'application/vnd.fujitsu.oasys', + 'obd' => 'application/x-msbinder', + 'oda' => 'application/oda', + 'odb' => 'application/vnd.oasis.opendocument.database', + 'odc' => 'application/vnd.oasis.opendocument.chart', + 'odf' => 'application/vnd.oasis.opendocument.formula', + 'odft' => 'application/vnd.oasis.opendocument.formula-template', + 'odg' => 'application/vnd.oasis.opendocument.graphics', + 'odi' => 'application/vnd.oasis.opendocument.image', + 'odm' => 'application/vnd.oasis.opendocument.text-master', + 'odp' => 'application/vnd.oasis.opendocument.presentation', + 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', + 'odt' => 'application/vnd.oasis.opendocument.text', + 'oga' => 'audio/ogg', + 'ogg' => 'audio/ogg', + 'ogv' => 'video/ogg', + 'ogx' => 'application/ogg', + 'onepkg' => 'application/onenote', + 'onetmp' => 'application/onenote', + 'onetoc' => 'application/onenote', + 'onetoc2' => 'application/onenote', + 'opf' => 'application/oebps-package+xml', + 'oprc' => 'application/vnd.palm', + 'org' => 'application/vnd.lotus-organizer', + 'osf' => 'application/vnd.yamaha.openscoreformat', + 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml', + 'otc' => 'application/vnd.oasis.opendocument.chart-template', + 'otf' => 'application/x-font-otf', + 'otg' => 'application/vnd.oasis.opendocument.graphics-template', + 'oth' => 'application/vnd.oasis.opendocument.text-web', + 'oti' => 'application/vnd.oasis.opendocument.image-template', + 'otp' => 'application/vnd.oasis.opendocument.presentation-template', + 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', + 'ott' => 'application/vnd.oasis.opendocument.text-template', + 'oxt' => 'application/vnd.openofficeorg.extension', + 'p' => 'text/x-pascal', + 'p10' => 'application/pkcs10', + 'p12' => 'application/x-pkcs12', + 'p7b' => 'application/x-pkcs7-certificates', + 'p7c' => 'application/pkcs7-mime', + 'p7m' => 'application/pkcs7-mime', + 'p7r' => 'application/x-pkcs7-certreqresp', + 'p7s' => 'application/pkcs7-signature', + 'p8' => 'application/pkcs8', + 'pas' => 'text/x-pascal', + 'paw' => 'application/vnd.pawaafile', + 'pbd' => 'application/vnd.powerbuilder6', + 'pbm' => 'image/x-portable-bitmap', + 'pcf' => 'application/x-font-pcf', + 'pcl' => 'application/vnd.hp-pcl', + 'pclxl' => 'application/vnd.hp-pclxl', + 'pct' => 'image/x-pict', + 'pcurl' => 'application/vnd.curl.pcurl', + 'pcx' => 'image/x-pcx', + 'pdb' => 'application/vnd.palm', + 'pdf' => 'application/pdf', + 'pfa' => 'application/x-font-type1', + 'pfb' => 'application/x-font-type1', + 'pfm' => 'application/x-font-type1', + 'pfr' => 'application/font-tdpfr', + 'pfx' => 'application/x-pkcs12', + 'pgm' => 'image/x-portable-graymap', + 'pgn' => 'application/x-chess-pgn', + 'pgp' => 'application/pgp-encrypted', + 'php' => 'text/x-php', + 'phps' => 'application/x-httpd-phps', + 'pic' => 'image/x-pict', + 'pkg' => 'application/octet-stream', + 'pki' => 'application/pkixcmp', + 'pkipath' => 'application/pkix-pkipath', + 'plb' => 'application/vnd.3gpp.pic-bw-large', + 'plc' => 'application/vnd.mobius.plc', + 'plf' => 'application/vnd.pocketlearn', + 'pls' => 'application/pls+xml', + 'pml' => 'application/vnd.ctc-posml', + 'png' => 'image/png', + 'pnm' => 'image/x-portable-anymap', + 'portpkg' => 'application/vnd.macports.portpkg', + 'pot' => 'application/vnd.ms-powerpoint', + 'potm' => 'application/vnd.ms-powerpoint.template.macroenabled.12', + 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', + 'ppam' => 'application/vnd.ms-powerpoint.addin.macroenabled.12', + 'ppd' => 'application/vnd.cups-ppd', + 'ppm' => 'image/x-portable-pixmap', + 'pps' => 'application/vnd.ms-powerpoint', + 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroenabled.12', + 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', + 'ppt' => 'application/vnd.ms-powerpoint', + 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroenabled.12', + 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'pqa' => 'application/vnd.palm', + 'prc' => 'application/x-mobipocket-ebook', + 'pre' => 'application/vnd.lotus-freelance', + 'prf' => 'application/pics-rules', + 'ps' => 'application/postscript', + 'psb' => 'application/vnd.3gpp.pic-bw-small', + 'psd' => 'image/vnd.adobe.photoshop', + 'psf' => 'application/x-font-linux-psf', + 'pskcxml' => 'application/pskc+xml', + 'ptid' => 'application/vnd.pvi.ptid1', + 'pub' => 'application/x-mspublisher', + 'pvb' => 'application/vnd.3gpp.pic-bw-var', + 'pwn' => 'application/vnd.3m.post-it-notes', + 'pya' => 'audio/vnd.ms-playready.media.pya', + 'pyv' => 'video/vnd.ms-playready.media.pyv', + 'qam' => 'application/vnd.epson.quickanime', + 'qbo' => 'application/vnd.intu.qbo', + 'qfx' => 'application/vnd.intu.qfx', + 'qps' => 'application/vnd.publishare-delta-tree', + 'qt' => 'video/quicktime', + 'qwd' => 'application/vnd.quark.quarkxpress', + 'qwt' => 'application/vnd.quark.quarkxpress', + 'qxb' => 'application/vnd.quark.quarkxpress', + 'qxd' => 'application/vnd.quark.quarkxpress', + 'qxl' => 'application/vnd.quark.quarkxpress', + 'qxt' => 'application/vnd.quark.quarkxpress', + 'ra' => 'audio/x-pn-realaudio', + 'ram' => 'audio/x-pn-realaudio', + 'rar' => 'application/x-rar-compressed', + 'ras' => 'image/x-cmu-raster', + 'rb' => 'text/plain', + 'rcprofile' => 'application/vnd.ipunplugged.rcprofile', + 'rdf' => 'application/rdf+xml', + 'rdz' => 'application/vnd.data-vision.rdz', + 'rep' => 'application/vnd.businessobjects', + 'res' => 'application/x-dtbresource+xml', + 'resx' => 'text/xml', + 'rgb' => 'image/x-rgb', + 'rif' => 'application/reginfo+xml', + 'rip' => 'audio/vnd.rip', + 'rl' => 'application/resource-lists+xml', + 'rlc' => 'image/vnd.fujixerox.edmics-rlc', + 'rld' => 'application/resource-lists-diff+xml', + 'rm' => 'application/vnd.rn-realmedia', + 'rmi' => 'audio/midi', + 'rmp' => 'audio/x-pn-realaudio-plugin', + 'rms' => 'application/vnd.jcp.javame.midlet-rms', + 'rnc' => 'application/relax-ng-compact-syntax', + 'roff' => 'text/troff', + 'rp9' => 'application/vnd.cloanto.rp9', + 'rpss' => 'application/vnd.nokia.radio-presets', + 'rpst' => 'application/vnd.nokia.radio-preset', + 'rq' => 'application/sparql-query', + 'rs' => 'application/rls-services+xml', + 'rsd' => 'application/rsd+xml', + 'rss' => 'application/rss+xml', + 'rtf' => 'application/rtf', + 'rtx' => 'text/richtext', + 's' => 'text/x-asm', + 'saf' => 'application/vnd.yamaha.smaf-audio', + 'sbml' => 'application/sbml+xml', + 'sc' => 'application/vnd.ibm.secure-container', + 'scd' => 'application/x-msschedule', + 'scm' => 'application/vnd.lotus-screencam', + 'scq' => 'application/scvp-cv-request', + 'scs' => 'application/scvp-cv-response', + 'scurl' => 'text/vnd.curl.scurl', + 'sda' => 'application/vnd.stardivision.draw', + 'sdc' => 'application/vnd.stardivision.calc', + 'sdd' => 'application/vnd.stardivision.impress', + 'sdkd' => 'application/vnd.solent.sdkm+xml', + 'sdkm' => 'application/vnd.solent.sdkm+xml', + 'sdp' => 'application/sdp', + 'sdw' => 'application/vnd.stardivision.writer', + 'see' => 'application/vnd.seemail', + 'seed' => 'application/vnd.fdsn.seed', + 'sema' => 'application/vnd.sema', + 'semd' => 'application/vnd.semd', + 'semf' => 'application/vnd.semf', + 'ser' => 'application/java-serialized-object', + 'setpay' => 'application/set-payment-initiation', + 'setreg' => 'application/set-registration-initiation', + 'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data', + 'sfs' => 'application/vnd.spotfire.sfs', + 'sgl' => 'application/vnd.stardivision.writer-global', + 'sgm' => 'text/sgml', + 'sgml' => 'text/sgml', + 'sh' => 'application/x-sh', + 'shar' => 'application/x-shar', + 'shf' => 'application/shf+xml', + 'sig' => 'application/pgp-signature', + 'silo' => 'model/mesh', + 'sis' => 'application/vnd.symbian.install', + 'sisx' => 'application/vnd.symbian.install', + 'sit' => 'application/x-stuffit', + 'sitx' => 'application/x-stuffitx', + 'skd' => 'application/vnd.koan', + 'skm' => 'application/vnd.koan', + 'skp' => 'application/vnd.koan', + 'skt' => 'application/vnd.koan', + 'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12', + 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', + 'slt' => 'application/vnd.epson.salt', + 'sm' => 'application/vnd.stepmania.stepchart', + 'smf' => 'application/vnd.stardivision.math', + 'smi' => 'application/smil+xml', + 'smil' => 'application/smil+xml', + 'snd' => 'audio/basic', + 'snf' => 'application/x-font-snf', + 'so' => 'application/octet-stream', + 'spc' => 'application/x-pkcs7-certificates', + 'spf' => 'application/vnd.yamaha.smaf-phrase', + 'spl' => 'application/x-futuresplash', + 'spot' => 'text/vnd.in3d.spot', + 'spp' => 'application/scvp-vp-response', + 'spq' => 'application/scvp-vp-request', + 'spx' => 'audio/ogg', + 'src' => 'application/x-wais-source', + 'sru' => 'application/sru+xml', + 'srx' => 'application/sparql-results+xml', + 'sse' => 'application/vnd.kodak-descriptor', + 'ssf' => 'application/vnd.epson.ssf', + 'ssml' => 'application/ssml+xml', + 'st' => 'application/vnd.sailingtracker.track', + 'stc' => 'application/vnd.sun.xml.calc.template', + 'std' => 'application/vnd.sun.xml.draw.template', + 'stf' => 'application/vnd.wt.stf', + 'sti' => 'application/vnd.sun.xml.impress.template', + 'stk' => 'application/hyperstudio', + 'stl' => 'application/vnd.ms-pki.stl', + 'str' => 'application/vnd.pg.format', + 'stw' => 'application/vnd.sun.xml.writer.template', + 'sub' => 'image/vnd.dvb.subtitle', + 'sus' => 'application/vnd.sus-calendar', + 'susp' => 'application/vnd.sus-calendar', + 'sv4cpio' => 'application/x-sv4cpio', + 'sv4crc' => 'application/x-sv4crc', + 'svc' => 'application/vnd.dvb.service', + 'svd' => 'application/vnd.svd', + 'svg' => 'image/svg+xml', + 'svgz' => 'image/svg+xml', + 'swa' => 'application/x-director', + 'swf' => 'application/x-shockwave-flash', + 'swi' => 'application/vnd.aristanetworks.swi', + 'sxc' => 'application/vnd.sun.xml.calc', + 'sxd' => 'application/vnd.sun.xml.draw', + 'sxg' => 'application/vnd.sun.xml.writer.global', + 'sxi' => 'application/vnd.sun.xml.impress', + 'sxm' => 'application/vnd.sun.xml.math', + 'sxw' => 'application/vnd.sun.xml.writer', + 't' => 'text/troff', + 'tao' => 'application/vnd.tao.intent-module-archive', + 'tar' => 'application/x-tar', + 'tcap' => 'application/vnd.3gpp2.tcap', + 'tcl' => 'application/x-tcl', + 'teacher' => 'application/vnd.smart.teacher', + 'tei' => 'application/tei+xml', + 'teicorpus' => 'application/tei+xml', + 'tex' => 'application/x-tex', + 'texi' => 'application/x-texinfo', + 'texinfo' => 'application/x-texinfo', + 'text' => 'text/plain', + 'tfi' => 'application/thraud+xml', + 'tfm' => 'application/x-tex-tfm', + 'thmx' => 'application/vnd.ms-officetheme', + 'tif' => 'image/tiff', + 'tiff' => 'image/tiff', + 'tmo' => 'application/vnd.tmobile-livetv', + 'torrent' => 'application/x-bittorrent', + 'tpl' => 'application/vnd.groove-tool-template', + 'tpt' => 'application/vnd.trid.tpt', + 'tr' => 'text/troff', + 'tra' => 'application/vnd.trueapp', + 'trm' => 'application/x-msterminal', + 'tsd' => 'application/timestamped-data', + 'tsv' => 'text/tab-separated-values', + 'ttc' => 'application/x-font-ttf', + 'ttf' => 'application/x-font-ttf', + 'ttl' => 'text/turtle', + 'twd' => 'application/vnd.simtech-mindmapper', + 'twds' => 'application/vnd.simtech-mindmapper', + 'txd' => 'application/vnd.genomatix.tuxedo', + 'txf' => 'application/vnd.mobius.txf', + 'txt' => 'text/plain', + 'u32' => 'application/x-authorware-bin', + 'udeb' => 'application/x-debian-package', + 'ufd' => 'application/vnd.ufdl', + 'ufdl' => 'application/vnd.ufdl', + 'umj' => 'application/vnd.umajin', + 'unityweb' => 'application/vnd.unity', + 'uoml' => 'application/vnd.uoml+xml', + 'uri' => 'text/uri-list', + 'uris' => 'text/uri-list', + 'urls' => 'text/uri-list', + 'ustar' => 'application/x-ustar', + 'utz' => 'application/vnd.uiq.theme', + 'uu' => 'text/x-uuencode', + 'uva' => 'audio/vnd.dece.audio', + 'uvd' => 'application/vnd.dece.data', + 'uvf' => 'application/vnd.dece.data', + 'uvg' => 'image/vnd.dece.graphic', + 'uvh' => 'video/vnd.dece.hd', + 'uvi' => 'image/vnd.dece.graphic', + 'uvm' => 'video/vnd.dece.mobile', + 'uvp' => 'video/vnd.dece.pd', + 'uvs' => 'video/vnd.dece.sd', + 'uvt' => 'application/vnd.dece.ttml+xml', + 'uvu' => 'video/vnd.uvvu.mp4', + 'uvv' => 'video/vnd.dece.video', + 'uvva' => 'audio/vnd.dece.audio', + 'uvvd' => 'application/vnd.dece.data', + 'uvvf' => 'application/vnd.dece.data', + 'uvvg' => 'image/vnd.dece.graphic', + 'uvvh' => 'video/vnd.dece.hd', + 'uvvi' => 'image/vnd.dece.graphic', + 'uvvm' => 'video/vnd.dece.mobile', + 'uvvp' => 'video/vnd.dece.pd', + 'uvvs' => 'video/vnd.dece.sd', + 'uvvt' => 'application/vnd.dece.ttml+xml', + 'uvvu' => 'video/vnd.uvvu.mp4', + 'uvvv' => 'video/vnd.dece.video', + 'uvvx' => 'application/vnd.dece.unspecified', + 'uvx' => 'application/vnd.dece.unspecified', + 'vcd' => 'application/x-cdlink', + 'vcf' => 'text/x-vcard', + 'vcg' => 'application/vnd.groove-vcard', + 'vcs' => 'text/x-vcalendar', + 'vcx' => 'application/vnd.vcx', + 'vis' => 'application/vnd.visionary', + 'viv' => 'video/vnd.vivo', + 'vor' => 'application/vnd.stardivision.writer', + 'vox' => 'application/x-authorware-bin', + 'vrml' => 'model/vrml', + 'vsd' => 'application/vnd.visio', + 'vsf' => 'application/vnd.vsf', + 'vss' => 'application/vnd.visio', + 'vst' => 'application/vnd.visio', + 'vsw' => 'application/vnd.visio', + 'vtu' => 'model/vnd.vtu', + 'vxml' => 'application/voicexml+xml', + 'w3d' => 'application/x-director', + 'wad' => 'application/x-doom', + 'wav' => 'audio/x-wav', + 'wax' => 'audio/x-ms-wax', + 'wbmp' => 'image/vnd.wap.wbmp', + 'wbs' => 'application/vnd.criticaltools.wbs+xml', + 'wbxml' => 'application/vnd.wap.wbxml', + 'wcm' => 'application/vnd.ms-works', + 'wdb' => 'application/vnd.ms-works', + 'weba' => 'audio/webm', + 'webm' => 'video/webm', + 'webp' => 'image/webp', + 'wg' => 'application/vnd.pmi.widget', + 'wgt' => 'application/widget', + 'wks' => 'application/vnd.ms-works', + 'wm' => 'video/x-ms-wm', + 'wma' => 'audio/x-ms-wma', + 'wmd' => 'application/x-ms-wmd', + 'wmf' => 'application/x-msmetafile', + 'wml' => 'text/vnd.wap.wml', + 'wmlc' => 'application/vnd.wap.wmlc', + 'wmls' => 'text/vnd.wap.wmlscript', + 'wmlsc' => 'application/vnd.wap.wmlscriptc', + 'wmv' => 'video/x-ms-wmv', + 'wmx' => 'video/x-ms-wmx', + 'wmz' => 'application/x-ms-wmz', + 'woff' => 'application/x-font-woff', + 'wpd' => 'application/vnd.wordperfect', + 'wpl' => 'application/vnd.ms-wpl', + 'wps' => 'application/vnd.ms-works', + 'wqd' => 'application/vnd.wqd', + 'wri' => 'application/x-mswrite', + 'wrl' => 'model/vrml', + 'wsdl' => 'application/wsdl+xml', + 'wspolicy' => 'application/wspolicy+xml', + 'wtb' => 'application/vnd.webturbo', + 'wvx' => 'video/x-ms-wvx', + 'x32' => 'application/x-authorware-bin', + 'x3d' => 'application/vnd.hzn-3d-crossword', + 'xap' => 'application/x-silverlight-app', + 'xar' => 'application/vnd.xara', + 'xbap' => 'application/x-ms-xbap', + 'xbd' => 'application/vnd.fujixerox.docuworks.binder', + 'xbm' => 'image/x-xbitmap', + 'xdf' => 'application/xcap-diff+xml', + 'xdm' => 'application/vnd.syncml.dm+xml', + 'xdp' => 'application/vnd.adobe.xdp+xml', + 'xdssc' => 'application/dssc+xml', + 'xdw' => 'application/vnd.fujixerox.docuworks', + 'xenc' => 'application/xenc+xml', + 'xer' => 'application/patch-ops-error+xml', + 'xfdf' => 'application/vnd.adobe.xfdf', + 'xfdl' => 'application/vnd.xfdl', + 'xht' => 'application/xhtml+xml', + 'xhtml' => 'application/xhtml+xml', + 'xhvml' => 'application/xv+xml', + 'xif' => 'image/vnd.xiff', + 'xla' => 'application/vnd.ms-excel', + 'xlam' => 'application/vnd.ms-excel.addin.macroenabled.12', + 'xlc' => 'application/vnd.ms-excel', + 'xlm' => 'application/vnd.ms-excel', + 'xls' => 'application/vnd.ms-excel', + 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroenabled.12', + 'xlsm' => 'application/vnd.ms-excel.sheet.macroenabled.12', + 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'xlt' => 'application/vnd.ms-excel', + 'xltm' => 'application/vnd.ms-excel.template.macroenabled.12', + 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', + 'xlw' => 'application/vnd.ms-excel', + 'xml' => 'application/xml', + 'xo' => 'application/vnd.olpc-sugar', + 'xop' => 'application/xop+xml', + 'xpi' => 'application/x-xpinstall', + 'xpm' => 'image/x-xpixmap', + 'xpr' => 'application/vnd.is-xpr', + 'xps' => 'application/vnd.ms-xpsdocument', + 'xpw' => 'application/vnd.intercon.formnet', + 'xpx' => 'application/vnd.intercon.formnet', + 'xsl' => 'application/xml', + 'xslt' => 'application/xslt+xml', + 'xsm' => 'application/vnd.syncml+xml', + 'xspf' => 'application/xspf+xml', + 'xul' => 'application/vnd.mozilla.xul+xml', + 'xvm' => 'application/xv+xml', + 'xvml' => 'application/xv+xml', + 'xwd' => 'image/x-xwindowdump', + 'xyz' => 'chemical/x-xyz', + 'yaml' => 'text/yaml', + 'yang' => 'application/yang', + 'yin' => 'application/yin+xml', + 'yml' => 'text/yaml', + 'zaz' => 'application/vnd.zzazz.deck+xml', + 'zip' => 'application/zip', + 'zir' => 'application/vnd.zul', + 'zirz' => 'application/vnd.zul', + 'zmm' => 'application/vnd.handheld-entertainment+xml' + ]; + + /** + * Get a singleton instance of the class + * + * @return self + * @codeCoverageIgnore + */ + public static function getInstance() + { + if (!self::$instance) { + self::$instance = new self(); + } + + return self::$instance; + } + + /** + * Get a mimetype value from a file extension + * + * @param string $extension File extension + * + * @return string|null + */ + public function fromExtension($extension) + { + $extension = strtolower($extension); + + return isset($this->mimetypes[$extension]) ? $this->mimetypes[$extension] : null; + } + + /** + * Get a mimetype from a filename + * + * @param string $filename Filename to generate a mimetype from + * + * @return string|null + */ + public function fromFilename($filename) + { + return $this->fromExtension(pathinfo($filename, PATHINFO_EXTENSION)); + } +} diff --git a/oauth/facebook-sdk-v5/GraphNodes/Collection.php b/oauth/facebook-sdk-v5/GraphNodes/Collection.php new file mode 100644 index 0000000..cac010b --- /dev/null +++ b/oauth/facebook-sdk-v5/GraphNodes/Collection.php @@ -0,0 +1,242 @@ +items = $items; + } + + /** + * Gets the value of a field from the Graph node. + * + * @param string $name The field to retrieve. + * @param mixed $default The default to return if the field doesn't exist. + * + * @return mixed + */ + public function getField($name, $default = null) + { + if (isset($this->items[$name])) { + return $this->items[$name]; + } + + return $default ?: null; + } + + /** + * Gets the value of the named property for this graph object. + * + * @param string $name The property to retrieve. + * @param mixed $default The default to return if the property doesn't exist. + * + * @return mixed + * + * @deprecated 5.0.0 getProperty() has been renamed to getField() + * @todo v6: Remove this method + */ + public function getProperty($name, $default = null) + { + return $this->getField($name, $default); + } + + /** + * Returns a list of all fields set on the object. + * + * @return array + */ + public function getFieldNames() + { + return array_keys($this->items); + } + + /** + * Returns a list of all properties set on the object. + * + * @return array + * + * @deprecated 5.0.0 getPropertyNames() has been renamed to getFieldNames() + * @todo v6: Remove this method + */ + public function getPropertyNames() + { + return $this->getFieldNames(); + } + + /** + * Get all of the items in the collection. + * + * @return array + */ + public function all() + { + return $this->items; + } + + /** + * Get the collection of items as a plain array. + * + * @return array + */ + public function asArray() + { + return array_map(function ($value) { + return $value instanceof Collection ? $value->asArray() : $value; + }, $this->items); + } + + /** + * Run a map over each of the items. + * + * @param \Closure $callback + * + * @return static + */ + public function map(\Closure $callback) + { + return new static(array_map($callback, $this->items, array_keys($this->items))); + } + + /** + * Get the collection of items as JSON. + * + * @param int $options + * + * @return string + */ + public function asJson($options = 0) + { + return json_encode($this->asArray(), $options); + } + + /** + * Count the number of items in the collection. + * + * @return int + */ + public function count() + { + return count($this->items); + } + + /** + * Get an iterator for the items. + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->items); + } + + /** + * Determine if an item exists at an offset. + * + * @param mixed $key + * + * @return bool + */ + public function offsetExists($key) + { + return array_key_exists($key, $this->items); + } + + /** + * Get an item at a given offset. + * + * @param mixed $key + * + * @return mixed + */ + public function offsetGet($key) + { + return $this->items[$key]; + } + + /** + * Set the item at a given offset. + * + * @param mixed $key + * @param mixed $value + * + * @return void + */ + public function offsetSet($key, $value) + { + if (is_null($key)) { + $this->items[] = $value; + } else { + $this->items[$key] = $value; + } + } + + /** + * Unset the item at a given offset. + * + * @param string $key + * + * @return void + */ + public function offsetUnset($key) + { + unset($this->items[$key]); + } + + /** + * Convert the collection to its string representation. + * + * @return string + */ + public function __toString() + { + return $this->asJson(); + } +} diff --git a/oauth/facebook-sdk-v5/GraphNodes/GraphAchievement.php b/oauth/facebook-sdk-v5/GraphNodes/GraphAchievement.php new file mode 100644 index 0000000..3fba815 --- /dev/null +++ b/oauth/facebook-sdk-v5/GraphNodes/GraphAchievement.php @@ -0,0 +1,113 @@ + '\Facebook\GraphNodes\GraphUser', + 'application' => '\Facebook\GraphNodes\GraphApplication', + ]; + + /** + * Returns the ID for the achievement. + * + * @return string|null + */ + public function getId() + { + return $this->getField('id'); + } + + /** + * Returns the user who achieved this. + * + * @return GraphUser|null + */ + public function getFrom() + { + return $this->getField('from'); + } + + /** + * Returns the time at which this was achieved. + * + * @return \DateTime|null + */ + public function getPublishTime() + { + return $this->getField('publish_time'); + } + + /** + * Returns the app in which the user achieved this. + * + * @return GraphApplication|null + */ + public function getApplication() + { + return $this->getField('application'); + } + + /** + * Returns information about the achievement type this instance is connected with. + * + * @return array|null + */ + public function getData() + { + return $this->getField('data'); + } + + /** + * Returns the type of achievement. + * + * @see https://developers.facebook.com/docs/graph-api/reference/v2.2/achievement + * + * @return string + */ + public function getType() + { + return 'game.achievement'; + } + + /** + * Indicates whether gaining the achievement published a feed story for the user. + * + * @return boolean|null + */ + public function isNoFeedStory() + { + return $this->getField('no_feed_story'); + } +} diff --git a/oauth/facebook-sdk-v5/GraphNodes/GraphAlbum.php b/oauth/facebook-sdk-v5/GraphNodes/GraphAlbum.php new file mode 100644 index 0000000..50d1f2c --- /dev/null +++ b/oauth/facebook-sdk-v5/GraphNodes/GraphAlbum.php @@ -0,0 +1,183 @@ + '\Facebook\GraphNodes\GraphUser', + 'place' => '\Facebook\GraphNodes\GraphPage', + ]; + + /** + * Returns the ID for the album. + * + * @return string|null + */ + public function getId() + { + return $this->getField('id'); + } + + /** + * Returns whether the viewer can upload photos to this album. + * + * @return boolean|null + */ + public function getCanUpload() + { + return $this->getField('can_upload'); + } + + /** + * Returns the number of photos in this album. + * + * @return int|null + */ + public function getCount() + { + return $this->getField('count'); + } + + /** + * Returns the ID of the album's cover photo. + * + * @return string|null + */ + public function getCoverPhoto() + { + return $this->getField('cover_photo'); + } + + /** + * Returns the time the album was initially created. + * + * @return \DateTime|null + */ + public function getCreatedTime() + { + return $this->getField('created_time'); + } + + /** + * Returns the time the album was updated. + * + * @return \DateTime|null + */ + public function getUpdatedTime() + { + return $this->getField('updated_time'); + } + + /** + * Returns the description of the album. + * + * @return string|null + */ + public function getDescription() + { + return $this->getField('description'); + } + + /** + * Returns profile that created the album. + * + * @return GraphUser|null + */ + public function getFrom() + { + return $this->getField('from'); + } + + /** + * Returns profile that created the album. + * + * @return GraphPage|null + */ + public function getPlace() + { + return $this->getField('place'); + } + + /** + * Returns a link to this album on Facebook. + * + * @return string|null + */ + public function getLink() + { + return $this->getField('link'); + } + + /** + * Returns the textual location of the album. + * + * @return string|null + */ + public function getLocation() + { + return $this->getField('location'); + } + + /** + * Returns the title of the album. + * + * @return string|null + */ + public function getName() + { + return $this->getField('name'); + } + + /** + * Returns the privacy settings for the album. + * + * @return string|null + */ + public function getPrivacy() + { + return $this->getField('privacy'); + } + + /** + * Returns the type of the album. + * + * enum{ profile, mobile, wall, normal, album } + * + * @return string|null + */ + public function getType() + { + return $this->getField('type'); + } +} diff --git a/oauth/facebook-sdk-v5/GraphNodes/GraphApplication.php b/oauth/facebook-sdk-v5/GraphNodes/GraphApplication.php new file mode 100644 index 0000000..69b09bb --- /dev/null +++ b/oauth/facebook-sdk-v5/GraphNodes/GraphApplication.php @@ -0,0 +1,43 @@ +getField('id'); + } +} diff --git a/oauth/facebook-sdk-v5/GraphNodes/GraphCoverPhoto.php b/oauth/facebook-sdk-v5/GraphNodes/GraphCoverPhoto.php new file mode 100644 index 0000000..ee60750 --- /dev/null +++ b/oauth/facebook-sdk-v5/GraphNodes/GraphCoverPhoto.php @@ -0,0 +1,72 @@ +getField('id'); + } + + /** + * Returns the source of cover if it exists + * + * @return string|null + */ + public function getSource() + { + return $this->getField('source'); + } + + /** + * Returns the offset_x of cover if it exists + * + * @return int|null + */ + public function getOffsetX() + { + return $this->getField('offset_x'); + } + + /** + * Returns the offset_y of cover if it exists + * + * @return int|null + */ + public function getOffsetY() + { + return $this->getField('offset_y'); + } +} diff --git a/oauth/facebook-sdk-v5/GraphNodes/GraphEdge.php b/oauth/facebook-sdk-v5/GraphNodes/GraphEdge.php new file mode 100644 index 0000000..95f3284 --- /dev/null +++ b/oauth/facebook-sdk-v5/GraphNodes/GraphEdge.php @@ -0,0 +1,260 @@ +request = $request; + $this->metaData = $metaData; + $this->parentEdgeEndpoint = $parentEdgeEndpoint; + $this->subclassName = $subclassName; + + parent::__construct($data); + } + + /** + * Gets the parent Graph edge endpoint that generated the list. + * + * @return string|null + */ + public function getParentGraphEdge() + { + return $this->parentEdgeEndpoint; + } + + /** + * Gets the subclass name that the child GraphNode's are cast as. + * + * @return string|null + */ + public function getSubClassName() + { + return $this->subclassName; + } + + /** + * Returns the raw meta data associated with this GraphEdge. + * + * @return array + */ + public function getMetaData() + { + return $this->metaData; + } + + /** + * Returns the next cursor if it exists. + * + * @return string|null + */ + public function getNextCursor() + { + return $this->getCursor('after'); + } + + /** + * Returns the previous cursor if it exists. + * + * @return string|null + */ + public function getPreviousCursor() + { + return $this->getCursor('before'); + } + + /** + * Returns the cursor for a specific direction if it exists. + * + * @param string $direction The direction of the page: after|before + * + * @return string|null + */ + public function getCursor($direction) + { + if (isset($this->metaData['paging']['cursors'][$direction])) { + return $this->metaData['paging']['cursors'][$direction]; + } + + return null; + } + + /** + * Generates a pagination URL based on a cursor. + * + * @param string $direction The direction of the page: next|previous + * + * @return string|null + * + * @throws FacebookSDKException + */ + public function getPaginationUrl($direction) + { + $this->validateForPagination(); + + // Do we have a paging URL? + if (isset($this->metaData['paging'][$direction])) { + // Graph returns the full URL with all the original params. + // We just want the endpoint though. + $pageUrl = $this->metaData['paging'][$direction]; + + return FacebookUrlManipulator::baseGraphUrlEndpoint($pageUrl); + } + + // Do we have a cursor to work with? + $cursorDirection = $direction === 'next' ? 'after' : 'before'; + $cursor = $this->getCursor($cursorDirection); + if (!$cursor) { + return null; + } + + // If we don't know the ID of the parent node, this ain't gonna work. + if (!$this->parentEdgeEndpoint) { + return null; + } + + // We have the parent node ID, paging cursor & original request. + // These were the ingredients chosen to create the perfect little URL. + $pageUrl = $this->parentEdgeEndpoint . '?' . $cursorDirection . '=' . urlencode($cursor); + + // Pull in the original params + $originalUrl = $this->request->getUrl(); + $pageUrl = FacebookUrlManipulator::mergeUrlParams($originalUrl, $pageUrl); + + return FacebookUrlManipulator::forceSlashPrefix($pageUrl); + } + + /** + * Validates whether or not we can paginate on this request. + * + * @throws FacebookSDKException + */ + public function validateForPagination() + { + if ($this->request->getMethod() !== 'GET') { + throw new FacebookSDKException('You can only paginate on a GET request.', 720); + } + } + + /** + * Gets the request object needed to make a next|previous page request. + * + * @param string $direction The direction of the page: next|previous + * + * @return FacebookRequest|null + * + * @throws FacebookSDKException + */ + public function getPaginationRequest($direction) + { + $pageUrl = $this->getPaginationUrl($direction); + if (!$pageUrl) { + return null; + } + + $newRequest = clone $this->request; + $newRequest->setEndpoint($pageUrl); + + return $newRequest; + } + + /** + * Gets the request object needed to make a "next" page request. + * + * @return FacebookRequest|null + * + * @throws FacebookSDKException + */ + public function getNextPageRequest() + { + return $this->getPaginationRequest('next'); + } + + /** + * Gets the request object needed to make a "previous" page request. + * + * @return FacebookRequest|null + * + * @throws FacebookSDKException + */ + public function getPreviousPageRequest() + { + return $this->getPaginationRequest('previous'); + } + + /** + * The total number of results according to Graph if it exists. + * + * This will be returned if the summary=true modifier is present in the request. + * + * @return int|null + */ + public function getTotalCount() + { + if (isset($this->metaData['summary']['total_count'])) { + return $this->metaData['summary']['total_count']; + } + + return null; + } +} diff --git a/oauth/facebook-sdk-v5/GraphNodes/GraphEvent.php b/oauth/facebook-sdk-v5/GraphNodes/GraphEvent.php new file mode 100644 index 0000000..19ff2fb --- /dev/null +++ b/oauth/facebook-sdk-v5/GraphNodes/GraphEvent.php @@ -0,0 +1,242 @@ + '\Facebook\GraphNodes\GraphCoverPhoto', + 'place' => '\Facebook\GraphNodes\GraphPage', + 'picture' => '\Facebook\GraphNodes\GraphPicture', + 'parent_group' => '\Facebook\GraphNodes\GraphGroup', + ]; + + /** + * Returns the `id` (The event ID) as string if present. + * + * @return string|null + */ + public function getId() + { + return $this->getField('id'); + } + + /** + * Returns the `cover` (Cover picture) as GraphCoverPhoto if present. + * + * @return GraphCoverPhoto|null + */ + public function getCover() + { + return $this->getField('cover'); + } + + /** + * Returns the `description` (Long-form description) as string if present. + * + * @return string|null + */ + public function getDescription() + { + return $this->getField('description'); + } + + /** + * Returns the `end_time` (End time, if one has been set) as DateTime if present. + * + * @return \DateTime|null + */ + public function getEndTime() + { + return $this->getField('end_time'); + } + + /** + * Returns the `is_date_only` (Whether the event only has a date specified, but no time) as bool if present. + * + * @return bool|null + */ + public function getIsDateOnly() + { + return $this->getField('is_date_only'); + } + + /** + * Returns the `name` (Event name) as string if present. + * + * @return string|null + */ + public function getName() + { + return $this->getField('name'); + } + + /** + * Returns the `owner` (The profile that created the event) as GraphNode if present. + * + * @return GraphNode|null + */ + public function getOwner() + { + return $this->getField('owner'); + } + + /** + * Returns the `parent_group` (The group the event belongs to) as GraphGroup if present. + * + * @return GraphGroup|null + */ + public function getParentGroup() + { + return $this->getField('parent_group'); + } + + /** + * Returns the `place` (Event Place information) as GraphPage if present. + * + * @return GraphPage|null + */ + public function getPlace() + { + return $this->getField('place'); + } + + /** + * Returns the `privacy` (Who can see the event) as string if present. + * + * @return string|null + */ + public function getPrivacy() + { + return $this->getField('privacy'); + } + + /** + * Returns the `start_time` (Start time) as DateTime if present. + * + * @return \DateTime|null + */ + public function getStartTime() + { + return $this->getField('start_time'); + } + + /** + * Returns the `ticket_uri` (The link users can visit to buy a ticket to this event) as string if present. + * + * @return string|null + */ + public function getTicketUri() + { + return $this->getField('ticket_uri'); + } + + /** + * Returns the `timezone` (Timezone) as string if present. + * + * @return string|null + */ + public function getTimezone() + { + return $this->getField('timezone'); + } + + /** + * Returns the `updated_time` (Last update time) as DateTime if present. + * + * @return \DateTime|null + */ + public function getUpdatedTime() + { + return $this->getField('updated_time'); + } + + /** + * Returns the `picture` (Event picture) as GraphPicture if present. + * + * @return GraphPicture|null + */ + public function getPicture() + { + return $this->getField('picture'); + } + + /** + * Returns the `attending_count` (Number of people attending the event) as int if present. + * + * @return int|null + */ + public function getAttendingCount() + { + return $this->getField('attending_count'); + } + + /** + * Returns the `declined_count` (Number of people who declined the event) as int if present. + * + * @return int|null + */ + public function getDeclinedCount() + { + return $this->getField('declined_count'); + } + + /** + * Returns the `maybe_count` (Number of people who maybe going to the event) as int if present. + * + * @return int|null + */ + public function getMaybeCount() + { + return $this->getField('maybe_count'); + } + + /** + * Returns the `noreply_count` (Number of people who did not reply to the event) as int if present. + * + * @return int|null + */ + public function getNoreplyCount() + { + return $this->getField('noreply_count'); + } + + /** + * Returns the `invited_count` (Number of people invited to the event) as int if present. + * + * @return int|null + */ + public function getInvitedCount() + { + return $this->getField('invited_count'); + } +} diff --git a/oauth/facebook-sdk-v5/GraphNodes/GraphGroup.php b/oauth/facebook-sdk-v5/GraphNodes/GraphGroup.php new file mode 100644 index 0000000..07a4dbd --- /dev/null +++ b/oauth/facebook-sdk-v5/GraphNodes/GraphGroup.php @@ -0,0 +1,171 @@ + '\Facebook\GraphNodes\GraphCoverPhoto', + 'venue' => '\Facebook\GraphNodes\GraphLocation', + ]; + + /** + * Returns the `id` (The Group ID) as string if present. + * + * @return string|null + */ + public function getId() + { + return $this->getField('id'); + } + + /** + * Returns the `cover` (The cover photo of the Group) as GraphCoverPhoto if present. + * + * @return GraphCoverPhoto|null + */ + public function getCover() + { + return $this->getField('cover'); + } + + /** + * Returns the `description` (A brief description of the Group) as string if present. + * + * @return string|null + */ + public function getDescription() + { + return $this->getField('description'); + } + + /** + * Returns the `email` (The email address to upload content to the Group. Only current members of the Group can use this) as string if present. + * + * @return string|null + */ + public function getEmail() + { + return $this->getField('email'); + } + + /** + * Returns the `icon` (The URL for the Group's icon) as string if present. + * + * @return string|null + */ + public function getIcon() + { + return $this->getField('icon'); + } + + /** + * Returns the `link` (The Group's website) as string if present. + * + * @return string|null + */ + public function getLink() + { + return $this->getField('link'); + } + + /** + * Returns the `name` (The name of the Group) as string if present. + * + * @return string|null + */ + public function getName() + { + return $this->getField('name'); + } + + /** + * Returns the `member_request_count` (Number of people asking to join the group.) as int if present. + * + * @return int|null + */ + public function getMemberRequestCount() + { + return $this->getField('member_request_count'); + } + + /** + * Returns the `owner` (The profile that created this Group) as GraphNode if present. + * + * @return GraphNode|null + */ + public function getOwner() + { + return $this->getField('owner'); + } + + /** + * Returns the `parent` (The parent Group of this Group, if it exists) as GraphNode if present. + * + * @return GraphNode|null + */ + public function getParent() + { + return $this->getField('parent'); + } + + /** + * Returns the `privacy` (The privacy setting of the Group) as string if present. + * + * @return string|null + */ + public function getPrivacy() + { + return $this->getField('privacy'); + } + + /** + * Returns the `updated_time` (The last time the Group was updated (this includes changes in the Group's properties and changes in posts and comments if user can see them)) as \DateTime if present. + * + * @return \DateTime|null + */ + public function getUpdatedTime() + { + return $this->getField('updated_time'); + } + + /** + * Returns the `venue` (The location for the Group) as GraphLocation if present. + * + * @return GraphLocation|null + */ + public function getVenue() + { + return $this->getField('venue'); + } + +} diff --git a/oauth/facebook-sdk-v5/GraphNodes/GraphList.php b/oauth/facebook-sdk-v5/GraphNodes/GraphList.php new file mode 100644 index 0000000..a60a07a --- /dev/null +++ b/oauth/facebook-sdk-v5/GraphNodes/GraphList.php @@ -0,0 +1,36 @@ +getField('street'); + } + + /** + * Returns the city component of the location + * + * @return string|null + */ + public function getCity() + { + return $this->getField('city'); + } + + /** + * Returns the state component of the location + * + * @return string|null + */ + public function getState() + { + return $this->getField('state'); + } + + /** + * Returns the country component of the location + * + * @return string|null + */ + public function getCountry() + { + return $this->getField('country'); + } + + /** + * Returns the zipcode component of the location + * + * @return string|null + */ + public function getZip() + { + return $this->getField('zip'); + } + + /** + * Returns the latitude component of the location + * + * @return float|null + */ + public function getLatitude() + { + return $this->getField('latitude'); + } + + /** + * Returns the street component of the location + * + * @return float|null + */ + public function getLongitude() + { + return $this->getField('longitude'); + } +} diff --git a/oauth/facebook-sdk-v5/GraphNodes/GraphNode.php b/oauth/facebook-sdk-v5/GraphNodes/GraphNode.php new file mode 100644 index 0000000..0d2f504 --- /dev/null +++ b/oauth/facebook-sdk-v5/GraphNodes/GraphNode.php @@ -0,0 +1,185 @@ +castItems($data)); + } + + /** + * Iterates over an array and detects the types each node + * should be cast to and returns all the items as an array. + * + * @TODO Add auto-casting to AccessToken entities. + * + * @param array $data The array to iterate over. + * + * @return array + */ + public function castItems(array $data) + { + $items = []; + + foreach ($data as $k => $v) { + if ($this->shouldCastAsDateTime($k) + && (is_numeric($v) + || $k === 'birthday' + || $this->isIso8601DateString($v)) + ) { + $items[$k] = $this->castToDateTime($v); + } else { + $items[$k] = $v; + } + } + + return $items; + } + + /** + * Uncasts any auto-casted datatypes. + * Basically the reverse of castItems(). + * + * @return array + */ + public function uncastItems() + { + $items = $this->asArray(); + + return array_map(function ($v) { + if ($v instanceof \DateTime) { + return $v->format(\DateTime::ISO8601); + } + + return $v; + }, $items); + } + + /** + * Get the collection of items as JSON. + * + * @param int $options + * + * @return string + */ + public function asJson($options = 0) + { + return json_encode($this->uncastItems(), $options); + } + + /** + * Detects an ISO 8601 formatted string. + * + * @param string $string + * + * @return boolean + * + * @see https://developers.facebook.com/docs/graph-api/using-graph-api/#readmodifiers + * @see http://www.cl.cam.ac.uk/~mgk25/iso-time.html + * @see http://en.wikipedia.org/wiki/ISO_8601 + */ + public function isIso8601DateString($string) + { + // This insane regex was yoinked from here: + // http://www.pelagodesign.com/blog/2009/05/20/iso-8601-date-validation-that-doesnt-suck/ + // ...and I'm all like: + // http://thecodinglove.com/post/95378251969/when-code-works-and-i-dont-know-why + $crazyInsaneRegexThatSomehowDetectsIso8601 = '/^([\+-]?\d{4}(?!\d{2}\b))' + . '((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?' + . '|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d' + . '|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])' + . '((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d' + . '([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/'; + + return preg_match($crazyInsaneRegexThatSomehowDetectsIso8601, $string) === 1; + } + + /** + * Determines if a value from Graph should be cast to DateTime. + * + * @param string $key + * + * @return boolean + */ + public function shouldCastAsDateTime($key) + { + return in_array($key, [ + 'created_time', + 'updated_time', + 'start_time', + 'end_time', + 'backdated_time', + 'issued_at', + 'expires_at', + 'birthday', + 'publish_time' + ], true); + } + + /** + * Casts a date value from Graph to DateTime. + * + * @param int|string $value + * + * @return \DateTime + */ + public function castToDateTime($value) + { + if (is_int($value)) { + $dt = new \DateTime(); + $dt->setTimestamp($value); + } else { + $dt = new \DateTime($value); + } + + return $dt; + } + + /** + * Getter for $graphObjectMap. + * + * @return array + */ + public static function getObjectMap() + { + return static::$graphObjectMap; + } +} diff --git a/oauth/facebook-sdk-v5/GraphNodes/GraphNodeFactory.php b/oauth/facebook-sdk-v5/GraphNodes/GraphNodeFactory.php new file mode 100644 index 0000000..e1bedd9 --- /dev/null +++ b/oauth/facebook-sdk-v5/GraphNodes/GraphNodeFactory.php @@ -0,0 +1,392 @@ +response = $response; + $this->decodedBody = $response->getDecodedBody(); + } + + /** + * Tries to convert a FacebookResponse entity into a GraphNode. + * + * @param string|null $subclassName The GraphNode sub class to cast to. + * + * @return GraphNode + * + * @throws FacebookSDKException + */ + public function makeGraphNode($subclassName = null) + { + $this->validateResponseAsArray(); + $this->validateResponseCastableAsGraphNode(); + + return $this->castAsGraphNodeOrGraphEdge($this->decodedBody, $subclassName); + } + + /** + * Convenience method for creating a GraphAchievement collection. + * + * @return GraphAchievement + * + * @throws FacebookSDKException + */ + public function makeGraphAchievement() + { + return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphAchievement'); + } + + /** + * Convenience method for creating a GraphAlbum collection. + * + * @return GraphAlbum + * + * @throws FacebookSDKException + */ + public function makeGraphAlbum() + { + return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphAlbum'); + } + + /** + * Convenience method for creating a GraphPage collection. + * + * @return GraphPage + * + * @throws FacebookSDKException + */ + public function makeGraphPage() + { + return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphPage'); + } + + /** + * Convenience method for creating a GraphSessionInfo collection. + * + * @return GraphSessionInfo + * + * @throws FacebookSDKException + */ + public function makeGraphSessionInfo() + { + return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphSessionInfo'); + } + + /** + * Convenience method for creating a GraphUser collection. + * + * @return GraphUser + * + * @throws FacebookSDKException + */ + public function makeGraphUser() + { + return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphUser'); + } + + /** + * Convenience method for creating a GraphEvent collection. + * + * @return GraphEvent + * + * @throws FacebookSDKException + */ + public function makeGraphEvent() + { + return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphEvent'); + } + + /** + * Convenience method for creating a GraphGroup collection. + * + * @return GraphGroup + * + * @throws FacebookSDKException + */ + public function makeGraphGroup() + { + return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphGroup'); + } + + /** + * Tries to convert a FacebookResponse entity into a GraphEdge. + * + * @param string|null $subclassName The GraphNode sub class to cast the list items to. + * @param boolean $auto_prefix Toggle to auto-prefix the subclass name. + * + * @return GraphEdge + * + * @throws FacebookSDKException + */ + public function makeGraphEdge($subclassName = null, $auto_prefix = true) + { + $this->validateResponseAsArray(); + $this->validateResponseCastableAsGraphEdge(); + + if ($subclassName && $auto_prefix) { + $subclassName = static::BASE_GRAPH_OBJECT_PREFIX . $subclassName; + } + + return $this->castAsGraphNodeOrGraphEdge($this->decodedBody, $subclassName); + } + + /** + * Validates the decoded body. + * + * @throws FacebookSDKException + */ + public function validateResponseAsArray() + { + if (!is_array($this->decodedBody)) { + throw new FacebookSDKException('Unable to get response from Graph as array.', 620); + } + } + + /** + * Validates that the return data can be cast as a GraphNode. + * + * @throws FacebookSDKException + */ + public function validateResponseCastableAsGraphNode() + { + if (isset($this->decodedBody['data']) && static::isCastableAsGraphEdge($this->decodedBody['data'])) { + throw new FacebookSDKException( + 'Unable to convert response from Graph to a GraphNode because the response looks like a GraphEdge. Try using GraphNodeFactory::makeGraphEdge() instead.', + 620 + ); + } + } + + /** + * Validates that the return data can be cast as a GraphEdge. + * + * @throws FacebookSDKException + */ + public function validateResponseCastableAsGraphEdge() + { + if (!(isset($this->decodedBody['data']) && static::isCastableAsGraphEdge($this->decodedBody['data']))) { + throw new FacebookSDKException( + 'Unable to convert response from Graph to a GraphEdge because the response does not look like a GraphEdge. Try using GraphNodeFactory::makeGraphNode() instead.', + 620 + ); + } + } + + /** + * Safely instantiates a GraphNode of $subclassName. + * + * @param array $data The array of data to iterate over. + * @param string|null $subclassName The subclass to cast this collection to. + * + * @return GraphNode + * + * @throws FacebookSDKException + */ + public function safelyMakeGraphNode(array $data, $subclassName = null) + { + $subclassName = $subclassName ?: static::BASE_GRAPH_NODE_CLASS; + static::validateSubclass($subclassName); + + // Remember the parent node ID + $parentNodeId = isset($data['id']) ? $data['id'] : null; + + $items = []; + + foreach ($data as $k => $v) { + // Array means could be recurable + if (is_array($v)) { + // Detect any smart-casting from the $graphObjectMap array. + // This is always empty on the GraphNode collection, but subclasses can define + // their own array of smart-casting types. + $graphObjectMap = $subclassName::getObjectMap(); + $objectSubClass = isset($graphObjectMap[$k]) + ? $graphObjectMap[$k] + : null; + + // Could be a GraphEdge or GraphNode + $items[$k] = $this->castAsGraphNodeOrGraphEdge($v, $objectSubClass, $k, $parentNodeId); + } else { + $items[$k] = $v; + } + } + + return new $subclassName($items); + } + + /** + * Takes an array of values and determines how to cast each node. + * + * @param array $data The array of data to iterate over. + * @param string|null $subclassName The subclass to cast this collection to. + * @param string|null $parentKey The key of this data (Graph edge). + * @param string|null $parentNodeId The parent Graph node ID. + * + * @return GraphNode|GraphEdge + * + * @throws FacebookSDKException + */ + public function castAsGraphNodeOrGraphEdge(array $data, $subclassName = null, $parentKey = null, $parentNodeId = null) + { + if (isset($data['data'])) { + // Create GraphEdge + if (static::isCastableAsGraphEdge($data['data'])) { + return $this->safelyMakeGraphEdge($data, $subclassName, $parentKey, $parentNodeId); + } + // Sometimes Graph is a weirdo and returns a GraphNode under the "data" key + $data = $data['data']; + } + + // Create GraphNode + return $this->safelyMakeGraphNode($data, $subclassName); + } + + /** + * Return an array of GraphNode's. + * + * @param array $data The array of data to iterate over. + * @param string|null $subclassName The GraphNode subclass to cast each item in the list to. + * @param string|null $parentKey The key of this data (Graph edge). + * @param string|null $parentNodeId The parent Graph node ID. + * + * @return GraphEdge + * + * @throws FacebookSDKException + */ + public function safelyMakeGraphEdge(array $data, $subclassName = null, $parentKey = null, $parentNodeId = null) + { + if (!isset($data['data'])) { + throw new FacebookSDKException('Cannot cast data to GraphEdge. Expected a "data" key.', 620); + } + + $dataList = []; + foreach ($data['data'] as $graphNode) { + $dataList[] = $this->safelyMakeGraphNode($graphNode, $subclassName, $parentKey, $parentNodeId); + } + + $metaData = $this->getMetaData($data); + + // We'll need to make an edge endpoint for this in case it's a GraphEdge (for cursor pagination) + $parentGraphEdgeEndpoint = $parentNodeId && $parentKey ? '/' . $parentNodeId . '/' . $parentKey : null; + $className = static::BASE_GRAPH_EDGE_CLASS; + + return new $className($this->response->getRequest(), $dataList, $metaData, $parentGraphEdgeEndpoint, $subclassName); + } + + /** + * Get the meta data from a list in a Graph response. + * + * @param array $data The Graph response. + * + * @return array + */ + public function getMetaData(array $data) + { + unset($data['data']); + + return $data; + } + + /** + * Determines whether or not the data should be cast as a GraphEdge. + * + * @param array $data + * + * @return boolean + */ + public static function isCastableAsGraphEdge(array $data) + { + if ($data === []) { + return true; + } + + // Checks for a sequential numeric array which would be a GraphEdge + return array_keys($data) === range(0, count($data) - 1); + } + + /** + * Ensures that the subclass in question is valid. + * + * @param string $subclassName The GraphNode subclass to validate. + * + * @throws FacebookSDKException + */ + public static function validateSubclass($subclassName) + { + if ($subclassName == static::BASE_GRAPH_NODE_CLASS || is_subclass_of($subclassName, static::BASE_GRAPH_NODE_CLASS)) { + return; + } + + throw new FacebookSDKException('The given subclass "' . $subclassName . '" is not valid. Cannot cast to an object that is not a GraphNode subclass.', 620); + } +} diff --git a/oauth/facebook-sdk-v5/GraphNodes/GraphObject.php b/oauth/facebook-sdk-v5/GraphNodes/GraphObject.php new file mode 100644 index 0000000..bb8f8e4 --- /dev/null +++ b/oauth/facebook-sdk-v5/GraphNodes/GraphObject.php @@ -0,0 +1,36 @@ +makeGraphNode($subclassName); + } + + /** + * Convenience method for creating a GraphEvent collection. + * + * @return GraphEvent + * + * @throws FacebookSDKException + */ + public function makeGraphEvent() + { + return $this->makeGraphObject(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphEvent'); + } + + /** + * Tries to convert a FacebookResponse entity into a GraphEdge. + * + * @param string|null $subclassName The GraphNode sub class to cast the list items to. + * @param boolean $auto_prefix Toggle to auto-prefix the subclass name. + * + * @return GraphEdge + * + * @deprecated 5.0.0 GraphObjectFactory has been renamed to GraphNodeFactory + */ + public function makeGraphList($subclassName = null, $auto_prefix = true) + { + return $this->makeGraphEdge($subclassName, $auto_prefix); + } +} diff --git a/oauth/facebook-sdk-v5/GraphNodes/GraphPage.php b/oauth/facebook-sdk-v5/GraphNodes/GraphPage.php new file mode 100644 index 0000000..ab8e31a --- /dev/null +++ b/oauth/facebook-sdk-v5/GraphNodes/GraphPage.php @@ -0,0 +1,125 @@ + '\Facebook\GraphNodes\GraphPage', + 'global_brand_parent_page' => '\Facebook\GraphNodes\GraphPage', + 'location' => '\Facebook\GraphNodes\GraphLocation', + ]; + + /** + * Returns the ID for the user's page as a string if present. + * + * @return string|null + */ + public function getId() + { + return $this->getField('id'); + } + + /** + * Returns the Category for the user's page as a string if present. + * + * @return string|null + */ + public function getCategory() + { + return $this->getField('category'); + } + + /** + * Returns the Name of the user's page as a string if present. + * + * @return string|null + */ + public function getName() + { + return $this->getField('name'); + } + + /** + * Returns the best available Page on Facebook. + * + * @return GraphPage|null + */ + public function getBestPage() + { + return $this->getField('best_page'); + } + + /** + * Returns the brand's global (parent) Page. + * + * @return GraphPage|null + */ + public function getGlobalBrandParentPage() + { + return $this->getField('global_brand_parent_page'); + } + + /** + * Returns the location of this place. + * + * @return GraphLocation|null + */ + public function getLocation() + { + return $this->getField('location'); + } + + /** + * Returns the page access token for the admin user. + * + * Only available in the `/me/accounts` context. + * + * @return string|null + */ + public function getAccessToken() + { + return $this->getField('access_token'); + } + + /** + * Returns the roles of the page admin user. + * + * Only available in the `/me/accounts` context. + * + * @return array|null + */ + public function getPerms() + { + return $this->getField('perms'); + } +} diff --git a/oauth/facebook-sdk-v5/GraphNodes/GraphPicture.php b/oauth/facebook-sdk-v5/GraphNodes/GraphPicture.php new file mode 100644 index 0000000..bfd37fa --- /dev/null +++ b/oauth/facebook-sdk-v5/GraphNodes/GraphPicture.php @@ -0,0 +1,72 @@ +getField('is_silhouette'); + } + + /** + * Returns the url of user picture if it exists + * + * @return string|null + */ + public function getUrl() + { + return $this->getField('url'); + } + + /** + * Returns the width of user picture if it exists + * + * @return int|null + */ + public function getWidth() + { + return $this->getField('width'); + } + + /** + * Returns the height of user picture if it exists + * + * @return int|null + */ + public function getHeight() + { + return $this->getField('height'); + } +} diff --git a/oauth/facebook-sdk-v5/GraphNodes/GraphSessionInfo.php b/oauth/facebook-sdk-v5/GraphNodes/GraphSessionInfo.php new file mode 100644 index 0000000..3c9e2ff --- /dev/null +++ b/oauth/facebook-sdk-v5/GraphNodes/GraphSessionInfo.php @@ -0,0 +1,102 @@ +getField('app_id'); + } + + /** + * Returns the application name the token was issued for. + * + * @return string|null + */ + public function getApplication() + { + return $this->getField('application'); + } + + /** + * Returns the date & time that the token expires. + * + * @return \DateTime|null + */ + public function getExpiresAt() + { + return $this->getField('expires_at'); + } + + /** + * Returns whether the token is valid. + * + * @return boolean + */ + public function getIsValid() + { + return $this->getField('is_valid'); + } + + /** + * Returns the date & time the token was issued at. + * + * @return \DateTime|null + */ + public function getIssuedAt() + { + return $this->getField('issued_at'); + } + + /** + * Returns the scope permissions associated with the token. + * + * @return array + */ + public function getScopes() + { + return $this->getField('scopes'); + } + + /** + * Returns the login id of the user associated with the token. + * + * @return string|null + */ + public function getUserId() + { + return $this->getField('user_id'); + } +} diff --git a/oauth/facebook-sdk-v5/GraphNodes/GraphUser.php b/oauth/facebook-sdk-v5/GraphNodes/GraphUser.php new file mode 100644 index 0000000..cb9ddbb --- /dev/null +++ b/oauth/facebook-sdk-v5/GraphNodes/GraphUser.php @@ -0,0 +1,162 @@ + '\Facebook\GraphNodes\GraphPage', + 'location' => '\Facebook\GraphNodes\GraphPage', + 'significant_other' => '\Facebook\GraphNodes\GraphUser', + 'picture' => '\Facebook\GraphNodes\GraphPicture', + ]; + + /** + * Returns the ID for the user as a string if present. + * + * @return string|null + */ + public function getId() + { + return $this->getField('id'); + } + + /** + * Returns the name for the user as a string if present. + * + * @return string|null + */ + public function getName() + { + return $this->getField('name'); + } + + /** + * Returns the first name for the user as a string if present. + * + * @return string|null + */ + public function getFirstName() + { + return $this->getField('first_name'); + } + + /** + * Returns the middle name for the user as a string if present. + * + * @return string|null + */ + public function getMiddleName() + { + return $this->getField('middle_name'); + } + + /** + * Returns the last name for the user as a string if present. + * + * @return string|null + */ + public function getLastName() + { + return $this->getField('last_name'); + } + + /** + * Returns the gender for the user as a string if present. + * + * @return string|null + */ + public function getGender() + { + return $this->getField('gender'); + } + + /** + * Returns the Facebook URL for the user as a string if available. + * + * @return string|null + */ + public function getLink() + { + return $this->getField('link'); + } + + /** + * Returns the users birthday, if available. + * + * @return \DateTime|null + */ + public function getBirthday() + { + return $this->getField('birthday'); + } + + /** + * Returns the current location of the user as a GraphPage. + * + * @return GraphPage|null + */ + public function getLocation() + { + return $this->getField('location'); + } + + /** + * Returns the current location of the user as a GraphPage. + * + * @return GraphPage|null + */ + public function getHometown() + { + return $this->getField('hometown'); + } + + /** + * Returns the current location of the user as a GraphUser. + * + * @return GraphUser|null + */ + public function getSignificantOther() + { + return $this->getField('significant_other'); + } + + /** + * Returns the picture of the user as a GraphPicture + * + * @return GraphPicture|null + */ + public function getPicture() + { + return $this->getField('picture'); + } +} diff --git a/oauth/facebook-sdk-v5/Helpers/FacebookCanvasHelper.php b/oauth/facebook-sdk-v5/Helpers/FacebookCanvasHelper.php new file mode 100644 index 0000000..8068526 --- /dev/null +++ b/oauth/facebook-sdk-v5/Helpers/FacebookCanvasHelper.php @@ -0,0 +1,52 @@ +signedRequest ? $this->signedRequest->get('app_data') : null; + } + + /** + * Get raw signed request from POST. + * + * @return string|null + */ + public function getRawSignedRequest() + { + return $this->getRawSignedRequestFromPost() ?: null; + } +} diff --git a/oauth/facebook-sdk-v5/Helpers/FacebookJavaScriptHelper.php b/oauth/facebook-sdk-v5/Helpers/FacebookJavaScriptHelper.php new file mode 100644 index 0000000..5d406b5 --- /dev/null +++ b/oauth/facebook-sdk-v5/Helpers/FacebookJavaScriptHelper.php @@ -0,0 +1,42 @@ +getRawSignedRequestFromCookie(); + } +} diff --git a/oauth/facebook-sdk-v5/Helpers/FacebookPageTabHelper.php b/oauth/facebook-sdk-v5/Helpers/FacebookPageTabHelper.php new file mode 100644 index 0000000..ee43f5e --- /dev/null +++ b/oauth/facebook-sdk-v5/Helpers/FacebookPageTabHelper.php @@ -0,0 +1,95 @@ +signedRequest) { + return; + } + + $this->pageData = $this->signedRequest->get('page'); + } + + /** + * Returns a value from the page data. + * + * @param string $key + * @param mixed|null $default + * + * @return mixed|null + */ + public function getPageData($key, $default = null) + { + if (isset($this->pageData[$key])) { + return $this->pageData[$key]; + } + + return $default; + } + + /** + * Returns true if the user is an admin. + * + * @return boolean + */ + public function isAdmin() + { + return $this->getPageData('admin') === true; + } + + /** + * Returns the page id if available. + * + * @return string|null + */ + public function getPageId() + { + return $this->getPageData('id'); + } +} diff --git a/oauth/facebook-sdk-v5/Helpers/FacebookRedirectLoginHelper.php b/oauth/facebook-sdk-v5/Helpers/FacebookRedirectLoginHelper.php new file mode 100644 index 0000000..144a5b4 --- /dev/null +++ b/oauth/facebook-sdk-v5/Helpers/FacebookRedirectLoginHelper.php @@ -0,0 +1,360 @@ +oAuth2Client = $oAuth2Client; + $this->persistentDataHandler = $persistentDataHandler ?: new FacebookSessionPersistentDataHandler(); + $this->urlDetectionHandler = $urlHandler ?: new FacebookUrlDetectionHandler(); + $this->pseudoRandomStringGenerator = $prsg ?: $this->detectPseudoRandomStringGenerator(); + } + + /** + * Returns the persistent data handler. + * + * @return PersistentDataInterface + */ + public function getPersistentDataHandler() + { + return $this->persistentDataHandler; + } + + /** + * Returns the URL detection handler. + * + * @return UrlDetectionInterface + */ + public function getUrlDetectionHandler() + { + return $this->urlDetectionHandler; + } + + /** + * Returns the cryptographically secure pseudo-random string generator. + * + * @return PseudoRandomStringGeneratorInterface + */ + public function getPseudoRandomStringGenerator() + { + return $this->pseudoRandomStringGenerator; + } + + /** + * Detects which pseudo-random string generator to use. + * + * @return PseudoRandomStringGeneratorInterface + * + * @throws FacebookSDKException + */ + public function detectPseudoRandomStringGenerator() + { + // Since openssl_random_pseudo_bytes() can sometimes return non-cryptographically + // secure pseudo-random strings (in rare cases), we check for mcrypt_create_iv() first. + if (function_exists('mcrypt_create_iv')) { + return new McryptPseudoRandomStringGenerator(); + } + + if (function_exists('openssl_random_pseudo_bytes')) { + return new OpenSslPseudoRandomStringGenerator(); + } + + if (!ini_get('open_basedir') && is_readable('/dev/urandom')) { + return new UrandomPseudoRandomStringGenerator(); + } + + throw new FacebookSDKException('Unable to detect a cryptographically secure pseudo-random string generator.'); + } + + /** + * Stores CSRF state and returns a URL to which the user should be sent to in order to continue the login process with Facebook. + * + * @param string $redirectUrl The URL Facebook should redirect users to after login. + * @param array $scope List of permissions to request during login. + * @param array $params An array of parameters to generate URL. + * @param string $separator The separator to use in http_build_query(). + * + * @return string + */ + private function makeUrl($redirectUrl, array $scope, array $params = [], $separator = '&') + { + $state = $this->pseudoRandomStringGenerator->getPseudoRandomString(static::CSRF_LENGTH); + $this->persistentDataHandler->set('state', $state); + + return $this->oAuth2Client->getAuthorizationUrl($redirectUrl, $state, $scope, $params, $separator); + } + + /** + * Returns the URL to send the user in order to login to Facebook. + * + * @param string $redirectUrl The URL Facebook should redirect users to after login. + * @param array $scope List of permissions to request during login. + * @param string $separator The separator to use in http_build_query(). + * + * @return string + */ + public function getLoginUrl($redirectUrl, array $scope = [], $separator = '&') + { + return $this->makeUrl($redirectUrl, $scope, [], $separator); + } + + /** + * Returns the URL to send the user in order to log out of Facebook. + * + * @param AccessToken|string $accessToken The access token that will be logged out. + * @param string $next The url Facebook should redirect the user to after a successful logout. + * @param string $separator The separator to use in http_build_query(). + * + * @return string + * + * @throws FacebookSDKException + */ + public function getLogoutUrl($accessToken, $next, $separator = '&') + { + if (!$accessToken instanceof AccessToken) { + $accessToken = new AccessToken($accessToken); + } + + if ($accessToken->isAppAccessToken()) { + throw new FacebookSDKException('Cannot generate a logout URL with an app access token.', 722); + } + + $params = [ + 'next' => $next, + 'access_token' => $accessToken->getValue(), + ]; + + return 'https://www.facebook.com/logout.php?' . http_build_query($params, null, $separator); + } + + /** + * Returns the URL to send the user in order to login to Facebook with permission(s) to be re-asked. + * + * @param string $redirectUrl The URL Facebook should redirect users to after login. + * @param array $scope List of permissions to request during login. + * @param string $separator The separator to use in http_build_query(). + * + * @return string + */ + public function getReRequestUrl($redirectUrl, array $scope = [], $separator = '&') + { + $params = ['auth_type' => 'rerequest']; + + return $this->makeUrl($redirectUrl, $scope, $params, $separator); + } + + /** + * Returns the URL to send the user in order to login to Facebook with user to be re-authenticated. + * + * @param string $redirectUrl The URL Facebook should redirect users to after login. + * @param array $scope List of permissions to request during login. + * @param string $separator The separator to use in http_build_query(). + * + * @return string + */ + public function getReAuthenticationUrl($redirectUrl, array $scope = [], $separator = '&') + { + $params = ['auth_type' => 'reauthenticate']; + + return $this->makeUrl($redirectUrl, $scope, $params, $separator); + } + + /** + * Takes a valid code from a login redirect, and returns an AccessToken entity. + * + * @param string|null $redirectUrl The redirect URL. + * + * @return AccessToken|null + * + * @throws FacebookSDKException + */ + public function getAccessToken($redirectUrl = null) + { + if (!$code = $this->getCode()) { + return null; + } + + $this->validateCsrf(); + + $redirectUrl = $redirectUrl ?: $this->urlDetectionHandler->getCurrentUrl(); + // At minimum we need to remove the state param + $redirectUrl = FacebookUrlManipulator::removeParamsFromUrl($redirectUrl, ['state']); + + return $this->oAuth2Client->getAccessTokenFromCode($code, $redirectUrl); + } + + /** + * Validate the request against a cross-site request forgery. + * + * @throws FacebookSDKException + */ + protected function validateCsrf() + { + $state = $this->getState(); + $savedState = $this->persistentDataHandler->get('state'); + + if (!$state || !$savedState) { + throw new FacebookSDKException('Cross-site request forgery validation failed. Required param "state" missing.'); + } + + $savedLen = strlen($savedState); + $givenLen = strlen($state); + + if ($savedLen !== $givenLen) { + throw new FacebookSDKException('Cross-site request forgery validation failed. The "state" param from the URL and session do not match.'); + } + + $result = 0; + for ($i = 0; $i < $savedLen; $i++) { + $result |= ord($state[$i]) ^ ord($savedState[$i]); + } + + if ($result !== 0) { + throw new FacebookSDKException('Cross-site request forgery validation failed. The "state" param from the URL and session do not match.'); + } + } + + /** + * Return the code. + * + * @return string|null + */ + protected function getCode() + { + return $this->getInput('code'); + } + + /** + * Return the state. + * + * @return string|null + */ + protected function getState() + { + return $this->getInput('state'); + } + + /** + * Return the error code. + * + * @return string|null + */ + public function getErrorCode() + { + return $this->getInput('error_code'); + } + + /** + * Returns the error. + * + * @return string|null + */ + public function getError() + { + return $this->getInput('error'); + } + + /** + * Returns the error reason. + * + * @return string|null + */ + public function getErrorReason() + { + return $this->getInput('error_reason'); + } + + /** + * Returns the error description. + * + * @return string|null + */ + public function getErrorDescription() + { + return $this->getInput('error_description'); + } + + /** + * Returns a value from a GET param. + * + * @param string $key + * + * @return string|null + */ + private function getInput($key) + { + return isset($_GET[$key]) ? $_GET[$key] : null; + } +} diff --git a/oauth/facebook-sdk-v5/Helpers/FacebookSignedRequestFromInputHelper.php b/oauth/facebook-sdk-v5/Helpers/FacebookSignedRequestFromInputHelper.php new file mode 100644 index 0000000..aafa246 --- /dev/null +++ b/oauth/facebook-sdk-v5/Helpers/FacebookSignedRequestFromInputHelper.php @@ -0,0 +1,166 @@ +app = $app; + $graphVersion = $graphVersion ?: Facebook::DEFAULT_GRAPH_VERSION; + $this->oAuth2Client = new OAuth2Client($this->app, $client, $graphVersion); + + $this->instantiateSignedRequest(); + } + + /** + * Instantiates a new SignedRequest entity. + * + * @param string|null + */ + public function instantiateSignedRequest($rawSignedRequest = null) + { + $rawSignedRequest = $rawSignedRequest ?: $this->getRawSignedRequest(); + + if (!$rawSignedRequest) { + return; + } + + $this->signedRequest = new SignedRequest($this->app, $rawSignedRequest); + } + + /** + * Returns an AccessToken entity from the signed request. + * + * @return AccessToken|null + * + * @throws \Facebook\Exceptions\FacebookSDKException + */ + public function getAccessToken() + { + if ($this->signedRequest && $this->signedRequest->hasOAuthData()) { + $code = $this->signedRequest->get('code'); + $accessToken = $this->signedRequest->get('oauth_token'); + + if ($code && !$accessToken) { + return $this->oAuth2Client->getAccessTokenFromCode($code); + } + + $expiresAt = $this->signedRequest->get('expires', 0); + + return new AccessToken($accessToken, $expiresAt); + } + + return null; + } + + /** + * Returns the SignedRequest entity. + * + * @return SignedRequest|null + */ + public function getSignedRequest() + { + return $this->signedRequest; + } + + /** + * Returns the user_id if available. + * + * @return string|null + */ + public function getUserId() + { + return $this->signedRequest ? $this->signedRequest->getUserId() : null; + } + + /** + * Get raw signed request from input. + * + * @return string|null + */ + abstract public function getRawSignedRequest(); + + /** + * Get raw signed request from POST input. + * + * @return string|null + */ + public function getRawSignedRequestFromPost() + { + if (isset($_POST['signed_request'])) { + return $_POST['signed_request']; + } + + return null; + } + + /** + * Get raw signed request from cookie set from the Javascript SDK. + * + * @return string|null + */ + public function getRawSignedRequestFromCookie() + { + if (isset($_COOKIE['fbsr_' . $this->app->getId()])) { + return $_COOKIE['fbsr_' . $this->app->getId()]; + } + + return null; + } +} diff --git a/oauth/facebook-sdk-v5/Http/GraphRawResponse.php b/oauth/facebook-sdk-v5/Http/GraphRawResponse.php new file mode 100644 index 0000000..583d303 --- /dev/null +++ b/oauth/facebook-sdk-v5/Http/GraphRawResponse.php @@ -0,0 +1,137 @@ +httpResponseCode = (int)$httpStatusCode; + } + + if (is_array($headers)) { + $this->headers = $headers; + } else { + $this->setHeadersFromString($headers); + } + + $this->body = $body; + } + + /** + * Return the response headers. + * + * @return array + */ + public function getHeaders() + { + return $this->headers; + } + + /** + * Return the body of the response. + * + * @return string + */ + public function getBody() + { + return $this->body; + } + + /** + * Return the HTTP response code. + * + * @return int + */ + public function getHttpResponseCode() + { + return $this->httpResponseCode; + } + + /** + * Sets the HTTP response code from a raw header. + * + * @param string $rawResponseHeader + */ + public function setHttpResponseCodeFromHeader($rawResponseHeader) + { + preg_match('|HTTP/\d\.\d\s+(\d+)\s+.*|', $rawResponseHeader, $match); + $this->httpResponseCode = (int)$match[1]; + } + + /** + * Parse the raw headers and set as an array. + * + * @param string $rawHeaders The raw headers from the response. + */ + protected function setHeadersFromString($rawHeaders) + { + // Normalize line breaks + $rawHeaders = str_replace("\r\n", "\n", $rawHeaders); + + // There will be multiple headers if a 301 was followed + // or a proxy was followed, etc + $headerCollection = explode("\n\n", trim($rawHeaders)); + // We just want the last response (at the end) + $rawHeader = array_pop($headerCollection); + + $headerComponents = explode("\n", $rawHeader); + foreach ($headerComponents as $line) { + if (strpos($line, ': ') === false) { + $this->setHttpResponseCodeFromHeader($line); + } else { + list($key, $value) = explode(': ', $line); + $this->headers[$key] = $value; + } + } + } +} diff --git a/oauth/facebook-sdk-v5/Http/RequestBodyInterface.php b/oauth/facebook-sdk-v5/Http/RequestBodyInterface.php new file mode 100644 index 0000000..97e0a2e --- /dev/null +++ b/oauth/facebook-sdk-v5/Http/RequestBodyInterface.php @@ -0,0 +1,39 @@ +params = $params; + $this->files = $files; + $this->boundary = $boundary ?: uniqid(); + } + + /** + * @inheritdoc + */ + public function getBody() + { + $body = ''; + + // Compile normal params + $params = $this->getNestedParams($this->params); + foreach ($params as $k => $v) { + $body .= $this->getParamString($k, $v); + } + + // Compile files + foreach ($this->files as $k => $v) { + $body .= $this->getFileString($k, $v); + } + + // Peace out + $body .= "--{$this->boundary}--\r\n"; + + return $body; + } + + /** + * Get the boundary + * + * @return string + */ + public function getBoundary() + { + return $this->boundary; + } + + /** + * Get the string needed to transfer a file. + * + * @param string $name + * @param FacebookFile $file + * + * @return string + */ + private function getFileString($name, FacebookFile $file) + { + return sprintf( + "--%s\r\nContent-Disposition: form-data; name=\"%s\"; filename=\"%s\"%s\r\n\r\n%s\r\n", + $this->boundary, + $name, + $file->getFileName(), + $this->getFileHeaders($file), + $file->getContents() + ); + } + + /** + * Get the string needed to transfer a POST field. + * + * @param string $name + * @param string $value + * + * @return string + */ + private function getParamString($name, $value) + { + return sprintf( + "--%s\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n%s\r\n", + $this->boundary, + $name, + $value + ); + } + + /** + * Returns the params as an array of nested params. + * + * @param array $params + * + * @return array + */ + private function getNestedParams(array $params) + { + $query = http_build_query($params, null, '&'); + $params = explode('&', $query); + $result = []; + + foreach ($params as $param) { + list($key, $value) = explode('=', $param, 2); + $result[urldecode($key)] = urldecode($value); + } + + return $result; + } + + /** + * Get the headers needed before transferring the content of a POST file. + * + * @param FacebookFile $file + * + * @return string + */ + protected function getFileHeaders(FacebookFile $file) + { + return "\r\nContent-Type: {$file->getMimetype()}"; + } +} diff --git a/oauth/facebook-sdk-v5/Http/RequestBodyUrlEncoded.php b/oauth/facebook-sdk-v5/Http/RequestBodyUrlEncoded.php new file mode 100644 index 0000000..77c2b64 --- /dev/null +++ b/oauth/facebook-sdk-v5/Http/RequestBodyUrlEncoded.php @@ -0,0 +1,55 @@ +params = $params; + } + + /** + * @inheritdoc + */ + public function getBody() + { + return http_build_query($this->params, null, '&'); + } +} diff --git a/oauth/facebook-sdk-v5/HttpClients/FacebookCurl.php b/oauth/facebook-sdk-v5/HttpClients/FacebookCurl.php new file mode 100644 index 0000000..e5d124a --- /dev/null +++ b/oauth/facebook-sdk-v5/HttpClients/FacebookCurl.php @@ -0,0 +1,129 @@ +curl = curl_init(); + } + + /** + * Set a curl option + * + * @param $key + * @param $value + */ + public function setopt($key, $value) + { + curl_setopt($this->curl, $key, $value); + } + + /** + * Set an array of options to a curl resource + * + * @param array $options + */ + public function setoptArray(array $options) + { + curl_setopt_array($this->curl, $options); + } + + /** + * Send a curl request + * + * @return mixed + */ + public function exec() + { + return curl_exec($this->curl); + } + + /** + * Return the curl error number + * + * @return int + */ + public function errno() + { + return curl_errno($this->curl); + } + + /** + * Return the curl error message + * + * @return string + */ + public function error() + { + return curl_error($this->curl); + } + + /** + * Get info from a curl reference + * + * @param $type + * + * @return mixed + */ + public function getinfo($type) + { + return curl_getinfo($this->curl, $type); + } + + /** + * Get the currently installed curl version + * + * @return array + */ + public function version() + { + return curl_version(); + } + + /** + * Close the resource connection to curl + */ + public function close() + { + curl_close($this->curl); + } +} diff --git a/oauth/facebook-sdk-v5/HttpClients/FacebookCurlHttpClient.php b/oauth/facebook-sdk-v5/HttpClients/FacebookCurlHttpClient.php new file mode 100644 index 0000000..955ac06 --- /dev/null +++ b/oauth/facebook-sdk-v5/HttpClients/FacebookCurlHttpClient.php @@ -0,0 +1,210 @@ +facebookCurl = $facebookCurl ?: new FacebookCurl(); + } + + /** + * @inheritdoc + */ + public function send($url, $method, $body, array $headers, $timeOut) + { + $this->openConnection($url, $method, $body, $headers, $timeOut); + $this->sendRequest(); + + if ($curlErrorCode = $this->facebookCurl->errno()) { + throw new FacebookSDKException($this->facebookCurl->error(), $curlErrorCode); + } + + // Separate the raw headers from the raw body + list($rawHeaders, $rawBody) = $this->extractResponseHeadersAndBody(); + + $this->closeConnection(); + + return new GraphRawResponse($rawHeaders, $rawBody); + } + + /** + * Opens a new curl connection. + * + * @param string $url The endpoint to send the request to. + * @param string $method The request method. + * @param string $body The body of the request. + * @param array $headers The request headers. + * @param int $timeOut The timeout in seconds for the request. + */ + public function openConnection($url, $method, $body, array $headers, $timeOut) + { + $options = [ + CURLOPT_CUSTOMREQUEST => $method, + CURLOPT_HTTPHEADER => $this->compileRequestHeaders($headers), + CURLOPT_URL => $url, + CURLOPT_CONNECTTIMEOUT => 10, + CURLOPT_TIMEOUT => $timeOut, + CURLOPT_RETURNTRANSFER => true, // Follow 301 redirects + CURLOPT_HEADER => true, // Enable header processing + CURLOPT_SSL_VERIFYHOST => 2, + CURLOPT_SSL_VERIFYPEER => true, + CURLOPT_CAINFO => __DIR__ . '/certs/DigiCertHighAssuranceEVRootCA.pem', + ]; + + if ($method !== "GET") { + $options[CURLOPT_POSTFIELDS] = $body; + } + + $this->facebookCurl->init(); + $this->facebookCurl->setoptArray($options); + } + + /** + * Closes an existing curl connection + */ + public function closeConnection() + { + $this->facebookCurl->close(); + } + + /** + * Send the request and get the raw response from curl + */ + public function sendRequest() + { + $this->rawResponse = $this->facebookCurl->exec(); + } + + /** + * Compiles the request headers into a curl-friendly format. + * + * @param array $headers The request headers. + * + * @return array + */ + public function compileRequestHeaders(array $headers) + { + $return = []; + + foreach ($headers as $key => $value) { + $return[] = $key . ': ' . $value; + } + + return $return; + } + + /** + * Extracts the headers and the body into a two-part array + * + * @return array + */ + public function extractResponseHeadersAndBody() + { + $headerSize = $this->getHeaderSize(); + + $rawHeaders = mb_substr($this->rawResponse, 0, $headerSize); + $rawBody = mb_substr($this->rawResponse, $headerSize); + + return [trim($rawHeaders), trim($rawBody)]; + } + + /** + * Return proper header size + * + * @return integer + */ + private function getHeaderSize() + { + $headerSize = $this->facebookCurl->getinfo(CURLINFO_HEADER_SIZE); + // This corrects a Curl bug where header size does not account + // for additional Proxy headers. + if ($this->needsCurlProxyFix()) { + // Additional way to calculate the request body size. + if (preg_match('/Content-Length: (\d+)/', $this->rawResponse, $m)) { + $headerSize = mb_strlen($this->rawResponse) - $m[1]; + } elseif (stripos($this->rawResponse, self::CONNECTION_ESTABLISHED) !== false) { + $headerSize += mb_strlen(self::CONNECTION_ESTABLISHED); + } + } + + return $headerSize; + } + + /** + * Detect versions of Curl which report incorrect header lengths when + * using Proxies. + * + * @return boolean + */ + private function needsCurlProxyFix() + { + $ver = $this->facebookCurl->version(); + $version = $ver['version_number']; + + return $version < self::CURL_PROXY_QUIRK_VER; + } +} diff --git a/oauth/facebook-sdk-v5/HttpClients/FacebookGuzzleHttpClient.php b/oauth/facebook-sdk-v5/HttpClients/FacebookGuzzleHttpClient.php new file mode 100644 index 0000000..6f2a1c6 --- /dev/null +++ b/oauth/facebook-sdk-v5/HttpClients/FacebookGuzzleHttpClient.php @@ -0,0 +1,97 @@ +guzzleClient = $guzzleClient ?: new Client(); + } + + /** + * @inheritdoc + */ + public function send($url, $method, $body, array $headers, $timeOut) + { + $options = [ + 'headers' => $headers, + 'body' => $body, + 'timeout' => $timeOut, + 'connect_timeout' => 10, + 'verify' => __DIR__ . '/certs/DigiCertHighAssuranceEVRootCA.pem', + ]; + $request = $this->guzzleClient->createRequest($method, $url, $options); + + try { + $rawResponse = $this->guzzleClient->send($request); + } catch (RequestException $e) { + $rawResponse = $e->getResponse(); + + if ($e->getPrevious() instanceof RingException || !$rawResponse instanceof ResponseInterface) { + throw new FacebookSDKException($e->getMessage(), $e->getCode()); + } + } + + $rawHeaders = $this->getHeadersAsString($rawResponse); + $rawBody = $rawResponse->getBody(); + $httpStatusCode = $rawResponse->getStatusCode(); + + return new GraphRawResponse($rawHeaders, $rawBody, $httpStatusCode); + } + + /** + * Returns the Guzzle array of headers as a string. + * + * @param ResponseInterface $response The Guzzle response. + * + * @return string + */ + public function getHeadersAsString(ResponseInterface $response) + { + $headers = $response->getHeaders(); + $rawHeaders = []; + foreach ($headers as $name => $values) { + $rawHeaders[] = $name . ": " . implode(", ", $values); + } + + return implode("\r\n", $rawHeaders); + } +} diff --git a/oauth/facebook-sdk-v5/HttpClients/FacebookHttpClientInterface.php b/oauth/facebook-sdk-v5/HttpClients/FacebookHttpClientInterface.php new file mode 100644 index 0000000..0029bc0 --- /dev/null +++ b/oauth/facebook-sdk-v5/HttpClients/FacebookHttpClientInterface.php @@ -0,0 +1,47 @@ +stream = stream_context_create($options); + } + + /** + * The response headers from the stream wrapper + * + * @return array|null + */ + public function getResponseHeaders() + { + return $this->responseHeaders; + } + + /** + * Send a stream wrapped request + * + * @param string $url + * + * @return mixed + */ + public function fileGetContents($url) + { + $rawResponse = file_get_contents($url, false, $this->stream); + $this->responseHeaders = $http_response_header; + + return $rawResponse; + } +} diff --git a/oauth/facebook-sdk-v5/HttpClients/FacebookStreamHttpClient.php b/oauth/facebook-sdk-v5/HttpClients/FacebookStreamHttpClient.php new file mode 100644 index 0000000..b157514 --- /dev/null +++ b/oauth/facebook-sdk-v5/HttpClients/FacebookStreamHttpClient.php @@ -0,0 +1,94 @@ +facebookStream = $facebookStream ?: new FacebookStream(); + } + + /** + * @inheritdoc + */ + public function send($url, $method, $body, array $headers, $timeOut) + { + $options = [ + 'http' => [ + 'method' => $method, + 'header' => $this->compileHeader($headers), + 'content' => $body, + 'timeout' => $timeOut, + 'ignore_errors' => true + ], + 'ssl' => [ + 'verify_peer' => true, + 'verify_peer_name' => true, + 'allow_self_signed' => true, // All root certificates are self-signed + 'cafile' => __DIR__ . '/certs/DigiCertHighAssuranceEVRootCA.pem', + ], + ]; + + $this->facebookStream->streamContextCreate($options); + $rawBody = $this->facebookStream->fileGetContents($url); + $rawHeaders = $this->facebookStream->getResponseHeaders(); + + if ($rawBody === false || !$rawHeaders) { + throw new FacebookSDKException('Stream returned an empty response', 660); + } + + $rawHeaders = implode("\r\n", $rawHeaders); + + return new GraphRawResponse($rawHeaders, $rawBody); + } + + /** + * Formats the headers for use in the stream wrapper. + * + * @param array $headers The request headers. + * + * @return string + */ + public function compileHeader(array $headers) + { + $header = []; + foreach ($headers as $k => $v) { + $header[] = $k . ': ' . $v; + } + + return implode("\r\n", $header); + } +} diff --git a/oauth/facebook-sdk-v5/HttpClients/certs/DigiCertHighAssuranceEVRootCA.pem b/oauth/facebook-sdk-v5/HttpClients/certs/DigiCertHighAssuranceEVRootCA.pem new file mode 100644 index 0000000..9e6810a --- /dev/null +++ b/oauth/facebook-sdk-v5/HttpClients/certs/DigiCertHighAssuranceEVRootCA.pem @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- diff --git a/oauth/facebook-sdk-v5/PersistentData/FacebookMemoryPersistentDataHandler.php b/oauth/facebook-sdk-v5/PersistentData/FacebookMemoryPersistentDataHandler.php new file mode 100644 index 0000000..93a6686 --- /dev/null +++ b/oauth/facebook-sdk-v5/PersistentData/FacebookMemoryPersistentDataHandler.php @@ -0,0 +1,53 @@ +sessionData[$key]) ? $this->sessionData[$key] : null; + } + + /** + * @inheritdoc + */ + public function set($key, $value) + { + $this->sessionData[$key] = $value; + } +} diff --git a/oauth/facebook-sdk-v5/PersistentData/FacebookSessionPersistentDataHandler.php b/oauth/facebook-sdk-v5/PersistentData/FacebookSessionPersistentDataHandler.php new file mode 100644 index 0000000..698bfd0 --- /dev/null +++ b/oauth/facebook-sdk-v5/PersistentData/FacebookSessionPersistentDataHandler.php @@ -0,0 +1,76 @@ +sessionPrefix . $key])) { + return $_SESSION[$this->sessionPrefix . $key]; + } + + return null; + } + + /** + * @inheritdoc + */ + public function set($key, $value) + { + $_SESSION[$this->sessionPrefix . $key] = $value; + } +} diff --git a/oauth/facebook-sdk-v5/PersistentData/PersistentDataInterface.php b/oauth/facebook-sdk-v5/PersistentData/PersistentDataInterface.php new file mode 100644 index 0000000..bd7e072 --- /dev/null +++ b/oauth/facebook-sdk-v5/PersistentData/PersistentDataInterface.php @@ -0,0 +1,49 @@ +validateLength($length); + + $binaryString = mcrypt_create_iv($length, MCRYPT_DEV_URANDOM); + + if ($binaryString === false) { + throw new FacebookSDKException( + static::ERROR_MESSAGE . + 'mcrypt_create_iv() returned an error.' + ); + } + + return $this->binToHex($binaryString, $length); + } +} diff --git a/oauth/facebook-sdk-v5/PseudoRandomString/OpenSslPseudoRandomStringGenerator.php b/oauth/facebook-sdk-v5/PseudoRandomString/OpenSslPseudoRandomStringGenerator.php new file mode 100644 index 0000000..f4ea6b8 --- /dev/null +++ b/oauth/facebook-sdk-v5/PseudoRandomString/OpenSslPseudoRandomStringGenerator.php @@ -0,0 +1,67 @@ +validateLength($length); + + $wasCryptographicallyStrong = false; + $binaryString = openssl_random_pseudo_bytes($length, $wasCryptographicallyStrong); + + if ($binaryString === false) { + throw new FacebookSDKException(static::ERROR_MESSAGE . 'openssl_random_pseudo_bytes() returned an unknown error.'); + } + + if ($wasCryptographicallyStrong !== true) { + throw new FacebookSDKException(static::ERROR_MESSAGE . 'openssl_random_pseudo_bytes() returned a pseudo-random string but it was not cryptographically secure and cannot be used.'); + } + + return $this->binToHex($binaryString, $length); + } +} diff --git a/oauth/facebook-sdk-v5/PseudoRandomString/PseudoRandomStringGeneratorInterface.php b/oauth/facebook-sdk-v5/PseudoRandomString/PseudoRandomStringGeneratorInterface.php new file mode 100644 index 0000000..970330c --- /dev/null +++ b/oauth/facebook-sdk-v5/PseudoRandomString/PseudoRandomStringGeneratorInterface.php @@ -0,0 +1,45 @@ +validateLength($length); + + $stream = fopen('/dev/urandom', 'rb'); + if (!is_resource($stream)) { + throw new FacebookSDKException( + static::ERROR_MESSAGE . + 'Unable to open stream to /dev/urandom.' + ); + } + + if (!defined('HHVM_VERSION')) { + stream_set_read_buffer($stream, 0); + } + + $binaryString = fread($stream, $length); + fclose($stream); + + if (!$binaryString) { + throw new FacebookSDKException( + static::ERROR_MESSAGE . + 'Stream to /dev/urandom returned no data.' + ); + } + + return $this->binToHex($binaryString, $length); + } +} diff --git a/oauth/facebook-sdk-v5/SignedRequest.php b/oauth/facebook-sdk-v5/SignedRequest.php new file mode 100644 index 0000000..77099a3 --- /dev/null +++ b/oauth/facebook-sdk-v5/SignedRequest.php @@ -0,0 +1,332 @@ +app = $facebookApp; + + if (!$rawSignedRequest) { + return; + } + + $this->rawSignedRequest = $rawSignedRequest; + + $this->parse(); + } + + /** + * Returns the raw signed request data. + * + * @return string|null + */ + public function getRawSignedRequest() + { + return $this->rawSignedRequest; + } + + /** + * Returns the parsed signed request data. + * + * @return array|null + */ + public function getPayload() + { + return $this->payload; + } + + /** + * Returns a property from the signed request data if available. + * + * @param string $key + * @param mixed|null $default + * + * @return mixed|null + */ + public function get($key, $default = null) + { + if (isset($this->payload[$key])) { + return $this->payload[$key]; + } + + return $default; + } + + /** + * Returns user_id from signed request data if available. + * + * @return string|null + */ + public function getUserId() + { + return $this->get('user_id'); + } + + /** + * Checks for OAuth data in the payload. + * + * @return boolean + */ + public function hasOAuthData() + { + return $this->get('oauth_token') || $this->get('code'); + } + + /** + * Creates a signed request from an array of data. + * + * @param array $payload + * + * @return string + */ + public function make(array $payload) + { + $payload['algorithm'] = isset($payload['algorithm']) ? $payload['algorithm'] : 'HMAC-SHA256'; + $payload['issued_at'] = isset($payload['issued_at']) ? $payload['issued_at'] : time(); + $encodedPayload = $this->base64UrlEncode(json_encode($payload)); + + $hashedSig = $this->hashSignature($encodedPayload); + $encodedSig = $this->base64UrlEncode($hashedSig); + + return $encodedSig . '.' . $encodedPayload; + } + + /** + * Validates and decodes a signed request and saves + * the payload to an array. + */ + protected function parse() + { + list($encodedSig, $encodedPayload) = $this->split(); + + // Signature validation + $sig = $this->decodeSignature($encodedSig); + $hashedSig = $this->hashSignature($encodedPayload); + $this->validateSignature($hashedSig, $sig); + + $this->payload = $this->decodePayload($encodedPayload); + + // Payload validation + $this->validateAlgorithm(); + } + + /** + * Splits a raw signed request into signature and payload. + * + * @returns array + * + * @throws FacebookSDKException + */ + protected function split() + { + if (strpos($this->rawSignedRequest, '.') === false) { + throw new FacebookSDKException('Malformed signed request.', 606); + } + + return explode('.', $this->rawSignedRequest, 2); + } + + /** + * Decodes the raw signature from a signed request. + * + * @param string $encodedSig + * + * @returns string + * + * @throws FacebookSDKException + */ + protected function decodeSignature($encodedSig) + { + $sig = $this->base64UrlDecode($encodedSig); + + if (!$sig) { + throw new FacebookSDKException('Signed request has malformed encoded signature data.', 607); + } + + return $sig; + } + + /** + * Decodes the raw payload from a signed request. + * + * @param string $encodedPayload + * + * @returns array + * + * @throws FacebookSDKException + */ + protected function decodePayload($encodedPayload) + { + $payload = $this->base64UrlDecode($encodedPayload); + + if ($payload) { + $payload = json_decode($payload, true); + } + + if (!is_array($payload)) { + throw new FacebookSDKException('Signed request has malformed encoded payload data.', 607); + } + + return $payload; + } + + /** + * Validates the algorithm used in a signed request. + * + * @throws FacebookSDKException + */ + protected function validateAlgorithm() + { + if ($this->get('algorithm') !== 'HMAC-SHA256') { + throw new FacebookSDKException('Signed request is using the wrong algorithm.', 605); + } + } + + /** + * Hashes the signature used in a signed request. + * + * @param string $encodedData + * + * @return string + * + * @throws FacebookSDKException + */ + protected function hashSignature($encodedData) + { + $hashedSig = hash_hmac( + 'sha256', + $encodedData, + $this->app->getSecret(), + $raw_output = true + ); + + if (!$hashedSig) { + throw new FacebookSDKException('Unable to hash signature from encoded payload data.', 602); + } + + return $hashedSig; + } + + /** + * Validates the signature used in a signed request. + * + * @param string $hashedSig + * @param string $sig + * + * @throws FacebookSDKException + */ + protected function validateSignature($hashedSig, $sig) + { + if (mb_strlen($hashedSig) === mb_strlen($sig)) { + $validate = 0; + for ($i = 0; $i < mb_strlen($sig); $i++) { + $validate |= ord($hashedSig[$i]) ^ ord($sig[$i]); + } + if ($validate === 0) { + return; + } + } + + throw new FacebookSDKException('Signed request has an invalid signature.', 602); + } + + /** + * Base64 decoding which replaces characters: + * + instead of - + * / instead of _ + * + * @link http://en.wikipedia.org/wiki/Base64#URL_applications + * + * @param string $input base64 url encoded input + * + * @return string decoded string + */ + public function base64UrlDecode($input) + { + $urlDecodedBase64 = strtr($input, '-_', '+/'); + $this->validateBase64($urlDecodedBase64); + + return base64_decode($urlDecodedBase64); + } + + /** + * Base64 encoding which replaces characters: + * + instead of - + * / instead of _ + * + * @link http://en.wikipedia.org/wiki/Base64#URL_applications + * + * @param string $input string to encode + * + * @return string base64 url encoded input + */ + public function base64UrlEncode($input) + { + return strtr(base64_encode($input), '+/', '-_'); + } + + /** + * Validates a base64 string. + * + * @param string $input base64 value to validate + * + * @throws FacebookSDKException + */ + protected function validateBase64($input) + { + if (!preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $input)) { + throw new FacebookSDKException('Signed request contains malformed base64 encoding.', 608); + } + } +} diff --git a/oauth/facebook-sdk-v5/Url/FacebookUrlDetectionHandler.php b/oauth/facebook-sdk-v5/Url/FacebookUrlDetectionHandler.php new file mode 100644 index 0000000..5fbb9ce --- /dev/null +++ b/oauth/facebook-sdk-v5/Url/FacebookUrlDetectionHandler.php @@ -0,0 +1,163 @@ +getHttpScheme() . '://' . $this->getHostName() . $this->getServerVar('REQUEST_URI'); + } + + /** + * Get the currently active URL scheme. + * + * @return string + */ + protected function getHttpScheme() + { + return $this->isBehindSsl() ? 'https' : 'http'; + } + + /** + * Tries to detect if the server is running behind an SSL. + * + * @return boolean + */ + protected function isBehindSsl() + { + // Check for proxy first + $protocol = $this->getHeader('X_FORWARDED_PROTO'); + if ($protocol) { + return $this->protocolWithActiveSsl($protocol); + } + + $protocol = $this->getServerVar('HTTPS'); + if ($protocol) { + return $this->protocolWithActiveSsl($protocol); + } + + return (string)$this->getServerVar('SERVER_PORT') === '443'; + } + + /** + * Detects an active SSL protocol value. + * + * @param string $protocol + * + * @return boolean + */ + protected function protocolWithActiveSsl($protocol) + { + $protocol = strtolower((string)$protocol); + + return in_array($protocol, ['on', '1', 'https', 'ssl'], true); + } + + /** + * Tries to detect the host name of the server. + * + * Some elements adapted from + * + * @see https://github.com/symfony/HttpFoundation/blob/master/Request.php + * + * @return string + */ + protected function getHostName() + { + // Check for proxy first + if ($host = $this->getHeader('X_FORWARDED_HOST')) { + $elements = explode(',', $host); + $host = $elements[count($elements) - 1]; + } elseif (!$host = $this->getHeader('HOST')) { + if (!$host = $this->getServerVar('SERVER_NAME')) { + $host = $this->getServerVar('SERVER_ADDR'); + } + } + + // trim and remove port number from host + // host is lowercase as per RFC 952/2181 + $host = strtolower(preg_replace('/:\d+$/', '', trim($host))); + + // Port number + $scheme = $this->getHttpScheme(); + $port = $this->getCurrentPort(); + $appendPort = ':' . $port; + + // Don't append port number if a normal port. + if (($scheme == 'http' && $port == '80') || ($scheme == 'https' && $port == '443')) { + $appendPort = ''; + } + + return $host . $appendPort; + } + + protected function getCurrentPort() + { + // Check for proxy first + $port = $this->getHeader('X_FORWARDED_PORT'); + if ($port) { + return (string)$port; + } + + $protocol = (string)$this->getHeader('X_FORWARDED_PROTO'); + if ($protocol === 'https') { + return '443'; + } + + return (string)$this->getServerVar('SERVER_PORT'); + } + + /** + * Returns the a value from the $_SERVER super global. + * + * @param string $key + * + * @return string + */ + protected function getServerVar($key) + { + return isset($_SERVER[$key]) ? $_SERVER[$key] : ''; + } + + /** + * Gets a value from the HTTP request headers. + * + * @param string $key + * + * @return string + */ + protected function getHeader($key) + { + return $this->getServerVar('HTTP_' . $key); + } +} diff --git a/oauth/facebook-sdk-v5/Url/FacebookUrlManipulator.php b/oauth/facebook-sdk-v5/Url/FacebookUrlManipulator.php new file mode 100644 index 0000000..20a0299 --- /dev/null +++ b/oauth/facebook-sdk-v5/Url/FacebookUrlManipulator.php @@ -0,0 +1,167 @@ + 0) { + $query = '?' . http_build_query($params, null, '&'); + } + } + + $scheme = isset($parts['scheme']) ? $parts['scheme'] . '://' : ''; + $host = isset($parts['host']) ? $parts['host'] : ''; + $port = isset($parts['port']) ? ':' . $parts['port'] : ''; + $path = isset($parts['path']) ? $parts['path'] : ''; + $fragment = isset($parts['fragment']) ? '#' . $parts['fragment'] : ''; + + return $scheme . $host . $port . $path . $query . $fragment; + } + + /** + * Gracefully appends params to the URL. + * + * @param string $url The URL that will receive the params. + * @param array $newParams The params to append to the URL. + * + * @return string + */ + public static function appendParamsToUrl($url, array $newParams = []) + { + if (!$newParams) { + return $url; + } + + if (strpos($url, '?') === false) { + return $url . '?' . http_build_query($newParams, null, '&'); + } + + list($path, $query) = explode('?', $url, 2); + $existingParams = []; + parse_str($query, $existingParams); + + // Favor params from the original URL over $newParams + $newParams = array_merge($newParams, $existingParams); + + // Sort for a predicable order + ksort($newParams); + + return $path . '?' . http_build_query($newParams, null, '&'); + } + + /** + * Returns the params from a URL in the form of an array. + * + * @param string $url The URL to parse the params from. + * + * @return array + */ + public static function getParamsAsArray($url) + { + $query = parse_url($url, PHP_URL_QUERY); + if (!$query) { + return []; + } + $params = []; + parse_str($query, $params); + + return $params; + } + + /** + * Adds the params of the first URL to the second URL. + * + * Any params that already exist in the second URL will go untouched. + * + * @param string $urlToStealFrom The URL harvest the params from. + * @param string $urlToAddTo The URL that will receive the new params. + * + * @return string The $urlToAddTo with any new params from $urlToStealFrom. + */ + public static function mergeUrlParams($urlToStealFrom, $urlToAddTo) + { + $newParams = static::getParamsAsArray($urlToStealFrom); + // Nothing new to add, return as-is + if (!$newParams) { + return $urlToAddTo; + } + + return static::appendParamsToUrl($urlToAddTo, $newParams); + } + + /** + * Check for a "/" prefix and prepend it if not exists. + * + * @param string|null $string + * + * @return string|null + */ + public static function forceSlashPrefix($string) + { + if (!$string) { + return $string; + } + + return strpos($string, '/') === 0 ? $string : '/' . $string; + } + + /** + * Trims off the hostname and Graph version from a URL. + * + * @param string $urlToTrim The URL the needs the surgery. + * + * @return string The $urlToTrim with the hostname and Graph version removed. + */ + public static function baseGraphUrlEndpoint($urlToTrim) + { + return '/' . preg_replace('/^https:\/\/.+\.facebook\.com(\/v.+?)?\//', '', $urlToTrim); + } +} diff --git a/oauth/facebook-sdk-v5/Url/UrlDetectionInterface.php b/oauth/facebook-sdk-v5/Url/UrlDetectionInterface.php new file mode 100644 index 0000000..764a606 --- /dev/null +++ b/oauth/facebook-sdk-v5/Url/UrlDetectionInterface.php @@ -0,0 +1,39 @@ +_id); + } + + protected function _init() + { + $this->setRenderPanel(false); + $this->setFormClass('form-horizontal dash-window-form'); + } + + protected function _render() + { + $html = $this->open(); + + $html .= $this->input(Locale::tm('Facebook App ID','oauth'), 'oauth_fb_app_id'); + $html .= $this->input(Locale::tm('Facebook App Secret','oauth'), 'oauth_fb_app_secret'); + $html .= $this->checkbox(Locale::tm('Enable Facebook authentication','oauth'), 'oauth_fb_on', null, false); + $html .= $this->input(Locale::tm('Facebook Page URL','oauth'), 'oauth_fb_page_url'); + + $html .= $this->input(Locale::tm('Vkontakte App ID','oauth'), 'oauth_vk_app_id'); + $html .= $this->input(Locale::tm('Vkontakte App Secret','oauth'), 'oauth_vk_app_secret'); + $html .= $this->checkbox(Locale::tm('Enable Vkontakte authentication','oauth'), 'oauth_vk_on', null, false); + $html .= $this->input(Locale::tm('Vkontakte Group ID','oauth'), 'oauth_vk_group_id'); + $html .= $this->close(); + return $html; + } + + protected function _validate() { + $validator = $this->getValidator(); + + $validator->registerString('oauth_fb_app_id',null,255,false,Locale::t('Invalid value "%s"',Locale::tm('Facebook App ID','oauth'))); + $validator->registerNoTags('oauth_fb_app_id',Locale::t('Invalid value "%s"',Locale::tm('Facebook App ID','oauth'))); + $validator->registerString('oauth_fb_app_secret',null,255,false,Locale::t('Invalid value "%s"',Locale::tm('Facebook App Secret','oauth'))); + $validator->registerNoTags('oauth_fb_app_secret',Locale::t('Invalid value "%s"',Locale::tm('Facebook App Secret','oauth'))); + $validator->registerString('oauth_fb_page_url',null,255,false,Locale::t('Invalid value "%s"',Locale::tm('Facebook Page URL','oauth'))); + $validator->registerNoTags('oauth_fb_page_url',Locale::t('Invalid value "%s"',Locale::tm('Facebook Page URL','oauth'))); + + $validator->registerString('oauth_vk_app_id',null,255,false,Locale::t('Invalid value "%s"',Locale::tm('Vkontakte App ID','oauth'))); + $validator->registerNoTags('oauth_vk_app_id',Locale::t('Invalid value "%s"',Locale::tm('Vkontakte App ID','oauth'))); + $validator->registerString('oauth_vk_app_secret',null,255,false,Locale::t('Invalid value "%s"',Locale::tm('Vkontakte App Secret','oauth'))); + $validator->registerNoTags('oauth_vk_app_secret',Locale::t('Invalid value "%s"',Locale::tm('Vkontakte App Secret','oauth'))); + $validator->registerString('oauth_vk_group_id',null,255,false,Locale::t('Invalid value "%s"',Locale::tm('Vkontakte Group ID','oauth'))); + $validator->registerNoTags('oauth_vk_group_id',Locale::t('Invalid value "%s"',Locale::tm('Vkontakte Group ID','oauth'))); + + } +} \ No newline at end of file diff --git a/oauth/install/fbuser.php b/oauth/install/fbuser.php new file mode 100644 index 0000000..b8624e2 --- /dev/null +++ b/oauth/install/fbuser.php @@ -0,0 +1,48 @@ +_table); + } + + public function getFields() { + return array( + 'id' => Field::primary(), + 'user_id' => Field::int(true, true), + 'fb_id' => Field::string(true), + 'email' => Field::string(true), + 'profile_name' => Field::string(true), + 'date_created' => Field::datetime(true) + ); + } + + public function getKeys() { + return array( + + ); + } + + public function getUnique() { + return array( + 'fb_id' => array('fb_id') + ); + } + + public function getDefaults() { + return array( + + ); + } +} \ No newline at end of file diff --git a/oauth/install/vkuser.php b/oauth/install/vkuser.php new file mode 100644 index 0000000..68c581e --- /dev/null +++ b/oauth/install/vkuser.php @@ -0,0 +1,48 @@ +_table); + } + + public function getFields() { + return array( + 'id' => Field::primary(), + 'user_id' => Field::int(true, true), + 'vk_id' => Field::string(true), + 'email' => Field::string(true), + 'profile_name' => Field::string(true), + 'date_created' => Field::datetime(true) + ); + } + + public function getKeys() { + return array( + + ); + } + + public function getUnique() { + return array( + 'vk_id' => array('vk_id') + ); + } + + public function getDefaults() { + return array( + + ); + } +} \ No newline at end of file diff --git a/oauth/models/fbuser.php b/oauth/models/fbuser.php new file mode 100644 index 0000000..5a36d26 --- /dev/null +++ b/oauth/models/fbuser.php @@ -0,0 +1,35 @@ +where('email','=',$email) + ->get(0); + } + + public static function isUserActive($user, $trust_email) { + $_user = User::findAuthUser($user->email); + if (!$_user) return false; + if ($trust_email && $_user->verified != Zira\Models\User::STATUS_VERIFIED) { + User::getCollection() + ->update(array( + 'verified' => Zira\Models\User::STATUS_VERIFIED + )) + ->where('id','=',$user->id) + ->execute(); + } + Zira\User::setCurrent($_user); + return true; + } + + public static function registerUser($username, $email, $firstname, $secondname, $trust_email) { + $user = new Zira\Models\User(); + $user->firstname = $firstname; + $user->secondname = $secondname; + $user->email = $email; + $user->username = $username; + $password = Zira\User::generateUserToken(); + $user->password = Zira\User::getHashedUserToken($password); + $user->group_id = Zira\User::GROUP_USER; + $user->date_created = date('Y-m-d H:i:s'); + $user->date_logged = date('Y-m-d H:i:s'); + $user->verified = $trust_email ? Zira\Models\User::STATUS_VERIFIED : Zira\Models\User::STATUS_NOT_VERIFIED; + $user->active = Zira\Models\User::STATUS_ACTIVE; + $user->code = Zira\User::generateRememberCode($user->username, $user->email); + $user->save(); + + if ($trust_email) { + try { + self::sendInformEmail($email, $firstname . ' ' . $secondname, $password); + } catch(\Exception $e) { + // ignore + } + } + + Zira\User::setCurrent($user); + return $user; + } + + public static function sendInformEmail($email, $username, $password) { + $message = Zira\Locale::t('Hello %s !', '$user')."\r\n\r\n"; + $message .= Zira\Locale::t('We created an account for you on %s.','$site')."\r\n"; + $message .= Zira\Locale::t('Your new password: %s', '$password')."\r\n\r\n"; + $message .= Zira\Locale::t('You recieved this message, because you logged in to %s first time, using your social network account.','$site'); + + $message = str_replace('$user', $username, $message); + $message = str_replace('$password', $password, $message); + $message = str_replace('$site', Zira\Helper::url('/',true, true), $message); + + Zira\Mail::send($email, Zira\Locale::t('Your new account'), Zira\Helper::html($message)); + } +} \ No newline at end of file diff --git a/oauth/models/settings.php b/oauth/models/settings.php new file mode 100644 index 0000000..2eb02f2 --- /dev/null +++ b/oauth/models/settings.php @@ -0,0 +1,62 @@ + Zira\Locale::t('Permission denied')); + } + + $form = new \Oauth\Forms\Settings(); + if ($form->isValid()) { + $options = array( + 'oauth_fb_app_id'=>'string', + 'oauth_fb_app_secret'=>'string', + 'oauth_fb_on'=>'int', + 'oauth_fb_page_url'=>'string', + 'oauth_vk_app_id'=>'string', + 'oauth_vk_app_secret'=>'string', + 'oauth_vk_on'=>'int', + 'oauth_vk_group_id'=>'string' + ); + + $config_ids = array(); + $user_configs = Zira\Models\Option::getCollection()->get(); + foreach($user_configs as $user_config) { + $config_ids[$user_config->name] = $user_config->id; + } + + foreach($options as $option=>$type) { + if (!array_key_exists($option, $config_ids)) { + $optionObj = new Zira\Models\Option(); + } else { + $optionObj = new Zira\Models\Option($config_ids[$option]); + } + $optionObj->name = $option; + $value = $form->getValue($option); + + if ($type=='int') $value=intval($value); + + $optionObj->value = $value; + $optionObj->module = 'oauth'; + $optionObj->save(); + } + + Zira\Cache::clear(true); + + return array('message'=>Zira\Locale::t('Successfully saved')); + } else { + return array('error'=>$form->getError()); + } + } +} \ No newline at end of file diff --git a/oauth/models/vkuser.php b/oauth/models/vkuser.php new file mode 100644 index 0000000..edbef35 --- /dev/null +++ b/oauth/models/vkuser.php @@ -0,0 +1,35 @@ +isPanelEnabled() && Zira\Permission::check(Zira\Permission::TO_ACCESS_DASHBOARD) && Zira\Permission::check(Zira\Permission::TO_CHANGE_OPTIONS)) { + \Dash\Dash::getInstance()->addPanelModulesGroupItem('glyphicon glyphicon-log-in', Zira\Locale::tm('Social networks', 'oauth'), null, 'oauthSettingsWindow()'); + \Dash\Dash::getInstance()->registerModuleWindowClass('oauthSettingsWindow', 'Oauth\Windows\Settings', 'Oauth\Models\Settings'); + } + } + + public static function getFacebookJsSdkUrl() { + if (Zira\Locale::getLanguage()=='ru') + return Models\Oauth::FACEBOOK_JS_SDK_RU; + else + return Models\Oauth::FACEBOOK_JS_SDK; + } + + public static function getFacebookLoginBtn() { + //return Zira\Helper::tag('fb:login-button', null, array('scope'=>'public_profile,email','onlogin'=>'oauth_fb_login();')); + return Zira\Helper::tag('a', null, array('href'=>'javascript:void(0)','onclick'=>'oauth_fb_btn();','class'=>'oauth-btn social-btn fb','title'=>Zira\Locale::tm('Login with: %s', 'oauth', Zira\Locale::t('Facebook')))); + } + + public static function addFacebookJsSdk($app_id) { + if (self::$_facebook_js_sdk_added) return; + $js = Zira\Helper::tag_open('script', array('type'=>'text/javascript'))."\r\n"; + $js .='window.fbAsyncInit = function() {'."\r\n". + "\t".'FB.init({'."\r\n". + "\t\t".'appId : \''.Zira\Helper::html($app_id).'\','."\r\n". + "\t\t".'cookie : true, // enable cookies'."\r\n". + "\t\t".'xfbml : true, // parse social plugins on this page'."\r\n". + "\t\t".'version : \'v2.2\' // use version 2.2'."\r\n". + "\t".'});'."\r\n". + "\t".'if (typeof(oauth_fb_btn)!="undefined") oauth_fb_btn.activated = true;'."\r\n". + '};'."\r\n"; + $js .='(function(d, s, id) {'."\r\n". + "\t".'var js, fjs = d.getElementsByTagName(s)[0];'."\r\n". + "\t".'if (d.getElementById(id)) return;'."\r\n". + "\t".'js = d.createElement(s); js.id = id;'."\r\n". + "\t".'js.src = "'.self::getFacebookJsSdkUrl().'";'."\r\n". + "\t".'fjs.parentNode.insertBefore(js, fjs);'."\r\n". + '}(document, \'script\', \'facebook-jssdk\'));'."\r\n"; + $js .= Zira\Helper::tag_close('script')."\r\n"; + Zira\View::addHTML($js, Zira\View::VAR_BODY_BOTTOM); + self::$_facebook_js_sdk_added = true; + } + + public static function addFacebookJSView() { + if (self::$_facebook_js_view_added) return; + self::addFacebookJsSdk(Zira\Config::get('oauth_fb_app_id')); + Zira\View::addPlaceholderView(Zira\View::VAR_BODY_BOTTOM, array( + 'app_id' => Zira\Config::get('oauth_fb_app_id'), + 'app_secret' => Zira\Config::get('oauth_fb_app_secret') + ), 'oauth/fb-login'); + self::$_facebook_js_view_added = true; + } + + public static function fb_login_form_hook() { + self::addFacebookJSView(); + return self::getFacebookLoginBtn(); + } + + public static function includeFacebookSdk() { + require_once(ROOT_DIR . DIRECTORY_SEPARATOR . 'oauth' . DIRECTORY_SEPARATOR . Models\Oauth::FACEBOOK_SDK_FOLDER . DIRECTORY_SEPARATOR . 'autoload.php'); + } + + public static function getVkontakteAuthUrl() { + return Models\Oauth::VKONTAKTE_AUTH_URL . '?client_id='.Zira\Config::get('oauth_vk_app_id').'&redirect_uri='.Zira\Helper::url('oauth/login/vkresponse', true, true).'&display=popup&scope=email&response_type=code&v=5.50'; + } + + public static function getVkontakteAccessTokenUrl($code) { + return Models\Oauth::VKONTAKTE_ACCESS_TOKEN_URL . '?client_id='.Zira\Config::get('oauth_vk_app_id').'&client_secret='.Zira\Config::get('oauth_vk_app_secret').'&redirect_uri='.Zira\Helper::url('oauth/login/vkresponse', true, true).'&code='.$code; + } + + public static function getVkontakteUserApiUrl($access_token, $user_id) { + return Models\Oauth::VKONTAKTE_USER_API_URL . '?user_id='.$user_id.'&access_token='.$access_token.'&v=5.50'; + } + + public static function getVkontakteLoginBtn() { + return Zira\Helper::tag('a', null, array('href'=>'javascript:void(0)','onclick'=>'oauth_vk_login();','class'=>'oauth-btn social-btn vk','title'=>Zira\Locale::tm('Login with: %s', 'oauth', Zira\Locale::t('Vkontakte')))); + } + + public static function addVkontakteJSView() { + if (self::$_vkontakte_js_view_added) return; + Zira\View::addPlaceholderView(Zira\View::VAR_BODY_BOTTOM, array( + 'app_id' => Zira\Config::get('oauth_vk_app_id'), + 'app_secret' => Zira\Config::get('oauth_vk_app_secret') + ), 'oauth/vk-login'); + self::$_vkontakte_js_view_added = true; + } + + public static function addVkontakteOpenApi($app_id) { + if (self::$_vkontakte_js_open_api_added) return; + $js = Zira\Helper::tag('div', null, array('id'=>'vk_api_transport'))."\r\n"; + $js .= Zira\Helper::tag_open('script', array('type'=>'text/javascript'))."\r\n"; + $js .= 'if (typeof(vk_open_api_init_callbacks)=="undefined") vk_open_api_init_callbacks = [];'."\r\n"; + $js .= 'window.vkAsyncInit = function() {'."\r\n". + "\t".'VK.init({apiId: '.$app_id.', onlyWidgets: true});'."\r\n". + "\t".'for(var i=0; iname; + return $redirect_url ? $redirect_url : ''; + } + } +} \ No newline at end of file diff --git a/oauth/widgets/buttons.php b/oauth/widgets/buttons.php new file mode 100644 index 0000000..5069636 --- /dev/null +++ b/oauth/widgets/buttons.php @@ -0,0 +1,69 @@ +setEditable(true); + $this->setCaching(false); + $this->setPlaceholder(View::VAR_HEADER); + } + + protected function _render() { + if (Zira\User::isAuthorized()) return; + + $fb_on = false; + $vk_on = false; + + $fb_enabled = Zira\Config::get('oauth_fb_on'); + $fb_app_id = Zira\Config::get('oauth_fb_app_id'); + $fb_app_secret = Zira\Config::get('oauth_fb_app_secret'); + + if ($fb_enabled && $fb_app_id && $fb_app_secret) { + $fb_on = true; + } + + $vk_enabled = Zira\Config::get('oauth_vk_on'); + $vk_app_id = Zira\Config::get('oauth_vk_app_id'); + $vk_app_secret = Zira\Config::get('oauth_vk_app_secret'); + + if ($vk_enabled && $vk_app_id && $vk_app_secret) { + $vk_on = true; + } + + if ($fb_on || $vk_on) { + echo Zira\Helper::tag_open('div', array('class'=>'header-top-item header-top-buttons')); + echo Zira\Helper::tag('div', Zira\Locale::tm('Login with: %s', 'oauth', ''), array('class'=>'header-top-button-text')); + } + + if ($fb_on) { + Oauth\Oauth::addFacebookJSView(); + echo Zira\Helper::tag_open('div', array('class'=>'header-top-button')). + Oauth\Oauth::getFacebookLoginBtn(). + Zira\Helper::tag_close('div'); + } + + if ($vk_on) { + Oauth\Oauth::addVkontakteJSView(); + echo Zira\Helper::tag_open('div', array('class'=>'header-top-button')). + Oauth\Oauth::getVkontakteLoginBtn(). + Zira\Helper::tag_close('div'); + } + + if ($fb_on || $vk_on) { + echo Zira\Helper::tag_close('div'); + } + } +} \ No newline at end of file diff --git a/oauth/widgets/fbcomments.php b/oauth/widgets/fbcomments.php new file mode 100644 index 0000000..b5cf61c --- /dev/null +++ b/oauth/widgets/fbcomments.php @@ -0,0 +1,37 @@ +setEditable(true); + $this->setCaching(false); + $this->setPlaceholder(View::VAR_CONTENT_BOTTOM); + } + + protected function _render() { + $record_url = Zira\Page::getRecordUrl(); + if (!$record_url || $record_url==Zira\Config::get('home_record_name')) return; + + $fb_app_id = Zira\Config::get('oauth_fb_app_id'); + + if ($fb_app_id) { + Oauth\Oauth::addFacebookJsSdk($fb_app_id); + Zira\View::renderView(array( + 'page_url' => Zira\Helper::url($record_url, true, true) + ),'oauth/fb-comments'); + } + } +} \ No newline at end of file diff --git a/oauth/widgets/fbpage.php b/oauth/widgets/fbpage.php new file mode 100644 index 0000000..c840541 --- /dev/null +++ b/oauth/widgets/fbpage.php @@ -0,0 +1,35 @@ +setEditable(true); + $this->setCaching(false); + $this->setPlaceholder(View::VAR_SIDEBAR_RIGHT); + } + + protected function _render() { + $fb_app_id = Zira\Config::get('oauth_fb_app_id'); + $fb_page_url = Zira\Config::get('oauth_fb_page_url'); + + if ($fb_app_id && $fb_page_url) { + Oauth\Oauth::addFacebookJsSdk($fb_app_id); + Zira\View::renderView(array( + 'page_url' => $fb_page_url + ),'oauth/fb-page'); + } + } +} \ No newline at end of file diff --git a/oauth/widgets/vkcomments.php b/oauth/widgets/vkcomments.php new file mode 100644 index 0000000..382ffa4 --- /dev/null +++ b/oauth/widgets/vkcomments.php @@ -0,0 +1,35 @@ +setEditable(true); + $this->setCaching(false); + $this->setPlaceholder(View::VAR_CONTENT_BOTTOM); + } + + protected function _render() { + $record_url = Zira\Page::getRecordUrl(); + if (!$record_url || $record_url==Zira\Config::get('home_record_name')) return; + + $vk_app_id = Zira\Config::get('oauth_vk_app_id'); + + if ($vk_app_id) { + Oauth\Oauth::addVkontakteOpenApi($vk_app_id); + Zira\View::renderView(array(),'oauth/vk-comments'); + } + } +} \ No newline at end of file diff --git a/oauth/widgets/vkgroup.php b/oauth/widgets/vkgroup.php new file mode 100644 index 0000000..5ee528f --- /dev/null +++ b/oauth/widgets/vkgroup.php @@ -0,0 +1,35 @@ +setEditable(true); + $this->setCaching(false); + $this->setPlaceholder(View::VAR_SIDEBAR_RIGHT); + } + + protected function _render() { + $vk_app_id = Zira\Config::get('oauth_vk_app_id'); + $vk_group_id = Zira\Config::get('oauth_vk_group_id'); + + if ($vk_app_id && $vk_group_id) { + Oauth\Oauth::addVkontakteOpenApi($vk_app_id); + Zira\View::renderView(array( + 'group_id' => $vk_group_id + ),'oauth/vk-group'); + } + } +} \ No newline at end of file diff --git a/oauth/windows/settings.php b/oauth/windows/settings.php new file mode 100644 index 0000000..915d814 --- /dev/null +++ b/oauth/windows/settings.php @@ -0,0 +1,48 @@ +setIconClass(self::$_icon_class); + $this->setTitle(Zira\Locale::t(self::$_title)); + $this->setSidebarEnabled(false); + + $this->setSaveActionEnabled(true); + } + + public function create() { + $this->setOnLoadJSCallback( + $this->createJSCallback( + 'desk_window_form_init(this);' + ) + ); + } + + public function load() { + if (!Permission::check(Permission::TO_CHANGE_OPTIONS)) { + return array('error' => Zira\Locale::t('Permission denied')); + } + + $configs = Zira\Config::getArray(); + + $form = new \Oauth\Forms\Settings(); + $form->setValues($configs); + + $this->setBodyContent($form); + } +} \ No newline at end of file diff --git a/robots.src.txt b/robots.src.txt new file mode 100644 index 0000000..4cf7983 --- /dev/null +++ b/robots.src.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +#Sitemap: http://domain.com/sitemap.xml \ No newline at end of file diff --git a/themes/bulaksu/assets/css/editor.css b/themes/bulaksu/assets/css/editor.css new file mode 100644 index 0000000..997f43b --- /dev/null +++ b/themes/bulaksu/assets/css/editor.css @@ -0,0 +1,72 @@ +body { + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; + font-size: 16px; +} +h1 { + font-size: 30px; +} +h2 { + font-size: 26px; +} +h3 { + font-size: 22px; +} +h4 { + font-size: 18px; +} +h5 { + font-size: 14px; +} +h6 { + font-size: 10px; +} +p { + margin: 0px; +} +a:link, +a:visited { + color: #1b6d85; + text-decoration: none; +} +a:hover, +a:active, +a.active { + text-decoration: underline; +} +.image { + max-width:100%; + height:auto; + display: inline-block; + vertical-align: top; + margin: 0px 20px 20px 0px; +} +blockquote { + background-color: #e5e4fe; + margin: 0px 0px 10px 0px; + padding: 10px; +} +pre { + color: #BABABA; + background: #2B2B2B none repeat scroll 0% 0%; + padding: 10px; + margin: 0px 0px 10px 0px; +} +code { + padding: 0px; + display: block; + padding: 2px 0px 2px 10px; + margin: 0px; + border-left: 3px solid #D5C5CA; + border-radius: 0px; + color: #c7254e; + background-color: #f9f2f4; +} +q { + display: block; + color: #858D93; + padding: 2px 0px 2px 10px; + margin: 0px; + border-left: 3px solid #C5D0D8; + background-color: #F8F8F8; + border-radius: 0px; +} \ No newline at end of file diff --git a/themes/bulaksu/assets/css/main.css b/themes/bulaksu/assets/css/main.css new file mode 100644 index 0000000..1a7779f --- /dev/null +++ b/themes/bulaksu/assets/css/main.css @@ -0,0 +1,1445 @@ +html, body { + height: 100%; +} +body { + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; + font-size: 14px; +} +h1 { + font-size: 28px; +} +h2 { + font-size: 26px; +} +h3 { + font-size: 22px; +} +h4 { + font-size: 18px; +} +h5 { + font-size: 14px; +} +h6 { + font-size: 10px; +} +p { + margin: 0px; +} +a:link, +a:visited { + color: #24669E; + text-decoration: none; +} +a:hover, +a:active, +a.active { + text-decoration: underline; + color: #337AB7; +} +a.external-url { + color: #337AB7 !important; +} +a.btn-primary { + color: #FFF; +} +#main-container-wrapper { + background: #ffffff url(../images/gradient.jpg) repeat-x 0 0; + height: 100%; +} +#main-container { + background: url(../images/bg.jpg) no-repeat 50% 0%; + min-height: 100%; +} +/** bootstrap **/ +.container { + +} +.breadcrumb { + padding: 10px 15px; + background-color: #fafafa; + background-color: rgba(250, 250, 250, 0.9); +} +.page-header { + border-bottom: 1px solid #DBDCEA; +} +.navbar-default { + background-image: -webkit-linear-gradient(top, #fff 0, #F0EDF5 100%); + background-image: -o-linear-gradient(top, #fff 0, #F0EDF5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#F0EDF5)); + background-image: linear-gradient(to bottom, #fff 0, #F0EDF5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffF0EDF5', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} +.navbar-default .navbar-nav li a { + color: #555; +} +.btn-default { + text-shadow:0 1px 0 #fff; + background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%); + background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%); + background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0)); + background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); + filter:progid:DXImageTransform.Microsoft.gradient(enabled=false); + background-repeat:repeat-x; + border-color:#dbdbdb; + border-color:#ccc +} +.btn-primary { + background-color: #5E7987; + background-image:-webkit-linear-gradient(top,#5E7987 0, #3D475C 100%); + background-image:-o-linear-gradient(top,#5E7987 0,#3D475C 100%); + background-image:-webkit-gradient(linear,left top,left bottom,from(#5E7987),to(#3D475C)); + background-image:linear-gradient(to bottom,#5E7987 0,#3D475C 100%); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5E7987', endColorstr='#ff3D475C', GradientType=0); + filter:progid:DXImageTransform.Microsoft.gradient(enabled=false); + background-repeat:repeat-x; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); +} +.btn-primary:hover, .btn-primary:focus { + background-color: #3D475C; +} +.btn-primary.active, .btn-primary:active, .open > .dropdown-toggle.btn-primary { + color: #FFF; + background-color: #3D475C; + border-color: #324465; +} +.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover { + color:#fff; + background-color: rgb(60, 67, 78); + border-color: #1b2e40 +} +.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover { + background-color: #3D475C; + border-color: #324465; +} +.zira-confirm-modal .modal-content { + background-color: #959C89; +} +.zira-confirm-modal .modal-header { + background-color: #778A75; + border-bottom: 1px solid #626B5A; + border-top-left-radius: 6px; + border-top-right-radius: 6px; + color: #FFFFFF; +} +.zira-confirm-modal .modal-body { + border-bottom: 1px solid #DED8BA; + border-top: 1px solid #ffffff; + background-color: #F9F7EB; +} +.zira-confirm-modal .modal-footer { + border-top: 1px solid #ffffff; + background-color: #F9F7EB; + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; +} +.zira-error-modal .modal-content { + background-color: #8C6781; +} +.zira-error-modal .modal-header { + background-color: #AA4372; + border-bottom: 1px solid #7E1166; + border-top-left-radius: 6px; + border-top-right-radius: 6px; + color: #fff; +} +.zira-error-modal .modal-body { + border-bottom: 1px solid #E9D7E4; + border-top: 1px solid #ffffff; + background-color: #FBF7FA; +} +.zira-error-modal .modal-footer { + border-top: 1px solid #ffffff; + background-color: #FBF7FA; + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; +} +.zira-message-modal .modal-content { + background-color: #5B7EA1; +} +.zira-message-modal .modal-header { + background-color: #357BA1; + border-bottom: 1px solid #064480; + border-top-left-radius: 6px; + border-top-right-radius: 6px; + color: #fff; +} +.zira-message-modal .modal-body { + border-bottom: 1px solid #CBD7DA; + border-top: 1px solid #ffffff; + background-color: #F6F7F8; +} +.zira-message-modal .modal-footer { + border-top: 1px solid #ffffff; + background-color: #F6F7F8; + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; +} +.zira-prompt-modal .modal-content { + background-color: #899C9C; +} +.zira-prompt-modal .modal-header { + background-color: #7D8892; + border-bottom: 1px solid #5A656B; + border-top-left-radius: 6px; + border-top-right-radius: 6px; + color: #FFFFFF; +} +.zira-prompt-modal .modal-body { + border-bottom: 1px solid #DED8BA; + border-top: 1px solid #ffffff; + background-color: #F9F7EB; +} +.zira-prompt-modal .modal-footer { + border-top: 1px solid #ffffff; + background-color: #F9F7EB; + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; +} +/** user profile **/ +.user-profile-photo { + float: left; + border: 5px solid #CCCCCC; + padding: 5px; + margin-right: 10px; + overflow: hidden; + border-radius: 3px; + box-shadow: 0px 0px 2px #cccccc; + background-color: #FFFFFF; +} +.user-head { + margin-bottom: 10px; +} +.user-profile h1 { + margin: 0px 0px 5px; +} +.user-profile h2 { + margin: 60px 0px 10px; + padding: 10px 0px; + border-bottom: 1px solid #E4E4E4; +} +.user-button .user-profile-links { + float: right; + margin-top: -40px; +} +.user-black-list-link .if-blocked { + display: none; +} +.user-black-list-link.blocked .if-blocked { + display: inline; +} +.user-black-list-link.blocked .if-not-blocked { + display: none; +} +#dashpanel-fixed-button:link, +#dashpanel-fixed-button:visited { + display: block; + position: fixed; + height: 42px; + top: 0px; + left: 8px; + z-index: 999; + font-size: 18px; + color: #444444; + text-decoration: none; + background-image: -webkit-linear-gradient(top, #fff 0, #F0EDF5 100%); + background-image: -o-linear-gradient(top, #fff 0, #F0EDF5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#F0EDF5)); + background-image: linear-gradient(to bottom, #fff 0, #F0EDF5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffF0EDF5', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + padding: 8px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + box-shadow: 0px 0px 4px #e3e3e3; +} +#dashpanel-fixed-button:hover { + color: #000000; + box-shadow: 0px 0px 4px #d3d3d3; +} +#dashpanel-fixed-button img { + display: block; + float: left; + margin-top: 4px; + margin-right: 2px; +} +/** header **/ +header { + min-height: 210px; + position: relative; + margin-bottom: 40px; +} +header .header-top-item { + float: right; + margin: 0px 15px 0px 50px; +} +header .header-top-buttons { + padding: 8px 0px 0px; + font-size: 14px; +} +header .header-top-buttons .header-top-button-text, +header .header-top-buttons .header-top-button { + float: left; + margin-right: 10px; +} +header .header-top-buttons .header-top-button { + margin-right: 5px; +} +header .header-top-buttons .header-top-button .social-btn { + box-shadow: none; + margin-top: -5px; +} +ul#user-menu { + list-style-type: none; + display: block; + margin: 0px 15px 0px 50px; + padding: 0px; + height: 30px; + float: right; +} +ul#user-menu.authorized { + +} +ul#user-menu li.menu-item { + display: block; + float: left; + position: relative; + margin: 0px; + color: #575262; +} +ul#user-menu li.menu-item.open { + box-shadow: 0px -1px 8px rgba(209, 209, 209, 0.8) inset; + background-color: #E2E1E4; +} +ul#user-menu li.menu-item-separator { + margin: 0px 0px; + padding: 8px 0px; +} +ul#user-menu li.menu-item-separator:after { + content: '\2022'; +} +ul#user-menu li.menu-item a.menu-link:link, +ul#user-menu li.menu-item a.menu-link:visited { + display: block; + padding: 8px 14px; + color: #333; +} +ul#user-menu li.menu-item a.menu-link:hover, +ul#user-menu li.menu-item a.menu-link.active, +ul#user-menu li.menu-item.open a.menu-link { + color: #000; + text-decoration: none; +} +ul#language-switcher { + list-style-type: none; + display: block; + padding: 0px; + margin: 0px 15px 0px 50px; + height: 30px; + float: right; +} +ul#language-switcher li { + float: left; + margin: 0px 0px 0px 1px; +} +ul#language-switcher li a:link, +ul#language-switcher li a:visited { + display: block; + font-size: 12px; + color: #777777; + padding: 5px 10px; +} +ul#language-switcher li a:hover, +ul#language-switcher li a.active { + background-color: #ECE2FF; + background-color: rgba(236, 226, 255, 0.5); + color: #000000; + text-decoration: none; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + box-shadow: 0px 0px 1px #92B4C5; +} +ul#language-switcher li a.active { + background-color: #A4B4BC; + color: #FFF; + box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.12) inset; +} +#site-logo-wrapper { + position: relative; + clear: both; + margin-left: 15px; + margin-bottom: 30px; +} +#site-logo-wrapper a#site-logo:link, +#site-logo-wrapper a#site-logo:visited { + display: inline-block; + color: #3C4045; + margin: 0px; + text-decoration: none; + height: 80px; +} +#site-logo-wrapper a#site-logo:hover { + color: #1B6D85; +} +#site-logo-wrapper a#site-logo img { + border: none; + vertical-align: middle; + margin-right: 10px; + max-width: 200px; + max-height: 80px; +} +#site-logo-wrapper a#site-logo span { + font-size: 30px; + vertical-align: middle; +} +#site-logo-wrapper #site-slogan { + display: inline-block; + font-style: italic; + white-space: nowrap; + text-shadow: 0px 0px 8px #fff; + vertical-align: bottom; +} +#top-menu-wrapper { + margin: 20px 15px 0px; + clear: both; +} +/** content **/ +.image { + max-width:100%; + height:auto; + display: inline-block; + vertical-align: top; + margin: 0px 18px 18px 0px; + border: 1px solid #EEEEEE; + border-radius: 3px; + box-shadow: 0px 0px 2px #eeeeee; +} +.image-wrapper { + max-width:100%; + display: inline-block; + vertical-align: top; + margin: 0px 18px 18px 0px; + background: #DDE0E4; + border: 1px solid #EEEEEE; + box-shadow: 0px 0px 2px #eeeeee; +} +.image-wrapper .image { + border: none; + box-shadow: none; + border-radius: 0; + margin: 0; +} +.image-wrapper .image-description { + color: #5d5b6b; + font-size: 12px; + text-align: center; + padding: 10px 0px; +} +.lightbox-image { + cursor: pointer; +} +.block { + margin-bottom: 20px; +} +.block h1, +.block h2, +.block h3, +.block h4, +.block h5, +.block h6 { + margin-top: 0px; +} +.block-image { + max-width:100%; + height:auto; + display: block; + margin: 0px auto 20px; +} +article .datetime { + font-style: italic; + color: #888888; + float: left; + margin-right: 20px; +} +article .author { + font-style: italic; + color: #888888; + float: right; + margin-left: 20px; +} +article .article-info { + overflow: hidden; + margin-bottom: 10px; +} +article .article { + margin: 30px 0px; +} +article .article p { + line-height: 26px; + font-size: 16px; +} +article .rating { + color: #888888; + overflow: hidden; + margin-bottom: 30px; +} +article .rating a.like:link, +article .rating a.like:visited { + position: relative; + z-index: 2; + font-size: 14px; + height: 30px; + line-height: 30px; + background-color: #2F5F87; + background-color: #337AB7; + display: inline-block; + padding: 0px 25px; + color: #FFF; + border-radius: 3px; +} +article .rating a.like:hover { + text-decoration: none; + background-color: #3A67A2; + box-shadow: inset 0px 0px 1px #ffffff; +} +article .rating a.like.active { + text-decoration: none; + background-color: #2C7E72; +} +article .rating a span.glyphicon { + font-size: 20px; + vertical-align: middle; + margin-right: 5px; +} +article .rating .share-wrapper { + position: relative; + z-index: 1; + left: -999px; + display: inline-block; + vertical-align: top; + margin-left: 10px; + transition: left .5s ease; +} +.share-btn-wrapper, +.social-btn-wrapper { + overflow: hidden; +} +.share-btn, +.social-btn { + display: block; + float: left; + width: 28px; + height: 28px; + background-image: url(../images/share-buttons.jpg); + background-repeat: no-repeat; + margin-right: 4px; + border-radius: 3px; + box-shadow: 0px 0px 2px #eeeeee; + text-decoration: none; +} +.share-btn:hover, +.social-btn:hover { + box-shadow: 0px 0px 2px #aaaaaa; +} +article .rating .share-wrapper .share-btn { + margin-top: 1px; +} +.share-btn.gp, +.social-btn.gp { + background-position: 0px 0px; +} +.share-btn.vk, +.social-btn.vk { + background-position: -28px 0px; +} +.share-btn.fb, +.social-btn.fb { + background-position: -56px 0px; +} +.share-btn.tw, +.social-btn.tw { + background-position: -84px 0px; +} +.share-btn.ok, +.social-btn.ok { + background-position: -112px 0px; +} +.oauth-btn { + float: left; + margin-right: 10px; +} +.oauth-btn.social-btn { + margin-top: -6px; + margin-right: 5px; +} +.user-login-form-extra-items { + float: left; +} +.user-login-form-extra-item { + float: left; +} +.gallery-wrapper { + margin: 30px 0px 20px; +} +.gallery { + display: block; + margin: 0px; + padding: 2px; + list-style-type: none; + border: 1px solid #eeeeee; + border-radius: 3px; + color: #ffffff; + overflow: hidden; + box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.15) inset, 0px 1px 5px rgba(0, 0, 0, 0.075); + background-color: #fafafa; + background-color: rgba(250, 250, 250, 0.9); +} +.gallery li { + display: block; + float: left; + margin: 0px; +} +.gallery li a:link, +.gallery li a:visited { + display: block; + margin: 1px; + border: 1px solid #eeeeee; + transition: border .2s; +} +.gallery li a:hover { + border: 1px solid #337AB7; +} +.gallery li img { + display: block; + border: none; +} +.slider { + display: block; + margin: 0px; + padding: 0px; + list-style-type: none; +} +.list { + list-style-type: none; + margin: 20px 0px; + padding: 0px; +} +.list .list-item { + margin-bottom: 20px; + overflow: hidden; + border: 1px solid #eeeeee; + background-color: #FAFAFA; + background-color: rgba(250, 250, 250, 0.9); + border-radius: 3px; + box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.15) inset, 0px 1px 5px rgba(0, 0, 0, 0.075); +} +.list .list-item .list-title-wrapper { + background-color: #F5F5F5; + border-bottom: 1px solid #eeeeee; + padding: 10px 14px; + margin: 0px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +.list .list-item a.list-title:link, +.list .list-item a.list-title:visited { + font-size: 18px; + margin: 0px 0px 5px; + text-shadow: 1px 1px 0px #ffffff; +} +.list .list-item .list-content-wrapper { + padding: 10px 14px 0px; +} +.list .list-item a.list-thumb:link, +.list .list-item a.list-thumb:visited { + display: block; + text-decoration: none; + float: left; + margin: 0px 10px 10px 0px; + border: 1px solid #EEEEEE; + background-color: #EBE6F0; + padding: 2px; +} +.list .list-item a.list-thumb:hover { + box-shadow: 0px 0px 2px #eeeeee; +} +.list .list-item a.list-thumb img { + border: none; + max-width: 100%; + max-width: none\9; /** ie8 hack **/ + height: auto; +} +.list .list-item .list-info-wrapper { + clear: left; + margin: 10px 0px 0px; + padding: 0px 14px 10px; + font-style: italic; +} +.list .list-item .list-info { + margin-right: 10px; + color: #3F3F3F; +} +.list .list-item .list-info a:link, +.list .list-item .list-info a:visited { + color: #3F3F3F; +} +.list-view-more-wrapper { + margin: 20px 0px; +} +.widget-category-wrapper, +.widget-top-wrapper { + margin-bottom: 20px; +} +/** comments **/ +.comments-wrapper { + margin: 40px 0px; +} +.comment-btn:link, +.comment-btn:visited { + display: block; + float: right; + color: #ffffff; +} +.comments { + list-style-type: none; + margin: 40px 0px; + padding: 0px; +} +.comments .comments-item { + margin-bottom: 20px; + overflow: hidden; +} +.comments .comments-item-nested-1 { + margin-left: 60px; +} +.comments .comments-item-nested-2 { + margin-left: 120px; +} +.comments .comments-item-nested-3 { + margin-left: 180px; +} +.comments .comments-item-nested-4 { + margin-left: 240px; +} +.comments .comments-item-nested-5 { + margin-left: 300px; +} +.comments .comments-item-nested-6 { + margin-left: 360px; +} +.comments .comments-item-nested-7 { + margin-left: 420px; +} +.comments .comments-item-nested-8 { + margin-left: 480px; +} +.comments .comments-item-nested-9 { + margin-left: 540px; +} +.comments .comments-item-nested-10 { + margin-left: 600px; +} +.comments .comments-item.disabled { + color: #777777; +} +.comments .comments-item .comment-avatar { + max-width: 50px; + height: auto; + display: block; + float: left; + border-radius: 5px; +} +.comments .comments-item .comment-head { + display: block; + font-weight: bold; + margin-left: 60px; +} +.comments .comments-item .comment-text { + display: block; + margin: 5px 0px 5px 60px; + background-color: #F5F5F5; + padding: 10px; + border-radius: 10px; +} +.comments .comments-item.disabled .comment-text { + background-color: #E3E3E3; +} +.comments .comments-item .comment-info { + display: block; + margin: 5px 0px 5px 60px; +} +.comments .comments-item .comment-info a:link, +.comments .comments-item .comment-info a:visited { + color: #000000; + text-decoration: none; +} +.comments .comments-item .comment-info a:hover { + color: #474855; + text-decoration: none; +} +.comments .comments-item .comment-info a.comment-like:link, +.comments .comments-item .comment-info a.comment-like:visited { + color: #1d7690; +} +.comments .comments-item .comment-info a.comment-like:hover, +.comments .comments-item .comment-info a.comment-like.active { + color: #114150; +} +.comments .comments-item .comment-info a.comment-dislike:link, +.comments .comments-item .comment-info a.comment-dislike:visited { + color: #a41748; +} +.comments .comments-item .comment-info a.comment-dislike:hover, +.comments .comments-item .comment-info a.comment-dislike.active { + color: #550e2a; +} +.comments-view-more-wrapper { + margin-bottom: 40px; +} +.parse-content code { + padding: 0px; + display: block; + padding: 2px 0px 2px 10px; + margin: 0px; + border-left: 3px solid #D5C5CA; + border-radius: 0px; +} +.parse-content q { + display: block; + color: #858D93; + padding: 2px 0px 2px 10px; + margin: 0px; + border-left: 3px solid #C5D0D8; + background-color: #FBFBFB; + border-radius: 0px; +} +blockquote { + color: #757D93; + font-size: 100%; + background-color: #FEFEFE; + margin: 0px 0px 18px 0px; +} +pre { + background-color: #FEFEFE; + border: 1px solid #eee; +} +/** sidebar **/ +.sidebar .page-header { + margin: 0px; + padding-bottom: 4px; +} +.sidebar .widget-category-title { + font-size: 20px; + margin-top: 0px; + text-shadow: 1px 1px 0px #fff; +} +.sidebar .list { + margin: 4px 0px 20px; +} +.sidebar .list .list-item { + margin-bottom: 10px; + overflow: hidden; + border: none; + background: none; + border-radius: 0px; + border-bottom: 1px dashed #eeeeee; + box-shadow: none; +} +.sidebar .list .list-item .list-title-wrapper { + background: none; + border-bottom: none; + padding: 4px 0px; + margin: 0px; + text-overflow: clip; + white-space: normal; + overflow: hidden; +} +.sidebar .list .list-item a.list-title:link, +.sidebar .list .list-item a.list-title:visited { + font-size: 14px; +} +.sidebar .list .list-item .list-content-wrapper { + padding: 4px 0px 0px; + margin-bottom: 10px; +} +.sidebar .list .list-item a.list-thumb:link, +.sidebar .list .list-item a.list-thumb:visited { + /*float: none;*/ + /*display: inline-block;*/ + max-width: 50%; +} +.sidebar .list .list-item a.list-thumb img { + width: 100%\9; /** ie8 hack **/ +} +.sidebar .list .list-item .list-info-wrapper { + padding: 4px 0px; +} +.sidebar .list .list-item .list-info { + display: block; +} +/** secondary menu **/ +#secondary-menu-wrapper { + margin-bottom: 20px; +} +#secondary-menu-wrapper ul li a:link, +#secondary-menu-wrapper ul li a:visited { + background-color: #fafafa; + color: #333333; +} +#secondary-menu-wrapper ul li a:hover { + background-color: #f5f5f5; + color: #337AB7; +} +#secondary-menu-wrapper ul li.active a { + background-color: #337AB7; + color: #ffffff; +} +#secondary-menu-wrapper ul li.parent { + margin-bottom: 10px; +} +#secondary-menu-wrapper ul li.parent a.menu-link { + color: #333333; + background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%); + background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%); + background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2)); + background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); + background-repeat:repeat-x; + -webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075); + box-shadow:inset 0 3px 9px rgba(0,0,0,.075) +} +#secondary-menu-wrapper .secondary-child ul { + margin-top: 2px; +} +#secondary-menu-wrapper .secondary-child ul .menu-link-ico { + margin-right: 2px; +} +#secondary-menu-wrapper .secondary-child ul .menu-link-ico:after { + content: '\203A'; +} +/** search **/ +.search-form-wrapper { + overflow: hidden; +} +.search-form-description { + margin-top: 0px; + margin-bottom: 100px; + font-style: italic; +} +.search-form-wrapper .col-sm-3 { + padding-left: 0px; + padding-right: 0px; +} +.search-simple-form { + display: none; + position: relative; +} +.search-simple-form .search-text-clear { + position: absolute; + top: 11px; + right: 59px; + z-index: 9; + cursor: pointer; +} +.search-simple-form input[type=text] { + padding-right: 20px; +} +.search-simple-form.loading button[type=submit] .glyphicon { + visibility: hidden; +} +#top-menu-container .zira-search-preview-wnd { + position: absolute; + width: 450px; + right: 30px; + top: 52px; + z-index: 99; + background-color: #f9f9f9; + box-shadow: 0px 5px 10px rgba(113, 113, 113, 0.52); +} +.zira-search-preview-wnd .list { + margin: 0px; +} +.zira-search-preview-wnd .list .list-item { + border: none; + border-top: 1px solid #f4f4f4; + border-left: 1px solid #eeeeee; + border-right: 1px solid #eeeeee; + border-bottom: 1px solid #eeeeee; + box-shadow: none; + background-color: #fafafa; + margin-bottom: 0px; + border-radius: 0; + cursor: pointer; +} +.zira-search-preview-wnd .list .list-item:first-child { + border-top: none; +} +.zira-search-preview-wnd .list .list-item:last-child { + border-bottom: 1px solid #dddddd; +} +.zira-search-preview-wnd .list .list-item:hover { + background-color: #fff; + border-left: 1px solid #C9D3F2; + border-right: 1px solid #C9D3F2; + border-bottom: 1px solid #C9D3F2; +} +.zira-search-preview-wnd .list .list-item .list-title-wrapper { + /**background-color: #EAEAEA;**/ + background-color: #F3F3F3; + padding: 6px 10px; +} +.zira-search-preview-wnd .list .list-item:hover .list-title-wrapper { + background-color: #DAE1E6; + color: #3B4350; +} +.zira-search-preview-wnd .list .list-item a.list-title:link, +.zira-search-preview-wnd .list .list-item a.list-title:visited { + font-size: 14px; + color: #656587; + text-shadow: none; +} +.zira-search-preview-wnd .list .list-item:hover a.list-title:link, +.zira-search-preview-wnd .list .list-item:hover a.list-title:visited { + color: #3B4350; +} +.zira-search-preview-wnd .list .list-item a.list-title:hover { + text-decoration: none; +} +.zira-search-preview-wnd .list .list-item a.list-thumb:link, +.zira-search-preview-wnd .list .list-item a.list-thumb:visited { + margin-bottom: 6px; + padding: 0px; +} +.zira-search-preview-wnd .list .list-item a.list-thumb img { + max-height: 60px; + width: auto; +} +.zira-search-preview-wnd .list .list-item .list-content-wrapper { + padding: 6px 10px; +} +.zira-search-preview-wnd .list .list-item .list-content-wrapper p { + max-height: 60px; + overflow: hidden; +} +/** footer **/ +footer { + min-height: 50px; + position: relative; + margin-top: 40px; + margin-right: 15px; + margin-left: 15px; + border: 1px solid #e7e7e7; + background: #f5f5f5; + background: -moz-linear-gradient(top, #f8f8f8 0%, #f5f5f5 100%); + background: -webkit-linear-gradient(top, #f8f8f8 0%,#f5f5f5 100%); + background: linear-gradient(to bottom, #f8f8f8 0%,#f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f8f8f8', endColorstr='#f5f5f5',GradientType=0 ); + box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.15) inset, 0px 1px 5px rgba(0, 0, 0, 0.075); + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +footer p { + line-height: 50px; + padding: 0px 15px; +} +#footer-menu-wrapper { + margin: 15px 0px 0px; +} +#footer-menu-wrapper ul.menu { + list-style-type: none; + margin: 0px 3px; + padding: 0px; +} +#footer-menu-wrapper ul.menu li.menu-item { + display: inline-block; + margin: 0px 8px; +} +#footer-menu-wrapper ul.menu li.menu-item-separator { + display: inline-block; + margin: 0px; + font-size: 90%; + vertical-align: top; +} +#footer-menu-wrapper ul.menu li.menu-item-separator:after { + /*content: '\22c5';*/ + content: '|'; +} +#footer-menu-wrapper ul.menu li.menu-item a.menu-link:link, +#footer-menu-wrapper ul.menu li.menu-item a.menu-link:visited { + text-decoration: none; + color: #333333; + padding: 2px 4px; + border-radius: 2px; +} +#footer-menu-wrapper ul.menu li.menu-item a.menu-link:hover, +#footer-menu-wrapper ul.menu li.menu-item a.menu-link.active, +#footer-menu-wrapper ul.menu li.menu-item.active a.menu-link { + text-decoration: none; + color: #337AB7; +} +footer a.rss-link:link, +footer a.rss-link:visited { + position: absolute; + bottom: 14px; + right: 14px; + display: block; + width: 20px; + height: 20px; + background: url(../images/rss.png) no-repeat 0 0; + outline: none; +} +.zira-loader-wrapper { + font-style: italic; + display: inline-block; + vertical-align: middle; + margin-left: 10px; +} +.zira-loader { + display: inline-block; + vertical-align: top; + width: 16px; + height: 16px; + background: url(../images/zira-loader.gif) no-repeat 0 0; +} +.search-simple-form .zira-loader { + position: absolute; + top: 9px; + right: 28px; + z-index: 9; +} +a.scroll-top:link, +a.scroll-top:visited { + display: block; + position: fixed; + bottom: 100px; + right: 30px; + width: 32px; + height: 32px; + background: url(../images/up.png) no-repeat 0 0; + opacity: 0; + filter: alpha(opacity=0); + transition: opacity 1s ease; + outline: none; +} +a.scroll-top:hover { + opacity: 1 !important; + filter: alpha(opacity=100); +} +a.scroll-top.visible:link, +a.scroll-top.visible:visited { + opacity: .6; + filter: alpha(opacity=60); +} + +/** home page **/ +.home-category-wrapper { + margin: 40px 0px; +} +.home-category-wrapper .home-category-title, +.home-category-wrapper .home-category-title a:link, +.home-category-wrapper .home-category-title a:visited { + color: #222222; +} +.home-category-wrapper .home-category-title a:hover { + color: #1B6D85; + text-decoration: none; +} +.grid-category-wrapper .list .list-item { + width: 49%; + display: inline-block; + vertical-align: top; + margin-right: 1%; +} +.grid-category-wrapper .list .list-item:nth-child(2) { + margin-right: 0px; +} + +.caret-right { + border-bottom: 4px solid transparent; + border-top: 4px solid transparent; + border-left: 4px solid; + display: inline-block; + width: 0; + height: 0; + vertical-align: middle; + margin-right: 2px; +} +.menu-default { + background: #777 !important; + color: #ffffff !important; +} +.menu-primary { + background: #337AB7 !important; + color: #ffffff !important; +} +.menu-success { + background: #5CB85C !important; + color: #ffffff !important; +} +.menu-info { + background: #5BC0DE !important; + color: #ffffff !important; +} +.menu-warning { + background: #F0AD4E !important; + color: #ffffff !important; +} +.menu-danger { + background: #D9534F !important; + color: #ffffff !important; +} +.menu-default a, +.menu-primary a, +.menu-success a, +.menu-info a, +.menu-warning a, +.menu-danger a { + color: #ffffff !important; + background: none !important; +} + +#sitemap-wrapper { + margin-bottom: 40px; +} +#sitemap-wrapper ul { + list-style-type: none; + margin: 0px; + padding: 0px; + box-shadow: 0px 0px 2px #ececec; + border: 1px solid #eee; + border-radius: 3px; +} +#sitemap-wrapper ul li { + padding: 10px; + margin: 0px; + border-top: 1px solid #fff; + border-bottom: 1px solid #EDEDED; +} +#sitemap-wrapper ul li:first-child { + border-top: none; +} +#sitemap-wrapper ul li:last-child { + border-bottom: none; +} +#sitemap-wrapper ul li.even { + background-color: #FAFAFA; + background-color: rgba(250, 250, 250, 0.2); +} +#sitemap-wrapper ul li.odd { + background-color: #FFFFFF; + background-color: rgba(255, 255, 255, 0.4); +} +#sitemap-wrapper ul li.menu-item-offset { + padding-left: 310px; +} +#sitemap-wrapper ul li.menu-item-offset-1 { + padding-left: 40px; +} +#sitemap-wrapper ul li.menu-item-offset-2 { + padding-left: 70px; +} +#sitemap-wrapper ul li.menu-item-offset-3 { + padding-left: 100px; +} +#sitemap-wrapper ul li.menu-item-offset-4 { + padding-left: 130px; +} +#sitemap-wrapper ul li.menu-item-offset-5 { + padding-left: 160px; +} +#sitemap-wrapper ul li.menu-item-offset-6 { + padding-left: 190px; +} +#sitemap-wrapper ul li.menu-item-offset-7 { + padding-left: 220px; +} +#sitemap-wrapper ul li.menu-item-offset-8 { + padding-left: 250px; +} +#sitemap-wrapper ul li.menu-item-offset-9 { + padding-left: 280px; +} +#sitemap-wrapper ul li a:link, +#sitemap-wrapper ul li a:visited { + color: #333; +} + +.contacts-wrapper { + overflow: hidden; + margin-bottom: 40px; +} +.contact-image { + max-width: 50%; + height: auto; + float: left; + margin: 0px 20px 0px 0px; + border: 5px solid #CCCCCC; + padding: 5px; + border-radius: 3px; + background-color: #FFFFFF; +} +.contact-name { + margin: 0px 0px 20px; + font-size: 22px; +} +.contact-details { + float: left; +} +.contact-address { + margin: 0px; +} +.contact-info { + margin: 10px 0px 0px; + font-style: italic; +} +.social-contacts { + margin: 10px 0px 0px; +} +#yandex-map, +#google-map { + margin-bottom: 40px; + border: 5px solid #EEEEEE; + box-shadow: 0px 0px 2px #cccccc; + border-radius: 3px; +} +.messages-panel { + overflow: hidden; +} +.messages-panel .navbar { + margin-bottom: 0px; + border-radius: 0; + background: #fefefe; +} +.messages-list li { + border-bottom: 1px solid #ffffff; + border-top: 1px solid #eeeeee; + padding: 10px; + overflow: hidden; +} +.messages-list li.even { + background-color: #fefefe; +} +.messages-list li.odd { + background-color: #fafafa; +} +.messages-list li a:link, +.messages-list li a:visited { + color: #333; +} +.messages-list li.highlight a:link, +.messages-list li.highlight a:visited { + color: #000; + font-weight: bold; +} +.messages-list .message-head { + padding-bottom: 10px; + margin-bottom: 10px; + border-bottom: 1px solid #EEEEEE; +} +.messages-list .message-head .message-date { + float: right; +} +.messages-list .message-avatar { + float: left; +} +.messages-list .message-avatar a img { + display: block; + max-width: 100px; + height: auto; + border-radius: 5px; +} +.messages-list .message-content { + margin-left: 120px; +} +.no-messages-message { + font-style: italic; + margin: 20px 0px 100px; +} +.compose-message-btn { + float: right; +} +.user-messages-resipients-list { + list-style-type: none; + margin: 0px 0px 20px; + padding: 0px; +} +.user-messages-resipients-list li { + display: inline-block; +} +.user-messages-resipients-list li.separator { + margin-right: 10px; +} +.user-messages-resipients-list li.separator:after { + content: ', '; +} +.user-messages-resipients-list li a:link, +.user-messages-resipients-list li a:visited { + color: #555; +} +/** mobile **/ +@media only screen and (max-width: 767px) { + .user-profile h1 { + clear: left; + padding-top: 10px; + } + .user-button .user-profile-links { + float: none; + margin-top: 0px; + } + header { + height: auto; + } + #site-logo-wrapper { + margin: 0px 20px; + } + #site-logo-wrapper a#site-logo:link, + #site-logo-wrapper a#site-logo:visited { + + } + #site-logo-wrapper #site-slogan { + display: block; + text-align: right; + } + header .header-top-item { + display: none; + } + ul#user-menu { + visibility: hidden; + } + #top-menu-wrapper { + margin: 10px 15px 0px; + } + .grid-category-wrapper .list .list-item { + width: 100%; + display: block; + margin-right: 0px; + } + #top-menu-container .zira-search-preview-wnd { + position: static; + width: 100%; + margin-bottom: 10px; + box-shadow: none; + } + .search-simple-form .search-text-clear { + top: 21px; + } + .search-simple-form .zira-loader { + top: 19px; + } + a.scroll-top { + display: none !important; + } +} +@media (min-width: 768px) { + .search-simple-form { + display: none; + } +} +@media (min-width: 992px) { + .search-simple-form { + display: block; + } +} diff --git a/themes/bulaksu/assets/images/bg-alt.jpg b/themes/bulaksu/assets/images/bg-alt.jpg new file mode 100644 index 0000000000000000000000000000000000000000..925fa42c7c6fc294a33a5bee4e6ef941e2a2ae11 GIT binary patch literal 71851 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%0D<19R>sgy#ns<$bD@saA zKHig+o*YOY$#VFAC0%P&Q&$#_tT^82>T0g31e_5}0!gVf1cVV;4UbDmNXVlgO9d%3 z3?dJw1jG*QC>g><5{W#UP~_WsV^-#+`EYJbZqL3(`I{;{10+geYn< z5dT>9ATWvrB$%dz-Jml;eT%Oo@ z{%NOQHl*yi>7G^DToeqfD{8aO;$P4g_IHu4?oU7Wi>oOF>#s5Z8cn4TUWje21y3uV zDTU8Z!s|MOs2|n|O7+QRr9~tHxeD(OWbWZ64dmBC)Fa&;x|5_=UKW2!=Fp!DUaH=# zY?zq;{r9)Zj-qg}f_3^GSfrbP=@B!4$@q=e_=bs^ zZKQbn`dvn%1u2O$En~;y#Q`3Y5O0E!M2eqYh(3Q_7R9=I@0$UzN4V9~{rK_36StWB z);8fFdRB_x%42ne>nX0SIjXIa;1DEoph|s&6u&&*2MdCf z2hBgf!Zz4fmgn-5DzZ@8nbgd$&& zxsk4d1Ggc>y}V--!zTzeI$i1g1VSLGD@&=2Fz*c(<~`OlC*&bz-7h?C|>e{ajgXfl9}#4}sxBM2Oyk z5GQW!edz+HqNjO3jNcR71I1|>jRI}lcPvA;F}!mypD$&i55f_Wl`B>QMNBPm8xbPx z;3^$g44}X{fWN$rgQkXM{;m~kPXLMzaJE#0Y3(56y6~{FRzZbVX!G*izhT&w2&ab` zlJrL4?{(V=ixI$N~(VN+pfWOWa7lP0Vxc5mupA_!GmPTBckC zr8ivo$6BKok5%G&ZS_g!(8^WDe>OClihAB=#Dy%FG={)7C;b$S#yFX-;|QN=XKq)v zp_G79!xvlSbr}mX@*&quOj%}ogEnG5Eoyzg%RmcO*Eq|x-|gQjQ@vARVt>k&%qEnq z`tK{Q>f7ALvAF<30dRs)6q{Sx4%}kC8TJ^%W#IaP0bog_9hVI}7MqCic~F;wmq1

    -weBxDmmrsqC(|iDYXUij6E(l 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 literal 0 HcmV?d00001 diff --git a/themes/bulaksu/assets/images/gradient.jpg b/themes/bulaksu/assets/images/gradient.jpg new file mode 100644 index 0000000000000000000000000000000000000000..630ee51edd4a0e215d88a81667457c16f85b8719 GIT binary patch literal 776 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 literal 0 HcmV?d00001 diff --git a/themes/bulaksu/assets/images/up.png b/themes/bulaksu/assets/images/up.png new file mode 100644 index 0000000000000000000000000000000000000000..6f84f9813c7b75d097835c02387549257e4cd414 GIT binary patch literal 3861 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 +

    +

    + +
    + + +Zira diff --git a/themes/bulaksu/layout-left.php b/themes/bulaksu/layout-left.php new file mode 100644 index 0000000..98f97f9 --- /dev/null +++ b/themes/bulaksu/layout-left.php @@ -0,0 +1,42 @@ + + + + + + + + + + +
    +
    +
    +
    + +
    +
    +
    + +
    + + + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/themes/bulaksu/layout-right.php b/themes/bulaksu/layout-right.php new file mode 100644 index 0000000..c8b3b0a --- /dev/null +++ b/themes/bulaksu/layout-right.php @@ -0,0 +1,42 @@ + + + + + + + + + + +
    +
    +
    +
    + +
    +
    +
    +
    + + + + +
    + +
    +
    +
    + + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/themes/bulaksu/layout-wide.php b/themes/bulaksu/layout-wide.php new file mode 100644 index 0000000..63feda5 --- /dev/null +++ b/themes/bulaksu/layout-wide.php @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    +
    +
    + +
    +
    +
    +
    + + + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/themes/bulaksu/layout.php b/themes/bulaksu/layout.php new file mode 100644 index 0000000..0172771 --- /dev/null +++ b/themes/bulaksu/layout.php @@ -0,0 +1,47 @@ + + + + + + + + + + +
    +
    +
    +
    + +
    +
    +
    + +
    + + + + +
    + +
    +
    +
    + + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/themes/bulaksu/page.php b/themes/bulaksu/page.php new file mode 100644 index 0000000..1e5bbfa --- /dev/null +++ b/themes/bulaksu/page.php @@ -0,0 +1,49 @@ +
    +
    + +<?php echo (!empty($title) ? Zira\Helper::html($title) : '') ?> + + + + + +

    + +

    + + + + + +
    + +
    + + +
    + + + + +
    + + +
    +
    \ No newline at end of file diff --git a/themes/bulaksu/screenshot.jpg b/themes/bulaksu/screenshot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c00083d53d289cd08dc9dcd1097d2bba024bec63 GIT binary patch literal 30995 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 +
    + + + + +

    ()

    + + + +
      + + +sort_path)) - 1; ?> +0) $comment_offset_class = ' comments-item-nested-'.($comment_offset < Zira\Config::get('comments_max_nesting', 5) ? $comment_offset : Zira\Config::get('comments_max_nesting', 5)); ?> +
    • +author_id > 0 && $comment->author_username !== null && $comment->author_firstname !== null && $comment->author_secondname !== null): ?> +author_id, $comment->author_firstname, $comment->author_secondname, $comment->author_username, null, $comment->author_image, null, array('class'=>'comment-avatar')) ?> + +author_image, null, array('class'=>'comment-avatar')) ?> + + +author_id > 0 && $comment->author_username !== null && $comment->author_firstname !== null && $comment->author_secondname !== null): ?> +sender_name ? Zira\User::generateUserProfileLink($comment->author_id, null, null, $comment->sender_name) : Zira\User::generateUserProfileLink($comment->author_id, $comment->author_firstname, $comment->author_secondname, $comment->author_username)); ?> + +sender_name ? Zira\Helper::html($comment->sender_name) : t('Guest')); ?> + +recipient_name): ?> +   recipient_name) ?> + + +

      content))) ?>

      + + creation_date)) ?>   + + +likes); ?> +   + + +dislikes); ?> +   + + + + +
    • + +
    +$limit*($page+1)): ?> +
    + +
    + + + +
    + +
    + + +'.t('Login').'') ?> + + +
    + + \ No newline at end of file diff --git a/themes/bulaksu/zira/contact.php b/themes/bulaksu/zira/contact.php new file mode 100644 index 0000000..bd29e28 --- /dev/null +++ b/themes/bulaksu/zira/contact.php @@ -0,0 +1,44 @@ + +
    + +<?php if (!empty($name)) echo Zira\Helper::html($name); ?> + +
    + +

    + + +
    + + +
    + + +
    + + + + + +

    + +
    +
    +$address, 'name'=>!empty($name) ? $name : ''), 'zira/google-map'); ?> +$address, 'name'=>!empty($name) ? $name : ''), 'zira/yandex-map'); ?> + \ No newline at end of file diff --git a/themes/bulaksu/zira/gallery.php b/themes/bulaksu/zira/gallery.php new file mode 100644 index 0000000..999a41a --- /dev/null +++ b/themes/bulaksu/zira/gallery.php @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/themes/bulaksu/zira/google-map.php b/themes/bulaksu/zira/google-map.php new file mode 100644 index 0000000..90a314e --- /dev/null +++ b/themes/bulaksu/zira/google-map.php @@ -0,0 +1,44 @@ + + + + +
    + + + + + + + + \ No newline at end of file diff --git a/themes/bulaksu/zira/home.php b/themes/bulaksu/zira/home.php new file mode 100644 index 0000000..fbb3698 --- /dev/null +++ b/themes/bulaksu/zira/home.php @@ -0,0 +1,50 @@ + + + +
    + + + +
      + +
    • + +
      +thumb): ?> + +<?php echo Zira\Helper::html($record->title) ?> + + +

      description)) ?>

      +
      +
      + + creation_date)) ?> + + + author_id, $record->author_firstname, $record->author_secondname, $record->author_username) ?> + + + comments ?> + + + + +category_name && $record->category_title): ?> + category_title) ?> + +
      +
    • + +
    +
    + + diff --git a/themes/bulaksu/zira/list.php b/themes/bulaksu/zira/list.php new file mode 100644 index 0000000..40f0519 --- /dev/null +++ b/themes/bulaksu/zira/list.php @@ -0,0 +1,44 @@ + +
      + + +
    • +

      +title) ?> +

      +
      +thumb): ?> + +<?php echo Zira\Helper::html($record->title) ?> + + +

      description)) ?>

      +
      +
      + + creation_date)) ?> + + + author_id, $record->author_firstname, $record->author_secondname, $record->author_username) ?> + + + comments ?> + + + + +category_name && $record->category_title): ?> + category_title) ?> + +
      +
    • + +=$settings['limit']) break; ?> + +
    +$settings['limit']): ?> +
    + +
    + + diff --git a/themes/bulaksu/zira/map.php b/themes/bulaksu/zira/map.php new file mode 100644 index 0000000..846a20c --- /dev/null +++ b/themes/bulaksu/zira/map.php @@ -0,0 +1,20 @@ +
    + +
    \ No newline at end of file diff --git a/themes/bulaksu/zira/search-results.php b/themes/bulaksu/zira/search-results.php new file mode 100644 index 0000000..eabed89 --- /dev/null +++ b/themes/bulaksu/zira/search-results.php @@ -0,0 +1,34 @@ + +
      + + +
    • +

      +title) ?> +

      +
      +thumb): ?> + +<?php echo Zira\Helper::html($record->title) ?> + + +

      description)) ?>

      +
      + +
      +category_name && $record->category_title): ?> + category_title) ?> + +
      + +
    • + +=$settings['limit']) break; ?> + +
    +$settings['limit'] && isset($settings['offset'])): ?> +
    + +
    + + diff --git a/themes/bulaksu/zira/search.php b/themes/bulaksu/zira/search.php new file mode 100644 index 0000000..ef38f4c --- /dev/null +++ b/themes/bulaksu/zira/search.php @@ -0,0 +1,11 @@ + + + +
    + +
    + +

    + \ No newline at end of file diff --git a/themes/bulaksu/zira/slider.php b/themes/bulaksu/zira/slider.php new file mode 100644 index 0000000..6f0cffb --- /dev/null +++ b/themes/bulaksu/zira/slider.php @@ -0,0 +1,9 @@ + +
    +
      + +
    • <?php echo Zira\Helper::html($_image->description) ?>
    • + +
    +
    + diff --git a/themes/bulaksu/zira/user/conversations.php b/themes/bulaksu/zira/user/conversations.php new file mode 100644 index 0000000..90a1f6b --- /dev/null +++ b/themes/bulaksu/zira/user/conversations.php @@ -0,0 +1,122 @@ + + +
    + +
    + + +
      +$item): ?> +
    • + +    + modified_date))) ?> +    + subject) ?> +
    • + +
    + +

    + + + diff --git a/themes/bulaksu/zira/user/menu.php b/themes/bulaksu/zira/user/menu.php new file mode 100644 index 0000000..f16c87f --- /dev/null +++ b/themes/bulaksu/zira/user/menu.php @@ -0,0 +1,27 @@ + +
      +$item): ?> +0): ?> + + + + +
    + \ No newline at end of file diff --git a/themes/bulaksu/zira/user/messages.php b/themes/bulaksu/zira/user/messages.php new file mode 100644 index 0000000..0e4ed8f --- /dev/null +++ b/themes/bulaksu/zira/user/messages.php @@ -0,0 +1,71 @@ + + + +
      +0): ?> +
    •  
    • +$user): ?> +0) echo '
    • '; ?> +
    • id, $user->firstname, $user->secondname, $user->username, null); ?>
    • + + +
    •  
    • +
    • + +
    +
    + +
    + + +
      +$item): ?> +
    • +
      +username): ?> +user_id, $item->firstname, $item->secondname, $item->username); ?> + + + +    +
      creation_date))) ?>
      +
      +
      +username): ?> +user_id, $item->firstname, $item->secondname, $item->username, null, $item->image); ?> + +
      +
      +

      content))) ?>

      +
      +
    • + +
    + + +0) echo $form; ?> + + \ No newline at end of file diff --git a/themes/bulaksu/zira/user/profile.php b/themes/bulaksu/zira/user/profile.php new file mode 100644 index 0000000..9d651fa --- /dev/null +++ b/themes/bulaksu/zira/user/profile.php @@ -0,0 +1,73 @@ +
    + +
    \ No newline at end of file diff --git a/themes/bulaksu/zira/widgets/block.php b/themes/bulaksu/zira/widgets/block.php new file mode 100644 index 0000000..d335703 --- /dev/null +++ b/themes/bulaksu/zira/widgets/block.php @@ -0,0 +1,6 @@ +
    + +

    + + +
    \ No newline at end of file diff --git a/themes/bulaksu/zira/widgets/category.php b/themes/bulaksu/zira/widgets/category.php new file mode 100644 index 0000000..09156fc --- /dev/null +++ b/themes/bulaksu/zira/widgets/category.php @@ -0,0 +1,49 @@ +
    + + + + +
      + +
    • +

      +title) ?> +

      +
      +thumb): ?> + +<?php echo Zira\Helper::html($record->title) ?> + + +

      description)) ?>

      +
      + +
      + + creation_date)) ?> + + + author_id, $record->author_firstname, $record->author_secondname, $record->author_username) ?> + + + comments ?> + + + + +category_name && $record->category_title): ?> + category_title) ?> + +
      + +
    • + +
    + +
    diff --git a/themes/bulaksu/zira/widgets/childmenu.php b/themes/bulaksu/zira/widgets/childmenu.php new file mode 100644 index 0000000..eb0cb2c --- /dev/null +++ b/themes/bulaksu/zira/widgets/childmenu.php @@ -0,0 +1,28 @@ +
    + +
    \ No newline at end of file diff --git a/themes/bulaksu/zira/widgets/discussed.php b/themes/bulaksu/zira/widgets/discussed.php new file mode 100644 index 0000000..08bacf0 --- /dev/null +++ b/themes/bulaksu/zira/widgets/discussed.php @@ -0,0 +1,42 @@ +
    + + + + +
      + +
    • +

      +title) ?> +

      +
      +thumb): ?> + +<?php echo Zira\Helper::html($record->title) ?> + + +

      description)) ?>

      +
      +
      + + + creation_date)) ?> + + + + + + + comments ?> + +category_name && $record->category_title): ?> + category_title) ?> + +
      +
    • + +
    + +
    diff --git a/themes/bulaksu/zira/widgets/footermenu.php b/themes/bulaksu/zira/widgets/footermenu.php new file mode 100644 index 0000000..b192d5b --- /dev/null +++ b/themes/bulaksu/zira/widgets/footermenu.php @@ -0,0 +1,29 @@ + \ No newline at end of file diff --git a/themes/bulaksu/zira/widgets/languages.php b/themes/bulaksu/zira/widgets/languages.php new file mode 100644 index 0000000..893de4c --- /dev/null +++ b/themes/bulaksu/zira/widgets/languages.php @@ -0,0 +1,15 @@ +1) { +echo '
      '; + Zira\Helper::setAddingLanguageToUrl(false); + foreach($languages as $language) { + $url = Zira\Helper::html($language); + $class = ''; + if ($language == Zira\Config::get('language')) $url='/'; + if ($language == Zira\Locale::getLanguage()) $class=' class="active"'; + echo '
    • '.Zira\Helper::html(t(ucfirst($language))).'
    • '; + } + Zira\Helper::setAddingLanguageToUrl(true); +echo '
    '; +} diff --git a/themes/bulaksu/zira/widgets/logo.php b/themes/bulaksu/zira/widgets/logo.php new file mode 100644 index 0000000..6f3bff1 --- /dev/null +++ b/themes/bulaksu/zira/widgets/logo.php @@ -0,0 +1,13 @@ +'; + if (!empty($logo) || !empty($title)) { + echo ''; + } + if (!empty($slogan)) echo '

    '.Zira\Helper::html($slogan).'

    '; + else echo '

     

    '; + echo ''; +} \ No newline at end of file diff --git a/themes/bulaksu/zira/widgets/rated.php b/themes/bulaksu/zira/widgets/rated.php new file mode 100644 index 0000000..7827295 --- /dev/null +++ b/themes/bulaksu/zira/widgets/rated.php @@ -0,0 +1,42 @@ +
    + + + + +
      + +
    • +

      +title) ?> +

      +
      +thumb): ?> + +<?php echo Zira\Helper::html($record->title) ?> + + +

      description)) ?>

      +
      +
      + + + creation_date)) ?> + + + comments ?> + + + + + +category_name && $record->category_title): ?> + category_title) ?> + +
      +
    • + +
    + +
    diff --git a/themes/bulaksu/zira/widgets/share.php b/themes/bulaksu/zira/widgets/share.php new file mode 100644 index 0000000..b52f9c1 --- /dev/null +++ b/themes/bulaksu/zira/widgets/share.php @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/themes/bulaksu/zira/widgets/topmenu.php b/themes/bulaksu/zira/widgets/topmenu.php new file mode 100644 index 0000000..0e34d0d --- /dev/null +++ b/themes/bulaksu/zira/widgets/topmenu.php @@ -0,0 +1,38 @@ +
    + +
    \ No newline at end of file diff --git a/themes/bulaksu/zira/xml/rss.php b/themes/bulaksu/zira/xml/rss.php new file mode 100644 index 0000000..c16c30a --- /dev/null +++ b/themes/bulaksu/zira/xml/rss.php @@ -0,0 +1,33 @@ +'; ?> + + + +<?php echo Zira\Helper::html($title); ?> + + + + + +<?php echo Zira\Helper::html($title); ?> + + + +Zira CMS + + + +<?php echo Zira\Helper::html($item['title']) ?> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/themes/bulaksu/zira/xml/sitemap-index.php b/themes/bulaksu/zira/xml/sitemap-index.php new file mode 100644 index 0000000..dc2c7eb --- /dev/null +++ b/themes/bulaksu/zira/xml/sitemap-index.php @@ -0,0 +1,9 @@ +'; ?> + + + + + + + + \ No newline at end of file diff --git a/themes/bulaksu/zira/xml/sitemap.php b/themes/bulaksu/zira/xml/sitemap.php new file mode 100644 index 0000000..5fc9d05 --- /dev/null +++ b/themes/bulaksu/zira/xml/sitemap.php @@ -0,0 +1,12 @@ +'; ?> + + +$url): ?> + + +weekly +0.8 + + + + diff --git a/themes/bulaksu/zira/yandex-map.php b/themes/bulaksu/zira/yandex-map.php new file mode 100644 index 0000000..c91a7a2 --- /dev/null +++ b/themes/bulaksu/zira/yandex-map.php @@ -0,0 +1,53 @@ + + + + + +
    + + + + + + + diff --git a/themes/default/assets/css/desk.css b/themes/default/assets/css/desk.css new file mode 100644 index 0000000..cf2c3ff --- /dev/null +++ b/themes/default/assets/css/desk.css @@ -0,0 +1,790 @@ +#dashpanel-container { + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; + font-size: 14px; + width: 100%; + height: 40px; + position: fixed; + top: 0; + left: 0; + z-index: 999; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +#dashpanel-container .navbar { + min-height: 40px; + margin-bottom: 0px; + border-radius: 0px; +} +#dashpanel-container .navbar.disabled { + background: #F2D2BB; + animation: blinker 1s linear infinite; +} +@keyframes blinker { + 50% { background: #fff; } +} +#dashpanel-container .navbar-nav li a { + padding-top: 10px; + padding-bottom: 10px; +} +#dashpanel-container .navbar-brand { + height: 40px; + padding: 10px 15px; +} +#dashpanel-container .dropdown-menu li a { + padding-top: 5px; + padding-bottom: 5px; +} +#dashpanel-container .navbar-toggle { + margin-top: 2px; + margin-bottom: 2px; +} +body { + padding-top: 42px; +} +body.dashboard-window-resizing { + cursor: nwse-resize; +} +body.dashboard-window-sidebar-resizing { + cursor: ew-resize; +} +#dashpanel-container .navbar-brand img { + display: inline-block; + vertical-align: baseline; + margin-right: 2px; +} +.dashboard-window { + position: fixed; + top: 100px; + left: 100px; + width: 400px; + height: 300px; + min-width: 70px; + min-height: 70px; + background-color: #e6e6e6; + border: 1px solid #cccccc; + box-shadow: 0px 0px 4px rgba(85, 70, 113, 0.41), inset 0px 0px 3px #ffffff; + border-top-left-radius: 10px; + border-top-right-radius: 10px; + z-index: 999; + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; + font-size: 14px; + color: #080808; + transition: background-color 50ms linear, box-shadow 50ms linear; + /* + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + */ +} +.dashboard-window-focused { + background-color: #f9f9f9; + box-shadow: 0px 0px 4px rgba(85, 70, 113, 0.41), 0px 0px 3px #FFF inset; +} +.dashboard-window-disabled { + background-color: #E7DDE6; +} +.dashboard-window-maximized { + border-radius: 0px; +} +.dashboard-window-minimized { + min-width: 0; + min-height: 0; + overflow: hidden; + background-color: #F2EBF9; + box-shadow: 0px 0px 4px #E5DFF3, 0px 0px 3px #FFF inset; +} +.dashboard-window-moving { + box-shadow: none; + border: 1px solid #97CFE9; +} +.dashboard-windows-overlay { + position: fixed; + left: 0px; + top: 0px; + width: 100%; + height: 100%; + background-color: rgba(139, 117, 189, 0.1); + z-index: 998; +} +.dashboard-window a:link, +.dashboard-window a:visited { + text-decoration: none; + outline: none; +} +.dashboard-window a:hover { + text-decoration: none; +} +.dashboard-window a img { + border: none; +} +.dashboard-window .dashboard-window-header { + position: relative; + width: 100%; + height: 30px; + border-bottom: 1px solid #eeeeee; + overflow: hidden; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.dashboard-window .dashboard-window-menu { + position: relative; + width: 100%; + height: 24px; + border-top: 1px solid #ffffff; + border-bottom: 1px solid #eeeeee; + background-color: #F4F5F8; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.dashboard-window .dashboard-window-sidebar { + position: relative; + float: left; + width: 180px; + height: 230px; + border-top: 1px solid #efefef; + border-bottom: 1px solid #eeeeee; + background-color: #D1D6E9; + overflow: auto; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.dashboard-window-focused .dashboard-window-sidebar { + border-top: 1px solid #ffffff; +} +.dashboard-window .dashboard-window-content { + position: relative; + width: auto; + height: 230px; + margin-left: 180px; + border-top: 1px solid #efefef; + border-bottom: 1px solid #eeeeee; + background-color: #ffffff; + overflow: auto; + transition: background-color 100ms linear; +} +.dashboard-window-focused .dashboard-window-content { + border-top: 1px solid #ffffff; +} +.dashboard-window-nosidebar .dashboard-window-content { + margin-left: 0px; +} +.dashboard-window-disabled .dashboard-window-content { + background-color: #F2EAF0; +} +.dashboard-window .dashboard-window-noselect-content { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.dashboard-window .dashboard-window-footer { + position: relative; + width: 100%; + height: 16px; + border-top: 1px solid #efefef; + overflow: hidden; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.dashboard-window-focused .dashboard-window-footer { + border-top: 1px solid #ffffff; +} +.dashboard-window .dashboard-window-header .dashboard-window-title { + display: block; + margin-left: 80px; + margin-right: 80px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + font-weight: bold; + text-align: center; + line-height: 30px; + cursor: default; + color: #99A7A3; + text-shadow: 1px 1px 1px #ffffff; +} +.dashboard-window-focused .dashboard-window-header .dashboard-window-title { + color: #645A69; +} +.dashboard-window-animating .dashboard-window-header .dashboard-window-title { + display: none; +} +.dashboard-window-minimized .dashboard-window-header, +.dashboard-window-minimized .dashboard-window-header .dashboard-window-title { + cursor: pointer; +} +.dashboard-window-minimized .dashboard-window-header .dashboard-window-title { + margin-left: 20px; + margin-right: 20px; + color: #4f494d; +} +.dashboard-window .dashboard-window-footer .dashboard-window-resizer { + position: absolute; + top: 0px; + right: 0px; + width: 14px; + height: 14px; + background-image: url(../images/dash-window-buttons-slice.png); + background-repeat: no-repeat; + background-position: 0 0; + cursor: nwse-resize; +} +.dashboard-window-noresize .dashboard-window-footer .dashboard-window-resizer, +.dashboard-window-maximized .dashboard-window-footer .dashboard-window-resizer, +.dashboard-window-minimized .dashboard-window-footer .dashboard-window-resizer, +.dashboard-window-animating .dashboard-window-footer .dashboard-window-resizer, +.dashboard-window-moving .dashboard-window-footer .dashboard-window-resizer { + visibility: hidden; +} +.dashboard-window .dashboard-window-content .dashboard-sidebar-resizer { + position: absolute; + top: 0px; + left: 0px; + width: 4px; + height: 230px; + background-image: url(../images/dash-window-buttons-slice.png); + background-repeat: repeat-y; + background-position: -78px 0px; + cursor: ew-resize; +} +.dashboard-window .dashboard-window-header a.dashboard-window-close-button:link, +.dashboard-window .dashboard-window-header a.dashboard-window-close-button:visited { + position: absolute; + display: block; + width: 16px; + height: 16px; + left: 7px; + top: 7px; + text-decoration: none; + background-image: url(../images/dash-window-buttons-slice.png); + background-repeat: no-repeat; + background-position: -16px 0px; +} +.dashboard-window .dashboard-window-header a.dashboard-window-close-button:hover { + background-position: -16px -16px; +} +.dashboard-window .dashboard-window-header a.dashboard-window-maximize-button:link, +.dashboard-window .dashboard-window-header a.dashboard-window-maximize-button:visited { + position: absolute; + display: block; + width: 16px; + height: 16px; + left: 45px; + top: 7px; + text-decoration: none; + background-image: url(../images/dash-window-buttons-slice.png); + background-repeat: no-repeat; + background-position: -48px 0px; +} +.dashboard-window .dashboard-window-header a.dashboard-window-maximize-button:hover { + background-position: -48px -16px; +} +.dashboard-window .dashboard-window-header a.dashboard-window-minimize-button:link, +.dashboard-window .dashboard-window-header a.dashboard-window-minimize-button:visited { + position: absolute; + display: block; + width: 16px; + height: 16px; + left: 26px; + top: 7px; + text-decoration: none; + background-image: url(../images/dash-window-buttons-slice.png); + background-repeat: no-repeat; + background-position: -32px 0px; +} +.dashboard-window .dashboard-window-header a.dashboard-window-minimize-button:hover { + background-position: -32px -16px; +} +.dashboard-window-animating .dashboard-window-sidebar, +.dashboard-window-moving .dashboard-window-sidebar, +.dashboard-window-minimized .dashboard-window-sidebar { + overflow: hidden; +} + +.dashboard-window-animating .dashboard-window-content, +.dashboard-window-minimized .dashboard-window-content { + overflow: hidden; +} +.dashboard-window .dashboard-window-menu .dropdown { + margin-right: 24px; +} +.dashboard-window .dashboard-window-menu ul.dashboard-window-menu-list { + list-style-type: none; + display: block; + margin: 0px; + padding: 0px; + height: 24px; +} +.dashboard-window-animating .dashboard-window-menu ul.dashboard-window-menu-list { + display: none; +} +.dashboard-window .dashboard-window-menu ul.dashboard-window-menu-list li.dashboard-window-menu-list-item { + display: inline-block; + vertical-align: top; + position: relative; +} +.dashboard-window .dashboard-window-menu ul.dashboard-window-menu-list li.dashboard-window-menu-list-item a.dashboard-window-menu-list-item-link:link, +.dashboard-window .dashboard-window-menu ul.dashboard-window-menu-list li.dashboard-window-menu-list-item a.dashboard-window-menu-list-item-link:visited { + display: block; + height: 24px; + line-height: 24px; + text-decoration: none; + color: #404347; + text-shadow: 1px 1px 1px #ffffff; + font-size: 14px; + padding: 0px 14px; +} +.dashboard-window .dashboard-window-menu ul.dashboard-window-menu-list li.dashboard-window-menu-list-item a.dashboard-window-menu-list-item-link:hover, +.dashboard-window .dashboard-window-menu ul.dashboard-window-menu-list li.dashboard-window-menu-list-item.open a.dashboard-window-menu-list-item-link { + color: #FFFFFF; + text-shadow: none; + background-color: #9eaeb4; +} +.dashboard-window .dashboard-window-menu ul.dashboard-window-menu-list li.dashboard-window-menu-list-item .dropdown-menu { + margin: 0px; + border-top-left-radius: 0px; + border-top-right-radius: 0px; + font-size: 14px; +} +.dashboard-window .dashboard-window-toolbar { + height: 50px; + position: relative; + border-top: 1px solid #ffffff; + border-bottom: 1px solid #eeeeee; + background-color: #eee; + overflow: hidden; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.dashboard-window .dashboard-window-toolbar .navbar { + margin: 0px; + border: none; +} +.dashboard-window .dashboard-window-toolbar .navbar-form { + width: auto; + padding-top: 0px; + padding-bottom: 0px; + margin-right: 0px; + margin-left: 0px; + border: 0px none; + box-shadow: none; +} +.dashboard-window-animating .dashboard-window-toolbar .navbar { + display: none; +} +.dashboard-window .dashboard-window-toolbar .navbar .navbar-left { + float: left !important; + margin-left: -15px; +} +.dashboard-window .dashboard-window-toolbar .navbar .navbar-right { + float: right !important; + margin-right: -15px; +} +.dashboard-window .dashboard-window-toolbar .navbar input[type=text].disabled { + background-color: #EEE; +} +.dashboard-window .dashboard-window-sidebar .dashboard-sidebar-content-wrapper { + margin: 10px; + font-size: 15px; + color: #564C60; + text-shadow: 0px 1px 1px #FFF; + white-space: nowrap; +} +.dashboard-window-animating .dashboard-window-sidebar .dashboard-sidebar-content-wrapper { + display: none; +} +.dashboard-window .dashboard-window-sidebar .dashboard-sidebar-content-wrapper div, +.dashboard-window .dashboard-window-sidebar .dashboard-sidebar-content-wrapper span { + display: block; + padding: 5px 14px; + font-weight: bold; +} +.dashboard-window .dashboard-window-sidebar .dashboard-sidebar-content-wrapper .disabled { + color: #9B979E; +} +.dashboard-window .dashboard-window-sidebar .dashboard-sidebar-content-wrapper span.glyphicon { + display: inline-block; + padding: 0px; +} +.dashboard-window .dashboard-window-sidebar .dashboard-sidebar-content-wrapper a:link, +.dashboard-window .dashboard-window-sidebar .dashboard-sidebar-content-wrapper a:visited { + display: block; + padding: 5px 14px; + color: #564C60; + font-weight: normal; + text-shadow: 0px 1px 1px #FFF; + text-decoration: none; + text-overflow: ellipsis; + overflow: hidden; +} +.dashboard-window .dashboard-window-sidebar .dashboard-sidebar-content-wrapper a:hover, +.dashboard-window .dashboard-window-sidebar .dashboard-sidebar-content-wrapper a.active { + background-color: #94AEC2; + color: #FBFBFB; + text-shadow: 0px 1px 1px #5C7D92; + border-radius: 5px; + box-shadow: 0px 0px 7px #768EA7 inset; +} +.dashboard-window .dashboard-window-sidebar .dashboard-sidebar-content-wrapper a.disabled:link, +.dashboard-window .dashboard-window-sidebar .dashboard-sidebar-content-wrapper a.disabled:visited { + color: #9B979E; +} +.dashboard-window .dashboard-window-sidebar .dashboard-sidebar-content-wrapper a.disabled:hover { + background: none; + color: #9B979E; + text-shadow: 0px 1px 1px #FFF; + border-radius: 0; + box-shadow: none; +} +.dashboard-window .dashboard-window-sidebar .dashboard-sidebar-content-wrapper span.devider { + height: 1px; + border-bottom: 1px solid #EDEDF6; + border-top: 1px solid #B3B6D1; + padding: 0px; + margin: 7px 14px; +} +.dashboard-window .dashboard-window-sidebar .dashboard-sidebar-content-wrapper ul { + list-style-type: none; + margin: 0px; + padding: 0px; +} +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper { + margin: 0px; + padding: 0px 4px; + color: #000000; + text-shadow: none; + font-size: 14px; + white-space: normal; +} +.dashboard-window .dashboard-window-content .dashboard-body-full-content-wrapper { + padding: 0px; + height: 100%; + overflow: hidden; +} +.dashboard-window-animating .dashboard-window-content .dashboard-body-content-wrapper { + display: none; +} +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper a:link, +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper a:visited { + color: #3C3F57; + text-shadow: none; + text-decoration: none; +} +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper a:hover, +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper a.active { + text-decoration: underline; +} +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper .dropdown-menu a:hover, +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper .dropdown-menu a.active { + text-decoration: none; +} +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper a.disabled:link, +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper a.disabled:visited, +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper a.inactive:link, +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper a.inactive:visited { + color: #BDBDBD; +} +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper ul { + list-style-type: none; + margin: 0px; + padding: 0px; +} +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper ul.dashwindow-content-grid li { + display: inline-block; + vertical-align: top; + margin: 2px; + text-align: center; +} +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper ul.dashwindow-content-grid li a:link, +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper ul.dashwindow-content-grid li a:visited { + display: block; + padding: 13px; + width: 86px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + font-size: 13px; + cursor: default; +} +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper ul.dashwindow-content-grid li a:hover, +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper ul.dashwindow-content-grid li a.active { + background-color: #F3F5F9; + box-shadow: 0px 0px 3px #E0E1F8 inset; + text-decoration: none; + border-radius: 7px; +} +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper ul.dashwindow-content-grid li a.active { + background-color: #C9D8F8; + box-shadow: 0px 0px 3px #D3D4F5 inset; +} +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper ul.dashwindow-content-grid li img, +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper ul.dashwindow-content-grid .dashwindow-content-icon { + display: block; + width: 60px; + height: 60px; + border: none; +} +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper ul.dashwindow-content-list li { + display: block; + margin: 0px; + text-align: left; +} +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper ul.dashwindow-content-list li.odd { + background-color: #F8F1FB; +} +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper ul.dashwindow-content-list li a:link, +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper ul.dashwindow-content-list li a:visited { + width: 100%; + line-height: 60px; + padding: 2px 13px; +} +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper ul.dashwindow-content-list li a:hover, +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper ul.dashwindow-content-list li a.active { + border-radius: 0; +} +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper ul.dashwindow-content-list li img, +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper ul.dashwindow-content-list .dashwindow-content-icon { + float: left; + margin-right: 10px; +} +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper .dashwindow-content-icon-html { + background: url(../images/dash-window-buttons-slice.png) no-repeat 0px -277px; +} +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper .dashwindow-content-icon-txt { + background: url(../images/dash-window-buttons-slice.png) no-repeat 0px -217px; +} +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper .dashwindow-content-icon-archive { + background: url(../images/dash-window-buttons-slice.png) no-repeat 0px -152px; +} +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper .dashwindow-content-icon-file { + background: url(../images/dash-window-buttons-slice.png) no-repeat 0px -32px; +} +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper .dashwindow-content-icon-folder { + background: url(../images/dash-window-buttons-slice.png) no-repeat 0px -92px; +} +.dashboard-window .dashboard-window-content .dashboard-body-content-wrapper .dashwindow-content-icon-blank { + background: none; +} +.dashboard-window .dashboard-window-footer .dashboard-footer-content-wrapper { + margin: 0px 10px; + color: #9F9F9F; + text-shadow: 0px 1px 1px #ffffff; + font-size: 12px; + line-height: 12px; + white-space: nowrap; +} +.dashboard-window-animating .dashboard-window-footer .dashboard-footer-content-wrapper, +.dashboard-window-moving .dashboard-window-footer .dashboard-footer-content-wrapper { + visibility: hidden; +} +.dashboard-window .dashboard-window-loader { + display: none; + position: absolute; + right: 4px; + top: 4px; + width: 16px; + height: 16px; + background: url(../images/dash-window-loader.gif) no-repeat 0 0; +} +.dashboard-window-loading .dashboard-window-loader { + display: block; +} +.dashboard-window-contextmenu { + position: fixed; + display: none; +} +.dashboard-window-contextmenu.open { + display: block; +} +.dashboard-window-highlight { + border: 1px solid #cdafff; + box-shadow: 0px 0px 20px #AA83F6, inset 0px 0px 3px #ffffff; + background-color: #D7CAFB; +} +.dashboard-window-highlight .dashboard-window-header .dashboard-window-title { + color: #644484; + text-shadow: 0px 1px 1px #ffffff; +} +.dashboard-window-blink { + border: 1px solid #cdafff; + box-shadow: 0px 0px 20px #AA83F6, inset 0px 0px 3px #ffffff; + background-color: #D7CAFB; +} +.dashboard-window .mce-panel { + border-color: #eeeeee !important; + background-color: #F8F8F8 !important; +} +.dashboard-window .mce-btn { + background-color: #F8F8F8 !important; +} +.mce-window { + border-radius: 20px; + overflow: hidden; + box-shadow: 0px 0px 10px #777777; + padding: 10px 20px !important; +} +.mce-window .mce-window-head { + border: none !important; +} +.mce-window .mce-foot { + border: none !important; +} +.mce-window .mce-btn { + border-radius: 6px; +} +.mce-window .mce-listbox { + border-radius: 0px; +} +.dashboard-window .dash-window-form { + padding: 0px 0px; +} +.dashboard-window .dash-window-form .form-group { + margin: 0px; + padding: 14px 0px; +} +.dashboard-window .dash-window-form .control-label { + text-align: left; +} +.dashboard-window .dash-window-form .form-group.odd { + background-color: #F8F1FB; +} +.dashboard-window .dashboard-glyphicon-pointer { + cursor: pointer; +} +.system-warning { + color: #ff397b; +} +.system-ok { + color: #298069; +} + +/** Dashboard **/ +html.dashboard, +body.dashboard, +body.dashboard #main-wrapper, +body.dashboard #dashboard-wrapper, +body.dashboard #dashboard-canvas-wrapper, +body.dashboard #dashboard-sidebar { + height: 100%; +} +body.dashboard #main-wrapper { + min-width: 800px; + background: #efebf0; + background: -moz-linear-gradient(top, #efebf0 0%, #dfd1f0 100%); + background: -webkit-linear-gradient(top, #efebf0 0%,#dfd1f0 100%); + background: linear-gradient(to bottom, #efebf0 0%,#dfd1f0 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#efebf0', endColorstr='#dfd1f0',GradientType=0 ); +} +body.dashboard #dashboard-wrapper { + background: url(../images/dash-pattern.png) repeat 0 0; +} +body.dashboard #dashboard-canvas-wrapper { + background: url(../images/dash-wallpaper.png) no-repeat 50% 50%; + position: relative; + overflow: hidden; +} +body.dashboard #dashboard-sidebar { + width: 280px; + float: right; + background: #ddd; + background: rgba(246, 238, 244, 0.4); + border-left: 1px solid #F8F4F4; + box-shadow: 0px 0px 1px #AEAEAE, 0px 0px 100px #ECF2E2 inset; +} +body.dashboard #remote-clock-wrapper { + display: none; + position: absolute; + width: 230px; + height: 230px; + top: 25px; + right: 25px; +} +body.dashboard #remote-clock-wrapper canvas { + display: block; + margin: 0px; +} +body.dashboard #dash-version { + position: absolute; + right: 20px; + bottom: 20px; + color: #240036; + text-shadow: 1px 1px 0px #fff; + font-size: 12px; +} +body.dashboard #memory-stick-wrapper { + position: absolute; + left: 20px; + top: 20px; + width: 300px; + height: 300px; + background: url(../images/dash-memo-stick.png) no-repeat 0 0; +} +body.dashboard #memory-stick-wrapper textarea { + border: none; + background: none; + width: 230px; + height: 220px; + resize: none; + padding: 0px; + margin: 40px 0px 0px 30px; + outline: none; +} +body.dashboard #memory-stick-save { + display: none; + text-align: right; + position: absolute; + bottom: 14px; + right: 14px; +} +body.dashboard #memory-stick-save span { + cursor: pointer; +} +body.dashboard .dashboard-notification { + display: none; + position: fixed; + width: 500px; + margin: 0px auto; + font-size: 16px; + padding: 20px; + color: #CAC6ED; + background-color: #515769; + border-radius: 12px; + box-shadow: 0px 0px 2px #7F6A8F; + cursor: pointer; + text-shadow: 1px 1px 0px #3E354E; +} +body.dashboard .dashboard-notification .dashboard-notification-close { + float: right; + color: #E4A691; + cursor: pointer; + font-size: 120%; +} \ No newline at end of file diff --git a/themes/default/assets/css/editor.css b/themes/default/assets/css/editor.css new file mode 100644 index 0000000..997f43b --- /dev/null +++ b/themes/default/assets/css/editor.css @@ -0,0 +1,72 @@ +body { + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; + font-size: 16px; +} +h1 { + font-size: 30px; +} +h2 { + font-size: 26px; +} +h3 { + font-size: 22px; +} +h4 { + font-size: 18px; +} +h5 { + font-size: 14px; +} +h6 { + font-size: 10px; +} +p { + margin: 0px; +} +a:link, +a:visited { + color: #1b6d85; + text-decoration: none; +} +a:hover, +a:active, +a.active { + text-decoration: underline; +} +.image { + max-width:100%; + height:auto; + display: inline-block; + vertical-align: top; + margin: 0px 20px 20px 0px; +} +blockquote { + background-color: #e5e4fe; + margin: 0px 0px 10px 0px; + padding: 10px; +} +pre { + color: #BABABA; + background: #2B2B2B none repeat scroll 0% 0%; + padding: 10px; + margin: 0px 0px 10px 0px; +} +code { + padding: 0px; + display: block; + padding: 2px 0px 2px 10px; + margin: 0px; + border-left: 3px solid #D5C5CA; + border-radius: 0px; + color: #c7254e; + background-color: #f9f2f4; +} +q { + display: block; + color: #858D93; + padding: 2px 0px 2px 10px; + margin: 0px; + border-left: 3px solid #C5D0D8; + background-color: #F8F8F8; + border-radius: 0px; +} \ No newline at end of file diff --git a/themes/default/assets/css/main.css b/themes/default/assets/css/main.css new file mode 100644 index 0000000..c5d735b --- /dev/null +++ b/themes/default/assets/css/main.css @@ -0,0 +1,1497 @@ +@font-face { + font-family: 'Roboto'; + src: url(../fonts/Roboto-Regular.ttf); +} +html, body { + height: 100%; +} +body { + font-family: Roboto,Arial,sans-serif; + font-size: 16px; + background-color: #F6F6F6; +} +h1 { + font-size: 28px; +} +h2 { + font-size: 26px; +} +h3 { + font-size: 22px; +} +h4 { + font-size: 18px; +} +h5 { + font-size: 14px; +} +h6 { + font-size: 10px; +} +p { + margin: 0px; +} +a:link, +a:visited { + color: #1C4F74; + text-decoration: none; +} +a:hover, +a:active, +a.active { + text-decoration: underline; + color: #337AB7; +} +a.external-url { + color: #337AB7 !important; +} +a.btn-primary { + color: #FFF; +} +dt { + font-weight: normal; +} +#main-container-wrapper { + height: 100%; +} +#main-container { + min-height: 100%; +} +/** bootstrap **/ +.container { + +} +.breadcrumb { + padding: 10px 15px; + background-color: #ececec; +} +.page-header { + border-bottom: 1px solid #DBDCEA; +} +.navbar-default { + background-image: -webkit-linear-gradient(top, #fff 0, #F0EDF5 100%); + background-image: -o-linear-gradient(top, #fff 0, #F0EDF5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#F0EDF5)); + background-image: linear-gradient(to bottom, #fff 0, #F0EDF5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffF0EDF5', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} +.navbar-default .navbar-nav li a { + color: #555; +} +.dropdown-menu { + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; + font-size: 14px; +} +.form-panel { + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; + font-size: 14px; +} +.btn-default { + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; + text-shadow:0 1px 0 #fff; + background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%); + background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%); + background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0)); + background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); + filter:progid:DXImageTransform.Microsoft.gradient(enabled=false); + background-repeat:repeat-x; + border-color:#dbdbdb; + border-color:#ccc; +} +.btn-primary { + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; + background-color: #5E7987; + background-image:-webkit-linear-gradient(top,#5E7987 0, #3D475C 100%); + background-image:-o-linear-gradient(top,#5E7987 0,#3D475C 100%); + background-image:-webkit-gradient(linear,left top,left bottom,from(#5E7987),to(#3D475C)); + background-image:linear-gradient(to bottom,#5E7987 0,#3D475C 100%); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5E7987', endColorstr='#ff3D475C', GradientType=0); + filter:progid:DXImageTransform.Microsoft.gradient(enabled=false); + background-repeat:repeat-x; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); +} +.btn-primary:hover, .btn-primary:focus { + background-color: #3D475C; +} +.btn-primary.active, .btn-primary:active, .open > .dropdown-toggle.btn-primary { + color: #FFF; + background-color: #3D475C; + border-color: #324465; +} +.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover { + color:#fff; + background-color: rgb(60, 67, 78); + border-color: #1b2e40 +} +.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover { + background-color: #3D475C; + border-color: #324465; +} +.zira-confirm-modal .modal-content { + background-color: #959C89; +} +.zira-confirm-modal .modal-header { + background-color: #778A75; + border-bottom: 1px solid #626B5A; + border-top-left-radius: 6px; + border-top-right-radius: 6px; + color: #FFFFFF; +} +.zira-confirm-modal .modal-body { + border-bottom: 1px solid #DED8BA; + border-top: 1px solid #ffffff; + background-color: #F9F7EB; +} +.zira-confirm-modal .modal-footer { + border-top: 1px solid #ffffff; + background-color: #F9F7EB; + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; +} +.zira-error-modal .modal-content { + background-color: #8C6781; +} +.zira-error-modal .modal-header { + background-color: #AA4372; + border-bottom: 1px solid #7E1166; + border-top-left-radius: 6px; + border-top-right-radius: 6px; + color: #fff; +} +.zira-error-modal .modal-body { + border-bottom: 1px solid #E9D7E4; + border-top: 1px solid #ffffff; + background-color: #FBF7FA; +} +.zira-error-modal .modal-footer { + border-top: 1px solid #ffffff; + background-color: #FBF7FA; + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; +} +.zira-message-modal .modal-content { + background-color: #5B7EA1; +} +.zira-message-modal .modal-header { + background-color: #357BA1; + border-bottom: 1px solid #064480; + border-top-left-radius: 6px; + border-top-right-radius: 6px; + color: #fff; +} +.zira-message-modal .modal-body { + border-bottom: 1px solid #CBD7DA; + border-top: 1px solid #ffffff; + background-color: #F6F7F8; +} +.zira-message-modal .modal-footer { + border-top: 1px solid #ffffff; + background-color: #F6F7F8; + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; +} +.zira-prompt-modal .modal-content { + background-color: #899C9C; +} +.zira-prompt-modal .modal-header { + background-color: #7D8892; + border-bottom: 1px solid #5A656B; + border-top-left-radius: 6px; + border-top-right-radius: 6px; + color: #FFFFFF; +} +.zira-prompt-modal .modal-body { + border-bottom: 1px solid #DED8BA; + border-top: 1px solid #ffffff; + background-color: #F9F7EB; +} +.zira-prompt-modal .modal-footer { + border-top: 1px solid #ffffff; + background-color: #F9F7EB; + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; +} +/** user profile **/ +.user-profile-photo { + float: left; + border: 5px solid #CCCCCC; + padding: 5px; + margin-right: 10px; + overflow: hidden; + border-radius: 3px; + box-shadow: 0px 0px 2px #cccccc; + background-color: #FFFFFF; +} +.user-head { + margin-bottom: 10px; +} +.user-profile h1 { + margin: 0px 0px 5px; +} +.user-profile h2 { + margin: 60px 0px 10px; + padding: 10px 0px; + border-bottom: 1px solid #E4E4E4; +} +.user-button .user-profile-links { + float: right; + margin-top: -40px; +} +.user-black-list-link .if-blocked { + display: none; +} +.user-black-list-link.blocked .if-blocked { + display: inline; +} +.user-black-list-link.blocked .if-not-blocked { + display: none; +} +#dashpanel-fixed-button:link, +#dashpanel-fixed-button:visited { + display: block; + position: fixed; + height: 42px; + top: 0px; + left: 8px; + z-index: 999; + font-size: 18px; + color: #444444; + text-decoration: none; + background-image: -webkit-linear-gradient(top, #fff 0, #F0EDF5 100%); + background-image: -o-linear-gradient(top, #fff 0, #F0EDF5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#F0EDF5)); + background-image: linear-gradient(to bottom, #fff 0, #F0EDF5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffF0EDF5', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + padding: 8px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + box-shadow: 0px 0px 4px #e3e3e3; +} +#dashpanel-fixed-button:hover { + color: #000000; + box-shadow: 0px 0px 4px #d3d3d3; +} +#dashpanel-fixed-button img { + display: block; + float: left; + margin-top: 4px; + margin-right: 2px; +} +/** header **/ +header { + min-height: 210px; + position: relative; + margin-bottom: 40px; + background-color: #2F4E6C; + color: #333; + border-top: 4px solid #1EBD8A; +} +header .header-top-item { + float: right; + margin: 0px 60px 0px 20px; +} +header .header-top-buttons { + padding: 10px 0px 0px; + color: #fff; + font-size: 14px; +} +header .header-top-buttons .header-top-button-text, +header .header-top-buttons .header-top-button { + float: left; + margin-right: 10px; +} +header .header-top-buttons .header-top-button { + margin-right: 5px; +} +header .header-top-buttons .header-top-button .social-btn { + box-shadow: none; + margin-top: -5px; +} +ul#user-menu { + list-style-type: none; + display: block; + margin: -4px 60px 0px 20px; + padding: 0px; + float: right; + background-color: #f6f6f6; + border-radius: 0px 0px 10px 10px; +} +ul#user-menu.authorized { + +} +ul#user-menu li.menu-item { + display: block; + float: left; + position: relative; + margin: 0px; + color: #333; +} +ul#user-menu li.menu-item.open { + +} +ul#user-menu li.menu-item-separator { + margin: 0px 0px; + padding: 8px 0px; +} +ul#user-menu li.menu-item-separator:after { + content: '\2022'; +} +ul#user-menu li.menu-item a.menu-link:link, +ul#user-menu li.menu-item a.menu-link:visited { + display: block; + padding: 8px 14px; + color: #333; + font-size: 15px; +} +ul#user-menu li.menu-item a.menu-link:hover, +ul#user-menu li.menu-item a.menu-link.active { + color: #000; + text-decoration: none; +} +ul#user-menu li.menu-item.open a.menu-link { + color: #333; +} +ul#language-switcher { + list-style-type: none; + display: block; + padding: 0px; + margin: 0px 60px 0px 20px; + height: 30px; + float: right; +} +ul#language-switcher li { + float: left; + margin: 0px 0px 0px 1px; +} +ul#language-switcher li a:link, +ul#language-switcher li a:visited { + display: block; + font-size: 13px; + color: #ececec; + padding: 5px 10px; + text-shadow: 1px 1px 0px #0A3241; +} +ul#language-switcher li a:hover, +ul#language-switcher li a.active { + color: #fff; + text-decoration: none; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; +} +ul#language-switcher li a.active { + background-color: #52879C; + color: #FFF; + box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.12) inset; +} +#site-logo-wrapper { + position: relative; + clear: both; + margin-left: 15px; + margin-bottom: 30px; +} +#site-logo-wrapper a#site-logo:link, +#site-logo-wrapper a#site-logo:visited { + display: inline-block; + color: #ececec; + margin: 0px; + text-decoration: none; + text-shadow: 1px 1px 0px #0A3241; + height: 80px; +} +#site-logo-wrapper a#site-logo:hover { + color: #fff; +} +#site-logo-wrapper a#site-logo img { + border: none; + vertical-align: middle; + margin-right: 10px; + max-width: 200px; + max-height: 80px; + + /*-webkit-filter: hue-rotate(330deg);*/ + /*filter: hue-rotate(330deg);*/ +} +#site-logo-wrapper a#site-logo span { + font-size: 30px; + vertical-align: middle; +} +#site-logo-wrapper #site-slogan { + display: inline-block; + white-space: nowrap; + vertical-align: bottom; + color: #ECECEC; + text-shadow: 1px 1px 0px #0A3241; +} +#top-menu-wrapper { + margin: 50px 15px 0px; + clear: both; +} +#top-menu-wrapper nav { + background: none; + background-color: #F6F6F6; + margin-bottom: 0px; + border-radius: 10px 10px 0px 0px; + box-shadow: none; + border: none; +} +#top-menu-wrapper .navbar-default .navbar-nav > .active { + margin-top: -4px; + border-top: 4px solid #1EBD8A; +} +#top-menu-wrapper .navbar-default .navbar-nav > .active > a, +#top-menu-wrapper .navbar-default .navbar-nav > .open > a { + background:none; + box-shadow: none; + color: #000; +} +/** content **/ +.image { + max-width:100%; + height:auto; + display: inline-block; + vertical-align: top; + margin: 0px 18px 18px 0px; + border: 1px solid #EEEEEE; + border-radius: 3px; + box-shadow: 0px 0px 2px #eeeeee; +} +.image-wrapper { + max-width:100%; + display: inline-block; + vertical-align: top; + margin: 0px 18px 18px 0px; + background: #DDE0E4; + border: 1px solid #EEEEEE; + box-shadow: 0px 0px 2px #eeeeee; +} +.image-wrapper .image { + border: none; + box-shadow: none; + border-radius: 0; + margin: 0; +} +.image-wrapper .image-description { + color: #5d5b6b; + font-size: 12px; + text-align: center; + padding: 10px 0px; +} +.lightbox-image { + cursor: pointer; +} +.block { + margin-bottom: 20px; +} +.block h1, +.block h2, +.block h3, +.block h4, +.block h5, +.block h6 { + margin-top: 0px; +} +.block-image { + max-width:100%; + height:auto; + display: block; + margin: 0px auto 20px; +} +article .article p { + line-height: 26px; +} +article .datetime { + font-style: italic; + color: #888888; + float: left; + margin-right: 20px; +} +article .author { + font-style: italic; + color: #888888; + float: right; + margin-left: 20px; +} +article .article-info { + overflow: hidden; + margin-bottom: 10px; +} +article .article { + margin: 30px 0px; +} +article .rating { + color: #888888; + overflow: hidden; + margin-bottom: 30px; +} +article .rating a.like:link, +article .rating a.like:visited { + position: relative; + z-index: 2; + font-size: 16px; + height: 30px; + line-height: 30px; + background-color: #2F5F87; + background-color: #337AB7; + display: inline-block; + padding: 0px 25px; + color: #FFF; + border-radius: 3px; +} +article .rating a.like:hover { + text-decoration: none; + background-color: #3A67A2; + box-shadow: inset 0px 0px 1px #ffffff; +} +article .rating a.like.active { + text-decoration: none; + background-color: #2C7E72; +} +article .rating a span.glyphicon { + font-size: 20px; + vertical-align: middle; + margin-right: 5px; +} +article .rating .share-wrapper { + position: relative; + z-index: 1; + left: -999px; + display: inline-block; + vertical-align: top; + margin-left: 10px; + transition: left .5s ease; +} +.share-btn-wrapper, +.social-btn-wrapper { + overflow: hidden; +} +.share-btn, +.social-btn { + display: block; + float: left; + width: 28px; + height: 28px; + background-image: url(../images/share-buttons.jpg); + background-repeat: no-repeat; + margin-right: 4px; + border-radius: 3px; + box-shadow: 0px 0px 2px #eeeeee; + text-decoration: none; +} +.share-btn:hover, +.social-btn:hover { + box-shadow: 0px 0px 2px #aaaaaa; +} +article .rating .share-wrapper .share-btn { + margin-top: 1px; +} +.share-btn.gp, +.social-btn.gp { + background-position: 0px 0px; +} +.share-btn.vk, +.social-btn.vk { + background-position: -28px 0px; +} +.share-btn.fb, +.social-btn.fb { + background-position: -56px 0px; +} +.share-btn.tw, +.social-btn.tw { + background-position: -84px 0px; +} +.share-btn.ok, +.social-btn.ok { + background-position: -112px 0px; +} +.oauth-btn { + float: left; + margin-right: 10px; +} +.oauth-btn.social-btn { + margin-top: -6px; + margin-right: 5px; +} +.user-login-form-extra-items { + float: left; +} +.user-login-form-extra-item { + float: left; +} +.gallery-wrapper { + margin: 30px 0px 20px; +} +.gallery { + display: block; + margin: 0px; + padding: 2px; + list-style-type: none; + border: 1px solid #eeeeee; + border-radius: 3px; + color: #ffffff; + overflow: hidden; + box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.15) inset, 0px 1px 5px rgba(0, 0, 0, 0.075); + background-color: #fafafa; + background-color: rgba(250, 250, 250, 0.9); +} +.gallery li { + display: block; + float: left; + margin: 0px; +} +.gallery li a:link, +.gallery li a:visited { + display: block; + margin: 1px; + border: 1px solid #eeeeee; + transition: border .2s; +} +.gallery li a:hover { + border: 1px solid #337AB7; +} +.gallery li img { + display: block; + border: none; +} +.slider { + display: block; + margin: 0px; + padding: 0px; + list-style-type: none; +} +.list { + list-style-type: none; + margin: 20px 0px; + padding: 0px; +} +.list .list-item { + margin-bottom: 20px; + overflow: hidden; + border: 1px solid #eeeeee; + background-color: #FAFAFA; + background-color: rgba(250, 250, 250, 0.9); + border-radius: 3px; + box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.15) inset, 0px 1px 5px rgba(0, 0, 0, 0.075); +} +.list .list-item .list-title-wrapper { + background-color: #F5F5F5; + border-bottom: 1px solid #eeeeee; + padding: 10px 14px; + margin: 0px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +.list .list-item a.list-title:link, +.list .list-item a.list-title:visited { + font-size: 18px; + margin: 0px 0px 5px; + text-shadow: 1px 1px 0px #ffffff; +} +.list .list-item .list-content-wrapper { + padding: 10px 14px 0px; +} +.list .list-item a.list-thumb:link, +.list .list-item a.list-thumb:visited { + display: block; + text-decoration: none; + float: left; + margin: 0px 10px 10px 0px; + border: 1px solid #EEEEEE; + background-color: #EBE6F0; + padding: 2px; +} +.list .list-item a.list-thumb:hover { + box-shadow: 0px 0px 2px #eeeeee; +} +.list .list-item a.list-thumb img { + border: none; + max-width: 100%; + max-width: none\9; /** ie8 hack **/ + height: auto; +} +.list .list-item .list-info-wrapper { + clear: left; + margin: 10px 0px 0px; + padding: 0px 14px 10px; + font-style: italic; +} +.list .list-item .list-info { + margin-right: 10px; + color: #3F3F3F; +} +.list .list-item .list-info a:link, +.list .list-item .list-info a:visited { + color: #3F3F3F; +} +.list-view-more-wrapper { + margin: 20px 0px; +} +.widget-category-wrapper, +.widget-top-wrapper { + margin-bottom: 20px; +} +/** comments **/ +.comments-wrapper { + margin: 40px 0px; +} +.comment-btn:link, +.comment-btn:visited { + display: block; + float: right; + color: #ffffff; +} +.comments { + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; + list-style-type: none; + margin: 40px 0px; + padding: 0px; + font-size: 14px; +} +.comments .comments-item { + margin-bottom: 20px; + overflow: hidden; +} +.comments .comments-item-nested-1 { + margin-left: 60px; +} +.comments .comments-item-nested-2 { + margin-left: 120px; +} +.comments .comments-item-nested-3 { + margin-left: 180px; +} +.comments .comments-item-nested-4 { + margin-left: 240px; +} +.comments .comments-item-nested-5 { + margin-left: 300px; +} +.comments .comments-item-nested-6 { + margin-left: 360px; +} +.comments .comments-item-nested-7 { + margin-left: 420px; +} +.comments .comments-item-nested-8 { + margin-left: 480px; +} +.comments .comments-item-nested-9 { + margin-left: 540px; +} +.comments .comments-item-nested-10 { + margin-left: 600px; +} +.comments .comments-item.disabled { + color: #777777; +} +.comments .comments-item .comment-avatar { + max-width: 50px; + height: auto; + display: block; + float: left; + border-radius: 5px; +} +.comments .comments-item .comment-head { + display: block; + margin-left: 60px; +} +.comments .comments-item .comment-text { + display: block; + margin: 5px 0px 5px 60px; + background-color: #EBEEF3; + padding: 14px; + border-radius: 14px; + border: 1px solid #E1E3E4; + box-shadow: inset 0px 0px 10px #E3EBED; +} +.comments .comments-item.disabled .comment-text { + background-color: #E3E3E3; +} +.comments .comments-item .comment-info { + display: block; + margin: 5px 0px 5px 60px; +} +.comments .comments-item .comment-info a:link, +.comments .comments-item .comment-info a:visited { + color: #000000; + text-decoration: none; +} +.comments .comments-item .comment-info a:hover { + color: #474855; + text-decoration: none; +} +.comments .comments-item .comment-info a.comment-like:link, +.comments .comments-item .comment-info a.comment-like:visited { + color: #1d7690; +} +.comments .comments-item .comment-info a.comment-like:hover, +.comments .comments-item .comment-info a.comment-like.active { + color: #114150; +} +.comments .comments-item .comment-info a.comment-dislike:link, +.comments .comments-item .comment-info a.comment-dislike:visited { + color: #a41748; +} +.comments .comments-item .comment-info a.comment-dislike:hover, +.comments .comments-item .comment-info a.comment-dislike.active { + color: #550e2a; +} +.comments-view-more-wrapper { + margin-bottom: 40px; +} +.parse-content code { + padding: 0px; + display: block; + padding: 2px 0px 2px 10px; + margin: 0px; + border-left: 3px solid #D5C5CA; + border-radius: 0px; +} +.parse-content q { + display: block; + color: #858D93; + padding: 2px 0px 2px 10px; + margin: 0px; + border-left: 3px solid #C5D0D8; + background-color: #F8F8F8; + border-radius: 0px; +} +blockquote { + color: #6E7899; + font-size: 100%; + background-color: #E5E9F3; + margin: 0px 0px 18px; + border-left: 4px solid #6E7899; +} +pre { + background-color: #FEFEFE; + border: 1px solid #eee; +} +/** sidebar **/ +.sidebar .page-header { + margin: 0px; + padding-bottom: 4px; +} +.sidebar .widget-category-title { + font-size: 20px; + margin-top: 0px; + text-shadow: 1px 1px 0px #fff; +} +.sidebar .list { + margin: 4px 0px 20px; +} +.sidebar .list .list-item { + margin-bottom: 10px; + overflow: hidden; + border: none; + background: none; + border-radius: 0px; + border-bottom: 1px dashed #eeeeee; + box-shadow: none; +} +.sidebar .list .list-item .list-title-wrapper { + background: none; + border-bottom: none; + padding: 4px 0px; + margin: 0px; + text-overflow: clip; + white-space: normal; + overflow: hidden; +} +.sidebar .list .list-item a.list-title:link, +.sidebar .list .list-item a.list-title:visited { + font-size: 16px; +} +.sidebar .list .list-item .list-content-wrapper { + padding: 4px 0px 0px; + margin-bottom: 10px; +} +.sidebar .list .list-item a.list-thumb:link, +.sidebar .list .list-item a.list-thumb:visited { + /*float: none;*/ + /*display: inline-block;*/ + max-width: 50%; +} +.sidebar .list .list-item a.list-thumb img { + width: 100%\9; /** ie8 hack **/ +} +.sidebar .list .list-item .list-info-wrapper { + padding: 4px 0px; +} +.sidebar .list .list-item .list-info { + display: block; +} +/** secondary menu **/ +#secondary-menu-wrapper { + margin-bottom: 20px; +} +#secondary-menu-wrapper ul li a:link, +#secondary-menu-wrapper ul li a:visited { + background-color: #fafafa; + color: #333333; +} +#secondary-menu-wrapper ul li a:hover { + background-color: #f5f5f5; + color: #337AB7; +} +#secondary-menu-wrapper ul li.active a { + background-color: #337AB7; + color: #ffffff; +} +#secondary-menu-wrapper ul li.parent { + margin-bottom: 10px; +} +#secondary-menu-wrapper ul li.parent a.menu-link { + color: #333333; + background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%); + background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%); + background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2)); + background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); + background-repeat:repeat-x; + -webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075); + box-shadow:inset 0 3px 9px rgba(0,0,0,.075) +} +#secondary-menu-wrapper .secondary-child ul { + margin-top: 2px; +} +#secondary-menu-wrapper .secondary-child ul .menu-link-ico { + margin-right: 2px; +} +#secondary-menu-wrapper .secondary-child ul .menu-link-ico:after { + content: '\203A'; +} +/** search **/ +.search-form-wrapper { + overflow: hidden; +} +.search-form-description { + margin-top: 0px; + margin-bottom: 100px; + font-style: italic; +} +.search-form-wrapper .col-sm-3 { + padding-left: 0px; + padding-right: 0px; +} +.search-simple-form { + display: none; + position: relative; +} +.search-simple-form .search-text-clear { + position: absolute; + top: 11px; + right: 59px; + z-index: 9; + cursor: pointer; +} +.search-simple-form input[type=text] { + padding-right: 20px; +} +.search-simple-form.loading button[type=submit] .glyphicon { + visibility: hidden; +} +#top-menu-container .zira-search-preview-wnd { + position: absolute; + width: 450px; + right: 30px; + top: 52px; + z-index: 99; + background-color: #f9f9f9; + box-shadow: 0px 5px 10px rgba(113, 113, 113, 0.52); +} +.zira-search-preview-wnd .list { + margin: 0px; +} +.zira-search-preview-wnd .list .list-item { + border: none; + border-top: 1px solid #f4f4f4; + border-left: 1px solid #eeeeee; + border-right: 1px solid #eeeeee; + border-bottom: 1px solid #eeeeee; + box-shadow: none; + background-color: #fafafa; + margin-bottom: 0px; + border-radius: 0; + cursor: pointer; +} +.zira-search-preview-wnd .list .list-item:first-child { + border-top: none; +} +.zira-search-preview-wnd .list .list-item:last-child { + border-bottom: 1px solid #dddddd; +} +.zira-search-preview-wnd .list .list-item:hover { + background-color: #FFFFFF; + border-left: 1px solid #C9D3F2; + border-right: 1px solid #C9D3F2; + border-bottom: 1px solid #C9D3F2; +} +.zira-search-preview-wnd .list .list-item .list-title-wrapper { + /**background-color: #EAEAEA;**/ + background-color: #f6f6f6; + padding: 6px 10px; +} +.zira-search-preview-wnd .list .list-item:hover .list-title-wrapper { + background-color: #DDE0E3; + color: #3B4350; +} +.zira-search-preview-wnd .list .list-item a.list-title:link, +.zira-search-preview-wnd .list .list-item a.list-title:visited { + font-size: 16px; + color: #656587; + text-shadow: none; +} +.zira-search-preview-wnd .list .list-item:hover a.list-title:link, +.zira-search-preview-wnd .list .list-item:hover a.list-title:visited { + color: #3B4350; +} +.zira-search-preview-wnd .list .list-item a.list-title:hover { + text-decoration: none; +} +.zira-search-preview-wnd .list .list-item a.list-thumb:link, +.zira-search-preview-wnd .list .list-item a.list-thumb:visited { + margin-bottom: 6px; + padding: 0px; +} +.zira-search-preview-wnd .list .list-item a.list-thumb img { + max-height: 60px; + width: auto; +} +.zira-search-preview-wnd .list .list-item .list-content-wrapper { + padding: 6px 10px; +} +.zira-search-preview-wnd .list .list-item .list-content-wrapper p { + max-height: 60px; + overflow: hidden; + font-size: 14px; +} +/** footer **/ +footer { + min-height: 50px; + position: relative; + margin-top: 40px; + padding: 40px 0px; + border-top: 4px solid #1EBD8A; + background: #33434E; + background: -moz-linear-gradient(top, #33434E 0%, #213F47 100%); + background: -webkit-linear-gradient(top, #33434E 0%,#213F47 100%); + background: linear-gradient(to bottom, #33434E 0%,#213F47 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#33434E', endColorstr='#213F47',GradientType=0 ); + box-shadow: 0px 2px 2px #4a6072; +} +footer p { + line-height: 50px; + padding: 0px 15px; + color: #ececec; +} +footer p a:link, +footer p a:visited { + color: #1EB5E1; +} +#footer-menu-wrapper { + margin: 15px 0px 0px; +} +#footer-menu-wrapper ul.menu { + list-style-type: none; + margin: 0px 3px; + padding: 0px; +} +#footer-menu-wrapper ul.menu li.menu-item { + display: inline-block; + margin: 0px 8px; +} +#footer-menu-wrapper ul.menu li.menu-item-separator { + display: inline-block; + margin: 0px; + font-size: 90%; + vertical-align: top; +} +#footer-menu-wrapper ul.menu li.menu-item-separator:after { + /*content: '\22c5';*/ + content: '|'; +} +#footer-menu-wrapper ul.menu li.menu-item a.menu-link:link, +#footer-menu-wrapper ul.menu li.menu-item a.menu-link:visited { + text-decoration: none; + color: #ACB8BA; + padding: 2px 4px; + border-radius: 2px; +} +#footer-menu-wrapper ul.menu li.menu-item a.menu-link:hover, +#footer-menu-wrapper ul.menu li.menu-item a.menu-link.active, +#footer-menu-wrapper ul.menu li.menu-item.active a.menu-link { + text-decoration: none; + color: #ececec; +} +footer a.rss-link:link, +footer a.rss-link:visited { + position: absolute; + bottom: 14px; + right: 14px; + display: block; + width: 20px; + height: 20px; + background: url(../images/rss.png) no-repeat 0 0; + outline: none; +} +.zira-loader-wrapper { + font-style: italic; + display: inline-block; + vertical-align: middle; + margin-left: 10px; +} +.zira-loader { + display: inline-block; + vertical-align: top; + width: 16px; + height: 16px; + background: url(../images/zira-loader.gif) no-repeat 0 0; +} +.search-simple-form .zira-loader { + position: absolute; + top: 9px; + right: 28px; + z-index: 9; +} +a.scroll-top:link, +a.scroll-top:visited { + display: block; + position: fixed; + bottom: 180px; + right: 10px; + width: 32px; + height: 32px; + background: url(../images/up.png) no-repeat 0 0; + opacity: 0; + filter: alpha(opacity=0); + transition: opacity 1s ease; + outline: none; +} +a.scroll-top:hover { + opacity: 1 !important; + filter: alpha(opacity=100); +} +a.scroll-top.visible:link, +a.scroll-top.visible:visited { + opacity: .6; + filter: alpha(opacity=60); +} + +/** home page **/ +.home-category-wrapper { + margin: 40px 0px; +} +.home-category-wrapper .home-category-title, +.home-category-wrapper .home-category-title a:link, +.home-category-wrapper .home-category-title a:visited { + color: #222222; +} +.home-category-wrapper .home-category-title a:hover { + color: #1B6D85; + text-decoration: none; +} +.grid-category-wrapper .list .list-item { + width: 49%; + display: inline-block; + vertical-align: top; + margin-right: 1%; +} +.grid-category-wrapper .list .list-item:nth-child(2) { + margin-right: 0px; +} + +.caret-right { + border-bottom: 4px solid transparent; + border-top: 4px solid transparent; + border-left: 4px solid; + display: inline-block; + width: 0; + height: 0; + vertical-align: middle; + margin-right: 2px; +} +.menu-default { + background: #777 !important; + color: #ffffff !important; +} +.menu-primary { + background: #337AB7 !important; + color: #ffffff !important; +} +.menu-success { + background: #5CB85C !important; + color: #ffffff !important; +} +.menu-info { + background: #5BC0DE !important; + color: #ffffff !important; +} +.menu-warning { + background: #F0AD4E !important; + color: #ffffff !important; +} +.menu-danger { + background: #D9534F !important; + color: #ffffff !important; +} +.menu-default a, +.menu-primary a, +.menu-success a, +.menu-info a, +.menu-warning a, +.menu-danger a { + color: #ffffff !important; + background: none !important; +} + +#sitemap-wrapper { + margin-bottom: 40px; +} +#sitemap-wrapper ul { + list-style-type: none; + margin: 0px; + padding: 0px; + box-shadow: 0px 0px 2px #efefef; + border: 1px solid #eee; + border-radius: 3px; +} +#sitemap-wrapper ul li { + padding: 14px; + margin: 0px; + border-top: 1px solid #fff; + border-bottom: 1px solid #efefef; +} +#sitemap-wrapper ul li:first-child { + border-top: none; +} +#sitemap-wrapper ul li:last-child { + border-bottom: none; +} +#sitemap-wrapper ul li.even { + background-color: #FAFAFA; + background-color: rgba(250, 250, 250, 0.2); +} +#sitemap-wrapper ul li.odd { + background-color: #FFFFFF; + background-color: rgba(255, 255, 255, 0.4); +} +#sitemap-wrapper ul li.menu-item-offset { + padding-left: 310px; +} +#sitemap-wrapper ul li.menu-item-offset-1 { + padding-left: 40px; +} +#sitemap-wrapper ul li.menu-item-offset-2 { + padding-left: 70px; +} +#sitemap-wrapper ul li.menu-item-offset-3 { + padding-left: 100px; +} +#sitemap-wrapper ul li.menu-item-offset-4 { + padding-left: 130px; +} +#sitemap-wrapper ul li.menu-item-offset-5 { + padding-left: 160px; +} +#sitemap-wrapper ul li.menu-item-offset-6 { + padding-left: 190px; +} +#sitemap-wrapper ul li.menu-item-offset-7 { + padding-left: 220px; +} +#sitemap-wrapper ul li.menu-item-offset-8 { + padding-left: 250px; +} +#sitemap-wrapper ul li.menu-item-offset-9 { + padding-left: 280px; +} +#sitemap-wrapper ul li a:link, +#sitemap-wrapper ul li a:visited { + color: #333; +} + +.contacts-wrapper { + overflow: hidden; + margin-bottom: 40px; +} +.contact-image { + max-width: 50%; + height: auto; + float: left; + margin: 0px 20px 0px 0px; + border: 5px solid #CCCCCC; + padding: 5px; + border-radius: 3px; + background-color: #FFFFFF; +} +.contact-name { + margin: 0px 0px 20px; + font-size: 22px; +} +.contact-details { + float: left; +} +.contact-address { + margin: 0px; +} +.contact-info { + margin: 10px 0px 0px; + font-style: italic; +} +.social-contacts { + margin: 10px 0px 0px; +} +#yandex-map, +#google-map { + margin-bottom: 40px; + border: 5px solid #EEEEEE; + box-shadow: 0px 0px 2px #cccccc; + border-radius: 3px; +} +.messages-panel { + overflow: hidden; +} +.messages-panel .navbar { + margin-bottom: 0px; + border-radius: 0; + background: #fefefe; +} +.messages-list li { + border-bottom: 1px solid #ffffff; + border-top: 1px solid #eeeeee; + padding: 10px; + overflow: hidden; +} +.messages-list li.even { + background-color: #fefefe; +} +.messages-list li.odd { + background-color: #fafafa; +} +.messages-list li a:link, +.messages-list li a:visited { + color: #333; +} +.messages-list li.highlight a:link, +.messages-list li.highlight a:visited { + color: #000; + font-weight: bold; +} +.messages-list .message-head { + padding-bottom: 10px; + margin-bottom: 10px; + border-bottom: 1px solid #EEEEEE; +} +.messages-list .message-head .message-date { + float: right; +} +.messages-list .message-avatar { + float: left; +} +.messages-list .message-avatar a img { + display: block; + max-width: 100px; + height: auto; + border-radius: 5px; +} +.messages-list .message-content { + margin-left: 120px; +} +.no-messages-message { + font-style: italic; + margin: 20px 0px 100px; +} +.compose-message-btn { + float: right; +} +.user-messages-resipients-list { + list-style-type: none; + margin: 0px 0px 20px; + padding: 0px; +} +.user-messages-resipients-list li { + display: inline-block; +} +.user-messages-resipients-list li.separator { + margin-right: 10px; +} +.user-messages-resipients-list li.separator:after { + content: ', '; +} +.user-messages-resipients-list li a:link, +.user-messages-resipients-list li a:visited { + color: #555; +} +/** mobile **/ +@media only screen and (max-width: 767px) { + .user-profile h1 { + clear: left; + padding-top: 10px; + } + .user-button .user-profile-links { + float: none; + margin-top: 0px; + } + header { + height: auto; + } + #site-logo-wrapper { + margin: 0px 20px; + } + #site-logo-wrapper a#site-logo:link, + #site-logo-wrapper a#site-logo:visited { + + } + #site-logo-wrapper #site-slogan { + display: block; + text-align: right; + } + header .header-top-item { + display: none; + } + ul#user-menu { + visibility: hidden; + } + #top-menu-wrapper { + margin: 30px 15px 0px; + } + #top-menu-wrapper .navbar-default .navbar-nav > .active { + margin-top: 0px; + border-top: 0px; + } + .grid-category-wrapper .list .list-item { + width: 100%; + display: block; + margin-right: 0px; + } + #top-menu-container .zira-search-preview-wnd { + position: static; + width: 100%; + margin-bottom: 10px; + box-shadow: none; + } + .search-simple-form .search-text-clear { + top: 21px; + } + .search-simple-form .zira-loader { + top: 19px; + } + a.scroll-top { + display: none !important; + } +} +@media (min-width: 768px) { + .search-simple-form { + display: none; + } +} +@media (min-width: 992px) { + .search-simple-form { + display: block; + } +} diff --git a/themes/default/assets/fonts/Roboto-Regular.ttf b/themes/default/assets/fonts/Roboto-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8c082c8de090865264d37594e396c4d6c0099fe4 GIT binary patch literal 162876 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 literal 0 HcmV?d00001 diff --git a/themes/default/assets/images/dash-memo-stick.png b/themes/default/assets/images/dash-memo-stick.png new file mode 100644 index 0000000000000000000000000000000000000000..6da968865e6e23fe39760abf25503c7f8e085007 GIT binary patch literal 60927 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%0AfoFm)!w8yL0Os1`TP+2B9%a=_BCs#T(p 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 _*mgkOD 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 X+P7M5!BjO)P)K;X`njxgN@xNAhdq|u literal 0 HcmV?d00001 diff --git a/themes/default/assets/images/dash-wallpaper.png b/themes/default/assets/images/dash-wallpaper.png new file mode 100644 index 0000000000000000000000000000000000000000..d1da1cd46bf09f03d3ccbb3edd56c8858c1ec86b GIT binary patch literal 26139 zcmbrlhdY~Z*gqV5Q&n5hf!5x8v|3cvti82G?M>{Us;E^((aYa$4Q9isaDsV;PS3-0TI z?5I4>B(#}#{r~?zhCf9Q@!hF3z`n>7d{@iW0xjeO4Otr&()j=mZ|#sUlT5P^@v5lUVBz&=yCL^ zJfW55{r~+VO|;yJZ};^x8X6jxcfyR+$kZjwtzDAco7*#tf6~bd9f)GP-gXK0=Y;sM zE-^m+-(@`vv?gp46ch7ud-JAs>4~{bUn24U{0~#<@>O@J?Ps_lmZI%n(BY7ZnxrqC zrvCq3B$MLhWYfTRskfhCvf#gi{QRVs@q7o(G@tz6#j5o6^`$B@FesljU{Nykr3)04 zyKSME7yrBRqt{c8;vDB!y}i9t;o;%rL|cSwY*L~!y zR_Qd!@&A2fV2cF#>*ZBWF0NJZ=ycmB&#>*oTPm2)d0a>E@b=>_eLJcp^36*foPdg{ zzXDAct;bkw3Z&?4CvrZ}F${HlnSS>7f41E2$L`Lt+(V{!pM@TyeSCb}&X1i&?ZqJ9 za0E$yFu-ImEb_#Dq4GD|N&WBq$_M`KI_S+4&T{nK&X%?as=eL$XOjJ8Jw~`%l!m)c z2NP*EVO$9>@ICm%akZ~=Xy!5Nf4&LnI&wC%FH*YQd zXCdRU@;S9<`Lm~VpL^~1bxBGQa=g@6E0byZg=5A^FWaZ*=3MTwuuPK1)3s!TU&xT3 z7{fAzYzT4Jb-n0Roc&ZFez;OMcO&N3X!ac?tDc^o)YH>bQ}Oh^)SOfyb&)m(wR7|B zV3ptV^EE?nlNTk6k9(@N>#U8A^b7S0K~llt@cl$CO(t9|ncJIR2^t3!pD5g#R0z75 z4A@^%6^z$VVuTz(yz%t?2lX`d1421@K)@)urBsv-q$DTz_M`}C#>T{`r{$!IsC)DZ zer9>gOP|~^MkN(H@`tw&XSB`o{YZgZiQ) zoJpcSJajkgKdsIOGRujY@nZU7nAq}=a@#T$#p)| zcey(WWTAJEVF;`EF>{QveCB`)sxi>N$-HC+x4E$Hc=6lo`_0S{d4j=hk!hUL7981| zV5*xFx(<*S7>qn!eSe#3Vsa@o(AQVW9Q$;$CHYWz&38&uNfZ^$TjBBxPQ+k$TK%jdC`uo>2QXje*9tbyIvp$jj*n`9? z82)X#YkR7mq?9ug{)w|T=3 z>*W90>k()|AVDCL{GeZH#Jp?7$HBN9oe}*V;Y8x>-g-jYnY|IFA29RfCIuD#U=tp{ zQe4mSUmyN8dT|lJncin3ocgLmwC}SOgAIG;n1#c1nNz*>jCWzNa`sS>E_ZQTTif`` zO3ts+_z!%-R`vThm6esmbO{$$^g9UC zK+-JVk`hb;CxCJB*IisF;hq#i3Dn^rLyX1G3-l|_w%=y;$>|vx88322Xh7(N3MGq> zKfq(Zia#JLFQJn^YLtfBE6^|8o~!k+^#XU98ipvg98zHf@n8$NFz8J=B6hB>rPHWe3)4R0 zR>p~hWJ>0-rMoUJE^b|7=Q7j2efuV+?$IjRN76A_L#ZS`z3WnG9Il+L{fI6)JSi#Z z&3{^@Qgnp3__Xq9&@xPY1mo@go}w&GB^|3se5sT9744I75Hae~O3SA{HesGGT$!d>!CC~)M`8mlZ{G2rmr{Cf$2m1?w()t=RCBwU9c8`uyNU3~ zT7lLqHiHuLKGPc4d0p{zx$R}5xZcZ3r}`=T%9k<94=i};$eOOs9LkJ~_p@yE`j7n+ zn2R=i?SlKIzj47?&B*b0=7P?*Q_ITA9R5&}Ys4sLdmgOxMby{VQ-rk7L~;n=Ua%l_ zDjNowkj@?jVjDLA=(5<$Vkm9|q~nO(kxkK}VY0OzQ;hQe+*n!PFIe}`HW-_&sGDw$ z2xKc!Q=TzBH8oW|cjVxs)hm&X4unI2QLBn;@R+P1Hl;vKcGTmX4ApRE#Sk3-xY6?|CGO%EwuU$;A6&&}iq z{eZ8quFz@5nT3^A{tDZ4-7xW9RJS`(*{$NZ+t1b_=ydsTbab@y&a2$GjU&JHb4-)P z9`fkwrK|Vzf6+{Rf)HB>Vx+AHN@>aFZty>iR<0!oRMo>@YAG7F!l`6n#e=)+8p+mU z#>M(&<|V6CR8$Aorvt&=RZcyYb9_s+uGjlL0=79hIr3Yg(JgK)o9)r`*QckenbF^| z4r;Ku&GzlTlIG^-8fLZb%OV|yvC2QpL1LaZU2eO?85h$DkeU(fBUUlNaJ*7vo7#Jb zAx>rDnDPp-h0N=3w?5hyYc?J9%ee6K^EbjZa_JwlKW1h82r^5D=BD!7*sLH=4_2o( zHtcb@2AUTqGTdKbJMc0@=+5%x;q4trv;5`Z z2v3e(M%GYn=J5Ixwl5J%U@)*fngYb^o+$aw|;d0kp4MU99oy zY%_dsZ%+-}ml3V?+V7Q>m1ZvY>`fX!4&XWq+$QgwO@QCIf#FHsG~ zrdJvl6H_(-uHF+|!Fz^|hZHea_HW<5CIS>4V1d3O-MT)qxb^}K%UqcJ?e~w*uR*G9`e0CeM34cGO&l(> znFQV`GJ5`RpeV5&pQZ6zG$Jle_7>9tLZU5~#189S+ZSo7t2bzj*UNL$Mb~(3(vgOT zuBmXMl^a|-B)QHApd(=yga9j?JcZqbOd41OiYb7b7|wg#VsC3}OQjO>1QGs5nmONlu6t4c>5hJhMIla7fmKP&6`$X$_5LwGVIC5(1|73se{YL#*ti2O$GnsqLm87JG*DI{PxIm6{S={E>(83pH}#2#?C08 zW`#KVn8+Z!Ml(4~{@*CBLO7%Z@dNJKdDDgtK>P0bXr;Bx->1t<#{(Ky->p)gVSx-8 zew}>XIUEHsF);$mhzj-t)LQ}M*Utsx6pjHA1jG6Ebk5U86#K}1^mk%h&s*VrHjvMF zj}{+Yj$L0-+_b8M;$y(&WCHgV+9g0*OZoNsZGgh#OY-wACSU$j9U%z*x02=vF6hNz zw9?k3atcEK(%{1r>9N&XVyvvp+KTsmM@k~v2sc7!795wv%}hLePuzf-v8zsntG!ns zi@F)qMjnj61|6)nuFjYeW}=JI8P^bx;+VniIWv4@G>muZ!ksAeRmAZQ)M+s9gvvPP135fFJgp9ZHH zr4iBdy3@kiBb6{$B0qXv=su^EMk3S0BTv~yRD-{vnb~#(hv^4NOTOMHwxwxFO04Xa z);`L*41d;fckzwpf@LOta}T;d==yw4v$wy$@tN0RVs=AA!<$OuN_J-w9`_NMwJf^8 z26F`lHZ}|o8uTU}+?r>*wKOBLdw6-u35N~ZpF=#k(>~N3@(5JR5@Vm{5@r(2sSBu` zZiZK~9tUzQVQ=I4!Epqilv-~%=lE(v29yuN%^VR9pj-UA1g{*v;jIs3oq z>FG&N=P-cJss7T@9er%m&hjERs|Z`5XgUXXE1G+%GdS7zIAm)g z#A;rWuXzz5M(wXp7UMemze^odSuuG0>3yj7ODDgsp}{Q0aJwKrPPP_w>y-Ukk4yD} z$?53=s7c7qTSpfcs)eS^P?IaYuSx$sqm@bRNB>Nhk6qB@R&UQT z#8MKSG;CZ+>cCQ3FExYDM%Do)n$z0Q6h2yLCrgO#r$j82FIlJ$+ElFHiEdYU{ra`R znOm`ggM&=JwinHim*lLYu`a-D-IvFvq~rSeGnJUKyUoaoa@EQmPQ2Pdt<=q{upRvACptx6%4)qb3^L%A%3?$m938#o0tG7 zVr>BlzP`GY?POXTJBrlF-aT9&X}yr;NcLPOST|rd`zDOGeYg8YiqNQCBS(p)GLd$< zJ-V57T&pwKg&a_04d0A7x4FPlG^^Jg92TfR(&^&@nZXK*GeL+sDYm5X%--4EegAHU zVRCZXl0AU@mNQi^{~{ip@E82@&l0l+cwItV{Ho&5AJ2xAi8DZ!imHwIO!oX>-xet@ zi~*?yGLOIBh-iM68PSFZJG?t>R#lw<4smJbYpSQL^e)#fKE4B+!1<09f1ZVnCluVi zG^KHdhj>Bw`b}wlssB{1coA#Rw92LQlqmp=l#&ZT5qk|63fEm@Pi=31KKMBErqw4G9>LxjXl%8}qi`D*q zjVrKW{tRd#d`yrS69sMn{@AA1#iqq|E2ubUj2tBe{MMd>N|49ti5tDF^C`QSIz8-y-xXo3?1U+Ko_n1@xUWyb;k{yL?8<*?J$B zYF%zIT+8agdbBiZ!F8*$s!HF`)YQ|x7Ws;0;^gA=pdmBp%ub@z$S(MgBy*Z!1^&AU zSp|iGoZQ?2%8_sGEJVrHM#cI)<-9%4;_3PoQ;wC!d_Zh5s&bmyW>;ww{7OF$n$*QX z=JjZoJyikz51iVG9+J;tb~Uy`(vQiiNz`dJR9t2MF|kgjya{kgbj4$$!Z*LoIPwSQ zioG8l&VLF7qZ`mS0h%st`E-QJvU_b+S()~Mx;gXw*ye}v_e6BOc-Q2}tMj?*tNo3! z!e7-WKZn{8KT>cF)h=^Er~Au21NA$bi{$5PvEHn&vf^S5$sAPsSEf*Hk{R@YQ*bcjZxcD^K0GL%bN2V+>xqoED}E@# zEw|k_pb1By99agkHfS+M0wu2Qkq|Fw3Nm2efvgxm_f~z#Tp6~syj&*$pr&GniQj#2 zh2Sf(5z(ZLv1;Su@x{(KA67X(U2m4o6~mnZ)~F1(a=E7N<#Hz@eW|3Ec4m8SPEOnC z<(`x=AQ|L1&2YD*bfW;+w;8jq>=+*(7jkg0x99d+=}qm5iHXSvirj|)MZ5rdq1Tgl z)^b>o%F^fYDW$ZP&2khHFMbf|4hw{6l$-%ZvsJMt%8&@f{uyM7dngjGp-QLvAtRl%Iqi`}&p~)nTvFzI%Nz zxVA{wfL=lZ4Cm8C07`IqT{|^@hf7SO-55iA7&?e;$~Bmtn#$ka+WJEuV7^q;%VWud z+h8C_-`ELQSNHN^|JQUlybntE+O_DDJdw1_!Y!pt103Dk_)wJBdIl%GE@3k+azUb{ z!fPmp#dUV|a*Z-|Up#R0-e#n?oqGcz;?@o*_Z^tv>vM^b^~22%E%RR&CAWXO738}$ z;Iq2mPLn2=jNC)RiGN_c#AJwI71h-S-_l3w>kdHB=?f}9pQ3|5k>`bs3ArKxOo=S-3U8{Lv_RqBq()O_iQzkw_xpv=eSACy48Dz;`HdOC~(q zySjyfW5f%2NV?l9S_4Q*z#C`h9l18ayn^v~2PY@Kxc5pm;FFr*1xB4ygN6d0T~FZ51a2p3DNAb z&cIi=CCzhD#Jxivtd8f!b~W41PTxNtQYBB0;hr?O&JgqP1Oio+?BL*ljRqNE0ph>0 zvC;h5pHIGeh4swQDx<*}DbwS9JoZ7s0`y@9*S5DwQQxJ#xbb|^Zv>%bBdZV2Onn%< zh4sHcpo9|lxBX4M~MeO>P!l*3}RG zSs6WVVe>Dy|H|$d?VpF*`gy_9lRgi)V{^N_W;XQwo5|*bj<<{s!l>k->2=LYiB2;b zU{`^l=~rgxh})dRV{n_gV$i;_NF|Pyb|}@MF*Ew1i{kXH6ddb&WWOCNh6|sxKAKpU z4ZcFu)a3c(M}mjrzmKXbIR>>&S?u*yo|+St_lw%MOE_9WT{d}54WK-`yaR1siBvCb zEJfB7y2)Z6@I7H8LWjFHd2bu9EVM^s7(WW(eF>oTX3^zNGM3LQ+1}aF2hHBT&*ot4 zJ{G`W4o-GATie{V&7U^U8d6^gy#5zTCp{o-`F)@b=@N^+^f8V9l`?(-RQ7aC({bfJMQx_K(?-YMWrZDAB z->;g}=bPxJ4TzK2f!~@`DdRq0DFz^bW7eb-hd>V+gVTdx6=pGG^zE54|)&Tbhc4A)z#JIMk7DoEWQcxvpv3+0ha7ENLB=Gt^0jh=}MHP)kB5ph}({&^NBUe0&@^g(x7(kj7`i zl|urW_J1<5xwHM!hFyfn#Wjrq~fX_+P_GdcROPp%}Jw}t@fiTc<1riCr+oY@6o z#V;Vx9lq)LG}< z+G@=F5qvbX$(!r-WNLjR*W>*B+$)v7Rx&2U2*Fq6m(DNW1b< z-{mBZ-fehPN<}uhX?s=lx@01{)>OkGF1-Xz@fym{y+?Kbp9s~CDlw@u@k;F0*<;oM z|IJIS`NqvZu}ZkI5_#xqAQg^jN7Osb9E1Ek05Xc4qj~EZ;VKBCJ93dEEsY~P9DY(iJ3G6uwN*4O5%}iK{fI>0&hmm#E9%}X;b}tH z#BE_ZhcD`7#K#SP&}6OyIn1c*^bmh%`B#;i$8!H7Dyzr)(=d`zS2w~ge@153|CMb~NX%y-C+w=&qQyV}fn|kxv&Lr8((b2J2klbcQJW-YnB^Tp&-QQ9yl7X*Q z{%Daept} zd2{Y0d!UA@F`BA*YikJWZN1n4kVszz>zIWAOgzUPuZi+1DX72`!X89j=j z{l0jz^%MxC+3TYT3o;hNnJ7yG?h+{(nfh-Z{1+r+ALPko-l>*NgxzHeJRF)_SXc-L z{4!aHGdkjhP=^jsV1JIR12NX^0?5(7CpM4Zph%@?X2|Ay(7mHAtfwEpDC~Ey!)-L= zU0CT$f0WWA#iAt8gFMQDbd;j&B;r3;V8zjT{Q+Uv`#T~hijbWwv0~hb2Kcw^4z%Fk zy$11yzh+6@1F)NuVx0Lj`ZxvD#m4`eTbTqlapV;{k@4WYD6tw zbw4{u=7TQJj(TsFD5&m{KN8^9CRko;y3-0GC~yaGff*3LfpxXD>jQ6(C0<(Lsx>kH z<0`K}ZftPx%+?dlRN++bMFU4%5y39I8A$0jDq*0f^rq#2eXdaY(E0-rW%Znz{C_Z) zmTh$b(&Vap&YnMG?$L<-i-iMnRjFN|11tbzDmHnfnVDI!E3Y^8pxyv7EG!JCd4GTZ zjn2;A*_j{pLX?-Z$*y8eFc2?oE2g%_Y7n}gg&w5zz%SRbXe{n6?tkhFeZ?ZpLuuXS7OC`j=d za`wFaD)r86rpCSCEW-idDW?H7*11o#FQi&!7K!`|c);NM?=KGep|EniA5_Lm+9rR^ z!>^pI!p8j#VJT~@e<`3t=esFG+dn10@^iZ(?o{C)mRIsh%`VBGE+sMwl)ldc8gnrb z73)?}aq(V}H!6%Wte&D0m*gg`*hJJts2_6z&xu1|RUyB{s{}GM5ULKeNZT9kxCI2h zxQIq_^6M1=^8H!<{u0=GBYn4cST!#h7Bknmu~D$q>F%1{>1&429bOJ?@}PV&OrBKU z>~4S)h(tAu#%8KVi=PBhz0w)oFY@7fcbDE*z|(l8n?x8 z+f?I5qW4Mxr@@+1Yyoa=Le%5+i;_TU<74-2@!}eu0gC@52!zU@anFCilLs<0=68-x z{#OYq3YO(}%vx$wo71?36Pv%D%6$ruj|0BphnBmNL6iew{tR1}3L@J^7}YO}6=)f| zB<5-Yg~;9SyT?3sr@J#DM<$0lkq?+o(rh2`hN@)$70ng=35a>n$?kkVb}qO{FJCte zM@^R4nYOe#m|w@b`W0s)akBw;(v6`@(?$Awaiuc&>U6ay$L{!2&<~Wu72sLaEcHDb z@h7+^uqknuUI~hD~iUm z0Kn*%Bx7ewHj5`VPgWJKBkO%IRoP2P$BI!9dZ#4@{0q5(Gkz3w&YpPtC^Fo-OkRu}9re8emXcSh`i>85;(uahplC^ES~&=Q&#rhcCKZ zl=_ijVJBS{KxEGiF*oHiL-z4KKagVCx5A>f>IoR8YnDNAaLg>@rNUkf^@C*SyQ(qQguGK z=m_7rVR^u}ed*#4H#MB5brdFV3&76$32Izk7 zt|NchLu3TpXCSV3o%{W7>wWOEgg+W9PpMp6O+YG&Z~OnDkofdE8JCZ=YMklt8Q#_- zfNCp&pYBW)H9mRoH{(!Pve7m-RT@q+D9`dYUGBbyR4pb;1j_7}oHh2_as;R+`Cw+E z7@z?rqSlruN4J#@86dhyii?jY`X>ym&d{#cUA`{wch7qJSsa;&yj2J}64gz}{aDu( zS&8vw(;W{m8G8GLflOX9()fjjQD-7g>Y}BGhe+_|cyZv29ON^umkhq8nNdEV+L5jU z5==4U2de{xxDJYh-f->-JA=|lp$-%v#O>f3j+!rpC9yq`#NKwcwLpQ$@JuGt{kf@c z1z%<$vY)t3i6zybOCs?Yc&%{q9+e<_vbsYz8q4;d$nI;>@mRL_n4jZ6z&yfn7!g$! z9__j`PJPT8`~%C2tiad#cYv@Q3Aq5k#BitH8ONJz$6p%$(JpQJZUk^5dxbj08_qWc zf@pYGhSkICY2eE{b4?Zv0jKVc@a2LrZs)ni7$CAsx@giZjMlKDU$Y`@6C9VHp(#Jq zuafKrjJb}!;EXzw*R|d4d}pLD_E;O$nenc8`~+CiRS5PR!4w4TzE-y3b}Z>q@cGPK zKf}j_Pq>Pp)AQXop7Z&DOljN%_7*%DD+8kP1}v9>m?ek7Pho5mmz%1#wfwm2t?!`m zB`?s<%}0Xf&xG+dE()Hpn9_SSQlsMvNi50WcYAQpYzW-A)bH@re5>JemAAO*1!`0~ zvfp}0NAqgzVDBIEaEVGur4ny80LcoBxLNZ*OHg?hL6Yz(RGo~BEK%}h0vTPydX+Wz z^Tj_y?>)t;`FdJ`D!B(_l6rbq7oJ{q1srtPJ(!HEtThjB2Zy8c5F^4R4|no|KN4xT zmGlobqLILR5&))-mcMBG4!W@vm6WgnN9_E`n*iKRU4;zZ7tAF+n0+KZT z5z^-_Vc-I(xVnZ$?0JzF^N>mQN8>F7#%sigzvD?=9t`U*W`kqe;)+ix(OeS#+jxtU zA-egA{aiX9=IW!bYqn_L@OYX;7Gwip8iJXs&1sh*-kwIFtS95|ToEx=TB_&j%S^~! z1Jc{a`ClV!QL-PHM-x z^Hl%(xlKM7r#k<})aQ!2y0h}kUwqk$Yd3=pbF;I>&jL`a-p8!s30a2QR;5;8l1PX| zr^VliI>@E9Y;%x$C0?HWK*-Ve5e|?w-v_4XW3{a ztvKT-L5;%8G2Ct1>LGbQRFzX_;mJf-X!gv9LDVo9BVlaos<1IyOm!}1ZrudP8Rjfs*TC>!~%b2D6&A#W1ysbA&?r;GA5X4kwxZCM1aDyG~XS~(O z=AxNj`2d8burpcJ=P+WgQi{}TVLf{4LBE)vpAVYDX@I$Intr8ng|q#7Kob`yX9v4; zWE4L;+qjVi@kv|TvzryqCa1?d1J26Z6WmTmrA@O+y~j9LFUTa#1z&RT+;ik(t`n^_ zh@V3u9d|Gog`t-6fL(OUaj{ADF+u&TphSS7*}OTyCys8prpih^QC=6!Lpfe(y8@RnEIf+fH=ng+!EnbFs0l z${)c+@r92@G>{zj!D!=7!Bn^_WJJ;xT)o%b<}XzlPJ2;LA;rA_9e9X8Ec1 z3u4|vC)f(xg=A#X8L$C`W27d~+g=(#)$6Wn>I8zqep=yQ_F? zx=rk2L{yL5)31#SK3#ScsW}>?NnoumD@%BeMd*Ug_47QC3V(VJ&FaH13y}n}HWUoP zUL1~ShLQhd=D3T7TEfHL%l)Iq^~Jq#L-EZ+2R8;STql3h*YdGIyg_PQ9+d=}Jx+Ql zHxLJMhYtzj7+gXXyF%f@Q*#@yW4xUb!ckz@3)(PreBB9aE9X52QUPr&7uS}&y;GMz z?dhNKrKN`$mW)-}C?;2~*$=?g(hRp9$e<=Y%jSkX%M%k@7yXt52{wJ}8YbE@C5d&X zDXt{I{G&V7FSP!jk2e9dVq3{GuyCy0KwrNq=wh$asi(Z?R*zhiNn^_DcB_()mDN4! zom0SI$|v+C>KXMVMNt8+!G*ia%*@Q;X;G;$@udEX6~nYRybH{9n)2HMKbU!e z+I70^VlA#e-xXzBqc@$Cf#rUiIlA`UcS^MApZG1s(=@x`1@F(z32M%Z* zx4C~h?i#$(mBxKRzyO>_gYk=$o_mR1@5tLeEpgh5rx$~v;R}#%RX1+xd+~I-ECY6( z?Kza%Ex4qDnYnpCFE20R*SSU+u)HK(P)O~`7X;~hYxrJ6ri5IhimQT!j>a7%YCRjPD)E;>^?IZa3 zlJ^~UOtX{X3SeZk4W=8GQ|cdhMYSOV=kh;N$WpBNJy_@<%L=xr#$Xa3t3B`q<(CGZ74qVQ|%@u1X8 zm)CS~u1H8R?x{YSBRVb47?H!KrErV^^eH%5C?{}W14y=IywR&Tss;WTGRa;7P!KJ` zQ;y@$p*@p^5(*hn?Ctq?YwX;_v#|FtHrrV-#x<`XDf51RW}Zl}Yig_GFU9cF;~O1N z>p930yU_kP(3$u2VXgopZO>~~tE;Pf7+A3g;&&SL_UXUhd@d8Q?Z+>Mj(yE=J_qLp z7DpO=6tdr4{~bGtdO22LN8Y@7n+HXl>SL_fnE29Lo1M+3@4%An*aLpNa~Iz;cKaBF z#xbngX~q{=21+e{M29{DY7gEfY7IF%J8S%^VA*U5e9+vPeLGggz7T)Z%cL-jpy>6N zG#i}ndpkzAwq*ZdyVL2?b?#~eb(~fcU-eceXyy0PvLFyoou8S@sdG7e!D;Sf3;wRA z=#i@UpBD9>k9P^N7iBNb0HhuUW4Plk&?h0@PJ&VlA?_J+y0j|oj#)KJZ7T*}SJhx~ zIUcTYVwAW8&C1ZhyFZN3@S)}VkXVAwP1qeePx^NI>L1l=86>=A&qp)nrlz#>18%IVzD5`G}=X=z+C~kS_7XRrIfu5Ch#Fg{6Zp-H`6in2e znN{2F#v4xGpOC{`$ZmN|8P&(2Qoe7~okYIpUzChJI9z{i?qE2Tl_;uqHFjR{e;?3e(8CVx1YU^*Dm>^dIw9d5gdqLj-f7ttAmmErtIVdD~#4uwj{D(YSr3mDhkr z=lhDOQKsF`LO_mRmRx*EyRY4Xxn_m8`4D2&sm!&z?Pu1C=IUS7)vfZ?ghU8HmfSo) z|Ccz-y7W3qACVj%=itK?y+dA6qeoa*gmgq+&eVsWk(kwa+BMG9U0e>LP$u^4e+X-eG~!@cg`$o3}ou zksHvj+E3A+@`OH;?_8Crx2Q9w5#=-Yz=?d+s5juvaJ%;{GOll>_9Zv`2kKD>qEWlP zj7?FP8bn`eVhr_UD)fj$^7=LflyR*-1U9maC9>{hCg0MJQy2l8#(dGmem2TVy%sgRie{#?7qtfO5^!n+mFvPSVJ`MPVk%0@v;B7{Vb#KcHBzr z!f*r5^RghmbRo1S2oiK{&gQ?z5PEj+A&2$f7?mkqu8!zY)-|pRnURsmJad37wCNlX z5Z~u6U+}hBptRdyivDZ=O;L|+^Kv6B#{Ll7c@(RM*KAa?)9Ds3t*jdaWZP zr{RwUrgJSs5EwSbbQrGKv1lIGy2T~ID&jfh|FTMToGEG zwAr_Yzfu8p0| z`ayEseJZ&Pzzk83MZ5FuY#R!yC-{ZFD@~`E^T)q z<*2Ot(jEr+d3uDq45ONew-KbU6jY$Dl)=u=rh1yiw0GpLv0bEaf&r9o$wwkBv(Amj zHNN|t8sonWRR6;}bLG#>lA4iOTXmP(o;|2?k^zibYyC3g9eu-S6qb9MmZFUTYHV0( z+zx<5X;ag{xi_UV`1NBbqf-et`zXUiaOH zsynyuAt4Tn@rO@&Si`E8>_V{}UtDrK?J`wN`BMsy{AL#nm$h{kZ(9rj zftU(mKhx1c2nJ$hsF5?URd`GE72hx=%tDqSp>>Q}yUWjTgA1r~<=KF9jc@&;10$i-VVaJKNiOx8zElADJG6#Pl~q=Ikq7 z!I`xiy!&4K7Z-t4p3l2GdU+1l=aA-sANF2W$!m1T@`7>?YqgOk7Fmy|II%tY4I#}C2|pT zx}627M?^%N?9^j+!8lzK8(WxP3v*JLF|Mo1LA!^Rz2Y`vHuU16fu7@iA}-XmnP2!J zblr3Nd=h_`_-w3@s{HT^Rygnn)$v!Nx#Na_|W9tW#<(^OkTK((oA-$TNGoL4?yH2!jvQ1{~ z-Q*r!Skj$W&+z(_87O4`9qcFxGBw~=e?eOJb@pf34k_G5(i=%TY^{Qc<`X_&n>3sI z{c{JW0e3d#*2gyAHG4pQfMJ(&oRjz`b%M+60?@_lG+u(9Ykvwz6YdEGQnyY!i9n*M zA#}IHP@AdqaK?S2C6vf^8)DlK^3I9GcuU6h{7>e1083vh-|2TNQZkeJ5F5sEB(CJW+|^IR#G>n|06v+W+>*gG;JW9Fca8(FgH?n1nwFaom%e5w8R!D4wcH; zR;rxey7BKOKaqjBg2{C)FP2S`Me)+Bw`rIA&8LF-O$A|gwc?iu}c-M2{WpfQE=K`mOAsR4D8HY<6=c|!X z)?E;G1?^6QEzYv4uEAb%Aj6CGdBm}qK-M=hY5__#>?OzeN3TVkZ$2Yt8u%r)u4d!e zS)#~LZW@+bQ^cD0C=R@(@C*|@KV{Jy9dR>5ra1p>JT=E2y>G#5=nXYc_1}g@JdL8> zN1fImS2k8xRb>%QQh4}|7)%%dv(`)2*(TFFPVBpL!Qy??X$%7Qd$4H-It!^H%lX31V_C%Rrx4uDNl@;0BQE z*ITGc1_SXDoF%ilo2~sNxjO!nUf{D+&!dXPF z>7$bmL^C@P>U}?3J2D=lut5%kw!3TYm$#f0!-kFq=EwO4^$^X5=2O#?g)<2RY&4TN z&7$fyX*tK+R#+_dv7Clw9|p{Ffm4%dIgI&hJuNLb;1nz^*2w=GE!(fX&r#tI-N)K0 zp0MIVJwA-b+(8DcIMsC0A|6l^R&w5VgdB7-Hh&B=Ky<9{W4gp|ZEue|Tn-R@L^0$jPYmbz)9CHd{wmhC zViJX4Qw+k?thajntez)CHy)@4FF1^hj7(=XP1sk0qn0j&oFo{JDNE+@3SV}`7T}17 z245_)-2^41ds36#Z;^4`>jBct#Xp`+sjs>CP=dgB4ikcfVC`LtyzBbeRek<>Q z6n)~c4)hwl#}D8zgyszl216fc#@o%$F4rz+K*DZ{r_eG9-yRYFIy;hLmOvNjh=M z`q7luYD$*QBM|KKV{JC1w!2zU1r+@f-Ck<%d__((j-Q81X_bgaX82bp2{{`~xxoLdlW5 z(cZQnNmhk>QZ0QuyoB_W)6^%>>dD&&Yh!DL|2?;JpADI{2$KgftldAS!lBf!Fh6bg zs=vV>%bl-V;0w+Qc^3Zi(u`KEv5mR%EOzdnPeprN*F5qkOHu7<7INtps~N+HyXo5T zL9cZo<95>UwkgR!XmKjzoxLLr%;E!Qe^qS@B1rqEoIv{lHB4ggTJ{vNK$y$rz-P28 zv^HJoVANr#@8BmDt8m>gvj3-z^nzx>dZy|C9EGA6jqqpYE%(4WpK0_k1%0(!@t7Ey zaJvKJl1|4|im@TJwpxpe=hQyYQlmZ*t;v5f;0TPRH*@i2h6m{*4*bP*3qRrgmS&`ON9vm9DZxG& zT~(~u;G!_^Aoy-e?GZ-d1jdA4MTyXL*rCtw`+RQO2{_m}v=vWX)u`1Nu})SK(AAS4 zUsf$Sg>YCvT-h3=?74l%>mQM|?}&k;PC`$EtgKoD$=~X%N^C4QjhxmqjV8Wt*Hmoq za@5uOL^nwI*IHGzGbzNMKbTP^M&*pwZU7I(3ZUc*6`TfwiN2;4oZ;jrx+__6{-^@O zeFWC<0Kw#z(No>PWW{`!d4A{YH-=tmNTqr@&d%4@H%%z#NIBoUM523H7~WJUz;N|w zX0tPQ@9xgbIcE)F2&;5Clj=;$E9c1h^m19qO+6Fz z7jtCx=^H9z6*u}Ha8X}#A)lJb^R|%V@n)(b&PKJqK)kIFkV-E5I-+LM0I3_k?i}#` zX3?77LZ)KO)R>@8!EoG^ZV5RdlHIgcwXCfq%;or&<5SSA$bMiGPhJOu;vxg{ZvNTY zqe7c$J$)!?Fe}l4=i@_a#Yox?CXg8IPd)s#r|b1A!EGwtR-W2+2W@h+6WTyo$??C*t?7xDt-uC06q@^zHLc`=wHQ{z~Z|T+H$b=Y(B{)UCY3rgh~Z3v3Nz(aJ#1q3dTR zWuyX>WL17ppngO^=Wf$^0HoY9Td8{T%=}-oODXqG7QoYw-Z!TYiWA#@B+uN8o3&O; zI_%qR0yF7K|Kxb|+1SYkBnfasTLV4{7pL1zF>eF~JD172De2kOwNH+{H#mRR6 zwW&T3=DxEm34lSfV$!*~UxV(^Pa94>r?Si&L4@4X$w#o=#i;-*nLk;k;f@y%!t6w? zad0L$SM}`*#oQB3e)24=Q~$~9YHdUMeT15HsT1*{`9hs5Hr@3q_2fT?@uJQ~vQ@xz z9zYQ5%bYRv7kN}Ta6YL80f;Mf^(yhLEsm^;ZBo$B4?8pG$HW^`tw!hSBk5?r(juKz zi78~^mc_}6nj-KqPQn|ZsaBopi8)@IYT<}~O>0Mcdw;)v>Av=gqR&))4M0|6H#N>j zdb7q>Hlwz>9tsz>6chNwvCVzK3&jl0>Yr*HiEa`15#ZjGKCJy0dEL;3BrT~2i1?_7 z1C(f*#qb&oZk6jf3 zsrb#&(EfgIhtk4Y4BZ;MmfE$Y*g;F+>_(iF6tHXkdR87&T6c}7f0Wg(%+A>oZ~4#d zyxJNs`_{HA^?)>&QOGfUv){~335?%t8QE$K{y|uVM!YJ&bL}gG*tS_S3ly;pMp(xA zbq3EUc538Mt-LNpELulY>U=@0K9GC-8~z&9_~g)sk)Tq$di!5CQ{(2%5^9*cQye@f z3F*Hp1}2f5w;drD0uE^z*;B z^ZI{p5go8k3!^}Q0&Zu$H~ppc^&HeY^f+jQby3gHHYp_+n=FPobP)$tg%`xoE3T{i z(EdiOL_J3b>H!OP(c7C#JXB3gM5#?TveF} zBkXP3wYh`VKCLK~rP1+9DT9+Kr9SwyAV{?e=sH@Tbjq6a)zU#Wy9X<0ho2wgaTQ zJ5w2&)(*zV|H)%qYCz63;z|{jVCoBzcMi_G*#?Y+Fo#tC9BEVnw^@p>ns`p#WKpeCJj)XQ`+E(p-WAk~vNHaJ1uTU^4!-z@hSeSf# zYinynivlqpuU2(_%!i_-p6JFAN*I%kqarR|v5#ynr@n;Hz0|Gr-NK&GOv^X6_-}9> zjXj0C9GAGK-giKIw+Uf-)xgYb@P?L_Da&g7CybeAb!gsg97qH;V&vOH9&0~0<|4sy9cTC3a>TObys3rOL#nO-yR7pniPDy)&(E_iLA<|`m07P>UmAosgS70p)vE* zf^*Z`=`u!g3+l4guQ;1KpoXagl9oE61vL9cr#-?@OkO;Q&;Ry&ZS_DgxP9vY-ggpyoIIQN~9OEiA$w>>CHoRRrD=n`KcZPP9EqgQXcM;7___F8n z9n!=IZ59#Pks~$pXZHnHD{brw^bV7R){=7AKemo>TeEy z1rBwjxxL@{*-4k{GbZ}-!{tx5JFUoDWCQUIhI$)o5E{y-$cmrgRXvy}L|9evpxza7!31}TZi`KFpyDzcjfiQ{*Vnl|ugyNog5z$ChQZ54h5wY0~zN4abm z{%We3v)h@v`DkdW9cTBrr;Am(T=;taL=tz{t0KXfy{n3es}rK)LE85ZnwE1(P^ukuxY{t)?-3!>_N>4aiBV&`h%9XNjs{=fOgNJU2-- zzC|RaNQ@_FB@c71PF0CMzugS;cginJ7|^W!b`4{Mvt(B8b0@?3b=53;BZPss%LV}O zAEvKV%eP!61M-E?ahKHhcZ_{8DrrUbooVn{?v!X1EuuBKs?O+t+2Vq5GO)tZR%beEN`0RHy z<+*Tfk;I8V&I%x0M)`gA=Pj;n>r;&s72&U!)N3(f7)dOUb>K+c7V+VR_~t=2BWOc4 z2qDZKJ-A-Co;`uL@qtHD=6nscLydnx|1QtBWe;X!IYQP}DQ58R?;uUWCV4(0P z<>e_E3$qaQkmTdz>7%y2xOH=_kfB|wF>8Djq?*L7Yxvtn6tx#?wqY0xr~!cf*m$HZ zGwlQTNFaA+hP}PW13snRoU>G9CE(9r)xuTC5UgLY$%?En?LjL`V7GBU_fRITl}<4W zA>x|<#%frcIFT$MYfqI(11PUiU^n=*T*^kc2%#C7b|mtU^D(rgqIUbY8fZOBh|4k| zn|w)+uZD4hig{H`d_d-A=qa3`oePu?3A-ebQMBji^5TKL%7Lkf@tqWP-I|&j%KN4p z5hHvAcQ}7=Szbb<+EKtH8h?G-e(63zvGYo&+DmB)Seja+%va(5DiH?T^XC0?TzIO= z*IRO#{vK-IVq31HiHrwSt=jE zAllik1W2~RayFj{c~%j{km_rVYoiZ8?X z=bd*t%_CehEVMnFq&#zvvYy0F01hDj z&rC4@j(380rU6f{zz!vbv}fl&0p-m4n_Pv&yvcI^o08k8sZnEmBI@c(gdw! zx9fw5QoX8J8}c01d^Y}RLha07i?)>*zTpq%>_EBy538DqRTThVxuPkQXP&-suCH>% zN~Js_o#syp->adk=NBpdPH5R@xi`L?AHb;*B8vGRBp&(h!VF{dQ~(0i@=a7IdBzGD zKZ|Z9C%jvkQ6hUZ#bCbx#i0Vo1C@4sg~96N%*Eb5bVmSx^dI6wzeV>UYc;pOgSoRV z(Xm$?cR8cGbxo;}Y5p&0_!Qh!KObgnTrgvcRfx~)<<5OOv9rBk#}iDveBi=4yZ2e} z7mCxkN)%|713(T-V-PQlhxOI&yFmOoD^2S8-z0LsczIoNTlENGX2sfe8GN7lhLTce z*mJubbLip};$+2t=8q@KazCf&w}cN3i9MNsZU)N+%w{)R+#?E{t_0gmQEq4YLTXK0A-{KhpSi^;sSnyH2RG(aKeR5@T z)JUY`9XHVO1FbmrWk9B#&X(F7WM?QzKa={ zctsT!{~!_FSt^9xoBksLN>??Bras#fe%8IwYssI-NDx80dV3q4aLL@0R8&9IxAbU|?3_RVfYGuwi<#tqOJFBb(}bqm*W>Ry@H?ZYZq&6|CMVCz z#R4cGLhu;J(ZP2+-GPQqzUBIcIm&rnOn<8_$QrhlVE*p2K8oF+Wm)=RH@&Urpp63+3v zVScxb7J|R{n;06y-r6tzVYKI?2X<0h=GZFXe>3>^&(rP~eEQWcyXwy)J_h<1&22!c z6Y3HkhGq{b!GwO;U-4OH{rQYt??DQ@!>AxV<~7e!iWtTOo>{=EG&rC60(xv7w<4qE zd@Gyvt!bmTGfq&(mHS3^@*6Vs^4N?Y(*eQ->GRFA@f+=a=={;OU)I#&2py-9Ov*Gk zb58N6DEdeMkr+2iElG`jB_5gXxO42qhp0H?T5Q@W3|zYxHu&i&X#wo8M&q!8>)cc${NiHpv?NK$$Dg&IC#irfpIL;J${qo|cj!n4nSYD!!W zz??NdfgWqW8(`fu41QXW{$||+VCMeL3MU_w98r4_^W`ePK+l?7=xSrD6 zP+@*_!R+30m$+Y-iHLvCp~mb|;!}{u`)ryo03~rdyf>h_p!^O? zk8XBGx9Z>gbYa|8@%3)pxEX)#{Mm(!)+`F^QB^Eq-b`o#N3}3SeXm)x2EBv7j(b)-c%Y5r^Mnm=t>Zm(Ca!g~G<(OWHN z9=4$}cn+-ZrK55a{o8wAdbcqOo~$Ltnm;A=n}e z(h9$|&I7lRg8hds{sani!pKMp$j{krcwUW2P=5~n8$fCa6ePc=`tp-`sQ|vl&Q5Yh z&Ucm}fOGYXjpA(kB>ZXpNi_TRGn48a3ywuAo$o_)3D=IswEJJH?=c~=1K-GagfYKZV zt~^m+O0D2rouv{mXY*%u6sy5^jedWJIxit}hQhwRx{Crbm_T8MzP`SG(#1z&TQ@Hn z-@xcQ(``kVCO6b0s=sHc_lOT(0cJB5{5SK4m4f+iTR}CO&}B2$0RZ8tk<&ni&*H_s z=?|}d`^}#}#=6z_PuI+HYc74N5ad*D6(FX1=iOQaw5a}7c8525ljRjeQl6CjzN<*~ zO7AF|aq~XDu$}zJ5}kTF+3M`$9$8=$59Fi4ijRK}tSXi0JE&YebqR=be$hi9a$^YJ zOz+HjXg)<2@ZT7>Y2B!y@Ly3d+jdiRJY`$u0L_25kql7G_AG4EO=R(ensxh zAStheZ@hd9IWXiT-Sc-5N*KmZmqWsQF=K@$wZW_dI`IB3MWXIDl4*6y#V>4O0L2Ye znrnOX2HfFv9ELkQJTU$jlHY7)AOnP_-^eYVh zv7pJTloIslv0I~Y4pVOi_W5iql0MQybL`#y+F-?k6|GsT+I>!{KiP`RN^Q!R)g+AP6f0y9w(1w%6T-X_VZbVxc1#Tv!<9J&l-K_L zO7Vv&j6ma}f1r;!ErlZ+Bx3mor|Mq?g^VQC&A#YNX8(T5h_T+UI`Dg5Ska}4+t6k& z7rv7GOwRucnLyX~%Fxb!)CF;pFOt)9Motym;5v&p&HFLxxz;P~z9R__XpKh)FWM8Jf1#V^8HFdwr z#_Fa>GY|tP6P!FJt70@{uOHB#!NzyaFdXPLHcebB*smWy48EzX!P>c~gp%aKpIo7E z1)6e53W5K$1C6TUzWJ)zzDyLEw1=^77~Z%eRK~|770p(ia%>tz8)lVGr$WB3)!27~ z!L2hrE+UVNUob-^nWBnWT(*qm?Lk4ip(XLtgGQ?#tv$URP;37?jQV0Y9We@5o=(c4 z4!MTjxk^v>w@FhXsXe58TD%&6y_c``VcVr+*Nn7dzpQkLf|nz_j1T1=b{3m1+0j=( zNwJ*(j%f56#^BQXOta0qSZ$Wk5nA$tST8XU*WiRKAq1L}xKTN#)fp%EB}kr)_B!?nif}3@Wm}?2}y6 zrG76Jc2#wyp_e7YE~8s7{9plh0{R&-l!7o9TgFj2J%_%ur8|9dKgy9z-R>^8KTp0R zNr9XC_$=t zeXj+-=g2c~l3pfY%8FIFnQy-2AC0plZ{@At))${tF2Ch&`%P!OSc`3U2ICZT;m*jf zn`8!wWM-uz+^2be8ypEkC|lE4p2(Y6SV}(m{YAIaNfkqeh!5xLy3Lr#?!S`MDh+DU zNbO6E*gC1MEwy@Fp9Vovp6}4$zA~W0#a4*W&&_#^8|s^f2Kq%bNBK*bURFb~A&%+Q zb*blrjQ3bYO!{bOx0$s_SEq-YT*aXa&~0vv1@XDH7a5hZ5W9??gF(Y45Ct!u!OWq_S`Zux+ zgl4)2ttk+%Cn%4$T_n5X7$Auh<&*XKLg5syxs1@qkLr2(SHS@e_ON?PR<*&NjP6Wo za;BXT9!{-q&84FtrzH+VP)6U95LvrHY|#6~l4ZM1Yf{nAE`jfoL1ej7vg>2{RC9p? z9RinF%l`^2qE}kYA20DyhM@{8kaUq*$R1^&q4el%kcROOH~AkZVt@dzQH%nJM|1k- zw=@zBt#J*-#l^K%7e-Ozg1q%&z{V_)RC4_`1L-7KV@-*P(36dHDE5{BM+XM7glA@&^o?;aGH^8`JWQ?!RM=}!vmc^|)&ER58grp}6rKpdZ$`E7{ zoB`eJlOABz`ONAHl*N-?AvRAJ#UIR>xFbRH8nUL(yeVYUiuSibeuN=kTyyK7C=l^) z1A!Q#lPWBQkz+vf$-2+6~$hsm76DeF>Ta>W5Jd?80T2~&}(cBE#>QuFCYr!A^$pK@#+c&QSB3v9RW5NBw5yeEy^up z83)c%07vUeg+fl@6$f9a4oV?U7pjM;|L@=31I{uq`1%@ouxv2c`e~!9@5TVUs~| zXxg?JwMo7%|2V16-MZi5-*W>DK94Uk-3l0))9-j0Apb#Hruy)={r@iIONG77!q*S$ z-EEebR*8+^82D}vm@N#6bW62QcBI|5i|9v3@Xi+~SYuKou%FKJ%-{Xz7-7gM)}E9K z8psjUG=Sz7*{@nwkN@wtKyJ3Mm}&!KzQ0<`k}c^P;HX`tC(35u;RIgh-^ z+gGUC*G@Q2r#A`b^|%^ohWV}ZEgQ0njy9D^GsZ-S-1P2wdMg&8udQrs(IW49(%#+u ziDRuFr!}8u@%f{^p{Lolc#lj*%K4XEZ(f3s`Cv@?=!WFaD&t6v5Gu+#bW;D9l<5Al zM!h(8x=6|0qVy4ZdLfo(Z(dEpM*~&)^iM-IL1muxr>KfK!X4bY&CqSse{G!ljz=F3|&s8>@VF$RNTW00$g4&yIp z&RSJC9(P9x?+)U|0+XZjPG6OfshXazoaB-ZluDj%AX2ERuOuNKn7<6@@C z-%1P}b6tvbyN6>@pEX?Vd)454k}2*q3^pY-yq@n1TR~HIC=!U!NMA_0>HG$~S`X;F zUlY;uorU-xwUdcAX_di}jctbxxPxx{VKDhQ(+M6Kd}_GrJC$nseFNi54%~mSb)Ig% zW>fVLC)?3~WFQ?!FF=Y3;oXf_$PH&ZD__wC?y2bQAM-m~+5$0#ZT$XwZlh=O6CD3E ssVeIg*<%=k<83f->dOE7aO_Y|W{=D6C1(TjU?7l@p1E$NHazbC0Nea@hEAlc);+m1zofc1%MMg$1ezYSRlY~Lc=hZ zjGz<{FHC|1jyFAExJ0ho*o7Gc`ulqZgfW%?U=ZSo4fFI6kGLN8r}zcTB})$_PbdJu zdohN3Hn`azh5kX-%UL}~!;@Kxed^g?HLyZ{Yh3!A0vwopH+_fHmg_76Glk(o=RCX| zbFi}*?~I|$nBK;w`u9VAs*ba#;gdr{QWFggjxr-e%2?VdmHd$fO{V8Rg^XW$V%^_o ze+hTpia%qNvAHVW_agc*-YYF^_}2PC@DRNqR7wZ&)^4NqbGcRJt~bz1w)yAYgGmJ zCfiwb`U1iMY`EqoRVTl-<$GMec~&sy8?+8aE@i!=dzBGhBi0(r5`@s- zr>nKd#R{Fk7jWae>UT49mM1~@&mOEk6&k0>0%RK}XL>N59#a${lVqy-^~KLEBpi8v z5eZkTi!&aK5>*lj`yj(-4X!IKou_KoXWafKY}4?Pd(PF% z_=k_qiQu-qmz7fH)&Kx|<1k<7P5Wu!&^vMZs4mp~Ca@E@eZqCF`57v+!}ajczJ7Xq zLne=BZhh9ng$-H%A=+dzaeRHd$NxsdAI`5Wqx_2Dh8nHePfSH|0L8(Ni5X_eOMU0t zi1N+;`mPR&cVtG7M)%4RmLEb~X{dFQr-0(69Hj~2TPtW63<2KSlZ`zZe?xKb&#BU> zot(NrpfHaHJeC-cCwQypTaZMR-XGyK-p;!3!vHiFF6i-jRrcCg9spCSv#?4ir9{?s zCYuiggN}-P7Bb1I`GXZsm=H4a;;%kBzfv)BgKZgD8PK_!(P9&B=rc?z+4>0*U_<6W zT~4qJqyAvo9}&<;w=Pv7xMY}r#xjk#I`bOiEWANqT2AJiM_m3J4BXWnP@M?`5SS9Y zMQQ#<+*zoG!dtiLx=sT1_rZW+1ugMtW;ok6R(^u{3w4(^?P3wgtR?Lv$1~(&B`Uy) z+!m%fcY1!SAuRqhBzLrap)0LOD$K`ahn>t0Qa-oBcSUlvGxVw?gB_?$qZI{w39a=@ zXjVwk%^Bter&H50LoK2=2%2IE2fKEYU1n^^qbs;cb)IbYb6kc#-m)7|ud0dPF~FU? zr0N@>Rv4v$dP+%jcZJlKmTb5U%>%X|nj9swgS_PH0DnZzMj;0TQGRQ%w!g2Oc_#Yf zZx!p{L9Bk$n?u8{JaL)}%ZRX7?%tXNk_Lnv zr5cwH#d}SY4r!9FB1D9ENOn<0pFQvqFzOe$aN|9_>{~j@`okwy6Az1)3oWZPS$Ovs z)V&M!2aw9r62FJOU&?Eh9-N)lZ8N|9tS_JZ=+G-_N&4xPJy#tkyCD55t`q zWgUnAMY^hT*7y^gLuxv1{uA8r2k91y>l4l4p;AYkSd;5KZ9o1m$jNdsfnJw%{_blq zq;N@A0)yrq)na!Uyks32(^?B`zfFS6Q=y`^H|a?_BZXB=aduIDVonEWrWL5Iyl_nO zkCTnYBAbwZWXfY;O>R!8NYNaNqV3zETyx*qiK#QFi@LO%DmcoD8?AMZ&>>#5)tLH1 zjOyNgJBG62Sqw3%2pX*uqY{><;ct`cMBhf~9zhs^{0GC^Sz{yPV;6K#x9%qE?Ge&l z4&RlVmOr9GyA{*#PoVe`!_2(4_jowHJ*<3E%EV@<&hQrWAI8cak0Nx|z$deA)vRKD zq%F05Bj@bJ&tSBDUnT+EXz)dVO+4|R2FBE~H--}X`^7Dzshhfc>((jAH2qv4BXful z(AH|vE*Y>ia7H^)JOKfcdKV2#G2Dno^8F-Tc;k0>5BCerj^zeP;hEBa3|8^KjZ^f? zO0yyIdGA%L5@c^*he_e3{yq*Qb@KS!O1>u!xyUqtn>>kxD)mfv_d+n`L1kY~ShMmR zf5$LV9TzBhoRb^APd1 zc$S+iReZ$iRscNFXY4n}tAj5}m`Ru=voi2X|8o@XUpo=9=o*;r0HQALq}p=#M1_E< zAlY3bAw)L=zrSJoZ@T<%d@chUUgxn9kS=1I}dEM)M{X_ zNsxnqhd{K3G-O3Tc0j?RCv5JaD_C=@-_d*Vb)C(ebN)aac^te0kjF^^7qhIv<}K1+ zmB(rz3%&7npTArJqFf`tubCl1zd)2cAevoVTIh_*4?)CBmKR)mcOIlzK*v|yR}w8+ z_}ZG*A2zd6qO+Bsd>K*+z^NoXCgVpx?~{a4>n)y_B`*PN$HbNbH#sdV>Y!7`xqtn? z^!&F74F9$1SZE-rbZ+t4=oE&k{%>YGVUu` z?1>8R-BKhqXStRDys|M(=AOjABck!E5zYOq^DCi& zeO&l&?b%`-5-<(y51_{-mtA2<))xB^a;(lVIkRd+qAm8g4gV?Es)YE;hNinQ*o&h7 zy!pS$Bi+RPlkZ32V>0CWh61zb#VBuC8hTdSv=ln_*}mT(cWbEZ4!0Grbc4 z*Ai3oR(k|u#K&kQ^!rtQw0*WjvWk>doI)SDQw+g^xUa|U$Cw4Qg(gWucWnSFF* zHz#p|MJAD(xRF}2*k+!h^L)QGCp(X2xgk^{1@eKNTQp`Y^^V3q2^+!IzZHP?av^Ro z`|eCIQ(1zxuW1*knh$^Xc_!$~USFc>gKhJVN66m}#+Gc~6kE#<_B-Enx|_2*A;H7t zwzRyC8Xaw)F&gX3)fgMw19iDEDwwI`n$&5+V=Ok))kPn(D;Du@Z;2m;y015P)XP?Y0lXv z+kwr0JF;BbwKv*^S?j?!L_ff+jX*^0 z3nRh1D5+5mVdz{SBFUL?wi7 zJ%m5e@n{PxR+nNs?ykzU{BGhGSY6k%oaQe6h!Z8sxlko|3<+E7YQe|lf%WX+Uyn$hWKEitZva)0jZ zc24|abBSnfUJht{3j9<}c4Dl!Ft>|RG4;HM^A#udQ>~=O(z#kGsfycM?+dZR^($iP z($0^rSV=0Hs))w;B~oWFb5iS#Vc02UsC|YGd{nk<+t}3($LR8IJ{^3M);|b2b2{5% z&-p>_zR~R(Z?Wx^(&uALg;vnz6dr@(xwt2&&vJ9tNo$>In5+G=U`=eeTQ}-Nw=#A5 zdxrpGR+~@jbPV!dZTnw_YUbw6CylNoSU#@2T+Juy=g6w<(&av=iFQ%dIGi3j5&DiN1gU`Urrb4Re87MRd1Fz6GAoZoy$%3$dbgvsv#-v zy_>H)KAsJs4KzlS;k+frRL8T`>&oc}|Gu8BK>zs4GN4c4-5?VJUA^sZ?YZP#wo1EU z7dVHQ(PF*h&#k)kAx(t;$+ZzL-?a2%5Q8XFy4D3@@&N-Nudk~JHI;kkdz{GqWkLCD z33FxwuifLnEs^ydi$P`Lkv7UO3EBLcZ2W$*8M| zA9_m11WOZzgX~1OnAsTD@BNZ_BFljp>vCJc1aP-}9BlbhuEs_dZ1-#JCdaLS_)jYL z+lvoRMGA$Mnpo@Q@=ywH=x05NbEq&j&pUbEv-@1e0`FIBF!NK@KS>Aqb8gKaQqyaD zsI9a2TF-`-s{NUk{wTh50x(EKt)MWbRSq+jWp_#qQzzy2h;sk)_pjRe2wrB81WAtF RF#{M6#>m{TR^Kh|zW~1HcPIb= literal 0 HcmV?d00001 diff --git a/themes/default/assets/images/dash-window-loader.gif b/themes/default/assets/images/dash-window-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..4bb5f44a5faf3f477f15848a01a2608ac1ec0b72 GIT binary patch literal 743 zcmZ?wbhEHb6krfw_{zZW|NsBIyu2@8zRaCF7s$AJ_3F=`Kc7E;{_fqo<;#~B6&2mQ zd2`mRS+8Ebs;#YUX=(ZR@#E^%s~Z~|r%s)EeQr3lR7#&y1ToNA3wfn)27nW(!RdFix)34 zPzDtLbNji51UowhxEkphFf#&8Q~W38T$GwvlA5AWo>`KikeHQNk&~a8qL-PMmd~L0 zlZBHDs7eQ9FDMWg*cLl9TxdASz~SNUrjTQ%*21))S%rgd{32F`^Fy(~NlA)>rO91LvyZoEuN9?abC9-;!0Y`z?BzM(8azB9!HxjeW8 z#hj)vFim5bDaqZ)ASo#o;K9Jn>?z>O>BOp{$~tW!j}r@5cRm}B$AP_(p$$&#LM&2j za}^k5JY;#J#FMk6Sd?$g+;)8WZnV4}RMPS~E=N+0Rw*3vO z+h;m3thw?0T7iz6sBofE>{k{H;WGFp_{%00Sr z8I+3xGkD4>0$Jih)GH(XIji$LynL`)Iu~dugQQ@eQ%|DCl?;Y{WyS@HJ$#3q*;yiF zcFMfGbiks{=qbO0SB2OTjRT2U7JT#0AAL}9N`ZkxBb`Ay#<|XimraW=2pBj%&I&nG zStl`wadPFzO878wNcy-*FBW%Zb7NuVW?=Of&}3Px%)peRBq=ExRK&7E++CT8K~mOT mm_g2+iHT3v-$_82W%>ygPD%MoDN5FaQ7`PwqVc literal 0 HcmV?d00001 diff --git a/themes/default/assets/images/gradient.jpg b/themes/default/assets/images/gradient.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c29c5ec2c76fab758ee0a8723508818c3a027230 GIT binary patch literal 782 zcmb7?PiPZC6vp41*-5t9q@77-V~mGxWWlNw;z7iVSsD$drwHceAw77J;y(}+Jm^gX z(G)!hQe&_PB1lD1um__a)LIRQQtL(W;6;h2o`m)7CX%K%-ww;L@0<6%-`nw*{jVS= zOXU(EBJ8IJ{4Y=h&RDQ03|hhz!Z1WE8jYCoSUhgUEGsdbl!;+AY*{ibRZ82o9Us|{ zN$X5f+d3$MoX!|xNQfbwuoC*e!+#FSGz>tF3YbE!(0>UV!&W)031lJ?4N?Swur5XI z`zsLV2uyMbfUC!flh<5xX*{+2;N5%AZpo&5TOXcX{J8K~w4u=!0@zhRPk?Sf1%RCc znCrVWy4%sfPXda5hIU-pj#nc;lNv$6E>@4GZ<10g9MAzA4@DfYfFYGyUy6uRy;3Yt zW#7K}-~-jlNMHku;7!!(-+HEz0^8bgLt!>(Z@`yK9Ix{GUw?&Msj+b8QDp3$rUShp zh4Yg?o<97uYgKI9bED;60e8j&C_D6?DZ9by!x-H!0c4gS`M~%UNC$J>c?78P_1@E$ z>aFR{mOG^1M1OTq4+>?@sZE6q2GsK8&iSP$ndb8S@#`-}%%36GX5yloxn}ajC7s+< z{=oSil@s+opVYkZes0lu)x3N`+h?~=w`=+8r)uj#(w=8U@5sK1*|G13@++gKes%oM Fe*xwYnCJii literal 0 HcmV?d00001 diff --git a/themes/default/assets/images/rss.png b/themes/default/assets/images/rss.png new file mode 100644 index 0000000000000000000000000000000000000000..586c8225e64aad7dccbb7f361c1291bd015647b6 GIT binary patch literal 597 zcmV-b0;>IqP)Ms!yv#<)ws&DE5_`%G4IuO_gpMbxyrA6`;`!e(6FTjXc zgE{zycet6E?`z)wv$W8*7-E z=kZ@dYDGlMti}%-@~b9R&)04&!95(!%(t0&E+STAWMMz{kT!_`hSP6~JKtF(4iR!vSy{41t5~JO+LO05}4= z?7sqq1kngMloNwNIRNqRB#1zw;AjkN=M}&UCE!>D764$;=}Q2RTe>*>Ij03cDjl?6 z>~iUwiSvo1iWSDpPD&peIxrBvw!hmVB)#_RgLYKm zs@2DF*5JlO@M9q^WB*%$tpnN}J`cf(4})2UMpO@fERQOD%{qK2=&(rU?cepkx+O-% zmQp~17*XF2+*kF{g5$P@^k_19XVd4sKQcIvZc1qZ<32qXqX{(Wm`2_SJG7EeM6QuL{AOpb&k zBchc+4#=;WT=}K~s3RfaByb>}T&|>` zZptkr;-J(>Rvyl`FLI65)L4yeKd}`XcbHdEw)ka#fdS`B3)vA_#%}>8c{hgkYLyoiB?>3)R#!9RjFexZMIq7S{wWM`0NaSslss^C4C~_ z;3t79&${AQX@MuJFYOs0wHWCM10SHU7nWOS`hgauM&ak?7V+~A4qX0LYb)~}h_Thx zkx`xImJSG;(k?b60z`v<*ZMm)JcuO;N*FLX1j$`?3@Ng5O8z%y@Lgtohz*V4vEVoL z(|qOXtgEK0^aiW(Sudf=qg}dW7Rw@8-!#ALYUFW+Zk@8X&oNZcHG>mHEtoDxo0zeJ zT3zZ{`h!HX)SRs$ndK3IH?rIfMc28<-i9eV2lxy!3A9~b5Te5lBCTr_eZ!D8~q*LOIOuJyb z206~wf}t3-x9HS-Wx&hGfQr46g>wi}`Sm0xm2UhZ;$dL9A+`N`iP zb~)gXctHx5B&n}#&E$Xt2^xcJVB?nZ;{~8};Zx&BvqW)HtD5gEuiZ=;^L?sT+N`}P zuKxOn-;GmEiK5eqi*uJG;&3C^6od|)EfziCwUy*D9LV?*N^b< zIk+$C)2rh3Po=IIs5*B<<3@$-viJDC;?P;qgqXF-s6Xus1{Rzt{x9U{12PTpVPr~U z_iD~mmJ>f-KUVTl_eGhhLaR4iTGVG*_q!L`zWCLnaJlLA*Tt9T9I6dz?CW3q1mfDI zS34BSW{muKg3gQmvi_;U7(f2*oXZSx!d&74?c!>Jkry%Nw_Jg#>;iYX_V|^emZoOy z9e@f!mD+`hKtg8vPjlf&0G6U}?Z#oGNRXM|Um@frx+Jzsdxl;YuRk2j;U~6sevKH@QpZzvG!g zf@QoLmwKVZcVEsm>Ak#I80mab7+{1xi+U(NNxf8GJicYyU&h?F!Af`CB6{xL5A`jAKzEJTXI%&*~)^}aXVu3=%n z;3$Tf1ysSqvZI{Sy+SYyYyOM{wq}-_u%;e#a3D{SGPdxDuYX?Zl8bb+TXm}Oen+cf zQ@#5}o9#HE=#9IgFiy5kYo*%TM=%V=Fj@N6YGRd?_e_(Y;QsLPJ+gSRYlq`<;cv<& zLf9FZet(9wZd&N9eJ5G%(DShwQk}6ZCeK~$<@KA?B)hmvUSMaI(#pzq8Oa!jGw$JrOe~Yt0OPw$!4z7v|aaYG`qT#D*kGev^y<|M$`Ukj(j} znfzVwuG?V05N%cG4I+kU~nV~ppUh7W3EV$87VcKAGQJs{;+=eFR2g%TBZSf0o5M~%cF_XPbz7S#~2Zx zL{dI!rCH@y*@>2HPDOAb3kpB3^n!Xfd}P@}d;Ak(d@RB2%p0EP_wSigAi-j~yj7Ld zKlaj)4hxLoi5RA<1MDYT8MgR|$;{g%c=kGZtp;BfLh8i%g$BVKiFEubdsR9eZ{#`J~ZWJ%`!-idpRqi}SO)@PlIW^#;Y z_UZvOzxUtwo)5`7hMFQg37U&jd_{YhC8rQD7aUTrO_c>IF{&NO%34RF%=HONj7pIl sAG9lx?a-3emV;kT7H;%up1xR_f6_KC+1joquPM538sb-Msk<}$U&^>T*#H0l literal 0 HcmV?d00001 diff --git a/themes/default/assets/images/up.png b/themes/default/assets/images/up.png new file mode 100644 index 0000000000000000000000000000000000000000..6f84f9813c7b75d097835c02387549257e4cd414 GIT binary patch literal 3861 zcmV+w59;uVP)uJ@VVD_UC<6{NG_fI~0ue<-1QkJoA_k0xBC#Thg@9ne9*`iQ#9$Or zQF$}6R&?d%y_c8YA7_1QpS|}zXYYO1x&V;8{kgn!SPFnNo`4_X6{c}T{8k*B#$jdxfFg<9uYy1K45IaYvHg`_dOZM)Sy63ve6hvv z1)yUy0P^?0*fb9UASvow`@mQCp^4`uNg&9uGcn1|&Nk+9SjOUl{-OWr@Hh0;_l(8q z{wNRKos+;6rV8ldy0Owz(}jF`W(JeRp&R{qi2rfmU!TJ;gp(Kmm5I1s5m_f-n#TRsj}B0%?E`vOzxB2#P=n*a3EfYETOrKoe*ICqM@{4K9Go;5xVgZi5G4 z1dM~{UdP6d+Yd3o?MrAqM0Kc|iV92owdyL5UC#5<>aVCa44|hpM4E zs0sQWIt5*Tu0n&*J!lk~f_{hI!w5`*sjxDv4V%CW*ah~3!{C*0BD@;TgA3v9a1~q+ zAA{TB3-ERLHar49hi4Ih5D^-ph8Q6X#0?2VqLBoIkE}zAkxHZUgRb+f=nat zP#6>iMMoK->`~sRLq)(kHo*Vn{;LcG6+edD1=7D>9j^O?D{Qg|tCDK{ym)H7&wDr6*;uGTJg8GHjVbnL{!cWyUB7MT6o-VNo_w8Yq`2<5Ub)hw4L3rj}5@qxMs0 zWMyP6Wy582WNT#4$d1qunl{acmP#w5ouJ*Jy_Zv#bCKi7ZIf$}8d zZdVy&)LYdbX%I9R8VMQ|8r>Q*nyQ)sn)#Z|n)kKvS`4iu ztvy=3T65Yu+7a4Yv^%sXb>ww?bn(=Yu(!=O6^iuTp>)p_Y^{w=i z^lS773}6Fm1Fpe-gF!>Ip{*g$u-szvGhed;vo5pW&GpS$<~8QGEXWp~7V9lKEnZq0SaK{6Sl+dwSOr*Z zvFf(^Xl-N7w{EeXveC4Ov)N}e%%C!Y7^RFWwrE>d+x51mZQt2h+X?JW*!^a2WS?Sx z)P8cQ&Qi|OhNWW;>JChYI)@QQx?`Nj^#uJBl~d&PK+RZLOLos~K(b5>qmrMN0})tOkySZ3_W zICNY@+|jrX%s^&6b2i>5eqa0y%Z;^%^_=a@u3%4b9605ii3Ep)@`TAmhs0fpQ%O!q zl}XcFH*PieWwLj2ZSq`7V9Mc?h17`D)-+sNT-qs~3@?S(ldh7UlRlVXkWrK|vf6I- z?$tAVKYn8-l({mqQ$Q8{O!WzMg`0(=S&msXS#Pt$vrpzo=kRj+a`kh!z=6$;c zwT88(J6|n-WB%w`m$h~4pmp)YIh_ z3ETV2tjiAU!0h1dxU-n=E9e!)6|Z;4?!H=SSy{V>ut&IOq{_dl zbFb#!9eY1iCsp6Bajj|Hr?hX|zPbJE{X++w546-O*Ot`2Kgd0Jx6Z4syT zu9enWavU5N9)I?I-1m1*_?_rJ$vD~agVqoG+9++s?NEDe`%Fht$4F;X=in*dQ{7$m zU2Q)a|9JSc+Uc4zvS-T963!N$T{xF_ZuWe}`RNOZ7sk3{yB}PPym+f8xTpV;-=!;; zJuhGEb?H5K#o@~7t9DmUU1MD9xNd#Dz0azz?I)|B+WM{g+Xrk0I&awC=o(x)cy`EX z=)z6+o0o6-+`4{y+3mqQ%kSJBju{@g%f35#FZJHb`&swrA8dGtepviS>QUumrN{L@ z>;2q1Vm)$Z)P1z?N$8UYW2~{~zhwUMVZ87u`Dx{Z>O|9|`Q+&->FRy-Sjp7DHs zy69KwU-!MxeeuI@&cF4|M9z%AfP?@5 z`Tzg`fam}Kbua(`>RI+y?e7jT@qQ9J+u00v@9M??Vs0RI60puMM)00009a7bBm z000XU000XU0RWnu7ytkO2XskIMF-#m7Y_po2~!A;000CaNklgmS^EO+wN%D8@E1u{DYY<7Q46KkvOcX$L~?nKR$aeE)f#5_QPTkd*&k26O`V z0(Syyfp!<21O|bxfX{#vlFm?oN(%{?*=4{-!2Q6I0y^h_zkox)c1eH4i!90kGus2a zP{h$1^bfEXc+nmEpCefcx&QAlvvEHdjZXtdfZf1)pxOV{0Z#x&fpdxe=YavBS<<|X znh2QL8sNAq&gnd`4LB-kY5~;RfG(gPXbi6=flf(3*F&JAit+uDS|oh}Ocj8ATGC-j zO~6}$-wvEMv*i(mEIIsbV*DXVyV8oNM-gU8yFGbxx)eAVWwH?WJ;0TT@ehNty5*WW z5uE-MhyrCZ>&<0Kq165iIk8{Tu3ERw`Q95EB>h-Gwg>2T_AGFtq>*10Pj9y$ZbIj3bgZFOX~l ze)Fm&2;2?~)d|Pjz+?V+AoIbJ(|h$`_nSxKXMwTs+y;CDTw5(1{(LO3R%D67FRR7R z=|mOS?*=vkza&n4XJ%KW2>A1GV6|o;9ssASAkboFqri26{kxaZNlDW_riT(I2F+}J zm4uGnbZJ(vv6xwdd%Q9kw;Lr5CZV_^QQiU^Gqd&tiMcq7G9ME2F$wK-i7y$;693jo z8i}{^GW!)+1&jnEEx;)=+YruQ5q?i(ZX~D8p=4%(FOm$uLDI=Ot$E6kh>7_n{hRkdy@J?{Fl==30D0)@& zri(C)nKc1#1a?ncNVfX|3D9U}`)UoO3o-7Oc^Oz5O0n0>xCEe5smzwkwk%pM0`53l+peNd@X<`-dey^wrJjQ0h!k4w7sKRcl- zp95}58k2mJX)GF&Ak$=KuL1jl@fl!C&85`qwG;R|u)BeAGkY}ddbJGut#<;Wz)L}7 z#+R1Sh-Rqzh2FHUuYSo`Ve=c0O(AL(L zkdPoICRS8bbmYj9sHmt(lO`=$vc$o`K~GQ5#KdIYym=KB6?}YrR#sLUHf#V|N(oT> z&+X?L671|4;A*62z|06VOYxtSb5UwyNotBhd1gt5LSj~8MNWQVie6@3T0Vo~PZmxt zpeh}Zt)M_)U|a0aaG~KO1BZvZn?jD6S_{*HW)%*;`OgkE&S9`QA&_wSB8OnV)&qwE z3563A8#os#^s?|IgoyGAaWJs)yYVt9c`$Rkdx#21viWkj`G&Fx`OXv*5>L*OVo|;|bKCWe3=$Ka9I?4O!J$DwK}xWtWn#vO6oGjso_A=P*!DN9ZlCGE zu;#||YXwSnd&8bYIBLXQJhb&oRhra|@Ktr^uV3bjc1{R)OJZPi%4kt)EBENiWl$~( z%-|`j2xN&1QLl{j=d8~2@bbZG>0F?t43dItfZiraZira diff --git a/themes/default/dash/layout.php b/themes/default/dash/layout.php new file mode 100644 index 0000000..f0accc7 --- /dev/null +++ b/themes/default/dash/layout.php @@ -0,0 +1,15 @@ + + + + + + + + +renderPanel(); ?> +

    + +
    + + + \ No newline at end of file diff --git a/themes/default/dash/page.php b/themes/default/dash/page.php new file mode 100644 index 0000000..043e6eb --- /dev/null +++ b/themes/default/dash/page.php @@ -0,0 +1,38 @@ +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + \ No newline at end of file diff --git a/themes/default/dash/panel.php b/themes/default/dash/panel.php new file mode 100644 index 0000000..258e6bd --- /dev/null +++ b/themes/default/dash/panel.php @@ -0,0 +1,73 @@ +'."\r\n"; + echo ''."\r\n"; + echo ''; +} \ No newline at end of file diff --git a/themes/default/error.php b/themes/default/error.php new file mode 100644 index 0000000..43f5923 --- /dev/null +++ b/themes/default/error.php @@ -0,0 +1,8 @@ +
    +

    +

    + +
    + +
    +Zira diff --git a/themes/default/layout-left.php b/themes/default/layout-left.php new file mode 100644 index 0000000..303d667 --- /dev/null +++ b/themes/default/layout-left.php @@ -0,0 +1,46 @@ + + + + + + + + + + +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    + + + + +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/themes/default/layout-right.php b/themes/default/layout-right.php new file mode 100644 index 0000000..b944ea0 --- /dev/null +++ b/themes/default/layout-right.php @@ -0,0 +1,46 @@ + + + + + + + + + + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + + + + +
    + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/themes/default/layout-wide.php b/themes/default/layout-wide.php new file mode 100644 index 0000000..bdcdb7a --- /dev/null +++ b/themes/default/layout-wide.php @@ -0,0 +1,41 @@ + + + + + + + + + + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/themes/default/layout.php b/themes/default/layout.php new file mode 100644 index 0000000..e733f6b --- /dev/null +++ b/themes/default/layout.php @@ -0,0 +1,51 @@ + + + + + + + + + + +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    + + + + +
    + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/themes/default/oauth/fb-comments.php b/themes/default/oauth/fb-comments.php new file mode 100644 index 0000000..541496b --- /dev/null +++ b/themes/default/oauth/fb-comments.php @@ -0,0 +1,7 @@ + +
    +
    + \ No newline at end of file diff --git a/themes/default/oauth/fb-login.php b/themes/default/oauth/fb-login.php new file mode 100644 index 0000000..9a2cd4f --- /dev/null +++ b/themes/default/oauth/fb-login.php @@ -0,0 +1,34 @@ + + + \ No newline at end of file diff --git a/themes/default/oauth/fb-page.php b/themes/default/oauth/fb-page.php new file mode 100644 index 0000000..6ba2b81 --- /dev/null +++ b/themes/default/oauth/fb-page.php @@ -0,0 +1,10 @@ + +
    +
    + \ No newline at end of file diff --git a/themes/default/oauth/vk-comments.php b/themes/default/oauth/vk-comments.php new file mode 100644 index 0000000..a07ac20 --- /dev/null +++ b/themes/default/oauth/vk-comments.php @@ -0,0 +1,12 @@ +
    + \ No newline at end of file diff --git a/themes/default/oauth/vk-group.php b/themes/default/oauth/vk-group.php new file mode 100644 index 0000000..26f6796 --- /dev/null +++ b/themes/default/oauth/vk-group.php @@ -0,0 +1,22 @@ + +
    + + \ No newline at end of file diff --git a/themes/default/oauth/vk-login.php b/themes/default/oauth/vk-login.php new file mode 100644 index 0000000..7ff43e7 --- /dev/null +++ b/themes/default/oauth/vk-login.php @@ -0,0 +1,29 @@ + + + \ No newline at end of file diff --git a/themes/default/oauth/vk-response.php b/themes/default/oauth/vk-response.php new file mode 100644 index 0000000..9330357 --- /dev/null +++ b/themes/default/oauth/vk-response.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/themes/default/page.php b/themes/default/page.php new file mode 100644 index 0000000..1e5bbfa --- /dev/null +++ b/themes/default/page.php @@ -0,0 +1,49 @@ +
    +
    + +<?php echo (!empty($title) ? Zira\Helper::html($title) : '') ?> + + + + + +

    + +

    + + + + + +
    + +
    + + +
    + + + + +
    + + +
    +
    \ No newline at end of file diff --git a/themes/default/screenshot.jpg b/themes/default/screenshot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bbcbd1f089eb52bcd37f262000996cc512047b9a GIT binary patch literal 22044 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ⅇrF=0-b&FgFKWG0Hgfj<5|`SnWp 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 +
    + + + + +

    ()

    + + + +
      + + +sort_path)) - 1; ?> +0) $comment_offset_class = ' comments-item-nested-'.($comment_offset < Zira\Config::get('comments_max_nesting', 5) ? $comment_offset : Zira\Config::get('comments_max_nesting', 5)); ?> +
    • +author_id > 0 && $comment->author_username !== null && $comment->author_firstname !== null && $comment->author_secondname !== null): ?> +author_id, $comment->author_firstname, $comment->author_secondname, $comment->author_username, null, $comment->author_image, null, array('class'=>'comment-avatar')) ?> + +author_image, null, array('class'=>'comment-avatar')) ?> + + +author_id > 0 && $comment->author_username !== null && $comment->author_firstname !== null && $comment->author_secondname !== null): ?> +sender_name ? Zira\User::generateUserProfileLink($comment->author_id, null, null, $comment->sender_name) : Zira\User::generateUserProfileLink($comment->author_id, $comment->author_firstname, $comment->author_secondname, $comment->author_username)); ?> + +sender_name ? Zira\Helper::html($comment->sender_name) : t('Guest')); ?> + +recipient_name): ?> +   recipient_name) ?> + + +

      content))) ?>

      + + creation_date)) ?>   + + +likes); ?> +   + + +dislikes); ?> +   + + + + +
    • + +
    +$limit*($page+1)): ?> +
    + +
    + + + +
    + +
    + + +'.t('Login').'') ?> + + +
    + + \ No newline at end of file diff --git a/themes/default/zira/contact.php b/themes/default/zira/contact.php new file mode 100644 index 0000000..bd29e28 --- /dev/null +++ b/themes/default/zira/contact.php @@ -0,0 +1,44 @@ + +
    + +<?php if (!empty($name)) echo Zira\Helper::html($name); ?> + +
    + +

    + + +
    + + +
    + + +
    + + + + + +

    + +
    +
    +$address, 'name'=>!empty($name) ? $name : ''), 'zira/google-map'); ?> +$address, 'name'=>!empty($name) ? $name : ''), 'zira/yandex-map'); ?> + \ No newline at end of file diff --git a/themes/default/zira/gallery.php b/themes/default/zira/gallery.php new file mode 100644 index 0000000..999a41a --- /dev/null +++ b/themes/default/zira/gallery.php @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/themes/default/zira/google-map.php b/themes/default/zira/google-map.php new file mode 100644 index 0000000..90a314e --- /dev/null +++ b/themes/default/zira/google-map.php @@ -0,0 +1,44 @@ + + + + +
    + + + + + + + + \ No newline at end of file diff --git a/themes/default/zira/home.php b/themes/default/zira/home.php new file mode 100644 index 0000000..fbb3698 --- /dev/null +++ b/themes/default/zira/home.php @@ -0,0 +1,50 @@ + + + +
    + + + +
      + +
    • + +
      +thumb): ?> + +<?php echo Zira\Helper::html($record->title) ?> + + +

      description)) ?>

      +
      +
      + + creation_date)) ?> + + + author_id, $record->author_firstname, $record->author_secondname, $record->author_username) ?> + + + comments ?> + + + + +category_name && $record->category_title): ?> + category_title) ?> + +
      +
    • + +
    +
    + + diff --git a/themes/default/zira/list.php b/themes/default/zira/list.php new file mode 100644 index 0000000..40f0519 --- /dev/null +++ b/themes/default/zira/list.php @@ -0,0 +1,44 @@ + +
      + + +
    • +

      +title) ?> +

      +
      +thumb): ?> + +<?php echo Zira\Helper::html($record->title) ?> + + +

      description)) ?>

      +
      +
      + + creation_date)) ?> + + + author_id, $record->author_firstname, $record->author_secondname, $record->author_username) ?> + + + comments ?> + + + + +category_name && $record->category_title): ?> + category_title) ?> + +
      +
    • + +=$settings['limit']) break; ?> + +
    +$settings['limit']): ?> +
    + +
    + + diff --git a/themes/default/zira/map.php b/themes/default/zira/map.php new file mode 100644 index 0000000..846a20c --- /dev/null +++ b/themes/default/zira/map.php @@ -0,0 +1,20 @@ +
    + +
    \ No newline at end of file diff --git a/themes/default/zira/search-results.php b/themes/default/zira/search-results.php new file mode 100644 index 0000000..eabed89 --- /dev/null +++ b/themes/default/zira/search-results.php @@ -0,0 +1,34 @@ + +
      + + +
    • +

      +title) ?> +

      +
      +thumb): ?> + +<?php echo Zira\Helper::html($record->title) ?> + + +

      description)) ?>

      +
      + +
      +category_name && $record->category_title): ?> + category_title) ?> + +
      + +
    • + +=$settings['limit']) break; ?> + +
    +$settings['limit'] && isset($settings['offset'])): ?> +
    + +
    + + diff --git a/themes/default/zira/search.php b/themes/default/zira/search.php new file mode 100644 index 0000000..ef38f4c --- /dev/null +++ b/themes/default/zira/search.php @@ -0,0 +1,11 @@ + + + +
    + +
    + +

    + \ No newline at end of file diff --git a/themes/default/zira/slider.php b/themes/default/zira/slider.php new file mode 100644 index 0000000..6f0cffb --- /dev/null +++ b/themes/default/zira/slider.php @@ -0,0 +1,9 @@ + +
    +
      + +
    • <?php echo Zira\Helper::html($_image->description) ?>
    • + +
    +
    + diff --git a/themes/default/zira/user/conversations.php b/themes/default/zira/user/conversations.php new file mode 100644 index 0000000..90a1f6b --- /dev/null +++ b/themes/default/zira/user/conversations.php @@ -0,0 +1,122 @@ + + +
    + +
    + + +
      +$item): ?> +
    • + +    + modified_date))) ?> +    + subject) ?> +
    • + +
    + +

    + + + diff --git a/themes/default/zira/user/menu.php b/themes/default/zira/user/menu.php new file mode 100644 index 0000000..f16c87f --- /dev/null +++ b/themes/default/zira/user/menu.php @@ -0,0 +1,27 @@ + +
      +$item): ?> +0): ?> + + + + +
    + \ No newline at end of file diff --git a/themes/default/zira/user/messages.php b/themes/default/zira/user/messages.php new file mode 100644 index 0000000..0e4ed8f --- /dev/null +++ b/themes/default/zira/user/messages.php @@ -0,0 +1,71 @@ + + + +
      +0): ?> +
    •  
    • +$user): ?> +0) echo '
    • '; ?> +
    • id, $user->firstname, $user->secondname, $user->username, null); ?>
    • + + +
    •  
    • +
    • + +
    +
    + +
    + + +
      +$item): ?> +
    • +
      +username): ?> +user_id, $item->firstname, $item->secondname, $item->username); ?> + + + +    +
      creation_date))) ?>
      +
      +
      +username): ?> +user_id, $item->firstname, $item->secondname, $item->username, null, $item->image); ?> + +
      +
      +

      content))) ?>

      +
      +
    • + +
    + + +0) echo $form; ?> + + \ No newline at end of file diff --git a/themes/default/zira/user/profile.php b/themes/default/zira/user/profile.php new file mode 100644 index 0000000..9d651fa --- /dev/null +++ b/themes/default/zira/user/profile.php @@ -0,0 +1,73 @@ +
    + +
    \ No newline at end of file diff --git a/themes/default/zira/widgets/block.php b/themes/default/zira/widgets/block.php new file mode 100644 index 0000000..d335703 --- /dev/null +++ b/themes/default/zira/widgets/block.php @@ -0,0 +1,6 @@ +
    + +

    + + +
    \ No newline at end of file diff --git a/themes/default/zira/widgets/category.php b/themes/default/zira/widgets/category.php new file mode 100644 index 0000000..09156fc --- /dev/null +++ b/themes/default/zira/widgets/category.php @@ -0,0 +1,49 @@ +
    + + + + +
      + +
    • +

      +title) ?> +

      +
      +thumb): ?> + +<?php echo Zira\Helper::html($record->title) ?> + + +

      description)) ?>

      +
      + +
      + + creation_date)) ?> + + + author_id, $record->author_firstname, $record->author_secondname, $record->author_username) ?> + + + comments ?> + + + + +category_name && $record->category_title): ?> + category_title) ?> + +
      + +
    • + +
    + +
    diff --git a/themes/default/zira/widgets/childmenu.php b/themes/default/zira/widgets/childmenu.php new file mode 100644 index 0000000..eb0cb2c --- /dev/null +++ b/themes/default/zira/widgets/childmenu.php @@ -0,0 +1,28 @@ +
    + +
    \ No newline at end of file diff --git a/themes/default/zira/widgets/discussed.php b/themes/default/zira/widgets/discussed.php new file mode 100644 index 0000000..08bacf0 --- /dev/null +++ b/themes/default/zira/widgets/discussed.php @@ -0,0 +1,42 @@ +
    + + + + +
      + +
    • +

      +title) ?> +

      +
      +thumb): ?> + +<?php echo Zira\Helper::html($record->title) ?> + + +

      description)) ?>

      +
      +
      + + + creation_date)) ?> + + + + + + + comments ?> + +category_name && $record->category_title): ?> + category_title) ?> + +
      +
    • + +
    + +
    diff --git a/themes/default/zira/widgets/footermenu.php b/themes/default/zira/widgets/footermenu.php new file mode 100644 index 0000000..b192d5b --- /dev/null +++ b/themes/default/zira/widgets/footermenu.php @@ -0,0 +1,29 @@ + \ No newline at end of file diff --git a/themes/default/zira/widgets/languages.php b/themes/default/zira/widgets/languages.php new file mode 100644 index 0000000..893de4c --- /dev/null +++ b/themes/default/zira/widgets/languages.php @@ -0,0 +1,15 @@ +1) { +echo '
      '; + Zira\Helper::setAddingLanguageToUrl(false); + foreach($languages as $language) { + $url = Zira\Helper::html($language); + $class = ''; + if ($language == Zira\Config::get('language')) $url='/'; + if ($language == Zira\Locale::getLanguage()) $class=' class="active"'; + echo '
    • '.Zira\Helper::html(t(ucfirst($language))).'
    • '; + } + Zira\Helper::setAddingLanguageToUrl(true); +echo '
    '; +} diff --git a/themes/default/zira/widgets/logo.php b/themes/default/zira/widgets/logo.php new file mode 100644 index 0000000..6f3bff1 --- /dev/null +++ b/themes/default/zira/widgets/logo.php @@ -0,0 +1,13 @@ +'; + if (!empty($logo) || !empty($title)) { + echo ''; + } + if (!empty($slogan)) echo '

    '.Zira\Helper::html($slogan).'

    '; + else echo '

     

    '; + echo ''; +} \ No newline at end of file diff --git a/themes/default/zira/widgets/rated.php b/themes/default/zira/widgets/rated.php new file mode 100644 index 0000000..7827295 --- /dev/null +++ b/themes/default/zira/widgets/rated.php @@ -0,0 +1,42 @@ +
    + + + + +
      + +
    • +

      +title) ?> +

      +
      +thumb): ?> + +<?php echo Zira\Helper::html($record->title) ?> + + +

      description)) ?>

      +
      +
      + + + creation_date)) ?> + + + comments ?> + + + + + +category_name && $record->category_title): ?> + category_title) ?> + +
      +
    • + +
    + +
    diff --git a/themes/default/zira/widgets/share.php b/themes/default/zira/widgets/share.php new file mode 100644 index 0000000..b52f9c1 --- /dev/null +++ b/themes/default/zira/widgets/share.php @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/themes/default/zira/widgets/topmenu.php b/themes/default/zira/widgets/topmenu.php new file mode 100644 index 0000000..0e34d0d --- /dev/null +++ b/themes/default/zira/widgets/topmenu.php @@ -0,0 +1,38 @@ +
    + +
    \ No newline at end of file diff --git a/themes/default/zira/xml/rss.php b/themes/default/zira/xml/rss.php new file mode 100644 index 0000000..c16c30a --- /dev/null +++ b/themes/default/zira/xml/rss.php @@ -0,0 +1,33 @@ +'; ?> + + + +<?php echo Zira\Helper::html($title); ?> + + + + + +<?php echo Zira\Helper::html($title); ?> + + + +Zira CMS + + + +<?php echo Zira\Helper::html($item['title']) ?> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/themes/default/zira/xml/sitemap-index.php b/themes/default/zira/xml/sitemap-index.php new file mode 100644 index 0000000..dc2c7eb --- /dev/null +++ b/themes/default/zira/xml/sitemap-index.php @@ -0,0 +1,9 @@ +'; ?> + + + + + + + + \ No newline at end of file diff --git a/themes/default/zira/xml/sitemap.php b/themes/default/zira/xml/sitemap.php new file mode 100644 index 0000000..5fc9d05 --- /dev/null +++ b/themes/default/zira/xml/sitemap.php @@ -0,0 +1,12 @@ +'; ?> + + +$url): ?> + + +weekly +0.8 + + + + diff --git a/themes/default/zira/yandex-map.php b/themes/default/zira/yandex-map.php new file mode 100644 index 0000000..c91a7a2 --- /dev/null +++ b/themes/default/zira/yandex-map.php @@ -0,0 +1,53 @@ + + + + + +
    + + + + + + + diff --git a/zira.php b/zira.php new file mode 100644 index 0000000..696ef9e --- /dev/null +++ b/zira.php @@ -0,0 +1,10 @@ +self::CACHE_LIFETIME; + } + + public static function isJSExpired() { + return time()-self::getJSMTime()>self::CACHE_LIFETIME; + } + + public static function isCSSCached() { + $url = CACHE_DIR . DIRECTORY_SEPARATOR . self::CSS_ASSETS_CACHE_FILE; + $css_file = ROOT_DIR . DIRECTORY_SEPARATOR . $url; + return file_exists($css_file) && is_readable($css_file) && filesize($css_file)>0; + } + + public static function isJSCached() { + $url = CACHE_DIR . DIRECTORY_SEPARATOR . self::JS_ASSETS_CACHE_FILE; + $js_file = ROOT_DIR . DIRECTORY_SEPARATOR . $url; + return file_exists($js_file) && is_readable($js_file) && filesize($js_file)>0; + } + + public static function isCached() { + return self::isCSSCached() && self::isJSCached(); + } + + public static function isCachedAndNotExpired() { + if (defined('DEBUG') && DEBUG) return false; + return self::isCached() && !self::isCSSExpired() && !self::isJSExpired(); + } + + public static function setActive($active) { + self::$_active = (bool)$active; + } + + public static function isActive() { + return self::$_active; + } + + public static function isMergedCSS($file) { + return in_array($file, self::$_css_assets); + } + + public static function isMergedJS($file) { + return in_array($file, self::$_js_assets); + } + + public static function getCSSURL() { + if (Config::get('clean_url')) { + $url = Helper::baseUrl(self::CSS_SCRIPT_CLEAN); + } else { + $url = Helper::baseUrl(self::CSS_SCRIPT); + } + $q = '?'; + $q .= 't='.(intval(self::isGzipEnabled())+1).self::getCSSMTime(); + return $url.$q; + } + + public static function getJSURL() { + if (Config::get('clean_url')) { + $url = Helper::baseUrl(self::JS_SCRIPT_CLEAN); + } else { + $url = Helper::baseUrl(self::JS_SCRIPT); + } + $q = '?'; + $q .= 't='.(intval(self::isGzipEnabled())+1).self::getJSMTime(); + return $url.$q; + } + + public static function addStyle() { + $attributes = array(); + $attributes['rel'] = 'stylesheet'; + $attributes['type'] = 'text/css'; + $attributes['href'] = self::getCSSURL(); + View::addHTML(Helper::tag_short('link', $attributes),View::VAR_STYLES); + } + + public static function addScript() { + $attributes = array(); + $attributes['src'] = self::getJSURL(); + View::addHTML(Helper::tag('script', null, $attributes),View::VAR_SCRIPTS); + } + + public static function init() { + if (Request::isAjax()) return; + if (Config::get('caching') && self::isCachedAndNotExpired()) { + self::setActive(true); + } else if (Config::get('caching') && self::merge()) { + self::setActive(true); + } else { + self::setActive(false); + } + if (self::isActive()) { + self::addStyle(); + self::addScript(); + } + } + + public static function isGzipEnabled() { + if (self::$_gzip!==null) return self::$_gzip; + $accept_encoding = ''; + if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) && preg_match( '/\b(x-gzip|gzip)\b/', strtolower($_SERVER['HTTP_ACCEPT_ENCODING']), $match)) { + $accept_encoding = $match[1]; + } + if (empty($accept_encoding) && defined('FORCE_GZIP_ASSETS') && FORCE_GZIP_ASSETS) $accept_encoding = 'gzip'; + if (Config::get('gzip') && function_exists('gzencode') && !@ini_get('zlib.output_compression') && !empty($accept_encoding)) { + self::$_gzip = true; + } else { + self::$_gzip = false; + } + return self::$_gzip; + } +} \ No newline at end of file diff --git a/zira/cache.php b/zira/cache.php new file mode 100644 index 0000000..ff06cef --- /dev/null +++ b/zira/cache.php @@ -0,0 +1,88 @@ +Config::get('cache_lifetime')); + } + + public static function get($key, $unserialize = false) { + if (!Config::get('caching')) return false; + + $cache_file = ROOT_DIR . DIRECTORY_SEPARATOR . + CACHE_DIR . DIRECTORY_SEPARATOR . + '.' . $key . '.cache'; + + if (!file_exists($cache_file)) return false; + if (self::isExpired($cache_file)) return false; + + chmod($cache_file, 0440); + $data = file_get_contents($cache_file); + chmod($cache_file, 0000); + + if ($unserialize) { + $data = unserialize($data); + } + + return $data; + } + + public static function getArray($key) { + return self::get($key, true); + } + + public static function getObject($key) { + return self::get($key, true); + } + + public static function clear($force=false) { + if (!Config::get('caching') && !$force) return; + $d = opendir(ROOT_DIR . DIRECTORY_SEPARATOR . CACHE_DIR); + if (!$d) return; + while(($f=readdir($d))!==false) { + if ($f=='.' || $f=='..' || !is_file(ROOT_DIR . DIRECTORY_SEPARATOR . CACHE_DIR . DIRECTORY_SEPARATOR . $f)) continue; + if (substr($f,-6)!='.cache') continue; + @chmod(ROOT_DIR . DIRECTORY_SEPARATOR . CACHE_DIR . DIRECTORY_SEPARATOR . $f, 0660); + @unlink(ROOT_DIR . DIRECTORY_SEPARATOR . CACHE_DIR . DIRECTORY_SEPARATOR . $f); + } + closedir($d); + } +} \ No newline at end of file diff --git a/zira/category.php b/zira/category.php new file mode 100644 index 0000000..1f463a4 --- /dev/null +++ b/zira/category.php @@ -0,0 +1,178 @@ +name, Locale::t($row->title)); + if ($row->name == $request) { + self::$_current = $row; + self::$_param = null; + } + if ($p !== false && $p_request && $row->name != $request && $row->name == $p_request) { + self::$_current = $row; + self::$_param = substr($request, $p + 1); + } + } + } + + public static function loadPartial($request) { + $parts = explode('/',$request); + + if (count($parts)>1) { + $_request = $parts[0]; + $query = Models\Category::getCollection() + ->open_query() + ->where('name','=',$_request); + for($i=1;$iclose_query(); + $query->union(); + $query->open_query(); + $query->where('name','=',$_request); + } + $query->close_query(); + $rows = $query->get(); + } else { + $rows = Models\Category::getCollection() + ->where('name','=',$request) + ->get(); + } + + return $rows; + } + + public static function getAllCategories() { + $rows = Cache::getArray(self::CACHE_KEY); + if ($rows===false) { + $rows = Models\Category::getCollection()->order_by('id','asc')->get(); + Cache::setArray(self::CACHE_KEY, $rows); + } + return $rows; + } + + public static function loadAll($request) { + $parts = explode('/',$request); + + $rows = self::getAllCategories(); + + self::$_childs = array(); + $_rows = array(); + if (count($parts)>1) { + $map = array(); + foreach($rows as $row) { + $map[$row->name] = $row; + if (strpos($row->name, $request.'/')===0) { + self::$_childs []= $row; + } + } + $_request = ''; + for($i=0;$iname == $request) { + $_rows []= $row; + } + if (strpos($row->name, $request.'/')===0) { + self::$_childs []= $row; + } + } + } + + return $_rows; + } + + public static function current() { + return self::$_current; + } + + public static function param() { + return self::$_param; + } + + public static function chain() { + return self::$_chain; + } + + public static function setCurrent($category) { + self::$_current = $category; + } + + public static function setChilds($childs) { + self::$_childs = $childs; + } + + public static function getChainIdsArray() { + $ids = array(); + foreach(self::$_chain as $row) { + $ids []= $row->id; + } + return $ids; + } + + public static function currentChilds() { + return self::$_childs; + } + + public static function getChilds($category = null) { + return Models\Category::getChildCategories($category); + } + + public static function getCategoriesMap() { + $categories = self::getAllCategories(); + if (empty($categories)) return array(); + $child_counts = array(); + foreach($categories as $category) { + if (!array_key_exists($category->parent_id, $child_counts)) { + $child_counts[$category->parent_id] = 0; + } + $child_counts[$category->parent_id]++; + } + $items = array(); + self::buildCategoriesMap($items, $categories, $child_counts); + return $items; + } + + protected static function buildCategoriesMap(array &$items, array &$categories, array &$child_counts, $parent_id = 0) { + foreach($categories as $category) { + if ($category->parent_id == $parent_id) { + $items []= $category; + if (array_key_exists($category->id, $child_counts) && $child_counts[$category->id]>0) { + self::buildCategoriesMap($items, $categories, $child_counts, $category->id); + } + } + } + } +} \ No newline at end of file diff --git a/zira/collection.php b/zira/collection.php new file mode 100644 index 0000000..7d8e110 --- /dev/null +++ b/zira/collection.php @@ -0,0 +1,12 @@ +access_check && !Zira\Permission::check(Zira\Permission::TO_VIEW_RECORDS)) { + if (!Zira\User::isAuthorized()) { + Zira\Response::redirect('user/login?redirect='.static::generateCategoryUrl(Zira\Category::current()->name), true); + } else { + Zira\Response::forbidden(); + } + } + + if (!$is_ajax) { + $record = static::record(Zira\Category::current()); + + // adding meta tags + $title = Zira\Category::current()->title; + if (Zira\Category::current()->meta_title) $meta_title = Zira\Category::current()->meta_title; + else $meta_title = Zira\Category::current()->title; + if (Zira\Category::current()->meta_keywords) $meta_keywords = Zira\Locale::t(Zira\Category::current()->meta_keywords); + else $meta_keywords = mb_strtolower(Zira\Locale::t(Zira\Category::current()->title), CHARSET); + if (Zira\Category::current()->meta_description) $meta_description = Zira\Category::current()->meta_description; + else if (Zira\Category::current()->description) $meta_description = Zira\Category::current()->description; + else $meta_description = Zira\Locale::t('Category: %s', Zira\Category::current()->title); + $thumb = null; + + if ($record) { + $title = $record->title; + if ($record->meta_title) $meta_title = $record->meta_title; + else $meta_title = $record->title; + if ($record->meta_keywords) $meta_keywords = $record->meta_keywords; + if ($record->meta_description) $meta_description = $record->meta_description; + else $meta_description = $record->description; + if ($record->thumb) $thumb = $record->thumb; + } + + static::addTitle(Zira\Locale::t($meta_title)); + static::setKeywords($meta_keywords); + static::setDescription(Zira\Locale::t($meta_description)); + static::addOpenGraphTags(Zira\Locale::t($meta_title), Zira\Locale::t($meta_description), static::generateCategoryUrl(Zira\Category::current()->name), $thumb); + } + + $limit = Zira\Config::get('records_limit', 10); + if (Zira\Category::current()->records_list===null || Zira\Category::current()->records_list) { + $records = static::getRecords(Zira\Category::current(), false, $limit + 1, $last_id, Zira\Config::get('category_childs_list', true), Zira\Category::currentChilds()); + } else { + $records = array(); + } + + $comments_enabled = Zira\Category::current()->comments_enabled!==null ? Zira\Category::current()->comments_enabled : Zira\Config::get('comments_enabled', 1); + $rating_enabled = Zira\Category::current()->rating_enabled!==null ? Zira\Category::current()->rating_enabled : Zira\Config::get('rating_enabled', 0); + $display_author = Zira\Category::current()->display_author!==null ? Zira\Category::current()->display_author : Zira\Config::get('display_author', 0); + $display_date = Zira\Category::current()->display_date!==null ? Zira\Category::current()->display_date : Zira\Config::get('display_date', 0); + + $data = array( + static::VIEW_PLACEHOLDER_CLASS => 'records', + static::VIEW_PLACEHOLDER_RECORDS => $records, + static::VIEW_PLACEHOLDER_SETTINGS => array( + 'limit' => $limit, + 'comments_enabled' => $comments_enabled, + 'rating_enabled' => $rating_enabled, + 'display_author' => $display_author, + 'display_date' => $display_date + ) + ); + + if (!$is_ajax) { + Zira\View::addPlaceholderView(Zira\View::VAR_CONTENT, $data, 'zira/list'); + Zira\View::preloadThemeLoader(); + + $_data = array( + static::VIEW_PLACEHOLDER_TITLE => Zira\Locale::t($title) + ); + + if ($record) { + $_data[static::VIEW_PLACEHOLDER_IMAGE] = $record->image; + $_data[static::VIEW_PLACEHOLDER_CONTENT] = $record->content; + $_data[static::VIEW_PLACEHOLDER_CLASS] = 'parse-content'; + Zira\View::addParser(); + } else { + $_data[static::VIEW_PLACEHOLDER_DESCRIPTION] = Zira\Locale::t(Zira\Category::current()->description); + } + static::render($_data); + } else { + $data[static::VIEW_PLACEHOLDER_CLASS] .= ' xhr-list'; + Zira\View::renderView($data, 'zira/list'); + } + } + + public static function record($category) { + $record = null; + $record_name = $category->name; + if (strpos($record_name,'/')!==false) { + $record_name_parts = explode('/', $record_name); + $record_name = array_pop($record_name_parts); + $category_id = $category->parent_id; + } else { + $category_id = Zira\Category::ROOT_CATEGORY_ID; + } + + if (!empty($record_name)) { + $record = Zira\Models\Record::getCollection() + ->select(Zira\Models\Record::getFields()) + ->where('category_id', '=', $category_id) + ->and_where('language', '=', Zira\Locale::getLanguage()) + ->and_where('name', '=', $record_name) + ->get(0) + ; + + if ($record) { + $slider_enabled = $category->slider_enabled!==null ? $category->slider_enabled : Zira\Config::get('slider_enabled', 1); + $gallery_enabled = $category->gallery_enabled!==null ? $category->gallery_enabled : Zira\Config::get('gallery_enabled', 1); + + if (!$record->access_check || Zira\Permission::check(Zira\Permission::TO_VIEW_RECORD)) { +// static::setRecordId($record->id); +// static::setRecordUrl(static::generateRecordUrl(null, $record->name)); + + if ($slider_enabled) { + $slides = Zira\Models\Slide::getCollection() + ->where('record_id', '=', $record->id) + ->order_by('id', 'asc') + ->get(); + } else { + $slides = null; + } + + if ($gallery_enabled) { + $images = Zira\Models\Image::getCollection() + ->where('record_id', '=', $record->id) + ->order_by('id', 'asc') + ->get(); + } else { + $images = null; + } + + if (!empty($slides) && $slider_enabled) static::setSlider($slides); + if (!empty($images) && $gallery_enabled) static::setGallery($images); + + if (!empty($slides) && $slider_enabled) $record->image = null; + } else { + $record = null; + } + } + } + return $record; + } +} \ No newline at end of file diff --git a/zira/content/index.php b/zira/content/index.php new file mode 100644 index 0000000..ea47a70 --- /dev/null +++ b/zira/content/index.php @@ -0,0 +1,212 @@ + $layout != Zira\View::LAYOUT_ALL_SIDEBARS, + 'categories' => $categories + ), 'zira/home'); + } + + // adding meta tags + $title = Zira\Config::get('home_title'); + $meta_title = Zira\Config::get('home_window_title'); + $meta_keywords = Zira\Config::get('home_keywords'); + $meta_description = Zira\Config::get('home_description'); + $thumb = null; + if ($record) { + if (!$title) $title = $record->title; + if (!$meta_title) { + if ($record->meta_title) $meta_title = $record->meta_title; + else $meta_title = $record->title; + } + if (!$meta_description) { + if ($record->meta_description) $meta_description = $record->meta_description; + else $meta_description = $record->description; + } + if (!$meta_keywords) $meta_keywords = $record->meta_keywords; + if ($record->thumb) $thumb = $record->thumb; + } else { + if (!$title) $title = Zira\Config::get('site_name'); + if (!$meta_title) $meta_title = Zira\Config::get('site_title'); + if (!$meta_keywords) $meta_keywords = Zira\Config::get('site_keywords'); + if (!$meta_description) $meta_description = Zira\Config::get('site_description'); + } + + static::setTitle(Zira\Locale::t($meta_title)); + static::setKeywords(Zira\Locale::t($meta_keywords)); + static::setDescription(Zira\Locale::t($meta_description)); + static::addOpenGraphTags(Zira\Locale::t($meta_title), Zira\Locale::t($meta_description), '', $thumb); + + //Zira\View::setRenderBreadcrumbs(false); + + $data = array( + static::VIEW_PLACEHOLDER_TITLE => Zira\Locale::t($title) + ); + + if ($record) { + $data[static::VIEW_PLACEHOLDER_IMAGE] = $record->image; + $data[static::VIEW_PLACEHOLDER_CONTENT] = $record->content; + $data[static::VIEW_PLACEHOLDER_CLASS] = 'parse-content'; + Zira\View::addParser(); + } else { + $data[static::VIEW_PLACEHOLDER_DESCRIPTION] = Zira\Locale::t($meta_description); + } + + parent::render($data); + } + + public static function record() { + $record = null; + $record_name = Zira\Config::get('home_record_name'); + if (!empty($record_name)) { + $record = Zira\Models\Record::getCollection() + ->select(Zira\Models\Record::getFields()) + ->where('category_id', '=', Zira\Category::ROOT_CATEGORY_ID) + ->and_where('language', '=', Zira\Locale::getLanguage()) + ->and_where('name', '=', $record_name) + ->get(0) + ; + + if ($record) { + $slider_enabled = Zira\Config::get('slider_enabled', 1); + $gallery_enabled = Zira\Config::get('gallery_enabled', 1); + + if (!$record->access_check || Zira\Permission::check(Zira\Permission::TO_VIEW_RECORD)) { + static::setRecordId($record->id); + static::setRecordUrl(static::generateRecordUrl(null, $record->name)); + + if ($slider_enabled) { + $slides = Zira\Models\Slide::getCollection() + ->where('record_id', '=', $record->id) + ->order_by('id', 'asc') + ->get(); + } else { + $slides = null; + } + + if ($gallery_enabled) { + $images = Zira\Models\Image::getCollection() + ->where('record_id', '=', $record->id) + ->order_by('id', 'asc') + ->get(); + } else { + $images = null; + } + + if (!empty($slides) && $slider_enabled) static::setSlider($slides); + if (!empty($images) && $gallery_enabled) static::setGallery($images); + + if (!empty($slides) && $slider_enabled) $record->image = null; + } else { + $record = null; + } + } + } + return $record; + } + + public static function categories() { + $limit = Zira\Config::get('home_records_limit'); + if (!$limit) $limit = Zira\Config::get('records_limit', 10); + + $categories = array(); + if (Zira\Config::get('home_records_enabled', true)) { + $categories_cache_key = 'home.categories.'.Zira\Locale::getLanguage(); + $cached_categories = Zira\Cache::getArray($categories_cache_key); + if ($cached_categories!==false) { + $categories = $cached_categories; + } else { + // root category records + $records = Zira\Models\Record::getCollection() + ->select('id', 'name', 'author_id', 'title', 'description', 'thumb', 'creation_date', 'rating', 'comments') + ->join(Zira\Models\User::getClass(), array('author_username' => 'username', 'author_firstname' => 'firstname', 'author_secondname' => 'secondname')) + ->where('category_id', '=', Zira\Category::ROOT_CATEGORY_ID) + ->and_where('language', '=', Zira\Locale::getLanguage()) + ->and_where('published', '=', Zira\Models\Record::STATUS_PUBLISHED) + ->and_where('front_page', '=', Zira\Models\Record::STATUS_FRONT_PAGE) + ->order_by('id', 'desc') + ->limit($limit) + ->get(); + + if ($records) { + for ($i = 0; $i < count($records); $i++) { + $records[$i]->category_name = ''; + $records[$i]->category_title = ''; + } + $categories [] = array( + 'title' => '', + 'url' => '', + 'records' => $records, + 'settings' => array( + 'comments_enabled' => Zira\Config::get('comments_enabled', 1), + 'rating_enabled' => Zira\Config::get('rating_enabled', 0), + 'display_author' => Zira\Config::get('display_author', 0), + 'display_date' => Zira\Config::get('display_date', 0) + ) + ); + } + + // top level category records + $order_by = 'id'; + $sort = 'asc'; + $order = Zira\Config::get('home_categories_order', 'asc'); + if ($order == 'desc') $sort = 'desc'; + else if ($order == 'name') $order_by = 'name'; + $top_categories = Zira\Models\Category::getTopCategories($order_by, $sort); + $includeChilds = Zira\Config::get('category_childs_list', true); + if ($includeChilds && CACHE_CATEGORIES_LIST) { + $all_categories = Zira\Category::getAllCategories(); + } + foreach ($top_categories as $category) { + if ($category->access_check && !Zira\Permission::check(Zira\Permission::TO_VIEW_RECORDS)) continue; + + $comments_enabled = $category->comments_enabled !== null ? $category->comments_enabled : Zira\Config::get('comments_enabled', 1); + $rating_enabled = $category->rating_enabled !== null ? $category->rating_enabled : Zira\Config::get('rating_enabled', 0); + $display_author = $category->display_author !== null ? $category->display_author : Zira\Config::get('display_author', 0); + $display_date = $category->display_date !== null ? $category->display_date : Zira\Config::get('display_date', 0); + + $childs = null; + if ($includeChilds && CACHE_CATEGORIES_LIST && isset($all_categories)) { + $childs = array(); + foreach($all_categories as $_category) { + if (mb_strpos($_category->name, $category->name . '/', null, CHARSET) === 0) { + $childs []= $_category; + } + } + } + + $categories [] = array( + 'title' => Zira\Locale::t($category->title), + 'url' => static::generateCategoryUrl($category->name), + 'records' => static::getRecords($category, true, $limit, null, $includeChilds, $childs), + 'settings' => array( + 'comments_enabled' => $comments_enabled, + 'rating_enabled' => $rating_enabled, + 'display_author' => $display_author, + 'display_date' => $display_date + ) + ); + } + + Zira\Cache::setArray($categories_cache_key, $categories); + } + } + return $categories; + } +} \ No newline at end of file diff --git a/zira/content/page.php b/zira/content/page.php new file mode 100644 index 0000000..b5db4d5 --- /dev/null +++ b/zira/content/page.php @@ -0,0 +1,138 @@ +id; + else $category_id = Zira\Category::ROOT_CATEGORY_ID; + + // record options + if (!Zira\Category::current()) { + $slider_enabled = Zira\Config::get('slider_enabled', 1); + $gallery_enabled = Zira\Config::get('gallery_enabled', 1); + $comments_enabled = Zira\Config::get('comments_enabled', 1); + $rating_enabled = Zira\Config::get('rating_enabled', 0); + $display_author = Zira\Config::get('display_author', 0); + $display_date = Zira\Config::get('display_date', 0); + } else { + $slider_enabled = Zira\Category::current()->slider_enabled!==null ? Zira\Category::current()->slider_enabled : Zira\Config::get('slider_enabled', 1); + $gallery_enabled = Zira\Category::current()->gallery_enabled!==null ? Zira\Category::current()->gallery_enabled : Zira\Config::get('gallery_enabled', 1); + $comments_enabled = Zira\Category::current()->comments_enabled!==null ? Zira\Category::current()->comments_enabled : Zira\Config::get('comments_enabled', 1); + $rating_enabled = Zira\Category::current()->rating_enabled!==null ? Zira\Category::current()->rating_enabled : Zira\Config::get('rating_enabled', 0); + $display_author = Zira\Category::current()->display_author!==null ? Zira\Category::current()->display_author : Zira\Config::get('display_author', 0); + $display_date = Zira\Category::current()->display_date!==null ? Zira\Category::current()->display_date : Zira\Config::get('display_date', 0); + } + + $query = Zira\Models\Record::getCollection() + ->select(Zira\Models\Record::getFields()) + ->where('category_id', '=', $category_id) + ->and_where('language', '=', Zira\Locale::getLanguage()) + ->and_where('name', '=', $param) + ; + + if (!$preview) { + $query->and_where('published', '=', Zira\Models\Record::STATUS_PUBLISHED); + } + + if ($display_author) { + $query->join(Zira\Models\User::getClass(), array('author_username'=>'username', 'author_firstname'=>'firstname', 'author_secondname'=>'secondname')); + } + + $row = $query->get(0); + + if (!$row) { + Zira\Response::notFound(); + } + + $home_page_name = Zira\Config::get('home_record_name'); + if ($home_page_name && $row->name == $home_page_name && $row->category_id == Zira\Category::ROOT_CATEGORY_ID) { + Zira\Response::redirect('/'); + } + + static::$_record_id = $row->id; + + if (Zira\Category::current()) static::$_record_url = static::generateRecordUrl(Zira\Category::current()->name, $row->name); + else static::$_record_url = static::generateRecordUrl(null, $row->name); + + // checking permission + if (((Zira\Category::current() && Zira\Category::current()->access_check) || $row->access_check) && + !Zira\Permission::check(Zira\Permission::TO_VIEW_RECORD) + ) { + if (!Zira\User::isAuthorized()) { + Zira\Response::redirect('user/login?redirect='.static::$_record_url, true); + } else { + Zira\Response::forbidden(); + } + } + + // adding meta tags + if ($row->meta_title) $meta_title = $row->meta_title; + else $meta_title = $row->title; + if ($row->meta_description) $meta_description = $row->meta_description; + else $meta_description = $row->description; + if ($row->thumb) $thumb = $row->thumb; + else $thumb = null; + + static::addTitle($meta_title); + static::setKeywords($row->meta_keywords); + static::setDescription($meta_description); + static::addOpenGraphTags($meta_title, $meta_description, static::$_record_url, $thumb); + + if ($display_author) { + $author = Zira\User::generateUserProfileLink($row->author_id, $row->author_firstname, $row->author_secondname, $row->author_username, 'author'); + } else { + $author = null; + } + + if ($slider_enabled) { + $slides = Zira\Models\Slide::getCollection() + ->where('record_id','=',$row->id) + ->order_by('id', 'asc') + ->get(); + } else { + $slides = null; + } + + if ($gallery_enabled) { + $images = Zira\Models\Image::getCollection() + ->where('record_id','=',$row->id) + ->order_by('id', 'asc') + ->get(); + } else { + $images = null; + } + + if (!empty($slides) && $slider_enabled) { + static::setSlider($slides); + } + if (!empty($images) && $gallery_enabled) { + static::setGallery($images); + } + if ($comments_enabled) { + static::setComments($row, $preview); + } + + Zira\View::addParser(); + + static::render(array( + static::VIEW_PLACEHOLDER_TITLE => $row->title, + static::VIEW_PLACEHOLDER_IMAGE => empty($slides) || !$slider_enabled ? $row->image : null, + static::VIEW_PLACEHOLDER_CONTENT => $row->content, + static::VIEW_PLACEHOLDER_DATE => $display_date ? $row->modified_date : null, + static::VIEW_PLACEHOLDER_AUTHOR => $author, + static::VIEW_PLACEHOLDER_RATING => $rating_enabled ? $row->rating : null, + static::VIEW_PLACEHOLDER_URL => static::$_record_url, + static::VIEW_PLACEHOLDER_CLASS => 'parse-content' + )); + } +} \ No newline at end of file diff --git a/zira/content/parse.php b/zira/content/parse.php new file mode 100644 index 0000000..490516d --- /dev/null +++ b/zira/content/parse.php @@ -0,0 +1,30 @@ +$1
    ', $content); + } + if (stripos($content, '[quote')!==false) { + $content = preg_replace('/\[quote[^\]]*?\]([^\[\]]+?)[\s]*\[\/quote\]/i', '$1', $content); + } + if (stripos($content, '[code')!==false) { + $content = preg_replace('/\[code[^\]]*?\]([^\[\]]+?)[\s]*\[\/code\]/i', '$1', $content); + } + if (stripos($content, '[img')!==false) { + $content = preg_replace('/\[img[^\]]*?\][\s]*([^\[\]"]+?)[\s]*\[\/img\]/i', '', $content); + } + } + return $content; + } +} \ No newline at end of file diff --git a/zira/controller.php b/zira/controller.php new file mode 100644 index 0000000..c3fea96 --- /dev/null +++ b/zira/controller.php @@ -0,0 +1,19 @@ +$record_id, + 'comments'=>$comments, + 'limit'=>$limit, + 'page'=>$page, + 'total'=>Zira\Models\Comment::countComments($record_id, !$preview), + 'ajax'=>true + ), 'zira/comments'); + } + } + + /** + * Comment action + */ + public function comment() { + $form = new Zira\Forms\Comment(); + $commenting_allowed = Zira\Config::get('comments_allowed',true); + if (!Zira\Config::get('comment_anonymous',true) && + !Zira\User::isAuthorized() + ) { + $commenting_allowed = false; + } + if (Zira\Request::isPost() && $commenting_allowed) { + if ($form->isValid()) { + $record = new Zira\Models\Record($form->getValue('record_id')); + if (!$record->loaded()) { + $form->setError(Zira\Locale::t('An error occurred')); + } else { + $parent = null; + $parent_id = (int)$form->getValue('parent_id'); + if ($parent_id>0) { + $parent = new Zira\Models\Comment($parent_id); + if (!$parent->loaded()) { + $parent = null; + $parent_id = 0; + } + } + $comment = new Zira\Models\Comment(); + $comment->record_id = $record->id; + if (Zira\User::isAuthorized()) { + $comment->author_id = Zira\User::getCurrent()->id; + $comment->sender_name = Zira\User::getProfileName(); + } else { + $comment->author_id = 0; + $comment->sender_name = strip_tags($form->getValue('sender_name')); + } + $comment->parent_id = $parent_id; + if ($parent!==null) { + $comment->recipient_name = $parent->sender_name; + } + $path_offset = Zira\Models\Comment::getPathOffset($record->id, $parent); + $comment->path_offset = $path_offset+1; + $comment->sort_path = Zira\Models\Comment::getSortPath($path_offset, $parent); + $comment->content = strip_tags($form->getValue('comment')); + $comment->creation_date = date('Y-m-d H:i:s'); + if (Zira\Permission::check(Zira\Permission::TO_MODERATE_COMMENTS) || + !Zira\Config::get('comment_moderate', true) + ) { + $comment->published = Zira\Models\Comment::STATUS_PUBLISHED; + } else { + $comment->published = Zira\Models\Comment::STATUS_NOT_PUBLISHED; + } + $comment->save(); + if ($comment->published != Zira\Models\Comment::STATUS_PUBLISHED) { + $form->setMessage(Zira\Locale::t('Thank you. Your message is awaiting moderation')); + } else { + $form->setMessage(Zira\Locale::t('Thank you. Your message was published')); + $record->comments++; + $record->save(); + if (Zira\User::isAuthorized()) { + Zira\User::increaseCommentsCount(); + } + } + try { + Zira\Models\Comment::notify($record, $comment); + } catch(\Exception $e) { + Zira\Log::exception($e); + } + } + } + } + Zira\Page::render(array( + Zira\Page::VIEW_PLACEHOLDER_CONTENT => $form + )); + } +} \ No newline at end of file diff --git a/zira/controllers/contact.php b/zira/controllers/contact.php new file mode 100644 index 0000000..a7068a0 --- /dev/null +++ b/zira/controllers/contact.php @@ -0,0 +1,111 @@ +isValid()) { + if (Zira\User::isAuthorized()) { + $name = Zira\User::getProfileName(); + $email = Zira\User::getProfileEmail(); + $replyTo = $email; + } else { + $name = $form->getValue('name'); + if (empty($name)) $name= Zira\Locale::t('not specified'); + $email = $form->getValue('email'); + if (empty($email)) { + $email = Zira\Locale::t('not specified'); + $replyTo = null; + } else { + $replyTo = $email; + } + } + $message = $form->getValue('message'); + + $message_tpl = Zira\Config::get('feedback_message'); + if (!$message_tpl || strlen(trim($message_tpl)) == 0) { + $message_tpl = Zira\Locale::t('Message') . ':' . "\r\n"; + $message_tpl .= '$message' . "\r\n\r\n"; + $message_tpl .= Zira\Locale::t('Name: %s', '$name') . "\r\n"; + $message_tpl .= Zira\Locale::t('Email: %s', '$email') . "\r\n\r\n"; + $message_tpl .= Zira\Locale::t('You recieved this message, because your Email address is specified as a contact email on %s', '$site'); + } else { + $message_tpl = Zira\Locale::t($message_tpl); + } + $message_tpl = str_replace('$name', $name, $message_tpl); + $message_tpl = str_replace('$email', $email, $message_tpl); + $message_tpl = str_replace('$message', $message, $message_tpl); + $message_tpl = str_replace('$site', Zira\Helper::url('/', true, true), $message_tpl); + + try { + Zira\Mail::send(Zira\Config::get('feedback_email'), Zira\Locale::t('Feedback'), Zira\Helper::html($message_tpl), null, $replyTo); + $form->setMessage(Zira\Locale::t('Thank you. Your message was sent')); + $form->setFill(false); + } catch (\Exception $e) { + $form->setError(Zira\Locale::t('Sorry, could not send your message. Try later')); + } + } + if (Zira\Config::get('contact_email_public')) { + $contacts['email'] = Zira\Config::get('feedback_email'); + } + } else { + $form = ''; + } + + $contact_name = Zira\Config::get('contact_name'); + if ($contact_name) $contacts['name'] = $contact_name; + $contact_address = Zira\Config::get('contact_address'); + if ($contact_address) $contacts['address'] = $contact_address; + $contact_image = Zira\Config::get('contact_image'); + if ($contact_image) $contacts['image'] = $contact_image; + $contact_phone = Zira\Config::get('contact_phone'); + if ($contact_phone) $contacts['phone'] = $contact_phone; + $contact_info = Zira\Config::get('contact_info'); + if ($contact_info) $contacts['info'] = $contact_info; + $contact_fb = Zira\Config::get('contact_fb'); + if ($contact_fb) $contacts['facebook'] = $contact_fb; + $contact_gp= Zira\Config::get('contact_gp'); + if ($contact_gp) $contacts['google'] = $contact_gp; + $contact_tw= Zira\Config::get('contact_tw'); + if ($contact_tw) $contacts['twitter'] = $contact_tw; + $contact_vk= Zira\Config::get('contact_vk'); + if ($contact_vk) $contacts['vkontakte'] = $contact_vk; + $contact_yandex_map = Zira\Config::get('contact_yandex_map'); + if ($contact_yandex_map && $contact_address) $contacts['yandex_map'] = $contact_yandex_map; + $contact_google_map = Zira\Config::get('contact_google_map'); + if ($contact_google_map && $contact_address) $contacts['google_map'] = $contact_google_map; + + if (empty($form) && empty($contacts)) { + Zira\Page::render(array( + Zira\Page::VIEW_PLACEHOLDER_TITLE => Zira\Locale::t('Contacts'), + Zira\Page::VIEW_PLACEHOLDER_CONTENT => Zira\Locale::t('Sorry, contacts are not specified') + )); + } else if (!empty($form) && empty($contacts)) { + Zira\Page::render(array( + Zira\Page::VIEW_PLACEHOLDER_TITLE => Zira\Locale::t('Contacts'), + Zira\Page::VIEW_PLACEHOLDER_CONTENT => $form + )); + } else { + if (!empty($form)) $contacts['form'] = $form; + Zira\Page::setView('zira/contact'); + Zira\Page::render($contacts); + } + } +} \ No newline at end of file diff --git a/zira/controllers/cron.php b/zira/controllers/cron.php new file mode 100644 index 0000000..75aa492 --- /dev/null +++ b/zira/controllers/cron.php @@ -0,0 +1,51 @@ +run(); + } catch (\Exception $e) { + $response = Zira\Locale::t('An error occurred') . ': ' . $e->getMessage(); + Zira\Log::exception($e); + } + $output .= "\t" . $co . '. ' . $response . "\r\n"; + } + } + Zira\Models\Option::write('cron_run', time()); + } + if (Zira\View::isAjax()) { + echo json_encode(explode("\r\n",$output)); + } else { + header('Content-Type: text/plain; charset='.CHARSET); + echo $output; + } + } +} \ No newline at end of file diff --git a/zira/controllers/index.php b/zira/controllers/index.php new file mode 100644 index 0000000..ba67318 --- /dev/null +++ b/zira/controllers/index.php @@ -0,0 +1,86 @@ +layout) { + Zira\Page::setLayout(Zira\Category::current()->layout); + } + Zira\Content\Page::content($param, Zira\Page::allowPreview()); + } else if (Zira\Category::current()) { + if (Zira\Category::current()->layout) { + Zira\Page::setLayout(Zira\Category::current()->layout); + } + Zira\Content\Category::content(); + } else { + Zira\Response::notFound(); + } + } + + /** + * 403 page + */ + public function forbidden() { + Zira\Response::forbidden(); + } + + /** + * 404 page + */ + public function notfound() { + Zira\Response::notFound(); + } + + /** + * Displays CAPTCHA image + */ + public function captcha() { + header('Content-Type: image/jpeg'); + Zira\Form\Form::generateCaptcha(); + } + + /** + * Site map page + */ + public function map() { + $categories = Zira\Category::getCategoriesMap(); + + Zira\Page::addTitle(Zira\Locale::t('Site map')); + Zira\Page::addBreadcrumb('sitemap', Zira\Locale::t('Site map')); + + Zira\View::addPlaceholderView(Zira\View::VAR_CONTENT, array('categories'=>$categories), 'zira/map'); + Zira\Page::render(array( + Zira\Page::VIEW_PLACEHOLDER_TITLE => Zira\Locale::t('Site map'), + Zira\Page::VIEW_PLACEHOLDER_CONTENT => '' + )); + } +} diff --git a/zira/controllers/poll.php b/zira/controllers/poll.php new file mode 100644 index 0000000..15b32bf --- /dev/null +++ b/zira/controllers/poll.php @@ -0,0 +1,111 @@ +id : 0; + $anonymous_id = Zira\User::getAnonymousUserId(); + if (empty($user_id) && empty($anonymous_id)) return; + + if ($type == 'record' && $value==1) { + $record = new Zira\Models\Record($id); + if (!$record->loaded()) return; + + $query = Zira\Models\Like::getCollection() + ->count() + ->where('record_id','=',$record->id); + + if (!empty($user_id)) { + $query->and_where(); + $query->open_where(); + $query->where('user_id','=',$user_id); + $query->or_where('anonymous_id','=',$anonymous_id); + $query->close_where(); + } else if (!empty($anonymous_id)) { + $query->and_where('anonymous_id','=',$anonymous_id); + } + + $co = $query->get('co'); + + if ($co==0) { + $like = new Zira\Models\Like(); + $like->record_id = $record->id; + $like->user_id = $user_id; + $like->anonymous_id = $anonymous_id; + $like->creation_date = date('Y-m-d H:i:s'); + $like->save(); + + $record->rating++; + $record->save(); + } + + Zira\Page::render(array('rating'=>$record->rating)); + } else if ($type == 'comment' && ($value==1 || $value==-1)) { + $comment = new Zira\Models\Comment($id); + if (!$comment->loaded()) return; + + $query = Zira\Models\Commentlike::getCollection() + ->where('comment_id','=',$comment->id); + + if (!empty($user_id)) { + $query->and_where(); + $query->open_where(); + $query->where('user_id','=',$user_id); + $query->or_where('anonymous_id','=',$anonymous_id); + $query->close_where(); + } else if (!empty($anonymous_id)) { + $query->and_where('anonymous_id','=',$anonymous_id); + } + + $exists = $query->get(0, true); + + if (!$exists || $exists['rate'] != $value) { + $like = new Zira\Models\Commentlike(); + if (!$exists) { + $like->comment_id = $comment->id; + $like->user_id = $user_id; + $like->anonymous_id = $anonymous_id; + $like->creation_date = date('Y-m-d H:i:s'); + } else { + $like->loadFromArray($exists); + if ($exists['rate']>0) $comment->likes--; + else $comment->dislikes--; + } + $like->rate = $value; + $like->save(); + + if ($value>0) $comment->likes++; + else $comment->dislikes++; + $comment->save(); + } + + if ($value>0) + Zira\Page::render(array('rating'=>$comment->likes)); + else + Zira\Page::render(array('rating'=>$comment->dislikes)); + } + } +} \ No newline at end of file diff --git a/zira/controllers/records.php b/zira/controllers/records.php new file mode 100644 index 0000000..92b23c5 --- /dev/null +++ b/zira/controllers/records.php @@ -0,0 +1,32 @@ +loaded()) return; + + Zira\Category::setCurrent($category); + Zira\Category::setChilds(null); + Zira\Content\Category::content($last_id, true); + } + } +} \ No newline at end of file diff --git a/zira/controllers/search.php b/zira/controllers/search.php new file mode 100644 index 0000000..88d078f --- /dev/null +++ b/zira/controllers/search.php @@ -0,0 +1,68 @@ +setExtended(true); + $data = array(); + $found = false; + if ($form->getValue('text') && $offset>=0 && $form->isValid()) { + if (!$is_simple) { + $records = Zira\Models\Search::getRecords($form->getValue('text'), $limit + 1, $offset); + } else { + $records = Zira\Models\Search::getRecordsSorted($form->getValue('text'), $limit); + } + if (!empty($records)) { + $found = true; + $_data = array( + Zira\Page::VIEW_PLACEHOLDER_CLASS => 'search-list'.($is_ajax ? ' xhr-list' : ''), + Zira\Page::VIEW_PLACEHOLDER_RECORDS => $records, + Zira\Page::VIEW_PLACEHOLDER_SETTINGS => array( + 'limit' => $limit, + 'text' => $form->getValue('text'), + 'offset' => $offset, + 'simple' => $is_simple + ) + ); + + if (!$is_ajax) { + Zira\View::addPlaceholderView(Zira\View::VAR_CONTENT, $_data, 'zira/search-results'); + Zira\View::preloadThemeLoader(); + $data[Zira\Page::VIEW_PLACEHOLDER_TITLE] = Zira\Locale::t('Search results'); + $data[Zira\Page::VIEW_PLACEHOLDER_CONTENT] = ''; + } else { + Zira\View::renderView($_data, 'zira/search-results'); + } + } else { + $form->setValue('text',''); + $form->setError(Zira\Locale::t('Your search did not match any documents')); + } + } else { + $form->setValue('text',''); + } + + if (!$is_ajax) { + Zira\Page::addTitle(Zira\Locale::t('Search')); + Zira\Page::addBreadcrumb('search', Zira\Locale::t('Search')); + + Zira\View::addPlaceholderView(Zira\View::VAR_CONTENT_TOP, array('form' => $form, 'found' => $found), 'zira/search'); + Zira\Page::render($data); + } + } +} \ No newline at end of file diff --git a/zira/controllers/user.php b/zira/controllers/user.php new file mode 100644 index 0000000..285dbc8 --- /dev/null +++ b/zira/controllers/user.php @@ -0,0 +1,1024 @@ +0) { + Zira\Response::redirect('user/login'.'?redirect=user/'.$id); + } else { + Zira\Response::redirect('user/login'); + } + return; + } + if (!$id) { + $category = Zira\Category::current(); + if ($category && $category->name==Zira\Router::getController()) { + Zira\Page::category(); + } else if (Zira\User::isAuthorized()) { + Zira\Response::redirect('user/profile'); + } else { + Zira\Response::redirect('user/login'); + } + return; + } + $user = Zira\Models\User::findUser($id); + if (!$user || !$user->active) { + Zira\Response::notFound(); + return; + } + + Zira\Page::addTitle(Zira\Locale::t('User profile')); + Zira\Page::addTitle(Zira\User::getProfileName($user)); + Zira\Page::addBreadcrumb(Zira\User::getProfileUrlPath($user),Zira\Locale::t('User profile')); + + Zira\View::addLightbox(); + Zira\View::render(array( + 'id' => $user->id, + 'title' => Zira\User::getProfileName($user), + 'email' => Zira\User::getProfileEmail($user), + 'phone' => Zira\User::getProfilePhone($user), + 'photo' => Zira\User::getProfilePhoto($user), + 'thumb' => Zira\User::getProfilePhotoThumb($user), + 'location' => Zira\User::getProfileLocation($user), + 'dob' => Zira\User::getProfileDob($user), + 'group' => Zira\User::getProfileGroup($user), + 'date_created' => Zira\User::getProfileSignupDate($user), + 'date_logged' => Zira\User::getProfileLoginDate($user), + 'comments' => Zira\User::getProfileComments($user), + 'is_owner' => Zira\User::isSelf($user), + 'verified' => Zira\User::isProfileVerified($user) + ),'zira/user/profile'); + } + + public function signup() { + if (!Zira\Config::get(Zira\User::CONFIG_ALLOW_SIGNUP, true)) { + Zira\Response::forbidden(); + return; + } + if (Zira\User::isAuthorized()) { + Zira\Response::redirect('user/profile'); + } + $form = new Zira\Forms\User\Register(); + + if (Zira\Request::isPost() && $form->isValid()) { + $user = new Zira\Models\User(); + $user->firstname = $form->getValue('firstname'); + $user->secondname = $form->getValue('secondname'); + $user->email = $form->getValue('email'); + $user->username = $form->getValue('username'); + $user->password = Zira\User::generatePasswordHash($form->getValue('password')); + $user->group_id = Zira\User::GROUP_USER; + $user->date_created = date('Y-m-d H:i:s'); + $user->date_logged = date('Y-m-d H:i:s'); + $user->verified = Zira\Models\User::STATUS_NOT_VERIFIED; + $user->active = Zira\Models\User::STATUS_ACTIVE; + $vcode = Zira\User::generateEmailConfirmationCode(); + $user->vcode = Zira\User::getHashedConfirmationCode($vcode); + $user->code = Zira\User::generateRememberCode($user->username, $user->email); + + try { + $user->save(); + if (Zira\Config::get(Zira\User::CONFIG_VERIFY_EMAIL, true)) { + Zira\User::sendConfirmEmail($user->email, Zira\User::getProfileName($user), $vcode); + Zira\User::rememberConfirmEmail($user->email); + Zira\Response::redirect('user/confirm'); + } else { + Zira\Response::redirect('user/login'); + } + } catch(\Exception $e) { + Zira::getInstance()->exception($e); + $form->setError($e->getMessage()); + } + } + + Zira\Page::addTitle(Zira\Locale::t('User Signup')); + Zira\Page::addBreadcrumb('user/signup',Zira\Locale::t('Sign Up')); + + Zira\Page::render(array( + Zira\Page::VIEW_PLACEHOLDER_CONTENT=>$form + )); + } + + public function login() { + if (Zira\User::isAuthorized()) { + Zira\Response::redirect('user/profile'); + } + $form = new Zira\Forms\User\Login(); + + $email = Zira\User::getRememberedConfirmEmail(); + if (!empty($email)) { + $form->setValues(array('login'=>$email)); + } + + if (Zira\Request::isPost() && $form->isValid()) { + if (Zira\User::isAllowedToLogin()) { + Zira\User::onUserLogin($form->getValue('rememberme')); + $redirect = Zira\Request::get('redirect'); + if (!empty($redirect) && strpos($redirect,'//')===false && strpos($redirect, '.')===false) { + if ($redirect=='dash') Zira\Helper::setAddingLanguageToUrl(false); + Zira\Response::redirect($redirect); + } else { + Zira\Response::redirect('user/profile'); + } + } else { + Zira\Response::redirect('user/confirm'); + } + } + + Zira\Page::addTitle(Zira\Locale::t('Sign In')); + Zira\Page::addBreadcrumb('user/login',Zira\Locale::t('Sign In')); + + Zira\Page::render(array( + Zira\Page::VIEW_PLACEHOLDER_CONTENT=>$form + )); + } + + public function logout() { + if (Zira\User::isAuthorized()) { + Zira\User::forgetAuthorizedUserId(); + Zira\User::forgetUser(); + Zira\User::onUserLogout(); + } + Zira\Response::redirect('user/login'); + } + + public function confirm() { + if (Zira\User::isVerified()) { + Zira\Response::redirect('user/profile'); + return; + } + $form = new Zira\Forms\User\Confirm(); + + if (!Zira\User::isAuthorized()) { + $email = Zira\User::getRememberedConfirmEmail(); + if (!empty($email)) { + $form->setValues(array('login'=>$email)); + } + } + + if (Zira\Request::isPost() && $form->isValid()) { + if (!Zira\User::isAuthorized()) { + $current = Zira\User::getCurrent(); + $user = new Zira\Models\User($current->id); + } else { + $user = Zira\User::getCurrent(); + } + $user->verified = Zira\Models\User::STATUS_VERIFIED; + $user->vcode = ''; + + try { + $user->save(); + if (!Zira\User::isAuthorized()) { + Zira\Response::redirect('user/login'); + } else { + Zira\Response::redirect('user/profile'); + } + } catch(\Exception $e) { + Zira::getInstance()->exception($e); + $form->setError($e->getMessage()); + } + } + + Zira\Page::addTitle(Zira\Locale::t('Email confirmation')); + if (Zira\User::isAuthorized()) { + Zira\Page::addBreadcrumb('user/profile',Zira\Locale::t('Profile')); + } + Zira\Page::addBreadcrumb('user/confirm',Zira\Locale::t('Verification')); + + Zira\Page::render(array( + Zira\Page::VIEW_PLACEHOLDER_CONTENT=>$form + )); + } + + public function send() { + if (Zira\User::isVerified()) { + Zira\Response::redirect('user/profile'); + return; + } + $form = new Zira\Forms\User\Send(); + + if (!Zira\User::isAuthorized()) { + $email = Zira\User::getRememberedConfirmEmail(); + if (!empty($email)) { + $form->setValues(array('login'=>$email)); + } + } else { + $current = Zira\User::getCurrent(); + $form->setValues(array('login'=>$current->email)); + } + + if (Zira\Request::isPost() && $form->isValid()) { + if (!Zira\User::isAuthorized()) { + $current = Zira\User::getCurrent(); + $user = new Zira\Models\User($current->id); + } else { + $user = Zira\User::getCurrent(); + } + $vcode = Zira\User::generateEmailConfirmationCode(); + $user->vcode = Zira\User::getHashedConfirmationCode($vcode); + + try { + $user->save(); + Zira\User::sendConfirmEmail($user->email, Zira\User::getProfileName($user), $vcode); + Zira\Response::redirect('user/confirm'); + } catch(\Exception $e) { + Zira::getInstance()->exception($e); + $form->setError($e->getMessage()); + } + } + + Zira\Page::addTitle(Zira\Locale::t('Send confirmation code')); + if (Zira\User::isAuthorized()) { + Zira\Page::addBreadcrumb('user/profile',Zira\Locale::t('Profile')); + } + Zira\Page::addBreadcrumb('user/send',Zira\Locale::t('Verification')); + + Zira\Page::render(array( + Zira\Page::VIEW_PLACEHOLDER_CONTENT=>$form + )); + } + + public function recover() { + if (Zira\User::isAuthorized()) { + Zira\Response::redirect('user/profile'); + } + $form = new Zira\Forms\User\Recover(); + + $email = Zira\User::getRememberedConfirmEmail(); + if (!empty($email)) { + $form->setValues(array('login'=>$email)); + } + + if (Zira\Request::isPost() && $form->isValid()) { + $current = Zira\User::getCurrent(); + $user = new Zira\Models\User($current->id); + $vcode = Zira\User::generatePasswordRecoveryCode(); + $user->vcode = Zira\User::getHashedPasswordRecoveryCode($vcode); + + try { + $user->save(); + Zira\User::sendRecoverEmail($user->email, Zira\User::getProfileName($user), $vcode); + Zira\User::rememberConfirmEmail($user->email); + Zira\Response::redirect('user/password'); + } catch(\Exception $e) { + Zira::getInstance()->exception($e); + $form->setError($e->getMessage()); + } + } + + Zira\Page::addTitle(Zira\Locale::t('Password recovery')); + Zira\Page::addBreadcrumb('user/recover',Zira\Locale::t('Recovery')); + + Zira\Page::render(array( + Zira\Page::VIEW_PLACEHOLDER_CONTENT=>$form + )); + } + + public function password() { + if (Zira\User::isAuthorized()) { + Zira\Response::redirect('user/pwd'); + } + $form = new Zira\Forms\User\Password(); + + $email = Zira\User::getRememberedConfirmEmail(); + if (!empty($email)) { + $form->setValues(array('login'=>$email)); + } + + if (Zira\Request::isPost() && $form->isValid()) { + $current = Zira\User::getCurrent(); + $user = new Zira\Models\User($current->id); + $user->vcode = ''; + $password = Zira\User::generateUserToken(); + $user->password = Zira\User::getHashedUserToken($password); + + try { + $user->save(); + Zira\User::sendPasswordEmail($user->email, Zira\User::getProfileName($user), $password); + Zira\Response::redirect('user/login'); + } catch(\Exception $e) { + Zira::getInstance()->exception($e); + $form->setError($e->getMessage()); + } + } + + Zira\Page::addTitle(Zira\Locale::t('Password recovery')); + Zira\Page::addBreadcrumb('user/password',Zira\Locale::t('Recovery')); + + Zira\Page::render(array( + Zira\Page::VIEW_PLACEHOLDER_CONTENT=>$form + )); + } + + public function pwd() { + if (!Zira\User::isAuthorized()) { + Zira\Response::redirect('user/recover'); + } + $form = new Zira\Forms\User\Pwd(); + + if (Zira\Request::isPost() && $form->isValid()) { + $user = Zira\User::getCurrent(); + $password = $form->getValue('password'); + $user->password = Zira\User::getHashedUserToken($password); + + try { + $user->save(); + $form->setMessage(Zira\Locale::t('Successfully saved')); + } catch(\Exception $e) { + Zira::getInstance()->exception($e); + $form->setError($e->getMessage()); + } + } + + Zira\Page::addTitle(Zira\Locale::t('Change password')); + Zira\Page::addBreadcrumb('user/profile',Zira\Locale::t('Profile')); + Zira\Page::addBreadcrumb('user/pwd',Zira\Locale::t('Password')); + + Zira\Page::render(array( + Zira\Page::VIEW_PLACEHOLDER_CONTENT=>$form + )); + } + + public function email() { + if (!Zira\User::isAuthorized()) { + Zira\Response::redirect('user/login'); + } + $form = new Zira\Forms\User\Email(); + + $user = Zira\User::getCurrent(); + + if (Zira\Request::isPost() && $form->isValid()) { + $e_updated = false; + if ($user->email != $form->getValue('email')) { + $user->email = $form->getValue('email'); + $user->verified = Zira\Models\User::STATUS_NOT_VERIFIED; + $vcode = Zira\User::generateEmailConfirmationCode(); + $user->vcode = Zira\User::getHashedConfirmationCode($vcode); + $e_updated = true; + } + $s_updated = false; + $subscribed = $form->getValue('subscribed') ? Zira\Models\User::STATUS_SUBSCRIBED : Zira\Models\User::STATUS_NOT_SUBSCRIBED; + if ($user->subscribed != $subscribed) { + $user->subscribed = $subscribed; + $s_updated = true; + } + try { + if ($e_updated || $s_updated) { + $user->save(); + } + if ($e_updated) { + Zira\User::sendConfirmEmail($user->email, Zira\User::getProfileName($user), $vcode); + } + Zira\Response::redirect('user/confirm'); + } catch(\Exception $e) { + Zira::getInstance()->exception($e); + $form->setError($e->getMessage()); + } + } else { + $form->setValues(array( + 'email'=> $user->email, + 'subscribed'=>$user->subscribed + )); + } + + Zira\Page::addTitle(Zira\Locale::t('Change email')); + Zira\Page::addBreadcrumb('user/profile',Zira\Locale::t('Profile')); + Zira\Page::addBreadcrumb('user/email',Zira\Locale::t('Email')); + + Zira\Page::render(array( + Zira\Page::VIEW_PLACEHOLDER_CONTENT=>$form + )); + } + + public function name() { + if (!Zira\Config::get(Zira\User::CONFIG_ALLOW_LOGIN_CHANGE, true)) { + Zira\Response::forbidden(); + return; + } + if (!Zira\User::isAuthorized()) { + Zira\Response::redirect('user/login'); + } + $form = new Zira\Forms\User\Name(); + + $user = Zira\User::getCurrent(); + $form->setValue('login', $user->username); + + if (Zira\Request::isPost() && $form->isValid()) { + $user->username = $form->getValue('login'); + + try { + $user->save(); + $form->setMessage(Zira\Locale::t('Successfully saved')); + } catch(\Exception $e) { + Zira::getInstance()->exception($e); + $form->setError($e->getMessage()); + } + } + + Zira\Page::addTitle(Zira\Locale::t('Change username')); + Zira\Page::addBreadcrumb('user/profile',Zira\Locale::t('Profile')); + Zira\Page::addBreadcrumb('user/name',Zira\Locale::t('Username')); + + Zira\Page::render(array( + Zira\Page::VIEW_PLACEHOLDER_CONTENT=>$form + )); + } + + public function edit() { + if (!Zira\User::isAuthorized()) { + Zira\Response::redirect('user/login'); + } + $form = new Zira\Forms\User\Edit(); + + $user = Zira\User::getCurrent(); + + $form->setValues(array( + 'firstname' => $user->firstname, + 'secondname' => $user->secondname, + 'country' => $user->country, + 'city' => $user->city, + 'street' => $user->address, + 'phone' => $user->phone, + 'dob' => $user->dob ? $form->prepareDatepickerDate($user->dob) : '' + )); + + if (Zira\Request::isPost() && $form->isValid()) { + $user->firstname = $form->getValue('firstname'); + $user->secondname = $form->getValue('secondname'); + $user->country = $form->getValue('country'); + $user->city = $form->getValue('city'); + $user->address = $form->getValue('street'); + $user->phone = $form->getValue('phone'); + $dob = $form->getValue('dob'); + if (!empty($dob)) $user->dob = $form->parseDatepickerDate($dob); + else $user->dob = null; + try { + $user->save(); + $form->setMessage(Zira\Locale::t('Successfully saved')); + } catch(\Exception $e) { + Zira::getInstance()->exception($e); + $form->setError($e->getMessage()); + } + } + + Zira\Page::addTitle(Zira\Locale::t('Change profile')); + Zira\Page::addBreadcrumb('user/profile',Zira\Locale::t('Profile')); + Zira\Page::addBreadcrumb('user/edit',Zira\Locale::t('Information')); + + Zira\Page::render(array( + Zira\Page::VIEW_PLACEHOLDER_CONTENT=>$form + )); + } + + public function photo() { + if (!Zira\User::isAuthorized()) { + Zira\Response::redirect('user/login'); + } + $form = new Zira\Forms\User\Photo(); + + $user = Zira\User::getCurrent(); + + if (Zira\Request::isPost() && $form->isValid()) { + try { + $image = Zira\User::savePhoto($user, $form->getValue('photo')); + if (!$image) { + $form->setError(Zira\Locale::t('An error occurred')); + } else { + $user->image = $image; + $user->save(); + Zira\Response::redirect('user/avatar'); + } + } catch(\Exception $e) { + Zira::getInstance()->exception($e); + $form->setError($e->getMessage()); + } + } + + Zira\Page::addTitle(Zira\Locale::t('Change photo')); + Zira\Page::addBreadcrumb('user/profile',Zira\Locale::t('Profile')); + Zira\Page::addBreadcrumb('user/photo',Zira\Locale::t('Photo')); + + Zira\Page::render(array( + Zira\Page::VIEW_PLACEHOLDER_CONTENT=>$form + )); + } + + public function avatar() { + if (!Zira\User::isAuthorized()) { + Zira\Response::redirect('user/login'); + } + + $user = Zira\User::getCurrent(); + if (!$user->image) { + Zira\Response::redirect('user/photo'); + } + + $form = new Zira\Forms\User\Avatar(); + + $form->setValue('image', $user->image); + + if (Zira\Request::isPost() && $form->isValid()) { + $width = floatval($form->getValue('cropper_w')); + $height = floatval($form->getValue('cropper_h')); + $left = floatval($form->getValue('cropper_x')); + $top = floatval($form->getValue('cropper_y')); + + try { + $image = Zira\User::saveAvatar($user, $width, $height, $left, $top); + if (!$image) { + $form->setError(Zira\Locale::t('An error occurred')); + } else { + $user->image = $image; + $user->save(); + Zira\Response::redirect('user/profile'); + } + } catch(\Exception $e) { + Zira::getInstance()->exception($e); + $form->setError($e->getMessage()); + } + } + + Zira\Page::addTitle(Zira\Locale::t('Change avatar')); + Zira\Page::addBreadcrumb('user/profile',Zira\Locale::t('Profile')); + Zira\Page::addBreadcrumb('user/avatar',Zira\Locale::t('Avatar')); + + Zira\Page::render(array( + Zira\Page::VIEW_PLACEHOLDER_CONTENT=>$form + )); + } + + public function nophoto() { + if (!Zira\User::isAuthorized()) { + Zira\Response::redirect('user/login'); + } + + $user = Zira\User::getCurrent(); + if (!$user->image) { + Zira\Response::redirect('user/profile'); + } + + $form = new Zira\Forms\User\Nophoto(); + + if (Zira\Request::isPost() && $form->isValid()) { + try { + Zira\User::deletePhoto($user); + $user->image = ''; + $user->save(); + Zira\Response::redirect('user/profile'); + } catch(\Exception $e) { + Zira::getInstance()->exception($e); + $form->setError($e->getMessage()); + } + } + + Zira\Page::addTitle(Zira\Locale::t('Remove photo')); + Zira\Page::addBreadcrumb('user/profile',Zira\Locale::t('Profile')); + Zira\Page::addBreadcrumb('user/nophoto',Zira\Locale::t('Photo')); + + Zira\Page::render(array( + Zira\Page::VIEW_PLACEHOLDER_CONTENT=>$form + )); + } + + public function profile() { + if (!Zira\User::isAuthorized()) { + Zira\Response::redirect('user/login'); + } + + Zira\Page::addTitle(Zira\Locale::t('User profile')); + Zira\Page::addTitle(Zira\User::getProfileName()); + Zira\Page::addBreadcrumb('user/profile',Zira\Locale::t('Profile')); + + Zira\View::addLightbox(); + Zira\View::render(array( + 'title' => Zira\User::getProfileName(), + 'email' => Zira\User::getProfileEmail(), + 'phone' => Zira\User::getProfilePhone(), + 'photo' => Zira\User::getProfilePhoto(), + 'thumb' => Zira\User::getProfilePhotoThumb(), + 'location' => Zira\User::getProfileLocation(), + 'dob' => Zira\User::getProfileDob(), + 'group' => Zira\User::getProfileGroup(), + 'date_created' => Zira\User::getProfileSignupDate(), + 'date_logged' => Zira\User::getProfileLoginDate(), + 'comments' => Zira\User::getProfileComments(), + 'is_owner' => true, + 'verified' => Zira\User::isVerified() + )); + } + + public function message($recipient_id) { + if (!Zira\User::isAuthorized()) { + Zira\Response::redirect('user/login'); + } + + if (empty($recipient_id)) { + Zira\Response::notFound(); + } + if ($recipient_id == Zira\User::getCurrent()->id) { + Zira\Response::forbidden(); + } + $recipient = new Zira\Models\User($recipient_id); + if (!$recipient->loaded() || !$recipient->active) { + Zira\Response::notFound(); + } + + $form = new Zira\Forms\User\Conversation($recipient); + + if (Zira\Request::isPost() && $form->isValid()) { + try { + if (!Zira\Permission::check(Zira\Permission::TO_ACCESS_DASHBOARD) && + ($blocked = Zira\User::isCurrentBlocked($recipient->id, true)) + ) { + $form->setError(Zira\Locale::t('Sorry, you were added to black list. Reason: %s', Zira\Helper::html($blocked->message))); + } else { + $conversation_id = Zira\Models\Conversation::createConversation(Zira\User::getCurrent()->id, $recipient->id, $form->getValue('subject')); + if ($conversation_id) { + $message = new Zira\Models\Message(); + $message->conversation_id = $conversation_id; + $message->user_id = Zira\User::getCurrent()->id; + $message->content = $form->getValue('content'); + $message->creation_date = date('Y-m-d H:i:s'); + $message->save(); + } + Zira\User::increaseMessagesCount($recipient); + try { + Zira\Models\Message::notify($recipient, Zira\User::getCurrent()); + } catch (\Exception $e) { + Zira\Log::exception($e); + } + $form->setMessage(Zira\Locale::t('Message sent')); + $form->setFill(false); + } + } catch(\Exception $e) { + Zira::getInstance()->exception($e); + $form->setError($e->getMessage()); + } + } + + Zira\Page::addTitle(Zira\Locale::t('New message')); + Zira\Page::addBreadcrumb('user/profile',Zira\Locale::t('Profile')); + Zira\Page::addBreadcrumb('user/messages',Zira\Locale::t('Messages')); + + Zira\Page::render(array( + Zira\Page::VIEW_PLACEHOLDER_CONTENT=>$form + )); + } + + public function compose() { + if (!Zira\User::isAuthorized()) { + Zira\Response::redirect('user/login'); + } + + $form = new Zira\Forms\User\Compose(); + + if (Zira\Request::isPost() && $form->isValid()) { + try { + $users = $form->getUsers(); + $recipients = array(); + foreach($users as $recipient) { + if (!Zira\Permission::check(Zira\Permission::TO_ACCESS_DASHBOARD) && + ($blocked = Zira\User::isCurrentBlocked($recipient->id, true)) + ) { + $form->setError(Zira\Locale::t('Sorry, you are in %s\'s black list', Zira\User::getProfileName($recipient))); + $recipients = array(); + break; + } else { + $recipients []= $recipient->id; + } + } + if (!empty($recipients)) { + $conversation_id = Zira\Models\Conversation::createGroupConversation(Zira\User::getCurrent()->id, $recipients, $form->getValue('subject')); + if ($conversation_id) { + $message = new Zira\Models\Message(); + $message->conversation_id = $conversation_id; + $message->user_id = Zira\User::getCurrent()->id; + $message->content = $form->getValue('content'); + $message->creation_date = date('Y-m-d H:i:s'); + $message->save(); + + foreach($users as $recipient) { + Zira\User::increaseMessagesCount($recipient); + try { + Zira\Models\Message::notify($recipient, Zira\User::getCurrent()); + } catch (\Exception $e) { + Zira\Log::exception($e); + } + } + $form->setMessage(Zira\Locale::t('Message sent')); + $form->setFill(false); + } + } + } catch(\Exception $e) { + Zira::getInstance()->exception($e); + $form->setError($e->getMessage()); + } + } + + Zira\Page::addTitle(Zira\Locale::t('New message')); + Zira\Page::addBreadcrumb('user/profile',Zira\Locale::t('Profile')); + Zira\Page::addBreadcrumb('user/messages',Zira\Locale::t('Messages')); + + Zira\Page::render(array( + Zira\Page::VIEW_PLACEHOLDER_CONTENT=>$form + )); + } + + public function messages($conversation_id) { + if (!Zira\User::isAuthorized()) { + Zira\Response::redirect('user/login'); + } + + Zira\Page::addTitle(Zira\Locale::t('Messages')); + Zira\Page::addBreadcrumb('user/profile',Zira\Locale::t('Profile')); + Zira\Page::addBreadcrumb('user/messages',Zira\Locale::t('Messages')); + + $limit = 10; + if (empty($conversation_id)) { + $total = Zira\Models\Conversation::getCollection() + ->count() + ->where('user_id','=',Zira\User::getCurrent()->id) + ->get('co'); + + $page = (int)Zira\Request::get('page'); + $pages = ceil($total/$limit); + if ($page>$pages) $page = $pages; + if ($page<1) $page = 1; + + $rows = Zira\Models\Conversation::getCollection() + ->where('user_id','=',Zira\User::getCurrent()->id) + ->order_by('modified_date','desc') + ->limit($limit, $limit * ($page-1)) + ->get(); + + $pagination = new Zira\Pagination(); + $pagination->setLimit($limit); + $pagination->setTotal($total); + $pagination->setPages($pages); + $pagination->setPage($page); + + Zira\Page::setView('zira/user/conversations'); + Zira\Page::render(array( + 'items'=>$rows, + 'pagination'=>$pagination + )); + } else { + $_conversation = Zira\Models\Conversation::getCollection() + ->where('conversation_id','=',$conversation_id) + ->and_where('user_id','=',Zira\User::getCurrent()->id) + ->get(0, true); + if (!$_conversation) { + Zira\Response::forbidden(); + } + + $conversation = new Zira\Models\Conversation(); + $conversation->loadFromArray($_conversation); + if ($conversation->highlight) { + $conversation->highlight = 0; + $conversation->save(); + Zira\User::decreaseMessagesCount(); + } + + $form = new Zira\Forms\User\Message(); + + if (Zira\Request::isPost() && $form->isValid()) { + try { + $message = new Zira\Models\Message(); + $message->conversation_id = $conversation_id; + $message->user_id = Zira\User::getCurrent()->id; + $message->content = $form->getValue('content'); + $message->creation_date = date('Y-m-d H:i:s'); + $message->save(); + + $user_conversations = Zira\Models\Conversation::getCollection() + ->where('conversation_id','=',$conversation_id) + ->get(null, true); + + foreach($user_conversations as $user_conversation) { + if ($user_conversation['highlight']) continue; + $_user_conversation = new Zira\Models\Conversation(); + $_user_conversation->loadFromArray($user_conversation); + if ($_user_conversation->user_id!=Zira\User::getCurrent()->id) { + $_user_conversation->highlight = 1; + $recipient = new Zira\Models\User($_user_conversation->user_id); + if (!$recipient->loaded()) continue; + Zira\User::increaseMessagesCount($recipient); + try { + Zira\Models\Message::notify($recipient, Zira\User::getCurrent()); + } catch(\Exception $e) { + Zira\Log::exception($e); + } + } + $_user_conversation->modified_date = date('Y-m-d H:i:s'); + $_user_conversation->save(); + } + + $form->setFill(false); + + if (Zira\View::isAjax()) { + $form->setMessage(Zira\Locale::t('Message sent')); + } + } catch(\Exception $e) { + Zira::getInstance()->exception($e); + $form->setError($e->getMessage()); + } + } + + if (Zira\Request::isPost() && Zira\View::isAjax()) { + Zira\Page::render(array( + Zira\Page::VIEW_PLACEHOLDER_CONTENT => $form + )); + return; + } + + $total = Zira\Models\Message::getCollection() + ->count() + ->where('conversation_id','=',$conversation_id) + ->get('co'); + + $page = (int)Zira\Request::get('page'); + $pages = ceil($total/$limit); + if ($page>$pages) $page = $pages; + if ($page<1) $page = 1; + + $rows = Zira\Models\Message::getCollection() + ->select('id', 'user_id', 'content', 'creation_date') + ->where('conversation_id','=',$conversation_id) + ->left_join(Zira\Models\User::getClass(), array('username', 'firstname', 'secondname', 'image')) + ->order_by('id','desc') + ->limit($limit, $limit * ($page-1)) + ->get(); + + $users = Zira\Models\Conversation::getCollection() + ->where('conversation_id','=',$conversation_id) + ->and_where('user_id','<>',Zira\User::getCurrent()->id) + ->join(Zira\Models\User::getClass(),array('id','username','firstname','secondname','image')) + ->get(); + + $pagination = new Zira\Pagination(); + $pagination->setLimit($limit); + $pagination->setTotal($total); + $pagination->setPages($pages); + $pagination->setPage($page); + + Zira\View::addParser(); + Zira\Page::setView('zira/user/messages'); + Zira\Page::render(array( + 'conversation' => $conversation, + 'users' => $users, + 'items'=>$rows, + 'pagination'=>$pagination, + 'form'=>$form + )); + } + } + + public function ajax() { + Zira\View::setAjax(true); + if (!Zira\User::isAuthorized()) return; + $response = array(); + if (Zira\Request::isPost() && Zira\User::checkToken(Zira\Request::post('token'))) { + $action = Zira\Request::post('action'); + if ($action == 'conversation-mark-read') { + $items = Zira\Request::post('items'); + if (!empty($items) && is_array($items)) { + $updated = array(); + foreach($items as $item) { + $conversation = new Zira\Models\Conversation($item); + if (!$conversation->loaded()) continue; + if ($conversation->user_id != Zira\User::getCurrent()->id) continue; + if (!$conversation->highlight) continue; + $conversation->highlight = 0; + $conversation->save(); + Zira\User::getCurrent()->messages--; + $updated []= $conversation->id; + } + if (Zira\User::getCurrent()->messages<0) Zira\User::getCurrent()->messages = 0; + Zira\User::getCurrent()->save(); + $response['items'] = $updated; + } + } else if ($action == 'conversation-mark-all-read') { + Zira\Models\Conversation::getCollection() + ->update(array('highlight'=>0)) + ->where('user_id','=',Zira\User::getCurrent()->id) + ->execute(); + Zira\User::getCurrent()->messages = 0; + Zira\User::getCurrent()->save(); + } else if ($action == 'conversation-delete') { + $items = Zira\Request::post('items'); + if (!empty($items) && is_array($items)) { + $updated = array(); + foreach($items as $item) { + $conversation = new Zira\Models\Conversation($item); + if (!$conversation->loaded()) continue; + if ($conversation->user_id != Zira\User::getCurrent()->id) continue; + $conversation->delete(); + if ($conversation->highlight) { + Zira\User::getCurrent()->messages--; + } + $updated []= $conversation->id; + } + if (Zira\User::getCurrent()->messages<0) Zira\User::getCurrent()->messages = 0; + Zira\User::getCurrent()->save(); + $response['items'] = $updated; + } + } else if ($action == 'black-list') { + $user_id = Zira\Request::post('user_id'); + $user = new Zira\Models\User($user_id); + if ($user->loaded() && $user->active && !Zira\User::isSelf($user)) { + $row = Zira\User::isUserBlocked($user_id, true); + if (!$row) { + $blocked = new Zira\Models\Blacklist(); + $blocked->user_id = Zira\User::getCurrent()->id; + $blocked->blocked_user_id = $user_id; + $blocked->message = Zira\Request::post('message'); + $blocked->creation_date = date('Y-m-d H:i:s'); + $blocked->save(); + } else { + Zira\Models\Blacklist::getCollection() + ->delete() + ->where('id', '=', $row->id) + ->execute(); + } + $response['success'] = 1; + } else { + $response['success'] = 0; + } + } + } else { + $response['error'] = Zira\Locale::t('Invalid token'); + } + Zira\Page::render($response); + } + + public function autocomplete() { + Zira\View::setAjax(true); + if (!Zira\User::isAuthorized()) return; + $response = array(); + if (Zira\Request::isPost() && Zira\User::checkToken(Zira\Request::post('token'))) { + $items = array(); + $text = Zira\Request::post('text'); + $text = trim(preg_replace('/[\x20]+/',' ', $text)); + if (strlen($text)>0) { + $rows = false; + if (is_numeric($text)) { + $user = new Zira\Models\User($text); + if ($user->loaded() && $user->active) { + $rows = array($user->toArray()); + } + } else if (strpos($text, ' ')>0) { + $parts = explode(' ', $text); + if (count($parts)==2) { + $rows = Zira\Models\User::getCollection() + ->where('firstname', 'like', $parts[0].'%') + ->and_where('secondname', 'like', $parts[1].'%') + ->and_where('active', '=', Zira\Models\User::STATUS_ACTIVE) + ->order_by('id','asc') + ->limit(10) + ->get(null, true); + } + } else { + $rows = Zira\Models\User::getCollection() + ->open_where() + ->where('username','like',$text.'%') + ->or_where('firstname','like',$text.'%') + ->or_where('secondname','like',$text.'%') + ->close_where() + ->and_where('active','=',Zira\Models\User::STATUS_ACTIVE) + ->order_by('id','asc') + ->limit(10) + ->get(null, true); + } + + if ($rows) { + foreach($rows as $row) { + $user = new Zira\Models\User(); + $user->loadFromArray($row); + if (Zira\User::isSelf($user)) continue; + $items[$user->id] = Zira\User::getProfileName($user); + } + } + } + $response['items'] = $items; + } else { + $response['error'] = Zira\Locale::t('Invalid token'); + } + Zira\Page::render($response); + } +} \ No newline at end of file diff --git a/zira/controllers/xml.php b/zira/controllers/xml.php new file mode 100644 index 0000000..27e470a --- /dev/null +++ b/zira/controllers/xml.php @@ -0,0 +1,119 @@ +1) { + Zira\Helper::setAddingLanguageToUrl(false); + $sitemaps = array(); + foreach(Zira\Config::get('languages') as $language) { + $sitemaps []= Zira\Helper::url($language . '/sitemap.xml', true, true); + } + Zira\View::renderView(array('sitemaps'=>$sitemaps), 'zira/xml/sitemap-index'); + } else { + $rows = Zira\Models\Record::getCollection() + ->select(Zira\Models\Record::getFields()) + ->left_join(Zira\Models\Category::getClass(), array('category_name'=>'name', 'category_access_check'=>'access_check')) + ->where('language','=',Zira\Locale::getLanguage()) + ->and_where('published','=',Zira\Models\Record::STATUS_PUBLISHED) + ->order_by('id','desc') + ->limit(50000) + ->get(); + + $urls = array(); + $home_page_name = Zira\Config::get('home_record_name'); + foreach($rows as $row) { + if ($row->access_check || $row->category_access_check) continue; + if ($home_page_name && $row->name == $home_page_name && $row->category_id == Zira\Category::ROOT_CATEGORY_ID) { + continue; + } + $urls []= Zira\Helper::url(Zira\Page::generateRecordUrl($row->category_name, $row->name), true, true); + } + + Zira\View::renderView(array('urls'=>$urls), 'zira/xml/sitemap'); + } + } + + /** + * RSS feed + */ + public function rss() { + header('Content-type: application/rss+xml; charset=utf-8'); + + if (Zira\Config::get('site_title')) { + $title = Zira\Locale::t(Zira\Config::get('site_title')); + } else if (Zira\Config::get('site_name')) { + $title = Zira\Locale::t(Zira\Config::get('site_name')); + } else { + $title = Zira\Locale::t(DEFAULT_TITLE); + } + if (Zira\Config::get('site_description')) { + $description = Zira\Locale::t(Zira\Config::get('site_description')); + } else if (Zira\Config::get('site_slogan')) { + $description = Zira\Locale::t(Zira\Config::get('site_slogan')); + } else if (Zira\Config::get('site_name')) { + $description = Zira\Locale::t(Zira\Config::get('site_name')); + } else { + $description = Zira\Locale::t(DEFAULT_TITLE); + } + + $rows = Zira\Models\Record::getCollection() + ->select(Zira\Models\Record::getFields()) + ->left_join(Zira\Models\Category::getClass(), array('category_name'=>'name', 'category_title'=>'title', 'category_access_check'=>'access_check')) + ->where('language','=',Zira\Locale::getLanguage()) + ->and_where('published','=',Zira\Models\Record::STATUS_PUBLISHED) + ->order_by('id','desc') + ->limit(20) + ->get(); + + $items = array(); + $home_page_name = Zira\Config::get('home_record_name'); + foreach($rows as $row) { + if ($row->access_check || $row->category_access_check) continue; + if ($home_page_name && $row->name == $home_page_name && $row->category_id == Zira\Category::ROOT_CATEGORY_ID) { + continue; + } + $image = array(); + if ($row->thumb && file_exists(ROOT_DIR . DIRECTORY_SEPARATOR . $row->thumb)) { + $size = @getimagesize(ROOT_DIR . DIRECTORY_SEPARATOR . $row->thumb); + if ($size) { + $image = array( + 'url' => Zira\Helper::baseUrl($row->thumb, true, true), + 'length' => filesize(ROOT_DIR . DIRECTORY_SEPARATOR . $row->thumb), + 'type' => $size['mime'] + ); + } + } + $items []= array( + 'title' => $row->title, + 'url' => Zira\Helper::url(Zira\Page::generateRecordUrl($row->category_name, $row->name), true, true), + 'description' => $row->description, + 'image' => $image, + 'category' => $row->category_title, + 'date' => strtotime($row->creation_date) + ); + } + + Zira\View::renderView(array( + 'title' => $title, + 'url' => Zira\Helper::url('', true, true), + 'description' => $description, + 'logo' => Zira\Config::get('site_logo') ? Zira\Helper::baseUrl(Zira\Config::get('site_logo'),true,true) : '', + 'channel_url' => Zira\Helper::url('rss', true, true), + 'items' => $items + ), 'zira/xml/rss'); + } +} \ No newline at end of file diff --git a/zira/cookie.php b/zira/cookie.php new file mode 100644 index 0000000..9bdb506 --- /dev/null +++ b/zira/cookie.php @@ -0,0 +1,39 @@ +getOffset(); + } + + public static function getOffsetTime() { + return time() + self::getOffset(); + } +} \ No newline at end of file diff --git a/zira/db/implement/collection.php b/zira/db/implement/collection.php new file mode 100644 index 0000000..878317d --- /dev/null +++ b/zira/db/implement/collection.php @@ -0,0 +1,210 @@ + 'table_foreign_key') + * @return array + */ + public static function getReferences(); + + /** + * Loads model from array + * @param $arr + */ + public function loadFromArray($arr); + + /** + * Returns true if model is loaded + * @return mixed + */ + public function loaded(); + + /** + * Loads model from db + * @param $id + */ + public function load($id); + + /** + * Updates row in db + */ + public function save(); + + /** + * Deletes row from db + */ + public function delete(); + + /** + * Getter method + * @param $var + * @return mixed + */ + public function __get($var); + + /** + * Setter method + * @param $var + * @param $val + */ + public function __set($var, $val); + + /** + * Returns Collection object + * @return Collection + */ + public static function getCollection(); + + /** + * Finds first rows in collection + * @param $limit + * @param null $offset + * @param array|null $where + * @return mixed + */ + public static function getFirst($limit, $offset = null, array $where = null); + + /** + * Finds last rows in collection + * @param $limit + * @param null $offset + * @param array|null $where + * @return mixed + */ + public static function getLast($limit, $offset = null, array $where = null); + + /** + * Search rows in collection + * @param $field + * @param $word + * @param $limit + * @param null $offset + * @param array|null $where + * @return mixed + */ + public static function find($field, $word, $limit, $offset = null, array $where = null); + + /** + * Returns model data + * @return array + */ + public function toArray(); +} \ No newline at end of file diff --git a/zira/db/implement/table.php b/zira/db/implement/table.php new file mode 100644 index 0000000..f3682e3 --- /dev/null +++ b/zira/db/implement/table.php @@ -0,0 +1,63 @@ +','<=','>=','<>','LIKE','NOT LIKE','IS','IS NOT','IN'); + + public function __construct($class) { + $this->validClass($class); + $this->_class = $class; + $this->_table = DB_PREFIX . $class::getTable(); + $this->_pk = $class::getPk(); + $this->_alias = $class::getAlias(); + $this->_references = $class::getReferences(); + } + + protected function validClass($class) { + if ( + !method_exists($class,'getTable') || + !method_exists($class,'getPk') || + !method_exists($class,'getAlias') || + !method_exists($class,'getReferences') + ) { + throw new \Exception('Orm class should be passed'); + } + } + + public function select($args) { + if (!is_array($args)) { + $args = func_get_args(); + } + if (!empty($args)) { + foreach($args as $alias=>$arg) { + if (is_int($alias)) $alias = $arg; + $this->_fields []= Db::escapeIdentifier($this->_alias).'.'.Db::escapeIdentifier($arg).' as '.Db::escapeIdentifier($alias); + } + } + return $this; + } + + public function update(array $fields) { + foreach($fields as $field=>$value) { + $alias = $this->_alias; +// if (is_int($field) && is_array($value) && (count($value)==2 || count($value)==3)) { +// if (count($value)==3) $alias = $value[2]; +// $field = $value[0]; +// $value = $value[1]; +// } + + $this->_update []= Db::escapeIdentifier($alias).'.'.Db::escapeIdentifier($field). ' = ?'; + $this->_update_data []= $value; + } + return $this; + } + + public function delete() { + $this->_delete = true; + return $this; + } + + public function count($alias = 'co') { + $this->_fields []= 'COUNT(*) as '.Db::escapeIdentifier($alias); + return $this; + } + + public function max($field, $alias = 'mx') { + $_alias = $this->_alias; + if (is_array($field) && count($field)==2) { + $_alias = $field[0]; + $field = $field[1]; + } + $this->_fields []= 'MAX('.Db::escapeIdentifier($_alias).'.'.Db::escapeIdentifier($field).') as '.Db::escapeIdentifier($alias); + return $this; + } + + public function min($field, $alias = 'mn') { + $_alias = $this->_alias; + if (is_array($field) && count($field)==2) { + $_alias = $field[0]; + $field = $field[1]; + } + $this->_fields []= 'MIN('.Db::escapeIdentifier($_alias).'.'.Db::escapeIdentifier($field).') as '.Db::escapeIdentifier($alias); + return $this; + } + + public function join($class, array $select = null) { + $this->validClass($class); + $this->_joins[$class]=array( + 'table' => DB_PREFIX . $class::getTable(), + 'pk' => $class::getPk(), + 'alias' => $class::getAlias(), + 'references' => $class::getReferences() + ); + if (!empty($select)) { + foreach($select as $alias=>$arg) { + if (is_int($alias)) $alias = $arg; + $this->_fields []= Db::escapeIdentifier($class::getAlias()).'.'.Db::escapeIdentifier($arg).' as '.Db::escapeIdentifier($alias); + } + } + return $this; + } + + public function left_join($class, array $select = null) { + $this->validClass($class); + $this->_left_joins[$class]=array( + 'table' => DB_PREFIX . $class::getTable(), + 'pk' => $class::getPk(), + 'alias' => $class::getAlias(), + 'references' => $class::getReferences() + ); + if (!empty($select)) { + foreach($select as $alias=>$arg) { + if (is_int($alias)) $alias = $arg; + $this->_fields []= Db::escapeIdentifier($class::getAlias()).'.'.Db::escapeIdentifier($arg).' as '.Db::escapeIdentifier($alias); + } + } + return $this; + } + + public function right_join($class, array $select = null) { + $this->validClass($class); + $this->_right_joins[$class]=array( + 'table' => DB_PREFIX . $class::getTable(), + 'pk' => $class::getPk(), + 'alias' => $class::getAlias(), + 'references' => $class::getReferences() + ); + if (!empty($select)) { + foreach($select as $alias=>$arg) { + if (is_int($alias)) $alias = $arg; + $this->_fields []= Db::escapeIdentifier($class::getAlias()).'.'.Db::escapeIdentifier($arg).' as '.Db::escapeIdentifier($alias); + } + } + return $this; + } + + public function limit($limit, $offset = null) { + $this->_limit = intval($limit); + if ($offset !== null) $this->_offset = intval($offset); + return $this; + } + + public function where($field, $sign, $value, $alias = null) { + if ($alias === null) $alias = $this->_alias; + if ($field === null) $field = $this->_pk; + $sign = strtoupper($sign); + if (!in_array($sign, $this->_allowed_signs)) { + throw new \Exception('Invalid sign passed'); + } + if ($value !== null) { + if (!is_array($value)) { + $this->_where .= Db::escapeIdentifier($alias) . '.' . Db::escapeIdentifier($field) . ' ' . $sign . ' ?'; + $this->_data[] = $value; + } else { + $this->_where .= Db::escapeIdentifier($alias) . '.' . Db::escapeIdentifier($field) . ' ' . $sign . ' '; + $_sign = ''; + $co = 0; + foreach($value as $_value) { + if ($co>0) $_sign .= ','; + $_sign .= '? '; + $this->_data[] = $_value; + $co++; + } + $this->_where .= '('.$_sign.')'; + } + } else { + $this->_where.=Db::escapeIdentifier($alias).'.'.Db::escapeIdentifier($field).' '.$sign.' NULL'; + } + return $this; + } + + public function and_where($field=null, $sign=null, $value=null, $alias = null) { + $this->_where.=' AND '; + if ($field!==null && $sign!==null) { + return $this->where($field, $sign, $value, $alias); + } + return $this; + } + + public function or_where($field=null, $sign=null, $value=null, $alias = null) { + $this->_where.=' OR '; + if ($field!==null && $sign!==null) { + return $this->where($field, $sign, $value, $alias); + } + return $this; + } + + public function open_where() { + $this->_where.=' ( '; + return $this; + } + + public function close_where() { + $this->_where.=' ) '; + return $this; + } + + public function open_query() { + $this->_query_prefix.=' ( '; + return $this; + } + + public function close_query() { + $this->_query_suffix.=' ) '; + return $this; + } + + public function order_by($field, $order = null) { + if ($field === null) $field = $this->_pk; + if ($order !== null) $order = strtoupper($order); + if ($order != 'DESC') $order = 'ASC'; + $this->_order_by[$field]= $order; + return $this; + } + + public function random() { + $this->_order_by['RAND()']= 'RAND()'; + return $this; + } + + public function group_by($field) { + if ($field === null) $field = $this->_pk; + $this->_group_by[]=$field; + return $this; + } + + public function toString() { + $query = $this->_query_prefix; + if (!empty($this->_update)) { + $query .= 'UPDATE '; + $query .= Db::escapeIdentifier($this->_table) . ' AS ' . Db::escapeIdentifier($this->_alias); + $query .= ' SET ' . implode(', ', $this->_update); + } else if ($this->_delete) { + $query .= 'DELETE '.Db::escapeIdentifier($this->_alias).' FROM '; + if (empty($this->_from)) $query .= Db::escapeIdentifier($this->_table) . ' AS ' . Db::escapeIdentifier($this->_alias); + else $query .= $this->_from; + } else { + $query .= 'SELECT '; + if (empty($this->_fields)) $query .= '*'; + else $query .= implode(', ', $this->_fields); + $query .= ' FROM '; + if (empty($this->_from)) $query .= Db::escapeIdentifier($this->_table) . ' AS ' . Db::escapeIdentifier($this->_alias); + else $query .= $this->_from; + } + $joined = array(); + if (!empty($this->_joins)) { + foreach($this->_joins as $class=>$info) { + $query .= ' LEFT JOIN '.Db::escapeIdentifier($info['table']).' AS '.Db::escapeIdentifier($info['alias']); + if (is_array($info['references']) && isset($info['references'][$this->_class])) { + $query .= ' ON '.Db::escapeIdentifier($this->_alias).'.'.Db::escapeIdentifier($this->_pk).' = '.Db::escapeIdentifier($info['alias']).'.'.Db::escapeIdentifier($info['references'][$this->_class]); + $joined[]=Db::escapeIdentifier($info['alias']).'.'.Db::escapeIdentifier($info['pk']); + } else if (is_array($this->_references) && isset($this->_references[$class])) { + $query .= ' ON '.Db::escapeIdentifier($this->_alias).'.'.Db::escapeIdentifier($this->_references[$class]).' = '.Db::escapeIdentifier($info['alias']).'.'.Db::escapeIdentifier($info['pk']); + $joined[]=Db::escapeIdentifier($info['alias']).'.'.Db::escapeIdentifier($info['pk']); + } else { + throw new \Exception('Failed to join class '.$class); + } + } + } + if (!empty($this->_left_joins)) { + foreach($this->_left_joins as $class=>$info) { + $query .= ' LEFT JOIN '.Db::escapeIdentifier($info['table']).' AS '.Db::escapeIdentifier($info['alias']); + if (is_array($info['references']) && isset($info['references'][$this->_class])) { + $query .= ' ON '.Db::escapeIdentifier($this->_alias).'.'.Db::escapeIdentifier($this->_pk).' = '.Db::escapeIdentifier($info['alias']).'.'.Db::escapeIdentifier($info['references'][$this->_class]); + } else if (is_array($this->_references) && isset($this->_references[$class])) { + $query .= ' ON '.Db::escapeIdentifier($this->_alias).'.'.Db::escapeIdentifier($this->_references[$class]).' = '.Db::escapeIdentifier($info['alias']).'.'.Db::escapeIdentifier($info['pk']); + } else { + throw new \Exception('Failed to join class '.$class); + } + } + } + if (!empty($this->_right_joins)) { + foreach($this->_right_joins as $class=>$info) { + $query .= ' RIGHT JOIN '.Db::escapeIdentifier($info['table']).' AS '.Db::escapeIdentifier($info['alias']); + if (is_array($info['references']) && isset($info['references'][$this->_class])) { + $query .= ' ON '.Db::escapeIdentifier($this->_alias).'.'.Db::escapeIdentifier($this->_pk).' = '.Db::escapeIdentifier($info['alias']).'.'.Db::escapeIdentifier($info['references'][$this->_class]); + } else if (is_array($this->_references) && isset($this->_references[$class])) { + $query .= ' ON '.Db::escapeIdentifier($this->_alias).'.'.Db::escapeIdentifier($this->_references[$class]).' = '.Db::escapeIdentifier($info['alias']).'.'.Db::escapeIdentifier($info['pk']); + } else { + throw new \Exception('Failed to join class '.$class); + } + } + } + $where = ''; + if (!empty($this->_where)) { + $where = ' WHERE ('.$this->_where.')'; + } + if (!empty($joined)) { + foreach($joined as $field) { + if (empty($where)) { + $where .= ' WHERE '.$field.' IS NOT NULL'; + } else { + $where .= ' AND '.$field.' IS NOT NULL'; + } + } + } + $query .= $where; + if (!empty($this->_group_by)) { + $_group = ''; + foreach($this->_group_by as $field) { + if (!empty($_group)) $_group.=', '; + $_group.=Db::escapeIdentifier($field); + } + $query .= ' GROUP BY '.$_group; + } + if (!empty($this->_order_by)) { + $_order = ''; + foreach($this->_order_by as $field=>$order) { + if (!empty($_order)) $_order.=', '; + if ($field == 'RAND()') { + $_order.=$field; + } else { + $_order.=Db::escapeIdentifier($field).' '.$order; + } + } + $query .= ' ORDER BY '.$_order; + } + if ($this->_limit !== null) { + $query .= ' LIMIT '.$this->_limit; + } + if ($this->_offset !== null) { + $query .= ' OFFSET '.$this->_offset; + } + $query .= $this->_query_suffix; + return $query; + } + + public function get($get = null, $as_array=false) { + $stmt = DB::query($this->toString(), $this->_data); + $result = array(); + while ($row=Db::fetch($stmt, $as_array)) { + $result[]=$row; + } + Db::free($stmt); + if ($get === null) { + return $result; + } else if (is_int($get) && isset($result[$get])) { + return $result[$get]; + } else if (is_string($get) && count($result)>0) { + return $result[0]->{$get}; + } else { + return null; + } + } + + public function execute() { + DB::query($this->toString(), array_merge($this->_update_data,$this->_data)); + } + + public function reset() { + $this->_fields = array(); + $this->_joins = array(); + $this->_ons = array(); + $this->_limit = null; + $this->_offset = null; + $this->_where = ''; + $this->_data = array(); + $this->_order_by = array(); + $this->_group_by = array(); + $this->_delete = false; + $this->_update = array(); + $this->_update_data = array(); + $this->_query_prefix = ''; + $this->_query_suffix = ''; + return $this; + } + + public function union() { + $query = $this->toString(); + $data = $this->_data; + $this->reset(); + $this->_data = $data; + $this->_query_prefix = $query . ' UNION '; + return $this; + } + + public function merge($alias = 'sub') { + $query = $this->toString(); + $data = $this->_data; + $this->reset(); + $this->_data = $data; + $this->_from = '(' . $query . ') AS ' . Db::escapeIdentifier($alias); + return $this; + } + + public function __toString() { + return $this->toString(); + } + + public function debug() { + return vsprintf(str_replace('?','\'%s\'',$this->toString()), $this->_data); + } +} \ No newline at end of file diff --git a/zira/db/mysql/db.php b/zira/db/mysql/db.php new file mode 100644 index 0000000..5e7b45a --- /dev/null +++ b/zira/db/mysql/db.php @@ -0,0 +1,94 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + + static::$_db->exec('SET NAMES '.MYSQL_CHARSET); + } + + public static function close() { + static::$_db = null; + } + + public static function query($query, array $params = null) { + if ($params === null) $params = array(); + $stmt = static::$_db->prepare($query); + $stmt->execute($params); + self::$_total++; + return $stmt; + } + + public static function fetch($stmt, $as_array = false) { + if (!$as_array) { + return $stmt->fetch(PDO::FETCH_OBJ); + } else { + return $stmt->fetch(PDO::FETCH_ASSOC); + } + } + + public static function free($stmt) { + $stmt->closeCursor(); + } + + public static function lastId() { + return static::$_db->lastInsertId(); + } + + public static function begin() { + return static::$_db->beginTransaction(); + } + + public static function commit() { + return static::$_db->commit(); + } + + public static function rollback() { + return static::$_db->rollback(); + } + + public static function escape($field) { + return static::$_db->quote($field); + } + + public static function escapeIdentifier($identifier) { + return '`'.$identifier.'`'; + } + + public static function getTotal() { + return self::$_total; + } + + public static function version() { + return static::$_db->getAttribute(PDO::ATTR_DRIVER_NAME).' '.static::$_db->getAttribute(PDO::ATTR_SERVER_VERSION); + } + + public static function getTables() { + $stmt = self::query("SHOW TABLES"); + $result = array(); + while ($row=Db::fetch($stmt, true)) { + $result[]=array_values($row)[0]; + } + Db::free($stmt); + return $result; + } +} \ No newline at end of file diff --git a/zira/db/mysql/field.php b/zira/db/mysql/field.php new file mode 100644 index 0000000..9f26d1a --- /dev/null +++ b/zira/db/mysql/field.php @@ -0,0 +1,113 @@ +_table = DB_PREFIX . static::getTable(); + $this->_pk = static::getPk(); + $this->_alias = static::getAlias(); + $this->_id = $id>0 ? $id : null; + if ($this->_id !== null) $this->load($this->_id); + } + + public static function getClass() { + return get_called_class(); + } + + public function load($id) { + $stmt = Db::query('SELECT * FROM '.Db::escapeIdentifier($this->_table).' WHERE '.$this->_pk.'=?', array($id)); + $this->_data = Db::fetch($stmt, true); + if ($this->_data===false) { + $this->_loaded = false; + $this->_data = array(); + } else { + $this->_loaded = true; + } + } + + public function loadFromArray($arr) { + if (array_key_exists($this->_pk, $arr)) { + $this->_id = $arr[$this->_pk]; + $this->_loaded = true; + } else { + $this->_loaded = false; + } + $this->_data = $arr; + } + + public function loaded() { + return $this->_loaded; + } + + public function save() { + if ($this->_id === null) { + $fields = array(); + $values = array(); + $data = array(); + foreach($this->_data as $field=>$value) { + if ($field == $this->_pk) continue; + $fields[]=Db::escapeIdentifier($field); + $values[]='?'; + $data[]=$value; + } + $query = 'INSERT INTO '.Db::escapeIdentifier($this->_table).' ('.implode(', ',$fields).') VALUES ('.implode(', ',$values).')'; + Db::query($query, $data); + $this->_id = Db::lastId(); + $this->_data[$this->_pk] = $this->_id; + } else { + $fields = array(); + $data = array(); + foreach($this->_data as $field=>$value) { + if ($field == $this->_pk) continue; + $data[]=$value; + $fields[]=Db::escapeIdentifier($field).'=?'; + } + $data[]=$this->_id; + $query = 'UPDATE '.Db::escapeIdentifier($this->_table).' SET '.implode(', ',$fields).' WHERE '.$this->_pk.'=?'; + Db::query($query, $data); + } + } + + public function delete() { + if ($this->_id === null) throw new \Exception('Cannot delete object'); + $query = 'DELETE FROM '.Db::escapeIdentifier($this->_table).' WHERE '.$this->_pk.'=?'; + Db::query($query, array($this->_id)); + } + + public function __get($var) { + if (!isset($this->_data[$var])) return null; + return $this->_data[$var]; + } + + public function __set($var, $val) { + $this->_data[$var] = $val; + } + + public static function getCollection() { + return new Collection(get_called_class()); + } + + public static function getFirst($limit, $offset = null, array $where = null) { + $collection = static::getCollection()->limit($limit, $offset); + if ($where !== null) { + $i=0; + foreach($where as $field=>$value) { + if ($i==0) { + $collection->where($field,'=',$value); + } else { + $collection->and_where($field,'=',$value); + } + $i++; + } + } + return $collection->order_by(null, 'ASC')->get(); + } + + public static function getLast($limit, $offset = null, array $where = null) { + $collection = static::getCollection()->limit($limit, $offset); + if ($where !== null) { + $i=0; + foreach($where as $field=>$value) { + if ($i==0) { + $collection->where($field,'=',$value); + } else { + $collection->and_where($field,'=',$value); + } + $i++; + } + } + return $collection->order_by(null, 'DESC')->get(); + } + + public static function find($field, $word, $limit, $offset = null, array $where = null) { + $collection = static::getCollection()->where(static::getAlias().'.'.$field, 'LIKE', '%'.$word.'%'); + if ($where !== null) { + foreach($where as $field=>$value) { + $collection->and_where($field,'=',$value); + } + } + return $collection->limit($limit, $offset)->order_by(null, 'DESC')->get(); + } + + public function toArray() { + return $this->_data; + } +} \ No newline at end of file diff --git a/zira/db/mysql/table.php b/zira/db/mysql/table.php new file mode 100644 index 0000000..d360b31 --- /dev/null +++ b/zira/db/mysql/table.php @@ -0,0 +1,138 @@ +_table = DB_PREFIX . $table_name; + } + + public function getName() { + return $this->_table; + } + + public function getKeys() { + return array(); + } + + public function getUnique() { + return array(); + } + + public function getDefaults() { + return array(); + } + + public function getEngine() { + return $this->_engine; + } + + public function getCharset() { + return $this->_charset; + } + + public function setEngine($engine) { + $this->_engine = $engine; + } + + public function setCharset($charset) { + $this->_charset = $charset; + } + + public function __toString() { + $primary = null; + $fields = array(); + foreach((array)$this->getFields() as $name=>$type) { + if ($type == Field::primary()) $primary = $name; + $fields[]= Db::escapeIdentifier($name).' '.$type; + } + if ($primary!==null) { + $fields[]='PRIMARY KEY ('.Db::escapeIdentifier($primary).')'; + } + foreach((array)$this->getKeys() as $name=>$keys) { + $index='KEY '.Db::escapeIdentifier($name).' ( '; + if (is_string($keys)) $index .= Db::escapeIdentifier($keys); + else if (is_array($keys)) { + for($i=0; $igetUnique() as $name=>$keys) { + $index='UNIQUE KEY '.Db::escapeIdentifier($name).' ( '; + if (is_string($keys)) $index .= Db::escapeIdentifier($keys); + else if (is_array($keys)) { + for($i=0; $i_table).' ( '; + $sql .= implode(', ', $fields); + $sql .= ' ) ENGINE='.$this->getEngine().' DEFAULT CHARSET='.$this->getCharset(); + + return $sql; + } + + public function install() { + // creating table + $query = (string)$this; + Db::query($query); + // inserting default values + foreach((array)$this->getDefaults() as $insert) { + $fields = array(); + $values = array(); + $data = array(); + foreach($insert as $field=>$value) { + $fields[]=Db::escapeIdentifier($field); + $values[]='?'; + $data[]=$value; + } + $query = 'INSERT INTO '.Db::escapeIdentifier($this->_table).' ('.implode(', ',$fields).') VALUES ('.implode(', ',$values).')'; + Db::query($query, $data); + } + } + + public function uninstall() { + $query = 'DROP TABLE IF EXISTS '.DB::escapeIdentifier($this->_table); + Db::query($query); + } + + public function dump($delimiter) { + $sql = ''; + $stmt = DB::query('SELECT * FROM '.DB::escapeIdentifier($this->_table)); + while ($row=Db::fetch($stmt,true)) { + $columns = array_keys($row); + for($i=0; $i_table).' ('.implode(', ',$columns).') VALUES ('.implode(', ',$values).');'.$delimiter; + } + Db::free($stmt); + return $sql; + } +} \ No newline at end of file diff --git a/zira/db/sqlite.collection.php b/zira/db/sqlite.collection.php new file mode 100644 index 0000000..7cc576b --- /dev/null +++ b/zira/db/sqlite.collection.php @@ -0,0 +1,12 @@ +','<=','>=','<>','LIKE','NOT LIKE','IS','IS NOT','IN'); + + public function __construct($class) { + $this->validClass($class); + $this->_class = $class; + $this->_table = DB_PREFIX . $class::getTable(); + $this->_pk = $class::getPk(); + //$this->_alias = $class::getAlias(); + $this->_alias = $this->_table; + $this->_references = $class::getReferences(); + } + + protected function validClass($class) { + if ( + !method_exists($class,'getTable') || + !method_exists($class,'getPk') || + !method_exists($class,'getAlias') || + !method_exists($class,'getReferences') + ) { + throw new \Exception('Orm class should be passed'); + } + } + + public function select($args) { + if (!is_array($args)) { + $args = func_get_args(); + } + if (!empty($args)) { + foreach($args as $alias=>$arg) { + if (is_int($alias)) $alias = $arg; + $this->_fields []= Db::escapeIdentifier($this->_alias).'.'.Db::escapeIdentifier($arg).' as '.Db::escapeIdentifier($alias); + } + } + return $this; + } + + public function update(array $fields) { + foreach($fields as $field=>$value) { +// $alias = $this->_alias; +// if (is_int($field) && is_array($value) && (count($value)==2 || count($value)==3)) { +// if (count($value)==3) $alias = $value[2]; +// $field = $value[0]; +// $value = $value[1]; +// } + $this->_update []= Db::escapeIdentifier($field). ' = ?'; + $this->_update_data []= $value; + } + return $this; + } + + public function delete() { + $this->_delete = true; + return $this; + } + + public function count($alias = 'co') { + $this->_fields []= 'COUNT(*) as '.Db::escapeIdentifier($alias); + return $this; + } + + public function max($field, $alias = 'mx') { + $_alias = $this->_alias; + if (is_array($field) && count($field)==2) { + $_alias = $field[0]; + $field = $field[1]; + } + $this->_fields []= 'MAX('.Db::escapeIdentifier($_alias).'.'.Db::escapeIdentifier($field).') as '.Db::escapeIdentifier($alias); + return $this; + } + + public function min($field, $alias = 'mn') { + $_alias = $this->_alias; + if (is_array($field) && count($field)==2) { + $_alias = $field[0]; + $field = $field[1]; + } + $this->_fields []= 'MIN('.Db::escapeIdentifier($_alias).'.'.Db::escapeIdentifier($field).') as '.Db::escapeIdentifier($alias); + return $this; + } + + public function join($class, array $select = null) { + $this->validClass($class); + $this->_joins[$class]=array( + 'table' => DB_PREFIX . $class::getTable(), + 'pk' => $class::getPk(), + 'alias' => $class::getAlias(), + 'references' => $class::getReferences() + ); + if (!empty($select)) { + foreach($select as $alias=>$arg) { + if (is_int($alias)) $alias = $arg; + $this->_fields []= Db::escapeIdentifier($class::getAlias()).'.'.Db::escapeIdentifier($arg).' as '.Db::escapeIdentifier($alias); + } + } + return $this; + } + + public function left_join($class, array $select = null) { + $this->validClass($class); + $this->_left_joins[$class]=array( + 'table' => DB_PREFIX . $class::getTable(), + 'pk' => $class::getPk(), + 'alias' => $class::getAlias(), + 'references' => $class::getReferences() + ); + if (!empty($select)) { + foreach($select as $alias=>$arg) { + if (is_int($alias)) $alias = $arg; + $this->_fields []= Db::escapeIdentifier($class::getAlias()).'.'.Db::escapeIdentifier($arg).' as '.Db::escapeIdentifier($alias); + } + } + return $this; + } + + public function right_join($class, array $select = null) { + $this->validClass($class); + $this->_right_joins[$class]=array( + 'table' => DB_PREFIX . $class::getTable(), + 'pk' => $class::getPk(), + 'alias' => $class::getAlias(), + 'references' => $class::getReferences() + ); + if (!empty($select)) { + foreach($select as $alias=>$arg) { + if (is_int($alias)) $alias = $arg; + $this->_fields []= Db::escapeIdentifier($class::getAlias()).'.'.Db::escapeIdentifier($arg).' as '.Db::escapeIdentifier($alias); + } + } + return $this; + } + + public function limit($limit, $offset = null) { + if ($this->_union_query_opened) return $this; + $this->_limit = intval($limit); + if ($offset !== null) $this->_offset = intval($offset); + return $this; + } + + public function where($field, $sign, $value, $alias = null) { + if ($alias === null) $alias = $this->_alias; + if ($field === null) $field = $this->_pk; + $sign = strtoupper($sign); + if (!in_array($sign, $this->_allowed_signs)) { + throw new \Exception('Invalid sign passed'); + } + if ($value !== null) { + if (!is_array($value)) { + $this->_where .= Db::escapeIdentifier($alias) . '.' . Db::escapeIdentifier($field) . ' ' . $sign . ' ?'; + $this->_data[] = $value; + } else { + $this->_where .= Db::escapeIdentifier($alias) . '.' . Db::escapeIdentifier($field) . ' ' . $sign . ' '; + $_sign = ''; + $co = 0; + foreach($value as $_value) { + if ($co>0) $_sign .= ','; + $_sign .= '? '; + $this->_data[] = $_value; + $co++; + } + $this->_where .= '('.$_sign.')'; + } + } else { + $this->_where.=Db::escapeIdentifier($alias).'.'.Db::escapeIdentifier($field).' '.$sign.' NULL'; + } + return $this; + } + + public function and_where($field=null, $sign=null, $value=null, $alias = null) { + $this->_where.=' AND '; + if ($field!==null && $sign!==null) { + return $this->where($field, $sign, $value, $alias); + } + return $this; + } + + public function or_where($field=null, $sign=null, $value=null, $alias = null) { + $this->_where.=' OR '; + if ($field!==null && $sign!==null) { + return $this->where($field, $sign, $value, $alias); + } + return $this; + } + + public function open_where() { + $this->_where.=' ( '; + return $this; + } + + public function close_where() { + $this->_where.=' ) '; + return $this; + } + + public function open_query() { + $this->_union_query_opened = true; + //$this->_query_prefix.=' ( '; + return $this; + } + + public function close_query() { + //$this->_query_suffix.=' ) '; + return $this; + } + + public function order_by($field, $order = null) { + if ($this->_union_query_opened) return $this; + if ($field === null) $field = $this->_pk; + if ($order !== null) $order = strtoupper($order); + if ($order != 'DESC') $order = 'ASC'; + $this->_order_by[$field]= $order; + return $this; + } + + public function random() { + $this->_order_by['RANDOM()']= 'RANDOM()'; + return $this; + } + + public function group_by($field) { + if ($this->_union_query_opened) return $this; + if ($field === null) $field = $this->_pk; + $this->_group_by[]=$field; + return $this; + } + + public function toString() { + $query = $this->_query_prefix; + if (!empty($this->_update)) { + $query .= 'UPDATE '; + $query .= Db::escapeIdentifier($this->_table); + $query .= ' SET ' . implode(', ', $this->_update); + } else if ($this->_delete) { + $query .= 'DELETE FROM '; + if (empty($this->_from)) $query .= Db::escapeIdentifier($this->_table); + else $query .= $this->_from; + } else { + $query .= 'SELECT '; + if (empty($this->_fields)) $query .= '*'; + else $query .= implode(', ', $this->_fields); + $query .= ' FROM '; + if (empty($this->_from)) $query .= Db::escapeIdentifier($this->_table) . ' AS ' . Db::escapeIdentifier($this->_alias); + else $query .= $this->_from; + } + $joined = array(); + if (!empty($this->_joins)) { + foreach($this->_joins as $class=>$info) { + $query .= ' LEFT JOIN '.Db::escapeIdentifier($info['table']).' AS '.Db::escapeIdentifier($info['alias']); + if (is_array($info['references']) && isset($info['references'][$this->_class])) { + $query .= ' ON '.Db::escapeIdentifier($this->_alias).'.'.Db::escapeIdentifier($this->_pk).' = '.Db::escapeIdentifier($info['alias']).'.'.Db::escapeIdentifier($info['references'][$this->_class]); + $joined[]=Db::escapeIdentifier($info['alias']).'.'.Db::escapeIdentifier($info['pk']); + } else if (is_array($this->_references) && isset($this->_references[$class])) { + $query .= ' ON '.Db::escapeIdentifier($this->_alias).'.'.Db::escapeIdentifier($this->_references[$class]).' = '.Db::escapeIdentifier($info['alias']).'.'.Db::escapeIdentifier($info['pk']); + $joined[]=Db::escapeIdentifier($info['alias']).'.'.Db::escapeIdentifier($info['pk']); + } else { + throw new \Exception('Failed to join class '.$class); + } + } + } + if (!empty($this->_left_joins)) { + foreach($this->_left_joins as $class=>$info) { + $query .= ' LEFT JOIN '.Db::escapeIdentifier($info['table']).' AS '.Db::escapeIdentifier($info['alias']); + if (is_array($info['references']) && isset($info['references'][$this->_class])) { + $query .= ' ON '.Db::escapeIdentifier($this->_alias).'.'.Db::escapeIdentifier($this->_pk).' = '.Db::escapeIdentifier($info['alias']).'.'.Db::escapeIdentifier($info['references'][$this->_class]); + } else if (is_array($this->_references) && isset($this->_references[$class])) { + $query .= ' ON '.Db::escapeIdentifier($this->_alias).'.'.Db::escapeIdentifier($this->_references[$class]).' = '.Db::escapeIdentifier($info['alias']).'.'.Db::escapeIdentifier($info['pk']); + } else { + throw new \Exception('Failed to join class '.$class); + } + } + } + if (!empty($this->_right_joins)) { + foreach($this->_right_joins as $class=>$info) { + $query .= ' RIGHT JOIN '.Db::escapeIdentifier($info['table']).' AS '.Db::escapeIdentifier($info['alias']); + if (is_array($info['references']) && isset($info['references'][$this->_class])) { + $query .= ' ON '.Db::escapeIdentifier($this->_alias).'.'.Db::escapeIdentifier($this->_pk).' = '.Db::escapeIdentifier($info['alias']).'.'.Db::escapeIdentifier($info['references'][$this->_class]); + } else if (is_array($this->_references) && isset($this->_references[$class])) { + $query .= ' ON '.Db::escapeIdentifier($this->_alias).'.'.Db::escapeIdentifier($this->_references[$class]).' = '.Db::escapeIdentifier($info['alias']).'.'.Db::escapeIdentifier($info['pk']); + } else { + throw new \Exception('Failed to join class '.$class); + } + } + } + $where = ''; + if (!empty($this->_where)) { + $where = ' WHERE ('.$this->_where.')'; + } + if (!empty($joined)) { + foreach($joined as $field) { + if (empty($where)) { + $where .= ' WHERE '.$field.' IS NOT NULL'; + } else { + $where .= ' AND '.$field.' IS NOT NULL'; + } + } + } + $query .= $where; + if (!empty($this->_group_by)) { + $_group = ''; + foreach($this->_group_by as $field) { + if (!empty($_group)) $_group.=', '; + $_group.=Db::escapeIdentifier($field); + } + $query .= ' GROUP BY '.$_group; + } + if (!empty($this->_order_by)) { + $_order = ''; + foreach($this->_order_by as $field=>$order) { + if (!empty($_order)) $_order.=', '; + if ($field == 'RANDOM()') { + $_order.=$field; + } else { + $_order.=Db::escapeIdentifier($field).' '.$order; + } + } + $query .= ' ORDER BY '.$_order; + } + if ($this->_limit !== null) { + $query .= ' LIMIT '.$this->_limit; + } + if ($this->_offset !== null) { + $query .= ' OFFSET '.$this->_offset; + } + $query .= $this->_query_suffix; + return $query; + } + + public function get($get = null, $as_array=false) { + $stmt = DB::query($this->toString(), $this->_data); + $result = array(); + while ($row=Db::fetch($stmt, $as_array)) { + $result[]=$row; + } + Db::free($stmt); + if ($get === null) { + return $result; + } else if (is_int($get) && isset($result[$get])) { + return $result[$get]; + } else if (is_string($get) && count($result)>0) { + return $result[0]->{$get}; + } else { + return null; + } + } + + public function execute() { + DB::query($this->toString(), array_merge($this->_update_data,$this->_data)); + } + + public function reset() { + $this->_fields = array(); + $this->_joins = array(); + $this->_ons = array(); + $this->_limit = null; + $this->_offset = null; + $this->_where = ''; + $this->_data = array(); + $this->_order_by = array(); + $this->_group_by = array(); + $this->_delete = false; + $this->_update = array(); + $this->_update_data = array(); + $this->_query_prefix = ''; + $this->_query_suffix = ''; + return $this; + } + + public function union() { + $query = $this->toString(); + $data = $this->_data; + $this->reset(); + $this->_data = $data; + $this->_query_prefix = $query . ' UNION '; + $this->_union_query_opened = false; + return $this; + } + + public function merge($alias = 'sub') { + $query = $this->toString(); + $data = $this->_data; + $this->reset(); + $this->_data = $data; + $this->_from = '(' . $query . ') AS ' . Db::escapeIdentifier($alias); + $this->_union_query_opened = false; + return $this; + } + + public function __toString() { + return $this->toString(); + } + + public function debug() { + return vsprintf(str_replace('?','\'%s\'',$this->toString()), $this->_data); + } +} \ No newline at end of file diff --git a/zira/db/sqlite/db.php b/zira/db/sqlite/db.php new file mode 100644 index 0000000..8a0052f --- /dev/null +++ b/zira/db/sqlite/db.php @@ -0,0 +1,88 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + } + + public static function close() { + static::$_db = null; + } + + public static function query($query, array $params = null) { + if ($params === null) $params = array(); + $stmt = static::$_db->prepare($query); + $stmt->execute($params); + self::$_total++; + return $stmt; + } + + public static function fetch($stmt, $as_array = false) { + if (!$as_array) { + return $stmt->fetch(PDO::FETCH_OBJ); + } else { + return $stmt->fetch(PDO::FETCH_ASSOC); + } + } + + public static function free($stmt) { + $stmt->closeCursor(); + } + + public static function lastId() { + return static::$_db->lastInsertId(); + } + + public static function begin() { + return static::$_db->beginTransaction(); + } + + public static function commit() { + return static::$_db->commit(); + } + + public static function rollback() { + return static::$_db->rollback(); + } + + public static function escape($field) { + return static::$_db->quote($field); + } + + public static function escapeIdentifier($identifier) { + return '"'.$identifier.'"'; + } + + public static function getTotal() { + return self::$_total; + } + + public static function version() { + return static::$_db->getAttribute(PDO::ATTR_DRIVER_NAME).' '.static::$_db->getAttribute(PDO::ATTR_SERVER_VERSION); + } + + public static function getTables() { + $stmt = self::query("SELECT name FROM sqlite_master WHERE type='table'"); + $result = array(); + while ($row=Db::fetch($stmt, true)) { + $result[]=array_values($row)[0]; + } + Db::free($stmt); + return $result; + } +} \ No newline at end of file diff --git a/zira/db/sqlite/field.php b/zira/db/sqlite/field.php new file mode 100644 index 0000000..2734e75 --- /dev/null +++ b/zira/db/sqlite/field.php @@ -0,0 +1,93 @@ +_table = DB_PREFIX . static::getTable(); + $this->_pk = static::getPk(); + $this->_alias = static::getAlias(); + $this->_id = $id>0 ? $id : null; + if ($this->_id !== null) $this->load($this->_id); + } + + public static function getClass() { + return get_called_class(); + } + + public function load($id) { + $stmt = Db::query('SELECT * FROM '.Db::escapeIdentifier($this->_table).' WHERE '.$this->_pk.'=?', array($id)); + $this->_data = Db::fetch($stmt, true); + if ($this->_data===false) { + $this->_loaded = false; + $this->_data = array(); + } else { + $this->_loaded = true; + } + } + + public function loadFromArray($arr) { + if (array_key_exists($this->_pk, $arr)) { + $this->_id = $arr[$this->_pk]; + $this->_loaded = true; + } else { + $this->_loaded = false; + } + $this->_data = $arr; + } + + public function loaded() { + return $this->_loaded; + } + + public function save() { + if ($this->_id === null) { + $fields = array(); + $values = array(); + $data = array(); + foreach($this->_data as $field=>$value) { + if ($field == $this->_pk) continue; + $fields[]=Db::escapeIdentifier($field); + $values[]='?'; + $data[]=$value; + } + $query = 'INSERT INTO '.Db::escapeIdentifier($this->_table).' ('.implode(', ',$fields).') VALUES ('.implode(', ',$values).')'; + Db::query($query, $data); + $this->_id = Db::lastId(); + $this->_data[$this->_pk] = $this->_id; + } else { + $fields = array(); + $data = array(); + foreach($this->_data as $field=>$value) { + if ($field == $this->_pk) continue; + $data[]=$value; + $fields[]=Db::escapeIdentifier($field).'=?'; + } + $data[]=$this->_id; + $query = 'UPDATE '.Db::escapeIdentifier($this->_table).' SET '.implode(', ',$fields).' WHERE '.$this->_pk.'=?'; + Db::query($query, $data); + } + } + + public function delete() { + if ($this->_id === null) throw new \Exception('Cannot delete object'); + $query = 'DELETE FROM '.Db::escapeIdentifier($this->_table).' WHERE '.$this->_pk.'=?'; + Db::query($query, array($this->_id)); + } + + public function __get($var) { + if (!isset($this->_data[$var])) return null; + return $this->_data[$var]; + } + + public function __set($var, $val) { + $this->_data[$var] = $val; + } + + public static function getCollection() { + return new Collection(get_called_class()); + } + + public static function getFirst($limit, $offset = null, array $where = null) { + $collection = static::getCollection()->limit($limit, $offset); + if ($where !== null) { + $i=0; + foreach($where as $field=>$value) { + if ($i==0) { + $collection->where($field,'=',$value); + } else { + $collection->and_where($field,'=',$value); + } + $i++; + } + } + return $collection->order_by(null, 'ASC')->get(); + } + + public static function getLast($limit, $offset = null, array $where = null) { + $collection = static::getCollection()->limit($limit, $offset); + if ($where !== null) { + $i=0; + foreach($where as $field=>$value) { + if ($i==0) { + $collection->where($field,'=',$value); + } else { + $collection->and_where($field,'=',$value); + } + $i++; + } + } + return $collection->order_by(null, 'DESC')->get(); + } + + public static function find($field, $word, $limit, $offset = null, array $where = null) { + $collection = static::getCollection()->where(static::getAlias().'.'.$field, 'LIKE', '%'.$word.'%'); + if ($where !== null) { + foreach($where as $field=>$value) { + $collection->and_where($field,'=',$value); + } + } + return $collection->limit($limit, $offset)->order_by(null, 'DESC')->get(); + } + + public function toArray() { + return $this->_data; + } +} \ No newline at end of file diff --git a/zira/db/sqlite/table.php b/zira/db/sqlite/table.php new file mode 100644 index 0000000..406e5fa --- /dev/null +++ b/zira/db/sqlite/table.php @@ -0,0 +1,143 @@ +_table = DB_PREFIX . $table_name; + } + + public function getName() { + return $this->_table; + } + + public function getKeys() { + return array(); + } + + public function getUnique() { + return array(); + } + + public function getDefaults() { + return array(); + } + + public function getCharset() { + return $this->_charset; + } + + public function setCharset($charset) { + $this->_charset = $charset; + } + + protected function _getCreateTableSQL() { + $fields = array(); + foreach((array)$this->getFields() as $name=>$type) { + $fields[]= Db::escapeIdentifier($name).' '.$type; + } + + $sql = 'CREATE TABLE '.DB::escapeIdentifier($this->_table).' ( '; + $sql .= implode(', ', $fields); + $sql .= ' )'; + + return $sql; + } + + protected function _getCreateIndexSQL($name, $keys, $unique = false) { + $index=' ( '; + if (is_string($keys)) $index .= Db::escapeIdentifier($keys); + else if (is_array($keys)) { + for($i=0; $i_table.'_'.$name).' ON '.DB::escapeIdentifier($this->_table).$index; + + return $sql; + } + + public function createIndexes() { + foreach((array)$this->getKeys() as $name=>$keys) { + $sql = $this->_getCreateIndexSQL($name, $keys); + Db::query($sql); + } + foreach((array)$this->getUnique() as $name=>$keys) { + $sql = $this->_getCreateIndexSQL($name, $keys, true); + Db::query($sql); + } + } + + public function __toString() { + $sql = $this->_getCreateTableSQL().';'; + foreach((array)$this->getKeys() as $name=>$keys) { + $sql .= "\r\n". $this->_getCreateIndexSQL($name, $keys); + } + foreach((array)$this->getUnique() as $name=>$keys) { + $sql .= "\r\n". $this->_getCreateIndexSQL($name, $keys, true); + } + return $sql; + } + + public function install() { + // setting encoding + Db::query('PRAGMA encoding = "'.$this->getCharset().'"'); + // creating table + $query = $this->_getCreateTableSQL(); + Db::query($query); + // creating indexes + $this->createIndexes(); + // inserting default values + foreach((array)$this->getDefaults() as $insert) { + $fields = array(); + $values = array(); + $data = array(); + foreach($insert as $field=>$value) { + $fields[]=Db::escapeIdentifier($field); + $values[]='?'; + $data[]=$value; + } + $query = 'INSERT INTO '.Db::escapeIdentifier($this->_table).' ('.implode(', ',$fields).') VALUES ('.implode(', ',$values).')'; + Db::query($query, $data); + } + } + + public function uninstall() { + $query = 'DROP TABLE IF EXISTS '.DB::escapeIdentifier($this->_table); + Db::query($query); + } + + public function dump($delimiter) { + $sql = ''; + $stmt = DB::query('SELECT * FROM '.DB::escapeIdentifier($this->_table)); + while ($row=Db::fetch($stmt,true)) { + $columns = array_keys($row); + for($i=0; $i_table).' ('.implode(', ',$columns).') VALUES ('.implode(', ',$values).');'.$delimiter; + } + Db::free($stmt); + return $sql; + } +} \ No newline at end of file diff --git a/zira/file.php b/zira/file.php new file mode 100644 index 0000000..f7f588a --- /dev/null +++ b/zira/file.php @@ -0,0 +1,86 @@ +$tmp_name) { + if (empty($tmp_name)) continue; + if (!isset($file['name'][$i]) || empty($file['name'][$i])) continue; + $files[$tmp_name] = $file['name'][$i]; + } + } else if (is_string($file['name']) && is_string($file['tmp_name'])) { + $files[$file['tmp_name']] = $file['name']; + } else { + return false; + } + + if (empty($files)) return false; + + $savedir = self::getAbsolutePath($dir); + + $_files = array(); + foreach($files as $path=>$name) { + $prefix = 0; + do { + $_f = self::getFileName($name, $prefix); + $f = $savedir . DIRECTORY_SEPARATOR . $_f; + $prefix++; + } while(file_exists($f)); + + if (!copy($path, $f)) return false; + $_files[$f] = $_f; + } + + return $_files; + } + + public static function getFileArray($path) { + return array( + 'name' => basename($path), + 'tmp_name' => $path + ); + } +} \ No newline at end of file diff --git a/zira/form.php b/zira/form.php new file mode 100644 index 0000000..79dddf3 --- /dev/null +++ b/zira/form.php @@ -0,0 +1,75 @@ +_init(); + + if ($this->_ajax) { + View::addScript('upload.inc.js'); + View::addScript('upload.js'); + } + } + + abstract protected function _init(); + abstract protected function _render(); + abstract protected function _validate(); + + protected function _update_values() { + if ($this->_method == Request::GET) { + $this->_request_values = Request::get(); + } else if ($this->_method == Request::POST) { + if (!$this->_multipart) { + $this->_request_values = Request::post(); + } else { + $this->_request_values = array_merge(Request::post(), Request::file()); + } + } + } + + public function getValue($name, $default = null) { + $_name = $this->getFieldName($name); + $request_value = isset($this->_request_values[$_name]) ? $this->_request_values[$_name] : null; + if ($request_value !== null) return $request_value; + if (isset($this->_values[$name])) return $this->_values[$name]; + return $default; + } + + public function setValue($name, $value) { + $_name = Form\Form::getFieldName($this->_token, $name); + if (isset($this->_request_values[$_name])) $this->_request_values[$_name] = $value; + $this->_values[$name] = $value; + } + + public function updateValues(array $values) { + foreach($values as $key=>$value) { + $this->setValue($key, $value); + $_name = Form\Form::getFieldName($this->_token, $key); + if ($this->_method == Request::POST) { + Request::setPost($_name, $value); + } else if ($this->_method == Request::GET) { + Request::setGet($_name, $value); + } + } + } + + public function isValid() { + $this->_update_values(); + $this->_validate(); + $result = $this->validate(); + return $result; + } + + public function __toString() { + return $this->_render(); + } +} \ No newline at end of file diff --git a/zira/form/factory.php b/zira/form/factory.php new file mode 100644 index 0000000..569075b --- /dev/null +++ b/zira/form/factory.php @@ -0,0 +1,709 @@ +_id = $id; + $this->_url = $url; + $this->_method = $method; + $this->_token = Form::getToken($this->_id, $this->_is_token_unique); + $this->_validator = new Validator(); + $this->_validator->setToken($this->_token); + if ($this->_multipart) $this->_validator->setMultipart(true); + } + + public function setValues(array $values) { + $this->_values = $values; + } + + public function setAjax($ajax) { + $this->_ajax = (bool) $ajax; + } + + public function setUrl($url) { + $this->_url = $url; + } + + public function setMethod($method) { + $this->_method = $method; + } + + public function setMultipart($multipart) { + $this->_multipart = (bool)$multipart; + $this->_validator->setMultipart($multipart); + } + + public function setFill($fill) { + $this->_fill = (bool) $fill; + } + + public function getToken() { + return $this->_token; + } + + public function setTitle($title) { + $this->_title = $title; + } + + public function setMessage($message) { + $this->_message = $message; + } + + public function setError($error) { + $this->_error = $error; + } + + public function setInfo($info) { + $this->_info = $info; + } + + public function setDescription($description) { + $this->_description = $description; + } + + public function getUrl() { + return $this->_url; + } + + public function getMethod() { + return $this->_method; + } + + public function getTitle() { + return $this->_title; + } + + public function getMessage() { + return $this->_message; + } + + public function getError() { + return $this->_error; + } + + public function getInfo() { + return $this->_info; + } + + public function getDescription() { + return $this->_description; + } + + public function setRenderPanel ($render_panel) { + $this->_render_panel = $render_panel; + } + + public function setWrapElements ($wrap_elements) { + $this->_wrap_elements = $wrap_elements; + } + + public function setFormClass($class) { + $this->_form_class = $class; + } + + public function setGroupClass($class) { + $this->_group_class = $class; + } + + public function setInputGroupClass($class) { + $this->_input_group_class = $class; + } + + public function setInputGroupAddonClass($class) { + $this->_input_group_addon_class = $class; + } + + public function setInputGroupButtonClass($class) { + $this->_input_group_button_class = $class; + } + + public function setInputClass($class) { + $this->_input_class = $class; + } + + public function setLabelClass($class) { + $this->_label_class = $class; + } + + public function setInputWrapClass($class) { + $this->_input_wrap_class = $class; + } + + public function setInputOffsetWrapClass($class) { + $this->_input_offset_wrap_class = $class; + } + + public function setCheckboxWrapClass($class) { + $this->_checkbox_wrap_class = $class; + } + + public function setRadioWrapClass($class) { + $this->_radio_wrap_class = $class; + } + + public function setButtonGroupClass($class) { + $this->_button_group_class = $class; + } + + public function setButtonClass($class) { + $this->_button_class = $class; + } + + public function setSubmitClass($class) { + $this->_submit_class = $class; + } + + public function setSelectWrapClass($class) { + $this->_select_wrapper_class = $class; + } + + public function setDropdownClass($class) { + $this->_dropdown_class = $class; + } + + public function setDropdownMenuClass($class) { + $this->_dropdown_menu_class = $class; + } + + public function setCaptchaWrapClass($class) { + $this->_captcha_wrapper_class = $class; + } + + public function setCaptchaImageWrapClass($class) { + $this->_captcha_image_wrapper_class = $class; + } + + public function setCaptchaRefreshWrapClass($class) { + $this->_captcha_refresh_wrapper_class = $class; + } + + public function setCaptchaInputWrapClass($class) { + $this->_captcha_input_wrapper_class = $class; + } + + public function setCaptchaRefreshIcoClass($class) { + $this->_captcha_refresh_ico_class = $class; + } + + public function setPanelClass($class) { + $this->_panel_class = $class; + } + + public function setPanelHeadingClass($class) { + $this->_panel_heading_class = $class; + } + + public function setPanelTitleClass($class) { + $this->_panel_title_class = $class; + } + + public function setPanelBodyClass($class) { + $this->_panel_body_class = $class; + } + + public function setPanelFooterClass($class) { + $this->_panel_footer_class = $class; + } + + public function setAlertSuccessClass($class) { + $this->_alert_success_class = $class; + } + + public function setAlertErrorClass($class) { + $this->_alert_error_class = $class; + } + + public function setAlertInfoClass($class) { + $this->_alert_info_class = $class; + } + + public function setAjaxFormClass($class) { + $this->_ajax_form_class = $class; + } + + public function getValidator() { + return $this->_validator; + } + + public function isErrorField($field) { + $error_field = $this->getValidator()->getErrorField(); + if (!empty($error_field) && $error_field==$field) return true; + return false; + } + + public function getId() { + return 'form-'.$this->_id; + } + + public function getFieldName($name) { + return Form::getFieldName($this->_token, $name); + } + + public function open(array $attributes = null) { + if (!$this->_url) $this->_url = Zira\Router::getRequest(); + + if ($this->_ajax) { + $this->_form_class .= ' '.$this->_ajax_form_class; + + if (strpos($this->_url,'?')!==false) $this->_url .= '&'; + else $this->_url .= '?'; + + $this->_url .= FORMAT_GET_VAR.'='.FORMAT_JSON; + } + $prefix = ''; + $prefix .= $this->get_alerts(); + if ($this->_render_panel) { + $prefix .= Helper::tag_open('div', array('class'=>$this->_panel_class)); + $prefix .= Helper::tag_open('div', array('class'=>$this->_panel_heading_class)); + if (!empty($this->_title)) { + $prefix .= Helper::tag('h2', $this->_title, array('class'=>$this->_panel_title_class)); + } + $prefix .= Helper::tag_close('div'); + $prefix .= Helper::tag_open('div', array('class'=>$this->_panel_body_class)); + if (!empty($this->_description)) { + $prefix .= Helper::html($this->_description); + } + $prefix .= Helper::tag_close('div'); + $prefix .= Helper::tag_open('div', array('class'=>$this->_panel_footer_class)); + } + + if (!$attributes) $attributes = array(); + if (!isset($attributes['class'])) $attributes['class'] = $this->_form_class; + $attributes['id'] = $this->getId(); + return $prefix.Form::open($this->_url,$this->_method, $this->_multipart, $attributes); + } + + protected function get_alerts() { + $html = ''; + if (!empty($this->_message)) { + $html .= Helper::tag('div',$this->_message,array('class'=>$this->_alert_success_class)); + } + if (!empty($this->_error)) { + $html .= Helper::tag('div',$this->_error,array('class'=>$this->_alert_error_class)); + } + if (!empty($this->_info)) { + $html .= Helper::tag('div',$this->_info,array('class'=>$this->_alert_info_class)); + } + return $html; + } + + public function close() { + $prefix = ''; + if ($this->_render_panel) { + $prefix .= Helper::tag_close('div'); + $prefix .= Helper::tag_close('div'); + } + return $prefix.Form::close(); + } + + public function wrap($element, $class = null) { + if (!$this->_wrap_elements) return $element; + if (!$class) $class = $this->_group_class; + $html = Helper::tag_open('div',array('class'=>$class)); + $html .= $element; + $html .= Helper::tag_close('div'); + return $html; + } + + public function input($label, $name, array $attributes = null) { + $value = isset($this->_values[$name]) ? $this->_values[$name] : null; + if (!$attributes) $attributes = array(); + if (!isset($attributes['class'])) $attributes['class'] = $this->_input_class; + if ($this->isErrorField($name)) $attributes['class'] .= ' '.$this->_field_error_class; + $label = Form::label($label, $name, array('class'=>$this->_label_class)); + $field = Form::input($this->_token, $name, $value, $attributes, $this->_fill); + if (isset($attributes['title'])) { + $field .= Helper::tag('p', $attributes['title'], array('class'=>$this->_help_class)); + } + return $this->wrap($label.$this->wrap($field,$this->_input_wrap_class)); + } + + public function password($label, $name, array $attributes = null) { + $value = isset($this->_values[$name]) ? $this->_values[$name] : null; + if (!$attributes) $attributes = array(); + if (!isset($attributes['class'])) $attributes['class'] = $this->_input_class; + if ($this->isErrorField($name)) $attributes['class'] .= ' '.$this->_field_error_class; + $label = Form::label($label, $name, array('class'=>$this->_label_class)); + $field = Form::password($this->_token, $name, $value, $attributes); + if (isset($attributes['title'])) { + $field .= Helper::tag('p', $attributes['title'], array('class'=>$this->_help_class)); + } + return $this->wrap($label.$this->wrap($field,$this->_input_wrap_class)); + } + + public function hidden($name, array $attributes = null) { + $value = isset($this->_values[$name]) ? $this->_values[$name] : null; + if (!$attributes) $attributes = array(); + if (!isset($attributes['class'])) $attributes['class'] = $this->_input_class; + return Form::hidden($this->_token, $name, $value, $attributes, $this->_fill); + } + + public function token($value, array $attributes = null) { + return Form::token($value, $attributes); + } + + public function file($label, $name, array $attributes = null, $multiple = false) { + if ($this->isErrorField($name)) { + if ($attributes === null) $attributes = array(); + if (!isset($attributes['class'])) + $attributes['class'] = ' '.$this->_field_error_class; + else + $attributes['class'] .= ' '.$this->_field_error_class; + } + $label = Form::label($label, $name, array('class'=>$this->_label_class)); + $field = Form::file($this->_token, $name, $attributes, $multiple); + if (isset($attributes['title'])) { + $field .= Helper::tag('p', $attributes['title'], array('class'=>$this->_help_class)); + } + return $this->wrap($label.$this->wrap($field,$this->_file_wrap_class)); + } + + public function fileButton($label, $name, array $attributes = null, $multiple = false, $text = null) { + $_name = Form::getFieldName($this->_token, $name); + if ($attributes === null) $attributes = array(); + $attributes['id'] = $_name; + if ($text==null) $text = Zira\Locale::t('Browse'); + $label = Form::label($label, $name, array('class'=>$this->_label_class)); + $field = Form::file($this->_token, $name, $attributes, $multiple); + $field = $this->wrap($text.$field,$this->_button_class.' form-file-button'); + $html = $this->wrap($text.$field,$this->_input_group_button_class); + $html .= Helper::tag_short('input', array('type'=>'text','class'=>$this->_input_class,'id'=>$_name.'-text','readonly'=>'readonly')); + $error_class = ''; + if ($this->isErrorField($name)) $error_class=' '.$this->_field_error_class; + $elems = $this->wrap($html,$this->_input_group_class.$error_class); + if (isset($attributes['title'])) { + $elems .= Helper::tag('p', $attributes['title'], array('class'=>$this->_help_class)); + } + return $this->wrap($label.$this->wrap($elems,$this->_file_wrap_class)); + } + + public function datepicker($label, $name, array $attributes = null) { + $value = isset($this->_values[$name]) ? $this->_values[$name] : null; + $id = $name.'-datepicker'; + if ($attributes === null) $attributes = array(); + if (!isset($attributes['class'])) $attributes['class'] = $this->_input_class; + $error_class = ''; + if ($this->isErrorField($name)) $error_class=' '.$this->_field_error_class; + $label = Form::label($label, $name, array('class'=>$this->_label_class)); + $html = Helper::tag_open('div', array('class'=>$this->_input_group_class.' '.$this->_date_wrap_class.$error_class,'id'=>$id)); + $html .= Form::input($this->_token, $name, $value, $attributes, $this->_fill); + $html .= Helper::tag_open('span', array('class'=>$this->_input_group_addon_class)); + $html .= Helper::tag('span', null, array('class'=>$this->_icon_time_class)); + $html .= Helper::tag_close('span'); + $html .= Helper::tag_close('div'); + if (isset($attributes['title'])) { + $html .= Helper::tag('p', $attributes['title'], array('class'=>$this->_help_class)); + } + return $this->wrap($label.$this->wrap($html,$this->_input_wrap_class)); + } + + /** + * @param $name + * @param string $viewMode - accepts 'decades','years','months','days' + * @param null $maxDate - format 'Y-m-d' + */ + public function initDatepicker($name, $viewMode = null, $maxDate = null) { + Zira\View::addDatepicker($viewMode, $maxDate); + $script = Helper::tag_open('script',array('type'=>'text/javascript')); + $script .= "jQuery(document).ready(function(){"; + $script .= "zira_datepicker(jQuery('#".$name."'))"; + $script .= "});"; + $script .= Helper::tag_close('script'); + Zira\View::addHTML($script, Zira\View::VAR_BODY_BOTTOM); + } + + public function parseDatepickerDate($value) { + $date = ''; + $format = Zira\Config::get('datepicker_date_format'); + if (preg_match_all('/(?:DD|MM|YYYY)/', $format, $m) && !empty($m[0])) { + $days = -1; $months = -1; $years = -1; + foreach($m[0] as $i=>$_m) { + if ($_m == 'DD') $days=$i; + if ($_m == 'MM') $months=$i; + if ($_m == 'YYYY') $years=$i; + } + if (preg_match_all('/[\d]+/', $value, $m1) && !empty($m1[0])) { + $day = ''; $month = ''; $year = ''; + foreach($m1[0] as $i=>$_m1) { + if ($i == $days) $day .= $_m1; + else if ($i == $months) $month .= $_m1; + else if ($i == $years) $year .= $_m1; + } + if (!empty($day) && !empty($month) && !empty($year)) { + $date=date('Y-m-d',mktime(0,0,0,intval($month),intval($day),intval($year))); + } + } + } + return $date; + } + + public function prepareDatepickerDate($value) { + if (empty($value)) return $value; + $time = strtotime($value); + $format = Zira\Config::get('datepicker_date_format'); + $format = str_replace('DD','%1$s',$format); + $format = str_replace('MM','%2$s',$format); + $format = str_replace('YYYY','%3$s',$format); + $day = date('d', $time); + $month = date('m', $time); + $year = date('Y', $time); + return sprintf($format,$day,$month,$year); + } + + public function checkbox($label, $name, array $attributes = null, $fill=true) { + $checked = !empty($this->_values[$name]); + if (!$attributes) $attributes = array(); + if ($checked) $attributes['checked'] = 'checked'; + + if ($this->_checkbox_inline_label) { + if (!isset($attributes['class'])) $attributes['class'] = $this->_input_class; + if (!isset($attributes['style'])) $attributes['style'] = 'width:auto;height:auto;outline:none'; + $field = Form::checkbox($this->_token, $name, null, $attributes, ($fill ? $this->_fill : false)); + $html = Helper::tag_open('label', array('for' => $name, 'class'=>$this->_label_class, 'style'=>'width:auto;padding-top:0px')); + $html .= $field . $label; + $html .= Helper::tag_close('label'); + $elems = $this->wrap($html,$this->_checkbox_wrap_class.' '.$this->_checkbox_inline_wrap_class); + return $this->wrap($this->wrap($elems,$this->_input_offset_wrap_class)); + } else { + $label = Form::label($label, $name, array('class'=>$this->_label_class)); + if (!isset($attributes['class'])) $attributes['class'] = $this->_input_class; + if (!isset($attributes['style'])) $attributes['style'] = 'width:auto;outline:none'; + $field = Form::checkbox($this->_token, $name, null, $attributes, ($fill ? $this->_fill : false)); + return $this->wrap($label.$this->wrap($field,$this->_input_wrap_class)); + } + } + + public function checkboxButton($label, $name, array $attributes = null, $fill=true) { + $checked = !empty($this->_values[$name]); + if (!$attributes) $attributes = array(); + if ($checked) $attributes['checked'] = 'checked'; + $field = Form::checkbox($this->_token, $name, null, $attributes, ($fill ? $this->_fill : false)); + $active = strpos($field,' checked="checked"') ? ' active' : ''; + $html = Helper::tag_open('div',array('class'=>$this->_button_group_class,'data-toggle'=>'buttons')); + $html .= Helper::tag_open('label',array('class'=>$this->_button_class.$active)); + $html .= $field.$label; + $html .= Helper::tag_close('label'); + $html .= Helper::tag_close('div'); + return $this->wrap($this->wrap($html,$this->_input_offset_wrap_class)); + } + + public function radio($label, $name, array $value_titles, array $attributes = null, $fill=true) { + $checked = isset($this->_values[$name]) ? $this->_values[$name] : null; + if (!$attributes) $attributes = array(); + $elems = ''; + foreach ($value_titles as $value=>$title) { + $_attributes = array(); + if ($checked!==null && $checked==$value) { + $_attributes['checked'] = 'checked'; + } + $field = Form::radio($this->_token, $name, $value, array_merge($attributes,$_attributes), ($fill ? $this->_fill : false)); + $html = Helper::tag_open('label'); + $html .= $field.$title; + $html .= Helper::tag_close('label'); + $elems .= $this->wrap($html,$this->_radio_wrap_class); + } + $label = Form::label($label, null, array('class'=>$this->_label_class)); + return $this->wrap($label.$this->wrap($elems,$this->_input_wrap_class)); + } + + public function radioButton($label, $name, array $value_titles, array $attributes = null, $fill=true) { + $checked = isset($this->_values[$name]) ? $this->_values[$name] : null; + if (!$attributes) $attributes = array(); + $elems = Helper::tag_open('div',array('class'=>$this->_button_group_class,'data-toggle'=>'buttons')); + foreach ($value_titles as $value=>$title) { + $_attributes = array(); + if ($checked!==null && $checked==$value) { + $_attributes['checked'] = 'checked'; + } + $field = Form::radio($this->_token, $name, $value, array_merge($attributes,$_attributes), ($fill ? $this->_fill : false)); + $active = strpos($field,' checked="checked"') ? ' active' : ''; + + $html = Helper::tag_open('label',array('class'=>$this->_button_class.$active)); + $html .= $field.$title; + $html .= Helper::tag_close('label'); + $elems .= $html; + } + $elems .= Helper::tag_close('div'); + $label = Form::label($label, null, array('class'=>$this->_label_class)); + return $this->wrap($label.$this->wrap($elems,$this->_input_wrap_class)); + } + + public function textarea($label, $name, array $attributes = null) { + $value = isset($this->_values[$name]) ? $this->_values[$name] : null; + if (!$attributes) $attributes = array(); + if (!isset($attributes['class'])) $attributes['class'] = $this->_input_class; + if ($this->isErrorField($name)) $attributes['class'] .= ' '.$this->_field_error_class; + $label = Form::label($label, $name, array('class'=>$this->_label_class)); + $field = Form::textarea($this->_token, $name, $value, $attributes, $this->_fill); + if (isset($attributes['title'])) { + $field .= Helper::tag('p', $attributes['title'], array('class'=>$this->_help_class)); + } + return $this->wrap($label.$this->wrap($field,$this->_input_wrap_class)); + } + + public function select($label, $name, array $options=null, array $attributes = null) { + $selected = isset($this->_values[$name]) ? $this->_values[$name] : null; + if (!$attributes) $attributes = array(); + if (!isset($attributes['class'])) $attributes['class'] = $this->_input_class; + $label = Form::label($label, $name, array('class'=>$this->_label_class)); + $field = Form::select($this->_token, $name, $options, $selected, $attributes, $this->_fill); + if (isset($attributes['title'])) { + $field .= Helper::tag('p', $attributes['title'], array('class'=>$this->_help_class)); + } + return $this->wrap($label.$this->wrap($field,$this->_select_wrapper_class)); + } + + public function selectDropdown($label, $name, array $options=null, array $attributes = null) { + $_name = Form::getFieldName($this->_token, $name); + $selected = isset($this->_values[$name]) ? $this->_values[$name] : null; + $label = Form::label($label, $name, array('class'=>$this->_label_class)); + + if ($this->_fill) { + if ($this->_fill == Request::POST && Request::isPost()) $_value = Request::post($_name); + else if ($this->_fill == Request::GET) $_value = Request::get($_name); + } + + if (isset($_value)) $selected = $_value; + if ($selected===null && $options!==null && count($options)>0) { + $selected = array_keys($options)[0]; + } + + $field = Form::hidden($this->_token, $name, $selected, $attributes, $this->_fill); + + $button_id = $_name.'-dropdown-label'; + if (!empty($options)) { + $button_label = $selected!==null && isset($options[$selected]) ? $options[$selected] : reset($options); + } else { + $button_label = ''; + } + $dropdown = Helper::tag_open('div',array('class'=>$this->_dropdown_class)); + $dropdown .= Helper::tag_open('button',array('class'=>$this->_button_class,'id'=>$button_id,'type'=>'button','data-toggle'=>'dropdown','aria-haspopup'=>'true','aria-expanded'=>'false')); + $dropdown .= Helper::html($button_label.' '); + $dropdown .= Helper::tag('span','',array('class'=>'caret')); + $dropdown .= Helper::tag_close('button'); + $dropdown .= Helper::tag_open('ul',array('class'=>$this->_dropdown_menu_class,'aria-labelledby'=>$button_id,'rel'=>$_name)); + foreach ($options as $option_value=>$option_name) { + $dropdown .= Helper::tag_open('li'); + $dropdown .= Helper::tag('a',$option_name,array('href'=>'javascript:void(0)','rel'=>$option_value)); + $dropdown .= Helper::tag_close('li'); + } + $dropdown .= Helper::tag_close('ul'); + $dropdown .= Helper::tag_close('div'); + if (isset($attributes['title'])) { + $dropdown .= Helper::tag('p', $attributes['title'], array('class'=>$this->_help_class)); + } + + return $this->wrap($label.$this->wrap($field.$dropdown,$this->_input_wrap_class)); + } + + public function button($label, array $attributes = null) { + if (!$attributes) $attributes = array(); + if (!isset($attributes['class'])) $attributes['class'] = $this->_button_class; + $field = Form::button($label,$attributes); + return $this->wrap($this->wrap($field,$this->_input_offset_wrap_class)); + } + + public function submit($label, array $attributes = null) { + if (!$attributes) $attributes = array(); + if (!isset($attributes['class'])) $attributes['class'] = $this->_submit_class; + $field = Form::submit($label,$attributes); + return $this->wrap($this->wrap($field,$this->_input_offset_wrap_class)); + } + + public function captcha($label) { + $error_class = ''; + if ($this->isErrorField(CAPTCHA_NAME)) $error_class=' '.$this->_field_error_class; + $label = Form::label($label, null, array('class'=>$this->_label_class)); + $captcha = Form::captcha( + $this->_token, + $this->_captcha_image_wrapper_class, + $this->_captcha_input_wrapper_class.$error_class, + $this->_input_class, + $this->_captcha_refresh_wrapper_class, + Helper::tag('span',null,array('class'=>$this->_captcha_refresh_ico_class)) + ); + return $this->wrap($label.$this->wrap($captcha,$this->_captcha_wrapper_class)); + } + + public function captchaLazy($label) { + if (!Zira\Models\Captcha::isActive($this->_id)) return ''; + return $this->captcha($label); + } + + public function validate() { + if (!$this->getValidator()->validate()) { + $this->setError($this->getValidator()->getMessage()); + return false; + } + return true; + } +} \ No newline at end of file diff --git a/zira/form/form.php b/zira/form/form.php new file mode 100644 index 0000000..3f7dab4 --- /dev/null +++ b/zira/form/form.php @@ -0,0 +1,310 @@ +*
    ',Helper::html($text)); + $html = Helper::tag_open('label',$attributes); + $html .= $text; + $html .= Helper::tag_close('label'); + return $html; + } + } + + public static function input($token, $name, $value=null, array $attributes = null, $fill=Request::POST) { + $_name = self::getFieldName($token, $name); + if (!$attributes) $attributes = array(); + if (!isset($attributes['type'])) $attributes['type'] = 'text'; + if (!isset($attributes['id'])) $attributes['id'] = $name; + $attributes['name'] = $_name; + + if ($fill) { + if ($fill == Request::POST && Request::isPost()) $_value = Request::post($_name); + else if($fill == Request::GET) $_value = Request::get($_name); + } + + if (isset($_value)) $attributes['value'] = $_value; + else if ($value!==null) $attributes['value'] = $value; + else if (!isset($attributes['value'])) $attributes['value'] = ''; + return Helper::tag_short('input',$attributes); + } + + public static function password($token, $name, $value=null, array $attributes = null) { + if (!$attributes) $attributes = array(); + $attributes['type'] = 'password'; + return self::input($token,$name,$value,$attributes,false); + } + + public static function hidden($token, $name, $value=null, array $attributes = null, $fill=Request::POST) { + if (!$attributes) $attributes = array(); + $attributes['type'] = 'hidden'; + return self::input($token,$name,$value,$attributes,$fill); + } + + public static function token($value, array $attributes = null) { + if (!$attributes) $attributes = array(); + $attributes['name'] = 'token'; + $attributes['type'] = 'hidden'; + $attributes['value'] = $value; + return Helper::tag_short('input',$attributes); + } + + public static function file($token, $name, array $attributes = null, $multiple = false) { + if (!$attributes) $attributes = array(); + $attributes['type'] = 'file'; + if ($multiple) { + $attributes['multiple'] = 'multiple'; + if (!isset($attributes['id'])) $attributes['id'] = $name; + $name .= '[]'; + } + + return self::input($token,$name,null,$attributes,false); + } + + public static function checkbox($token, $name, $value=null, array $attributes = null, $fill=Request::POST) { + if (!$attributes) $attributes = array(); + $attributes['type'] = 'checkbox'; + if ($value===null && !isset($attributes['value'])) $attributes['value'] = 1; + + if ($fill) { + $_name = $token . '-' . $name; + if ($fill == Request::POST && Request::isPost()) $_value = Request::post($_name, 0); + else if ($fill == Request::GET) $_value = Request::get($_name, 0); + + if (isset($_value) && !empty($_value)) { + $attributes['checked'] = 'checked'; + } else if (isset($_value) && empty($_value) && isset($attributes['checked'])) { + unset($attributes['checked']); + } + $fill = false; + } + + return self::input($token,$name,$value,$attributes,$fill); + } + + public static function radio($token, $name, $value=null, array $attributes = null, $fill=Request::POST) { + if (!$attributes) $attributes = array(); + $attributes['type'] = 'radio'; + if ($value===null && isset($attributes['value'])) $value = $attributes['value']; + + if ($fill) { + $_name = $token . '-' . $name; + if ($fill == Request::POST && Request::isPost()) $_value = Request::post($_name); + else if ($fill == Request::GET) $_value = Request::get($_name); + + if (isset($_value) && $_value == $value) { + $attributes['checked'] = 'checked'; + } else if (isset($_value) && $_value != $value && isset($attributes['checked'])) { + unset($attributes['checked']); + } + $fill = false; + } + + return self::input($token,$name,$value,$attributes,$fill); + } + + public static function textarea($token, $name, $value=null, array $attributes = null, $fill=Request::POST) { + $_name = self::getFieldName($token, $name); + if (!$attributes) $attributes = array(); + if (!isset($attributes['id'])) $attributes['id'] = $name; + $attributes['name'] = $_name; + + if ($fill) { + if ($fill == Request::POST && Request::isPost()) $_value = Request::post($_name); + else if($fill == Request::GET) $_value = Request::get($_name); + } + + if (isset($_value)) $value = $_value; + + return Helper::tag('textarea',$value,$attributes); + } + + public static function select($token, $name, array $options=null, $selected = null, array $attributes = null, $fill=Request::POST) { + $_name = self::getFieldName($token, $name); + if (!$options) $options = array(); + if (!$attributes) $attributes = array(); + if (!isset($attributes['id'])) $attributes['id'] = $name; + $attributes['name'] = $_name; + + if ($fill) { + if ($fill == Request::POST && Request::isPost()) $_value = Request::post($_name); + else if ($fill == Request::GET) $_value = Request::get($_name); + } + + if (isset($_value)) $selected = $_value; + + $html = Helper::tag_open('select',$attributes); + foreach($options as $k=>$v) { + $_attributes = array(); + $_attributes['value'] = $k; + if ($k == $selected) $_attributes['selected'] = 'selected'; + $html .= Helper::tag('option',$v,$_attributes); + } + $html .= Helper::tag_close('select'); + return $html; + } + + public static function button($label, array $attributes = null) { + return Helper::tag('button',$label,$attributes); + } + + public static function submit($label, array $attributes = null) { + if (!$attributes) $attributes = array(); + $attributes['type'] = 'submit'; + $attributes['value'] = $label; + + return Helper::tag_short('input',$attributes); + } + + public static function captcha($token,$image_wrapper_class='captcha_image',$input_wrapper_class='captcha_input',$input_class='captcha',$refresh_wrapper_class='captcha_refresh',$refresh_value = 'Reload') { + $html = Helper::tag_open('div',array('class'=>$image_wrapper_class)); + $html .= Helper::tag_short('img',array('src'=>Helper::url('captcha').'?token='.$token.'&t='.time(),'width'=>CAPTCHA_WIDTH,'height'=>CAPTCHA_HEIGHT,'id'=>$token.'-'.CAPTCHA_NAME.'-image')); + $html .= Helper::tag_close('div'); + + $html .= Helper::tag_open('div',array('class'=>$input_wrapper_class)); + $html .= self::input($token,CAPTCHA_NAME, null, array('class'=>$input_class,'autocomplete'=>'off'), false); + + $html .= Helper::tag_open('div',array('class'=>$refresh_wrapper_class)); + $html .= Helper::tag_open('a',array('href'=>'javascript:void(0)','onclick'=>'document.getElementById(\''.$token.'-'.CAPTCHA_NAME.'-image'.'\').src+=Math.floor(Math.random()*10);')); + $html .= $refresh_value; + $html .= Helper::tag_close('a'); + $html .= Helper::tag_close('div'); + + $html .= Helper::tag_close('div'); + + return $html; + } + + public static function generateCaptcha() { + $token = Request::get('token'); + if (!$token) return; + + $digit1 = rand(1,9); + $digit2 = rand(1,9); + + $result = $digit1 + $digit2; + Session::set(self::getFieldName($token, CAPTCHA_NAME),$result); + + $image = imagecreatetruecolor(CAPTCHA_WIDTH,CAPTCHA_HEIGHT); + + $size = CAPTCHA_HEIGHT*.8; + putenv('GDFONTPATH=' . realpath(ROOT_DIR . DIRECTORY_SEPARATOR . ASSETS_DIR . DIRECTORY_SEPARATOR . FONTS_DIR)); + + $bg = imagecolorallocate($image, rand(160,255), rand(160,255), rand(160,255)); + imagefill($image,0,0,$bg); + + for ($i=0;$i<30;$i++) { + $color= imagecolorallocate($image, rand(160,255), rand(160,255), rand(160,255)); + imagefilledellipse($image,rand(0,CAPTCHA_WIDTH),rand(0,CAPTCHA_HEIGHT),CAPTCHA_HEIGHT/3,CAPTCHA_HEIGHT/3,$color); + } + + $captcha_font = CAPTCHA_FONT; + + $color= imagecolorallocate($image, rand(0,155), rand(0,155), rand(0,155)); + try { + imagettftext($image,$size,rand(-15,15),CAPTCHA_WIDTH/5+(CAPTCHA_WIDTH/5-$size)/2,CAPTCHA_HEIGHT-(CAPTCHA_HEIGHT-$size)/2,$color,$captcha_font,$digit1); + } catch(\Exception $e) { + imagestring($image,$size,CAPTCHA_WIDTH/5+(CAPTCHA_WIDTH/5-$size)/2,(CAPTCHA_HEIGHT-$size)/2+$size/4,$digit1,$color); + } + + $sign = '+'; + $color= imagecolorallocate($image, rand(0,155), rand(0,155), rand(0,155)); + try { + imagettftext($image,$size,rand(-5,5),CAPTCHA_WIDTH*2/5+(CAPTCHA_WIDTH/5-$size)/2,CAPTCHA_HEIGHT-(CAPTCHA_HEIGHT-$size)/2,$color,$captcha_font,$sign); + } catch(\Exception $e) { + imagestring($image,$size,CAPTCHA_WIDTH*2/5+(CAPTCHA_WIDTH/5-$size)/2,(CAPTCHA_HEIGHT-$size)/2+$size/4,$sign,$color); + } + + $color= imagecolorallocate($image, rand(0,155), rand(0,155), rand(0,155)); + try { + imagettftext($image,$size,rand(-15,15),CAPTCHA_WIDTH*3/5+(CAPTCHA_WIDTH/5-$size)/2,CAPTCHA_HEIGHT-(CAPTCHA_HEIGHT-$size)/2,$color,$captcha_font,$digit2); + } catch(\Exception $e) { + imagestring($image,$size,CAPTCHA_WIDTH*3/5+(CAPTCHA_WIDTH/5-$size)/2,(CAPTCHA_HEIGHT-$size)/2+$size/4,$digit2,$color); + } + + $sign = '='; + $color= imagecolorallocate($image, rand(0,155), rand(0,155), rand(0,155)); + try { + imagettftext($image,$size,rand(-5,5),CAPTCHA_WIDTH*4/5+(CAPTCHA_WIDTH/5-$size)/2,CAPTCHA_HEIGHT-(CAPTCHA_HEIGHT-$size)/2,$color,$captcha_font,$sign); + } catch(\Exception $e) { + imagestring($image,$size,CAPTCHA_WIDTH*4/5+(CAPTCHA_WIDTH/5-$size)/2,(CAPTCHA_HEIGHT-$size)/2+$size/4,$sign,$color); + } + + imagejpeg($image,null,90); + } + + public static function isCaptchaValid($token,$method=Request::POST) { + $value = self::getValue($token,CAPTCHA_NAME,$method); + if (!$value) return false; + $captcha = Session::get(self::getFieldName($token, CAPTCHA_NAME)); + if (!$captcha) return false; + return $value == $captcha; + } + + public static function getValue($token,$name,$method=Request::POST) { + $_name = self::getFieldName($token, $name); + if ($method == Request::POST) { + return Request::post($_name); + } else if ($method == Request::FILES) { + return Request::file($_name); + } else if ($method == Request::GET) { + return Request::get($_name); + } else { + return null; + } + } +} \ No newline at end of file diff --git a/zira/form/validator.php b/zira/form/validator.php new file mode 100644 index 0000000..f9cb853 --- /dev/null +++ b/zira/form/validator.php @@ -0,0 +1,454 @@ +_token = $token; + } + + public function getToken() { + return $this->_token; + } + + public function setMethod($method) { + $this->_method = $method; + } + + public function setMultipart($multipart) { + $this->_multipart = (bool)$multipart; + } + + public function getMessage() { + return $this->_message; + } + + public function getErrorField() { + return $this->_error_field; + } + + protected function getValue(array $field, $method = null) { + if (!$method) $method = $this->_method; + $value = Form::getValue($field['token'],$field['name'],$method); + if ($value===null && $method == Request::POST && $this->_multipart) { + $value = Form::getValue($field['token'],$field['name'],Request::FILES); + } + return $value; + } + + public function registerString($field,$min_length,$max_length,$required,$message) { + $this->_fields []= array( + 'type' => self::TYPE_STRING, + 'token' => $this->_token, + 'name' => $field, + 'min' => $min_length, + 'max' => $max_length, + 'required' => $required, + 'message' => $message + ); + } + + protected function validateString(array $field) { + $value = $this->getValue($field); + $value = trim($value); + if ($field['required'] && empty($value)) return false; + if (!empty($value) && !is_string($value)) return false; + if (!empty($value) && $field['min']>0 && mb_strlen($value,CHARSET)<$field['min']) return false; + if (!empty($value) && $field['max']>0 && mb_strlen($value,CHARSET)>$field['max']) return false; + return true; + } + + public function registerNoTags($field,$message) { + $this->_fields []= array( + 'type' => self::TYPE_NO_TAGS, + 'token' => $this->_token, + 'name' => $field, + 'message' => $message + ); + } + + protected function validateNoTags(array $field) { + $value = $this->getValue($field); + if (empty($value)) return true; + if (strpos($value, '<')!==false || strpos($value, '>')!==false) return false; + return true; + } + + public function registerNumber($field,$min_value,$max_value,$required,$message) { + $this->_fields []= array( + 'type' => self::TYPE_NUMBER, + 'token' => $this->_token, + 'name' => $field, + 'min' => $min_value, + 'max' => $max_value, + 'required' => $required, + 'message' => $message + ); + } + + protected function validateNumber(array $field) { + $value = $this->getValue($field); + if ($field['required'] && $value===null) return false; + if ($value!==null && !is_numeric($value)) return false; + if ($value!==null && $field['min']!==null && $value<$field['min']) return false; + if ($value!==null && $field['max']!==null && $value>$field['max']) return false; + return true; + } + + public function registerEmail($field,$required,$message) { + $this->_fields []= array( + 'type' => self::TYPE_EMAIL, + 'token' => $this->_token, + 'name' => $field, + 'required' => $required, + 'message' => $message + ); + } + + protected function validateEmail(array $field) { + $value = $this->getValue($field); + if ($field['required'] && empty($value)) return false; + if (!empty($value)) { + return (boolean)preg_match( + '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' . + '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD', + $value + ); + } else { + return true; + } + } + + public function registerDate($field,$required,$message) { + $this->_fields []= array( + 'type' => self::TYPE_DATE, + 'token' => $this->_token, + 'name' => $field, + 'required' => $required, + 'message' => $message + ); + } + + protected function validateDate(array $field) { + $value = $this->getValue($field); + if ($field['required'] && empty($value)) return false; + if (!empty($value)) { + $format = Zira\Config::get('datepicker_date_format'); + $format = preg_quote($format); + $format = str_replace('M','[\d]', $format); + $format = str_replace('D','[\d]', $format); + $format = str_replace('Y','[\d]', $format); + return (boolean)preg_match( + '/^'.$format.'$/', + $value + ); + } else { + return true; + } + } + + public function registerPhone($field,$required,$message) { + $this->_fields []= array( + 'type' => self::TYPE_PHONE, + 'token' => $this->_token, + 'name' => $field, + 'required' => $required, + 'message' => $message + ); + } + + protected function validatePhone(array $field) { + $value = $this->getValue($field); + $value = str_replace(' ','',$value); + $value = str_replace('-','',$value); + if ($field['required'] && empty($value)) return false; + if (!empty($value)) { + return (boolean)preg_match( + '/^[+][\d]+$/', + $value + ); + } else { + return true; + } + } + + public function registerMatch($field1,$field2,$message) { + $this->_fields []= array( + 'type' => self::TYPE_MATCH, + 'name' => $field2, + 'fields' => array( + array( + 'token' => $this->_token, + 'name' => $field1 + ), + array( + 'token' => $this->_token, + 'name' => $field2 + ) + ), + 'message' => $message + ); + } + + protected function validateMatch(array $field) { + $value1 = $this->getValue($field['fields'][0]); + $value2 = $this->getValue($field['fields'][1]); + return $value1 == $value2; + } + + public function registerRegexp($field,$regexp,$message) { + $this->_fields []= array( + 'type' => self::TYPE_REGEXP, + 'token' => $this->_token, + 'name' => $field, + 'regexp' => $regexp, + 'message' => $message + ); + } + + protected function validateRegexp(array $field) { + $value = $this->getValue($field); + return (boolean)preg_match( + $field['regexp'], + $value + ); + } + + public function registerText($field,$min_length,$required,$message) { + $this->_fields []= array( + 'type' => self::TYPE_TEXT, + 'token' => $this->_token, + 'name' => $field, + 'min' => $min_length, + 'required' => $required, + 'message' => $message + ); + } + + protected function validateText(array $field) { + $value = $this->getValue($field); + $value = trim($value); + if ($field['required'] && empty($value)) return false; + if (!empty($value) && !is_string($value)) return false; + if (!empty($value) && $field['min']>0 && mb_strlen($value,CHARSET)<$field['min']) return false; + return true; + } + + public function registerFile($field,$max_size,array $extensions,$required,$message) { + $this->_fields []= array( + 'type' => self::TYPE_FILE, + 'token' => $this->_token, + 'name' => $field, + 'max' => $max_size, + 'extensions' => $extensions, + 'required' => $required, + 'message' => $message + ); + } + + protected function validateFile(array $field) { + $value = $this->getValue($field,Request::FILES); + $files = array(); + if (!empty($value) && !empty($value['name']) && !empty($value['tmp_name'])) { + if (is_array($value['tmp_name'])) { + foreach($value['tmp_name'] as $i=>$tmp_name) { + if (empty($tmp_name)) continue; + if (!isset($value['name'][$i])) return false; + if (empty($value['name'][$i])) continue; + $files[$tmp_name] = $value['name'][$i]; + } + } else { + $files[$value['tmp_name']] = $value['name']; + } + } + + if (!$field['required'] && empty($files)) return true; + if ($field['required'] && empty($files)) return false; + + foreach($files as $tmp_name=>$name) { + if (!file_exists($tmp_name)) return false; + if ($field['max']>0 && filesize($tmp_name)>$field['max']) return false; + + if (!empty($field['extensions'])) { + $ext = preg_replace('/^.+\.(.+?)$/iu','$1',$name); + if (!in_array($ext,$field['extensions'])) return false; + } + } + + return true; + } + + public function registerImage($field,$max_size,$required,$message) { + $this->_fields []= array( + 'type' => self::TYPE_IMAGE, + 'token' => $this->_token, + 'name' => $field, + 'max' => $max_size, + 'extensions' => array('jpg','jpeg','png','gif','JPG','JPEG','PNG','GIF'), + 'required' => $required, + 'message' => $message + ); + } + + protected function validateImage(array $field) { + if (!$this->validateFile($field)) return false; + + $value = $this->getValue($field,Request::FILES); + if (!empty($value) && !empty($value['name']) && !empty($value['tmp_name'])) { + if (is_array($value['tmp_name'])) { + foreach($value['tmp_name'] as $tmp_name) { + if (empty($tmp_name)) continue; + if (!@getimagesize($tmp_name)) return false; + } + } else if (!@getimagesize($value['tmp_name'])) return false; + } + return true; + } + + public function registerCaptcha($message) { + $this->_fields []= array( + 'type' => self::TYPE_CAPTCHA, + 'name' => CAPTCHA_NAME, + 'token' => $this->_token, + 'message' => $message + ); + } + + protected function validateCaptcha(array $field) { + return Form::isCaptchaValid($field['token'], $this->_method); + } + + public function registerCaptchaLazy($form_id, $message) { + $this->_fields []= array( + 'type' => self::TYPE_CAPTCHA_LAZY, + 'name' => CAPTCHA_NAME, + 'token' => $this->_token, + 'form_id' => $form_id, + 'message' => $message + ); + } + + protected function validateCaptchaLazy(array $field) { + if ($this->getValue($field)===null && !Zira\Models\Captcha::isActive($field['form_id'])) { + Zira\Models\Captcha::register($field['form_id']); + return true; + } else { + Zira\Models\Captcha::register($field['form_id']); + return Form::isCaptchaValid($field['token'], $this->_method); + } + } + + public function registerExists($field,$class,$property,$message) { + $this->_fields []= array( + 'type' => self::TYPE_EXISTS, + 'token' => $this->_token, + 'name' => $field, + 'class' => $class, + 'property' => $property, + 'message' => $message + ); + } + + protected function validateExists(array $field) { + $value = $this->getValue($field); + try { + $collection = new Zira\Db\Collection($field['class']); + $co = $collection->count() + ->where($field['property'],'=',$value) + ->get('co'); + return $co==0; + } catch (\Exception $e) { + Zira::getInstance()->exception($e); + return false; + } + } + + public function registerCustom(array $class_method,$fields,$message) { + if (is_array($fields)) $name = reset($fields); + else $name = (string)$fields; + $this->_fields []= array( + 'type' => self::TYPE_CUSTOM, + 'class_method' => $class_method, + 'token' => $this->_token, + 'name' => $name, + 'fields' => $fields, + 'message' => $message + ); + } + + protected function validateCustom($field) { + $fields = $field['fields']; + if (!is_array($fields)) { + $value = $this->getValue($field); + return call_user_func($field['class_method'],$value); + } else { + $args = array(); + foreach($fields as $name) { + $field['name'] = $name; + $args[]=$this->getValue($field); + } + return call_user_func_array($field['class_method'],$args); + } + } + + public function validate() { + foreach($this->_fields as $field) { + if (!$this->validateField($field)) { + $this->_message = $field['message']; + $this->_error_field = $field['name']; + return false; + } + } + return true; + } + + protected function validateField(array $field) { + if ($field['type']==self::TYPE_STRING && !$this->validateString($field)) return false; + if ($field['type']==self::TYPE_NO_TAGS && !$this->validateNoTags($field)) return false; + if ($field['type']==self::TYPE_NUMBER && !$this->validateNumber($field)) return false; + if ($field['type']==self::TYPE_EMAIL && !$this->validateEmail($field)) return false; + if ($field['type']==self::TYPE_DATE && !$this->validateDate($field)) return false; + if ($field['type']==self::TYPE_MATCH && !$this->validateMatch($field)) return false; + if ($field['type']==self::TYPE_PHONE && !$this->validatePhone($field)) return false; + if ($field['type']==self::TYPE_REGEXP && !$this->validateRegexp($field)) return false; + if ($field['type']==self::TYPE_TEXT && !$this->validateText($field)) return false; + if ($field['type']==self::TYPE_FILE && !$this->validateFile($field)) return false; + if ($field['type']==self::TYPE_IMAGE && !$this->validateImage($field)) return false; + if ($field['type']==self::TYPE_EXISTS && !$this->validateExists($field)) return false; + if ($field['type']==self::TYPE_CAPTCHA && !$this->validateCaptcha($field)) return false; + if ($field['type']==self::TYPE_CAPTCHA_LAZY && !$this->validateCaptchaLazy($field)) return false; + if ($field['type']==self::TYPE_CUSTOM && !$this->validateCustom($field)) return false; + return true; + } +} \ No newline at end of file diff --git a/zira/forms/comment.php b/zira/forms/comment.php new file mode 100644 index 0000000..1be5cbd --- /dev/null +++ b/zira/forms/comment.php @@ -0,0 +1,84 @@ +_id); + } + + protected function _init() { + $this->setAjax(true); + $this->setUrl('comment'); + $this->setTitle(Locale::t('Leave a comment')); + $this->setDescription(Locale::t('Message should contain at least %s characters', Config::get('comment_min_chars', 10))); + $script = Helper::tag_open('script', array('type'=>'text/javascript')); + $script .= 'jQuery(document).ready(function(){ jQuery(\'#'.$this->getId().'\').bind(\'xhr-submit-success\', function(){ zira_reset_comments_form(true); }); });'; + $script .= Helper::tag_close('script'); + View::addHTML($script, View::VAR_BODY_BOTTOM); + } + + protected function _render() { + $html = $this->open(); + $html .= $this->hidden('record_id'); + $html .= $this->hidden('parent_id'); + $html .= Helper::tag('div',null,array('class'=>'form-group comment-reply-preview')); + if(!User::isAuthorized()) { + $html .= $this->input(Locale::t('Name'), 'sender_name'); + } else { + $html .= $this->hidden('sender_name'); + } + + $extra_items = \Zira\Hook::run(\Zira\Page::USER_TEXTAREA_HOOK); + if (!empty($extra_items)) { + $html .= Helper::tag_open('div',array('class'=>'user-text-form-extra-items')); + foreach($extra_items as $item) { + $html .= Helper::tag_open('div',array('class'=>'user-text-form-extra-item')); + $html .= $item; + $html .= Helper::tag_close('div'); + } + $html .= Helper::tag_close('div'); + } + + $html .= $this->textarea(Locale::t('Message').'*','comment'); + if (Config::get('comments_captcha',true)) { + $html .= $this->captcha(Locale::t('Enter result').'*'); + } else { + $html .= $this->captchaLazy(Locale::t('Enter result') . '*'); + } + $html .= $this->submit(Locale::t('Submit')); + $html .= $this->close(); + return $html; + } + + protected function _validate() { + $validator = $this->getValidator(); + if (Config::get('comments_captcha',true)) { + $validator->registerCaptcha(Locale::t('Wrong CAPTCHA result')); + } else { + $validator->registerCaptchaLazy($this->_id, Locale::t('Wrong CAPTCHA result')); + } + $validator->registerNumber('record_id', null, null, true, Locale::t('An error occurred')); + $validator->registerString('sender_name', 2, 255, false, Locale::t('Invalid name')); + $validator->registerNoTags('sender_name', Locale::t('Invalid name')); + $validator->registerText('comment', Config::get('comment_min_chars', 10), true, Locale::t('Message should contain at least %s characters', Config::get('comment_min_chars', 10))); + $validator->registerString('comment', null, self::MAX_CHARS, true, Locale::t('Sorry, your comment is too big')); + $validator->registerNoTags('comment', Locale::t('Message contains bad character')); + } +} \ No newline at end of file diff --git a/zira/forms/contact.php b/zira/forms/contact.php new file mode 100644 index 0000000..9451f28 --- /dev/null +++ b/zira/forms/contact.php @@ -0,0 +1,57 @@ +_id); + } + + protected function _init() { + $this->setUrl('contact'); + $this->setTitle(Locale::t('Send message')); + if (!User::isAuthorized()) { + $this->setDescription(Locale::t('Please specify your name and Email address')); + } else { + $this->setDescription(Locale::t('Message should contain at least %s characters', self::MIN_CHARS)); + } + } + + protected function _render() { + $html = $this->open(); + if (!User::isAuthorized()) { + $html .= $this->input(Locale::t('Name'), 'name'); + $html .= $this->input(Locale::t('Email'), 'email'); + } + $html .= $this->textarea(Locale::t('Message').'*','message'); + $html .= $this->captcha(Locale::t('Enter result').'*'); + $html .= $this->submit(Locale::t('Submit')); + $html .= $this->close(); + return $html; + } + + protected function _validate() { + $validator = $this->getValidator(); + $validator->registerCaptcha(Locale::t('Wrong CAPTCHA result')); + $validator->registerString('name', 2, 255, false, Locale::t('Invalid name')); + $validator->registerNoTags('name', Locale::t('Invalid name')); + $validator->registerEmail('email', false, Locale::t('Invalid email')); + $validator->registerText('message', self::MIN_CHARS, true, Locale::t('Message should contain at least %s characters', self::MIN_CHARS)); + $validator->registerString('message', null, self::MAX_CHARS, true, Locale::t('Sorry, your message is too big')); + $validator->registerNoTags('message', Locale::t('Message contains bad character')); + } +} \ No newline at end of file diff --git a/zira/forms/search.php b/zira/forms/search.php new file mode 100644 index 0000000..0a77588 --- /dev/null +++ b/zira/forms/search.php @@ -0,0 +1,134 @@ +_is_token_unique = true; + parent::__construct($this->_id); + } + + public function setExtended($extended) { + $this->_extended = $extended; + } + + protected function _init() { + $this->setUrl('search'); + $this->setMethod(Request::GET); + $this->setRenderPanel(false); + if (!$this->_extended) { + $script = Helper::tag_open('script', array('type'=>'text/javascript')); + $script .= 'jQuery(document).ready(function(){ zira_init_search(jQuery(\'#'.$this->getId().'\')); });'; + $script .= Helper::tag_close('script'); + View::addHTML($script, View::VAR_BODY_BOTTOM); + } + } + + public function getValue($name, $default = NULL) { + return Request::get($name, $default); + } + + public function setValue($name, $value) { + Request::setGet($name, $value); + } + + public function input($label, $name, array $attributes = NULL) { + if (!$attributes) $attributes = array(); + $attributes['type'] = 'text'; + $attributes['id'] = $name; + $attributes['name'] = $name; + + $_value = trim($this->getValue($name)); + + if (isset($_value)) $attributes['value'] = $_value; + else if (!isset($attributes['value'])) $attributes['value'] = ''; + + return Helper::tag_short('input',$attributes); + } + + protected function _render() { + if (!$this->_extended) { + return $this->_renderSimple(); + } else { + return $this->_renderExtended(); + } + } + + protected function _renderSimple() { + $html = $this->open(array('class'=>'search-simple-form navbar-form navbar-right','role'=>'search')); + $html .= Helper::tag_open('div',array('class'=>'form-group input-group')); + $html .= $this->input(null,'text', array('class'=>$this->_input_class, 'placeholder'=>Locale::t('Search'),'autocomplete'=>'off')); + $html .= Helper::tag_open('span',array('class'=>'input-group-btn')); + $html .= Helper::tag_open('button',array('type'=>'submit','class'=>'btn btn-default')); + $html .= Helper::tag('span', null, array('class'=>'glyphicon glyphicon-search')); + $html .= Helper::tag_close('button'); + $html .= Helper::tag_close('span'); + $html .= Helper::tag_close('div'); + $html .= $this->close(); + return $html; + } + + protected function _renderExtended() { + $html = $this->open(array('class'=>'search-extended-form','role'=>'search')); + $html .= Helper::tag_open('div',array('class'=>'form-group input-group')); + $html .= Helper::tag_open('span',array('class'=>'input-group-addon')); + $html .= Helper::tag('span', null, array('class'=>'glyphicon glyphicon-search')); + $html .= Helper::tag_close('span'); + $html .= $this->input(null,'text', array('class'=>$this->_input_class)); + $html .= Helper::tag_open('span',array('class'=>'input-group-btn')); + $html .= Helper::tag_open('button',array('type'=>'submit','class'=>'btn btn-default')); + $html .= Locale::t('Search'); + $html .= Helper::tag_close('button'); + $html .= Helper::tag_close('span'); + $html .= Helper::tag_close('div'); + $html .= $this->close(); + return $html; + } + + protected function _validate() { + $validator = $this->getValidator(); + $validator->setMethod(Request::GET); + $validator->registerCustom(array(get_class(), 'validateString'), 'text', Locale::t('Invalid search text')); + $validator->registerCustom(array(get_class(), 'validateNoTags'), 'text', Locale::t('Search text contains bad character')); + } + + public static function validateString($ignore) { + return self::_validateString('text', \Zira\Models\Search::MIN_CHARS, 255, false); + } + + public static function _validateString($name, $min, $max, $required) { + $value = Request::get($name); + $value = trim($value); + if ($required && empty($value)) return false; + if (!empty($value) && !is_string($value)) return false; + if (!empty($value) && $min>0 && mb_strlen($value,CHARSET)<$min) return false; + if (!empty($value) && $max>0 && mb_strlen($value,CHARSET)>$max) return false; + return true; + } + + public static function validateNoTags($ignore) { + return self::_validateNoTags('text'); + } + + public static function _validateNoTags($name) { + $value = Request::get($name); + if (empty($value)) return true; + if (strpos($value, '<')!==false || strpos($value, '>')!==false) return false; + if (strpos($value, '%')!==false) return false; + return true; + } +} \ No newline at end of file diff --git a/zira/forms/user/avatar.php b/zira/forms/user/avatar.php new file mode 100644 index 0000000..c6716a4 --- /dev/null +++ b/zira/forms/user/avatar.php @@ -0,0 +1,120 @@ +_id); + } + + protected function _init() { + $w = intval(Config::get('user_thumb_width')); + $h = intval(Config::get('user_thumb_height')); + + View::addCropper($this->_cropper_id, array( + 'dst_w' => $w, + 'dst_h' => $h, + 'sel_w' => $w, + 'sel_h' => $h, + 'sel_mw' => $w, + 'sel_mh' => $h, + 'fixed' => true, + 'preview' => true, + 'previewer' => $this->_previewer_id, + 'input_w'=>'cropper_w', + 'input_h'=>'cropper_h', + 'input_x'=>'cropper_x', + 'input_y'=>'cropper_y' + )); + $this->setTitle(Locale::t('Change avatar')); + $this->setDescription(Locale::t('Select your desired area')); + } + + protected function _render() { + $image = $this->getValue('image'); + $filename = User::getUserPhotoFilename($image); + $url = Helper::baseUrl(UPLOADS_DIR . '/' . USERS_DIR . '/' . $filename); + $size = @getimagesize(File::getAbsolutePath(USERS_DIR). DIRECTORY_SEPARATOR . $filename); + if ($size[0]>$size[1]) { + $height = $this->_cropper_width; + $width = round($height * $size[0] / $size[1]); + } else { + $width = $this->_cropper_width; + $height = round($width * $size[1] / $size[0]); + } + + $html = $this->open(); + $html .= Helper::tag_open('div',array('class'=>$this->_group_class)); + $html .= Helper::tag('label', Locale::t('Photo'), array('class'=>$this->_label_class)); + $html .= Helper::tag_open('div',array('class'=>$this->_input_wrap_class)); + $html .= Helper::tag_short('img', array('src'=>$url,'width'=>$width,'height'=>$height,'id'=>$this->_cropper_id)); + $html .= Helper::tag_close('div'); + $html .= Helper::tag_close('div'); + $html .= Helper::tag_open('div',array('class'=>$this->_group_class)); + $html .= Helper::tag('label', Locale::t('Avatar'), array('class'=>$this->_label_class)); + $html .= Helper::tag_open('div',array('class'=>$this->_input_wrap_class)); + $html .= Helper::tag('div', null, array('id'=>$this->_previewer_id)); + $html .= Helper::tag_close('div'); + $html .= Helper::tag_close('div'); + $html .= $this->hidden('cropper_w'); + $html .= $this->hidden('cropper_h'); + $html .= $this->hidden('cropper_x'); + $html .= $this->hidden('cropper_y'); + if (!User::isUserPasswordChecked()) { + $html .= $this->password(Locale::t('Current password').'*','password-current'); + } + $html .= $this->captchaLazy(Locale::t('Enter result').'*'); + $html .= $this->submit(Locale::t('Submit')); + $html .= $this->close(); + return $html; + } + + protected function _validate() { + $validator = $this->getValidator(); + $validator->registerCaptchaLazy($this->_id, Locale::t('Wrong CAPTCHA result')); + if (!User::isUserPasswordChecked()) { + $validator->registerString('password-current',User::PASSWORD_MIN_CHARS,User::PASSWORD_MAX_CHARS,true,Locale::t('Invalid password')); + $validator->registerCustom(array(get_class(), 'checkPassword'), 'password-current', Locale::t('Current password incorrect')); + } + $width = floatval($this->getValue('cropper_w')); + $height = floatval($this->getValue('cropper_h')); + $left = floatval($this->getValue('cropper_x')); + $top = floatval($this->getValue('cropper_y')); + + $this->updateValues(array( + 'cropper_w' => $width, + 'cropper_h' => $height, + 'cropper_x' => $left, + 'cropper_y' => $top + )); + } + + public static function checkPassword($password) { + $user = User::getCurrent(); + if (!$user || !User::isAuthorized()) return false; + $success = User::isPasswordCorrect($user->username, $password); + if ($success) { + User::setUserPasswordChecked(); + } + return $success; + } +} \ No newline at end of file diff --git a/zira/forms/user/compose.php b/zira/forms/user/compose.php new file mode 100644 index 0000000..6f3a60b --- /dev/null +++ b/zira/forms/user/compose.php @@ -0,0 +1,148 @@ +_id); + } + + public function getUsers() { + return self::$_users; + } + + protected function _init() { + $this->setAjax(true); + $this->setTitle(Locale::t('New message')); + $this->setDescription(Locale::t('Please enter user login, full name or ID')); + $script = Helper::tag_open('script', array('type'=>'text/javascript')); + $script .= 'jQuery(document).ready(function(){'; + $script .= 'jQuery(\'#'.$this->getId().'\').bind(\'xhr-submit-success\', function(){'; + $script .= 'jQuery(\'#'.$this->getId().'\').get(0).reset();'; + $script .= '});'; + $script .= 'jQuery(\'#'.$this->getId().'\').bind(\'xhr-submit-error\', function(){'; + $script .= 'jQuery(\'.zira_form_compose_add_recipient_input\').each(function(){'; + $script .= 'var text = jQuery(this).data(\'autocomplete_text\');'; + $script .= 'if (typeof(text)!="undefined" && text) jQuery(this).val(text);'; + $script .= '});'; + $script .= '});'; + $script .= 'jQuery(\'.zira_form_compose_add_recipient_input\').parent().append(\'\');'; + $script .= 'jQuery(\'.zira_form_compose_add_recipient_btn\').click(function(e){'; + $script .= 'e.stopPropagation(); e.preventDefault();'; + $script .= 'if (jQuery(\'.zira_form_compose_add_recipient_input\').length>='.self::MAX_RECIPIENTS.') return;'; + $script .= 'var con = jQuery(\'.zira_form_compose_add_recipient_input\').last().parents(\'.form-group\');'; + $script .= '$(con).after(\'
    \'+$(con).html()+\'
    \');'; + $script .= 'if (jQuery(\'.zira_form_compose_add_recipient_input\').length>='.self::MAX_RECIPIENTS.'){'; + $script .= 'jQuery(\'.zira_form_compose_add_recipient_btn\').attr(\'disabled\',\'disabled\');'; + $script .= '}'; + $script .= '});'; + $script .= 'jQuery(\'.container #content\').on(\'click\', \'.zira_form_compose_remove_recipient_input\', function(e){'; + $script .= 'jQuery(this).parents(\'.form-group\').remove();'; + $script .= 'if (jQuery(\'.zira_form_compose_add_recipient_input\').length<'.self::MAX_RECIPIENTS.'){'; + $script .= 'jQuery(\'.zira_form_compose_add_recipient_btn\').removeAttr(\'disabled\');'; + $script .= '}'; + $script .= '});'; + $script .= 'jQuery(\'#'.$this->getId().'\').submit(function(){'; + $script .= 'jQuery(\'.zira_form_compose_add_recipient_input\').each(function(){'; + $script .= 'var id = jQuery(this).data(\'autocomplete_id\');'; + $script .= 'if (typeof(id)!="undefined" && id) jQuery(this).val(id);'; + $script .= '});'; + $script .= '});'; + $script .= '});'; + $script .= Helper::tag_close('script'); + View::addHTML($script, View::VAR_BODY_BOTTOM); + View::addAutoCompleter(); + } + + protected function _render() { + $html = $this->open(); + $html .= $this->input(Locale::t('Recipient').'*','users[]',array('class'=>'form-control form-input-autocomplete zira_form_compose_add_recipient_input','data-url'=>Zira\Helper::url('user/autocomplete'),'data-token'=>Zira\User::getToken())); + $html .= $this->button(Locale::t('Add recipient'), array('class'=>'btn btn-default zira_form_compose_add_recipient_btn','type'=>'button')); + $html .= $this->input(Locale::t('Subject').'*','subject'); + + $extra_items = \Zira\Hook::run(\Zira\Page::USER_TEXTAREA_HOOK); + if (!empty($extra_items)) { + $html .= Helper::tag_open('div',array('class'=>'user-text-form-extra-items')); + foreach($extra_items as $item) { + $html .= Helper::tag_open('div',array('class'=>'user-text-form-extra-item')); + $html .= $item; + $html .= Helper::tag_close('div'); + } + $html .= Helper::tag_close('div'); + } + + $html .= $this->textarea(Locale::t('Message').'*', 'content'); + $html .= $this->captchaLazy(Locale::t('Enter result').'*'); + $html .= $this->submit(Locale::t('Submit')); + $html .= $this->close(); + return $html; + } + + protected function _validate() { + $validator = $this->getValidator(); + $validator->registerCaptchaLazy($this->_id, Locale::t('Wrong CAPTCHA result')); + $validator->registerString('subject', null, 255, true, Locale::t('Please specify the subject of your message')); + $validator->registerNoTags('subject', Locale::t('Subject contains bad character')); + $validator->registerText('content', \Zira\Models\Message::MIN_CHARS, true, Locale::t('Message should contain at least %s characters', \Zira\Models\Message::MIN_CHARS)); + $validator->registerNoTags('content', Locale::t('Message contains bad character')); + $validator->registerCustom(array(get_class(), 'checkUsers'), 'users', Locale::t('Please enter correct user login, full name or ID')); + } + + public static function checkUsers($users) { + if (!is_array($users) || empty($users)) return false; + if (count($users)>self::MAX_RECIPIENTS) return false; + $added = array(); + foreach($users as $user_id) { + if (empty($user_id)) { + return false; + } else if (is_numeric($user_id)) { + $user = new Zira\Models\User($user_id); + if (!$user->loaded() || !$user->active) return false; + } else if (strpos($user_id, ' ')>0) { + $parts = explode(' ', $user_id); + if (count($parts)!=2) return false; + $_user = Zira\Models\User::getCollection() + ->where('firstname','=',$parts[0]) + ->and_where('secondname','=',$parts[1]) + ->and_where('active','=',Zira\Models\User::STATUS_ACTIVE) + ->order_by('id','asc') + ->limit(1) + ->get(0, true); + if (!$_user) return false; + $user = new Zira\Models\User(); + $user->loadFromArray($_user); + } else { + $_user = Zira\Models\User::getCollection() + ->where('username','=',$user_id) + ->and_where('active','=',Zira\Models\User::STATUS_ACTIVE) + ->limit(1) + ->order_by('id','asc') + ->get(0, true); + if (!$_user) return false; + $user = new Zira\Models\User(); + $user->loadFromArray($_user); + } + if (Zira\User::isSelf($user)) return false; + if (in_array($user->id, $added)) continue; + self::$_users []= $user; + $added []= $user->id; + } + return true; + } +} \ No newline at end of file diff --git a/zira/forms/user/confirm.php b/zira/forms/user/confirm.php new file mode 100644 index 0000000..e2f4c84 --- /dev/null +++ b/zira/forms/user/confirm.php @@ -0,0 +1,69 @@ +_id); + } + + protected function _init() { + $this->setTitle(Locale::t('Email confirmation')); + $this->setDescription(Locale::t('Verification code was sent to your Email address')); + } + + protected function _render() { + $html = $this->open(); + if (!User::isAuthorized()) { + $html .= $this->input(Locale::t('Username or Email').'*','login'); + } + $html .= $this->input(Locale::t('Verification code').'*','code'); + $html .= $this->captchaLazy(Locale::t('Enter result').'*'); + $html .= $this->submit(Locale::t('Submit')); + $html .= Helper::tag_open('p',array('class'=>'text-right')); + $html .= Helper::tag('a', Locale::t('Did not recieve verification code ?'), array('href'=>Helper::url('user/send'))); + $html .= Helper::tag_close('p'); + $html .= $this->close(); + return $html; + } + + protected function _validate() { + $validator = $this->getValidator(); + $validator->registerCaptchaLazy($this->_id, Locale::t('Wrong CAPTCHA result')); + $validator->registerString('code', 0, 0, true, Locale::t('Incorrect verification code')); + if (!User::isAuthorized()) { + $login = (string)$this->getValue('login'); + $is_email = strpos($login, '@') !== false; + + if (!$is_email) { + $validator->registerString('login',User::LOGIN_MIN_CHARS,User::LOGIN_MAX_CHARS,true,Locale::t('Invalid username')); + $validator->registerRegexp('login', User::REGEXP_LOGIN, Locale::t('Login must contain only letters and numbers')); + } else { + $validator->registerEmail('login',true,Locale::t('Invalid email')); + } + $validator->registerCustom(array(get_class(), 'checkVerificationCode'), array('code','login'), Locale::t('Incorrect verification code')); + } else { + $validator->registerCustom(array(get_class(), 'checkVerificationCode'), array('code'), Locale::t('Incorrect verification code')); + } + } + + public static function checkVerificationCode($code, $login=null) { + if (User::isAuthorized()) { + $current = User::getCurrent(); + $login = $current->username; + } + return User::isVerificationCodeCorrect($login, $code); + } +} \ No newline at end of file diff --git a/zira/forms/user/conversation.php b/zira/forms/user/conversation.php new file mode 100644 index 0000000..6cd8256 --- /dev/null +++ b/zira/forms/user/conversation.php @@ -0,0 +1,54 @@ +_recipient = $recipient; + parent::__construct($this->_id); + } + + protected function _init() { + $this->setAjax(true); + $this->setTitle(Locale::t('New message')); + $this->setDescription(Locale::t('Message to: %s', User::getProfileName($this->_recipient))); + $script = Helper::tag_open('script', array('type'=>'text/javascript')); + $script .= 'jQuery(document).ready(function(){ jQuery(\'#'.$this->getId().'\').bind(\'xhr-submit-success\', function(){ jQuery(\'#'.$this->getId().'\').get(0).reset(); }); });'; + $script .= Helper::tag_close('script'); + View::addHTML($script, View::VAR_BODY_BOTTOM); + } + + protected function _render() { + $html = $this->open(); + $html .= $this->input(Locale::t('Subject').'*','subject'); + $html .= $this->textarea(Locale::t('Message').'*', 'content'); + $html .= $this->captchaLazy(Locale::t('Enter result').'*'); + $html .= $this->submit(Locale::t('Submit')); + $html .= $this->close(); + return $html; + } + + protected function _validate() { + $validator = $this->getValidator(); + $validator->registerCaptchaLazy($this->_id, Locale::t('Wrong CAPTCHA result')); + $validator->registerString('subject', null, 255, true, Locale::t('Please specify the subject of your message')); + $validator->registerNoTags('subject', Locale::t('Subject contains bad character')); + $validator->registerText('content', \Zira\Models\Message::MIN_CHARS, true, Locale::t('Message should contain at least %s characters', \Zira\Models\Message::MIN_CHARS)); + $validator->registerNoTags('content', Locale::t('Message contains bad character')); + } +} \ No newline at end of file diff --git a/zira/forms/user/edit.php b/zira/forms/user/edit.php new file mode 100644 index 0000000..0726f47 --- /dev/null +++ b/zira/forms/user/edit.php @@ -0,0 +1,91 @@ +_id); + } + + protected function _init() { + $this->initDatepicker('dob', 'years', date('Y-m-d')); + $this->setTitle(Locale::t('Change profile')); + $this->setDescription(Locale::t('Please enter your first name and second name')); + } + + protected function _render() { + $html = $this->open(); + $html .= $this->input(Locale::t('First name').'*','firstname'); + $html .= $this->input(Locale::t('Second name').'*','secondname'); + $html .= $this->input(Locale::t('Country'),'country'); + $html .= $this->input(Locale::t('City'),'city'); + $html .= $this->input(Locale::t('Street'),'street'); + $html .= $this->input(Locale::t('Phone'),'phone', array('placeholder'=>'+7...')); + $html .= $this->datepicker(Locale::t('Date of birth'), 'dob'); + if (!User::isUserPasswordChecked()) { + $html .= $this->password(Locale::t('Current password').'*','password-current'); + } + $html .= $this->captchaLazy(Locale::t('Enter result').'*'); + $html .= $this->submit(Locale::t('Submit')); + $html .= $this->close(); + return $html; + } + + protected function _validate() { + $validator = $this->getValidator(); + $validator->registerCaptchaLazy($this->_id, Locale::t('Wrong CAPTCHA result')); + $validator->registerString('firstname',0,0,true,Locale::t('Please enter your first name')); + $validator->registerString('secondname',0,0,true,Locale::t('Please enter your second name')); + $validator->registerNoTags('firstname', Locale::t('Invalid character specified')); + $validator->registerNoTags('secondname', Locale::t('Invalid character specified')); + $validator->registerNoTags('country', Locale::t('Invalid character specified')); + $validator->registerNoTags('city', Locale::t('Invalid character specified')); + $validator->registerNoTags('street', Locale::t('Invalid character specified')); + $validator->registerPhone('phone', false, Locale::t('Phone should be specified in international format')); + $validator->registerDate('dob', false, Locale::t('Invalid date format')); + if (!User::isUserPasswordChecked()) { + $validator->registerString('password-current',User::PASSWORD_MIN_CHARS,User::PASSWORD_MAX_CHARS,true,Locale::t('Invalid password')); + $validator->registerCustom(array(get_class(), 'checkPassword'), 'password-current', Locale::t('Current password incorrect')); + } + + $firstname = trim((string)$this->getValue('firstname')); + $secondname = trim((string)$this->getValue('secondname')); + $country = trim((string)$this->getValue('country')); + $city = trim((string)$this->getValue('city')); + $street = trim((string)$this->getValue('street')); + $phone = trim((string)$this->getValue('phone')); + if (!empty($phone)) { + $phone = str_replace(' ','',$phone); + $phone = str_replace('-','',$phone); + } + $this->updateValues(array( + 'firstname' => $firstname, + 'secondname' => $secondname, + 'country' => $country, + 'city' => $city, + 'street' => $street, + 'phone' => $phone + )); + } + + public static function checkPassword($password) { + $user = User::getCurrent(); + if (!$user || !User::isAuthorized()) return false; + $success = User::isPasswordCorrect($user->username, $password); + if ($success) { + User::setUserPasswordChecked(); + } + return $success; + } +} \ No newline at end of file diff --git a/zira/forms/user/email.php b/zira/forms/user/email.php new file mode 100644 index 0000000..ba56314 --- /dev/null +++ b/zira/forms/user/email.php @@ -0,0 +1,72 @@ +_id); + } + + protected function _init() { + $this->setTitle(Locale::t('Change email')); + $this->setDescription(Locale::t('Enter a valid email')); + } + + protected function _render() { + $html = $this->open(); + $html .= $this->input(Locale::t('Email').'*','email'); + $html .= $this->checkbox(Locale::t('recieve notifications'), 'subscribed'); + if (!User::isUserPasswordChecked()) { + $html .= $this->password(Locale::t('Current password').'*','password-current'); + } + $html .= $this->captchaLazy(Locale::t('Enter result').'*'); + $html .= $this->submit(Locale::t('Submit')); + $html .= $this->close(); + return $html; + } + + protected function _validate() { + $validator = $this->getValidator(); + $validator->registerCaptchaLazy($this->_id, Locale::t('Wrong CAPTCHA result')); + $validator->registerEmail('email',true,Locale::t('Invalid email')); + if (!User::isUserPasswordChecked()) { + $validator->registerString('password-current',User::PASSWORD_MIN_CHARS,User::PASSWORD_MAX_CHARS,true,Locale::t('Invalid password')); + $validator->registerCustom(array(get_class(), 'checkPassword'), 'password-current', Locale::t('Current password incorrect')); + } + //$validator->registerExists('email', \Zira\Models\User::getClass(), 'email', Locale::t('Specified email already exists')); + $validator->registerCustom(array(get_class(), 'checkEmailExists'), 'email', Locale::t('Specified email already exists')); + } + + public static function checkEmailExists($email) { + $user = User::getCurrent(); + if (!$user || !User::isAuthorized()) return false; + $exists = \Zira\Models\User::getCollection() + ->count() + ->where('email','=',$email) + ->and_where('id','<>',$user->id) + ->get('co'); + + return !(bool)$exists; + } + + public static function checkPassword($password) { + $user = User::getCurrent(); + if (!$user || !User::isAuthorized()) return false; + $success = User::isPasswordCorrect($user->username, $password); + if ($success) { + User::setUserPasswordChecked(); + } + return $success; + } +} \ No newline at end of file diff --git a/zira/forms/user/login.php b/zira/forms/user/login.php new file mode 100644 index 0000000..5c49475 --- /dev/null +++ b/zira/forms/user/login.php @@ -0,0 +1,93 @@ +_id); + } + + protected function _init() { + $action = 'user/login'; + $redirect = Request::get('redirect'); + if (!empty($redirect) && strpos($redirect, '//')===false && strpos($redirect, '.')===false) $action .= '?redirect='.$redirect; + $this->setUrl($action); + $this->setTitle(Locale::t('Sign In')); + $this->setDescription(Locale::t('Enter your username or email')); + $script = Helper::tag_open('script', array('type'=>'text/javascript')); + $script .= 'jQuery(document).ready(function(){ jQuery(\'#'.$this->getId().'\').find(\'input[type=text]\').focus(); });'; + $script .= Helper::tag_close('script'); + View::addHTML($script, View::VAR_HEAD_BOTTOM); + } + + protected function _render() { + $html = $this->open(); + $html .= $this->input(Locale::t('Username or Email').'*','login'); + $html .= $this->password(Locale::t('Password').'*','password'); + $html .= $this->checkbox(Locale::t('Remember me'), 'rememberme'); + $html .= $this->captchaLazy(Locale::t('Enter result').'*'); + $html .= $this->submit(Locale::t('Submit')); + + $extra_items = \Zira\Hook::run(self::HOOK_NAME); + if (!empty($extra_items)) { + $html .= Helper::tag_open('div',array('class'=>'user-login-form-extra-items')); + foreach($extra_items as $item) { + $html .= Helper::tag_open('div',array('class'=>'user-login-form-extra-item')); + $html .= $item; + $html .= Helper::tag_close('div'); + } + $html .= Helper::tag_close('div'); + } + + $html .= Helper::tag_open('p',array('class'=>'text-right')); + $html .= Helper::tag('a', Locale::t('Forgot password ?'), array('href'=>Helper::url('user/recover'))); + if (\Zira\Config::get('user_signup_allow')) { + $html .= ' | '; + $html .= Helper::tag('a', Locale::t('Sign Up'), array('href' => Helper::url('user/signup'))); + } + $html .= Helper::tag_close('p'); + $html .= $this->close(); + return $html; + } + + protected function _validate() { + $login = (string)$this->getValue('login'); + $is_email = strpos($login, '@') !== false; + + $validator = $this->getValidator(); + $validator->registerCaptchaLazy($this->_id, Locale::t('Wrong CAPTCHA result')); + if (!$is_email) { + $validator->registerString('login',User::LOGIN_MIN_CHARS,User::LOGIN_MAX_CHARS,true,Locale::t('Invalid username')); + $validator->registerRegexp('login', User::REGEXP_LOGIN, Locale::t('Login must contain only letters and numbers')); + } else { + $validator->registerEmail('login',true,Locale::t('Invalid email')); + } + $validator->registerString('password',User::PASSWORD_MIN_CHARS,User::PASSWORD_MAX_CHARS,true,Locale::t('Invalid password')); + $validator->registerRegexp('password', User::REGEXP_PASSWORD, Locale::t('Password contain bad characters')); + $validator->registerCustom(array(get_class(), 'checkPassword'), array('login','password'), $is_email ? Locale::t('Email or password incorrect') : Locale::t('Username or password incorrect')); + } + + public static function checkPassword($login, $password) { + $success = User::isPasswordCorrect($login, $password); + if ($success) { + User::setUserPasswordChecked(); + } + return $success; + } +} \ No newline at end of file diff --git a/zira/forms/user/message.php b/zira/forms/user/message.php new file mode 100644 index 0000000..8cdc9d0 --- /dev/null +++ b/zira/forms/user/message.php @@ -0,0 +1,59 @@ +_id); + } + + protected function _init() { + $this->setAjax(true); + $this->setTitle(Locale::t('Reply')); + $this->setDescription(Locale::t('Message should contain at least %s characters', \Zira\Models\Message::MIN_CHARS)); + $script = Helper::tag_open('script', array('type'=>'text/javascript')); + $script .= 'jQuery(document).ready(function(){ jQuery(\'#'.$this->getId().'\').bind(\'xhr-submit-success\', function(){ jQuery(\'#'.$this->getId().'\').get(0).reset(); }); });'; + $script .= Helper::tag_close('script'); + View::addHTML($script, View::VAR_BODY_BOTTOM); + } + + protected function _render() { + $html = $this->open(); + + $extra_items = \Zira\Hook::run(\Zira\Page::USER_TEXTAREA_HOOK); + if (!empty($extra_items)) { + $html .= Helper::tag_open('div',array('class'=>'user-text-form-extra-items')); + foreach($extra_items as $item) { + $html .= Helper::tag_open('div',array('class'=>'user-text-form-extra-item')); + $html .= $item; + $html .= Helper::tag_close('div'); + } + $html .= Helper::tag_close('div'); + } + + $html .= $this->textarea(Locale::t('Message').'*', 'content'); + $html .= $this->captchaLazy(Locale::t('Enter result').'*'); + $html .= $this->submit(Locale::t('Submit')); + $html .= $this->close(); + return $html; + } + + protected function _validate() { + $validator = $this->getValidator(); + $validator->registerCaptchaLazy($this->_id, Locale::t('Wrong CAPTCHA result')); + $validator->registerText('content', \Zira\Models\Message::MIN_CHARS, true, Locale::t('Message should contain at least %s characters', \Zira\Models\Message::MIN_CHARS)); + $validator->registerNoTags('content', Locale::t('Message contains bad character')); + } +} \ No newline at end of file diff --git a/zira/forms/user/name.php b/zira/forms/user/name.php new file mode 100644 index 0000000..6769151 --- /dev/null +++ b/zira/forms/user/name.php @@ -0,0 +1,59 @@ +_id); + } + + protected function _init() { + $this->setTitle(Locale::t('Change username')); + $this->setDescription(Locale::t('At least %s characters required',User::LOGIN_MIN_CHARS)); + } + + protected function _render() { + $html = $this->open(); + $html .= $this->input(Locale::t('Username').'*','login'); + if (!User::isUserPasswordChecked()) { + $html .= $this->password(Locale::t('Current password').'*','password-current'); + } + $html .= $this->captchaLazy(Locale::t('Enter result').'*'); + $html .= $this->submit(Locale::t('Submit')); + $html .= $this->close(); + return $html; + } + + protected function _validate() { + $validator = $this->getValidator(); + $validator->registerCaptchaLazy($this->_id, Locale::t('Wrong CAPTCHA result')); + $validator->registerString('login',User::LOGIN_MIN_CHARS,User::LOGIN_MAX_CHARS,true,Locale::t('Invalid username')); + $validator->registerRegexp('login', User::REGEXP_LOGIN, Locale::t('Login must contain only letters and numbers')); + if (!User::isUserPasswordChecked()) { + $validator->registerString('password-current',User::PASSWORD_MIN_CHARS,User::PASSWORD_MAX_CHARS,true,Locale::t('Invalid password')); + $validator->registerCustom(array(get_class(), 'checkPassword'), 'password-current', Locale::t('Current password incorrect')); + } + $validator->registerExists('login', \Zira\Models\User::getClass(), 'username', Locale::t('Specified login already exists')); + } + + public static function checkPassword($password) { + $user = User::getCurrent(); + if (!$user || !User::isAuthorized()) return false; + $success = User::isPasswordCorrect($user->username, $password); + if ($success) { + User::setUserPasswordChecked(); + } + return $success; + } +} \ No newline at end of file diff --git a/zira/forms/user/nophoto.php b/zira/forms/user/nophoto.php new file mode 100644 index 0000000..a3dd880 --- /dev/null +++ b/zira/forms/user/nophoto.php @@ -0,0 +1,51 @@ +_id); + } + + protected function _init() { + $this->setTitle(Locale::t('Remove photo')); + $this->setDescription(Locale::t('Please enter your password')); + } + + protected function _render() { + $html = $this->open(); + $html .= $this->password(Locale::t('Current password').'*','password-current'); + $html .= $this->captchaLazy(Locale::t('Enter result').'*'); + $html .= $this->submit(Locale::t('Submit')); + $html .= $this->close(); + return $html; + } + + protected function _validate() { + $validator = $this->getValidator(); + $validator->registerCaptchaLazy($this->_id, Locale::t('Wrong CAPTCHA result')); + $validator->registerString('password-current',User::PASSWORD_MIN_CHARS,User::PASSWORD_MAX_CHARS,true,Locale::t('Invalid password')); + $validator->registerCustom(array(get_class(), 'checkPassword'), 'password-current', Locale::t('Current password incorrect')); + } + + public static function checkPassword($password) { + $user = User::getCurrent(); + if (!$user || !User::isAuthorized()) return false; + $success = User::isPasswordCorrect($user->username, $password); + if ($success) { + User::setUserPasswordChecked(); + } + return $success; + } +} \ No newline at end of file diff --git a/zira/forms/user/password.php b/zira/forms/user/password.php new file mode 100644 index 0000000..9b45e5e --- /dev/null +++ b/zira/forms/user/password.php @@ -0,0 +1,64 @@ +_id); + } + + protected function _init() { + $this->setTitle(Locale::t('Password recovery')); + $this->setDescription(Locale::t('Verification code was sent to your Email address')); + } + + protected function _render() { + $html = $this->open(); + $html .= $this->input(Locale::t('Username or Email').'*','login'); + $html .= $this->input(Locale::t('Verification code').'*','code'); + $html .= $this->captcha(Locale::t('Enter result').'*'); + $html .= $this->submit(Locale::t('Submit')); + $html .= $this->close(); + return $html; + } + + protected function _validate() { + $login = (string)$this->getValue('login'); + $is_email = strpos($login, '@') !== false; + + $validator = $this->getValidator(); + $validator->registerCaptcha(Locale::t('Wrong CAPTCHA result')); + if (!$is_email) { + $validator->registerString('login',User::LOGIN_MIN_CHARS,User::LOGIN_MAX_CHARS,true,Locale::t('Invalid username')); + $validator->registerRegexp('login', User::REGEXP_LOGIN, Locale::t('Login must contain only letters and numbers')); + } else { + $validator->registerEmail('login',true,Locale::t('Invalid email')); + } + $validator->registerString('code', 0, 0, true, Locale::t('Incorrect verification code')); + $validator->registerCustom(array(get_class(), 'isUserExists'), 'login', Locale::t('User not found')); + $validator->registerCustom(array(get_class(), 'checkVerificationCode'), array('code','login'), Locale::t('Incorrect verification code')); + } + + public static function isUserExists($login) { + $user = \Zira\Models\User::findAuthUser($login); + if (!$user) return false; + if ($user->verified != \Zira\Models\User::STATUS_VERIFIED) return false; + User::setCurrent($user); + return true; + } + + public static function checkVerificationCode($code, $login) { + return User::isRecoveryCodeCorrect($login, $code); + } +} \ No newline at end of file diff --git a/zira/forms/user/photo.php b/zira/forms/user/photo.php new file mode 100644 index 0000000..3da3358 --- /dev/null +++ b/zira/forms/user/photo.php @@ -0,0 +1,67 @@ +_id); + } + + protected function _init() { + $this->setMultipart(true); + $this->setTitle(Locale::t('Change photo')); + $this->setDescription(Locale::t('Allowed file extensions: %s', 'jpg, png, gif')); + } + + protected function _render() { + $html = $this->open(); + $html .= $this->fileButton(Locale::t('Photo').'*','photo'); + if (!User::isUserPasswordChecked()) { + $html .= $this->password(Locale::t('Current password').'*','password-current'); + } + $html .= $this->captchaLazy(Locale::t('Enter result').'*'); + $html .= $this->submit(Locale::t('Submit')); + $html .= $this->close(); + return $html; + } + + protected function _validate() { + $validator = $this->getValidator(); + $validator->registerCaptchaLazy($this->_id, Locale::t('Wrong CAPTCHA result')); + $validator->registerImage('photo', 0, true, Locale::t('Invalid image file')); + $validator->registerCustom(array(get_class(), 'checkSize'), 'photo', Locale::t('Photo size should be at least %s pixels',Config::get('user_photo_min_width').'x'.config::get('user_photo_min_height'))); + if (!User::isUserPasswordChecked()) { + $validator->registerString('password-current',User::PASSWORD_MIN_CHARS,User::PASSWORD_MAX_CHARS,true,Locale::t('Invalid password')); + $validator->registerCustom(array(get_class(), 'checkPassword'), 'password-current', Locale::t('Current password incorrect')); + } + } + + public static function checkSize($photo) { + $size = @getimagesize($photo['tmp_name']); + if ($size[0]username, $password); + if ($success) { + User::setUserPasswordChecked(); + } + return $success; + } +} \ No newline at end of file diff --git a/zira/forms/user/pwd.php b/zira/forms/user/pwd.php new file mode 100644 index 0000000..dd27684 --- /dev/null +++ b/zira/forms/user/pwd.php @@ -0,0 +1,58 @@ +_id); + } + + protected function _init() { + $this->setTitle(Locale::t('Change password')); + $this->setDescription(Locale::t('At least %s characters required',User::PASSWORD_MIN_CHARS)); + } + + protected function _render() { + $html = $this->open(); + $html .= $this->password(Locale::t('New password').'*','password'); + $html .= $this->password(Locale::t('Repeat password').'*','password-match'); + $html .= $this->password(Locale::t('Current password').'*','password-current'); + $html .= $this->captchaLazy(Locale::t('Enter result').'*'); + $html .= $this->submit(Locale::t('Submit')); + $html .= $this->close(); + return $html; + } + + protected function _validate() { + $validator = $this->getValidator(); + + $validator->registerCaptchaLazy($this->_id, Locale::t('Wrong CAPTCHA result')); + $validator->registerString('password',User::PASSWORD_MIN_CHARS,User::PASSWORD_MAX_CHARS,true,Locale::t('Invalid password')); + $validator->registerString('password-match',User::PASSWORD_MIN_CHARS,User::PASSWORD_MAX_CHARS,true,Locale::t('Invalid password')); + $validator->registerMatch('password','password-match',Locale::t('Passwords do not match')); + $validator->registerRegexp('password', User::REGEXP_PASSWORD, Locale::t('Password contain bad characters')); + $validator->registerString('password-current',User::PASSWORD_MIN_CHARS,User::PASSWORD_MAX_CHARS,true,Locale::t('Invalid password')); + $validator->registerCustom(array(get_class(), 'checkPassword'), 'password-current', Locale::t('Current password incorrect')); + } + + public static function checkPassword($password) { + $user = User::getCurrent(); + if (!$user || !User::isAuthorized()) return false; + $success = User::isPasswordCorrect($user->username, $password); + if ($success) { + User::setUserPasswordChecked(); + } + return $success; + } +} \ No newline at end of file diff --git a/zira/forms/user/recover.php b/zira/forms/user/recover.php new file mode 100644 index 0000000..f70895f --- /dev/null +++ b/zira/forms/user/recover.php @@ -0,0 +1,57 @@ +_id); + } + + protected function _init() { + $this->setTitle(Locale::t('Password recovery')); + $this->setDescription(Locale::t('Verification code will be sent to your Email address')); + } + + protected function _render() { + $html = $this->open(); + $html .= $this->input(Locale::t('Username or Email').'*','login'); + $html .= $this->captcha(Locale::t('Enter result').'*'); + $html .= $this->submit(Locale::t('Submit')); + $html .= $this->close(); + return $html; + } + + protected function _validate() { + $login = (string)$this->getValue('login'); + $is_email = strpos($login, '@') !== false; + + $validator = $this->getValidator(); + $validator->registerCaptcha(Locale::t('Wrong CAPTCHA result')); + if (!$is_email) { + $validator->registerString('login',User::LOGIN_MIN_CHARS,User::LOGIN_MAX_CHARS,true,Locale::t('Invalid username')); + $validator->registerRegexp('login', User::REGEXP_LOGIN, Locale::t('Login must contain only letters and numbers')); + } else { + $validator->registerEmail('login',true,Locale::t('Invalid email')); + } + $validator->registerCustom(array(get_class(), 'isUserExists'), 'login', Locale::t('User not found')); + } + + public static function isUserExists($login) { + $user = \Zira\Models\User::findAuthUser($login); + if (!$user) return false; + if ($user->verified != \Zira\Models\User::STATUS_VERIFIED) return false; + User::setCurrent($user); + return true; + } +} \ No newline at end of file diff --git a/zira/forms/user/register.php b/zira/forms/user/register.php new file mode 100644 index 0000000..aa28ced --- /dev/null +++ b/zira/forms/user/register.php @@ -0,0 +1,64 @@ +_id); + } + + protected function _init() { + $this->setTitle(Locale::t('User Signup')); + $this->setDescription(Locale::t('Pick a username and password')); + } + + protected function _render() { + $html = $this->open(); + $html .= $this->input(Locale::t('First name').'*','firstname',array('title'=>Locale::t('Please enter your first name'))); + $html .= $this->input(Locale::t('Second name').'*','secondname',array('title'=>Locale::t('Please enter your second name'))); + $html .= $this->input(Locale::t('Username').'*','username',array('title'=>Locale::t('At least %s characters required',User::LOGIN_MIN_CHARS))); + $html .= $this->input(Locale::t('Email').'*','email',array('title'=>Locale::t('Enter a valid email'))); + $html .= $this->password(Locale::t('Password').'*','password',array('title'=>Locale::t('At least %s characters required',User::PASSWORD_MIN_CHARS))); + $html .= $this->password(Locale::t('Repeat password').'*','password-match',array('title'=>Locale::t('Enter password again'))); + $html .= $this->captcha(Locale::t('Enter result').'*'); + $html .= $this->submit(Locale::t('Submit')); + $html .= $this->close(); + return $html; + } + + protected function _validate() { + $validator = $this->getValidator(); + $validator->registerCaptcha(Locale::t('Wrong CAPTCHA result')); + $validator->registerString('firstname',0,0,true,Locale::t('Please enter your first name')); + $validator->registerString('secondname',0,0,true,Locale::t('Please enter your second name')); + $validator->registerNoTags('firstname', Locale::t('Invalid character specified')); + $validator->registerNoTags('secondname', Locale::t('Invalid character specified')); + $validator->registerString('username',User::LOGIN_MIN_CHARS,User::LOGIN_MAX_CHARS,true,Locale::t('Invalid username')); + $validator->registerEmail('email',true,Locale::t('Invalid email')); + $validator->registerString('password',User::PASSWORD_MIN_CHARS,User::PASSWORD_MAX_CHARS,true,Locale::t('Invalid password')); + $validator->registerString('password-match',User::PASSWORD_MIN_CHARS,User::PASSWORD_MAX_CHARS,true,Locale::t('Invalid password')); + $validator->registerRegexp('username', User::REGEXP_LOGIN, Locale::t('Login must contain only letters and numbers')); + $validator->registerMatch('password','password-match',Locale::t('Passwords do not match')); + $validator->registerRegexp('password', User::REGEXP_PASSWORD, Locale::t('Password contain bad characters')); + $validator->registerExists('username', \Zira\Models\User::getClass(), 'username', Locale::t('Specified login already exists')); + $validator->registerExists('email', \Zira\Models\User::getClass(), 'email', Locale::t('Specified email already exists')); + + $firstname = trim((string)$this->getValue('firstname')); + $secondname = trim((string)$this->getValue('secondname')); + $this->updateValues(array( + 'firstname' => $firstname, + 'secondname' => $secondname + )); + } +} \ No newline at end of file diff --git a/zira/forms/user/send.php b/zira/forms/user/send.php new file mode 100644 index 0000000..0abef82 --- /dev/null +++ b/zira/forms/user/send.php @@ -0,0 +1,58 @@ +_id); + } + + protected function _init() { + $this->setTitle(Locale::t('Send confirmation code')); + $this->setDescription(Locale::t('Enter your username or email')); + } + + protected function _render() { + $html = $this->open(); + $html .= $this->input(Locale::t('Username or Email').'*','login'); + $html .= $this->captcha(Locale::t('Enter result').'*'); + $html .= $this->submit(Locale::t('Submit')); + $html .= $this->close(); + return $html; + } + + protected function _validate() { + $login = (string)$this->getValue('login'); + $is_email = strpos($login, '@') !== false; + + $validator = $this->getValidator(); + $validator->registerCaptcha(Locale::t('Wrong CAPTCHA result')); + if (!$is_email) { + $validator->registerString('login',User::LOGIN_MIN_CHARS,User::LOGIN_MAX_CHARS,true,Locale::t('Invalid username')); + $validator->registerRegexp('login', User::REGEXP_LOGIN, Locale::t('Login must contain only letters and numbers')); + } else { + $validator->registerEmail('login',true,Locale::t('Invalid email')); + } + $validator->registerCustom(array(get_class(), 'isUserExists'), 'login', Locale::t('User not found')); + } + + public static function isUserExists($login) { + $user = \Zira\Models\User::findAuthUser($login); + if (!$user) return false; + if ($user->verified == \Zira\Models\User::STATUS_VERIFIED) return false; + User::setCurrent($user); + return true; + } +} \ No newline at end of file diff --git a/zira/helper.php b/zira/helper.php new file mode 100644 index 0000000..e994473 --- /dev/null +++ b/zira/helper.php @@ -0,0 +1,128 @@ +1 && + (Locale::getLanguage()!=Config::get('language') || !empty($path)) + ) { + $url .= '/'.Locale::getLanguage(); + } + + $url .= '/'.$path; + if ($url != '/') $url = rtrim($url,'/'); + + return $url; + } + + public static function baseUrl($url,$absolute=false,$detect_protocol=false) { + $prefix = ''; + if ($absolute && $detect_protocol) { + $port = isset($_SERVER['SERVER_PORT']) ? $_SERVER['SERVER_PORT'] : 80; + $protocol = $port == 443 ? 'https:' : 'http:'; + $prefix .= $protocol; + } + if ($absolute) $prefix .= '//' . $_SERVER['HTTP_HOST']; + return $prefix . rtrim(BASE_URL,'/') . '/' .ltrim($url,'/'); + } + + public static function assetUrl($url) { + return rtrim(BASE_URL,'/') . '/' . ASSETS_DIR . '/' .$url; + } + + public static function assetThemeUrl($url) { + return rtrim(BASE_URL,'/') . '/' . THEMES_DIR . '/' . View::getTheme() . '/' . ASSETS_DIR . '/' .$url; + } + + public static function cssUrl($url) { + return rtrim(BASE_URL,'/') . '/' . ASSETS_DIR . '/' . CSS_DIR . '/' .$url; + } + + public static function cssThemeUrl($url) { + return rtrim(BASE_URL,'/') . '/' . THEMES_DIR . '/' . View::getTheme() . '/' . ASSETS_DIR . '/' . CSS_DIR . '/' .$url; + } + + public static function jsUrl($url) { + return rtrim(BASE_URL,'/') . '/' . ASSETS_DIR . '/' . JS_DIR . '/' .$url; + } + + public static function jsThemeUrl($url) { + return rtrim(BASE_URL,'/') . '/' . THEMES_DIR . '/' . View::getTheme() . '/' . ASSETS_DIR . '/' . JS_DIR . '/' .$url; + } + + public static function imgUrl($url) { + return rtrim(BASE_URL,'/') . '/' . ASSETS_DIR . '/' . IMAGES_DIR . '/' .$url; + } + + public static function imgThemeUrl($url) { + return rtrim(BASE_URL,'/') . '/' . THEMES_DIR . '/' . View::getTheme() . '/' . ASSETS_DIR . '/' . IMAGES_DIR . '/' .$url; + } + + public static function tag_short($name, array $attributes = null) { + if (!$attributes) $attributes = array(); + $html = '<'.self::html($name); + foreach($attributes as $k=>$v) { + $html .= ' '.self::html($k) . '="' . self::html($v) . '"'; + } + $html .= ' />'; + return $html; + } + + public static function tag_open($name, array $attributes = null) { + if (!$attributes) $attributes = array(); + $html = '<'.self::html($name); + foreach($attributes as $k=>$v) { + $html .= ' '.self::html($k) . '="' . self::html($v) . '"'; + } + $html .= '>'; + return $html; + } + + public static function tag_close($name) { + return ''; + } + + public static function tag($name, $value = null, array $attributes = null) { + $html = self::tag_open($name, $attributes); + if ($value!==null) $html .= self::html($value); + $html .= self::tag_close($name); + return $html; + } + + public static function nl2br($str) { + return nl2br(trim($str)); + } +} \ No newline at end of file diff --git a/zira/hook.php b/zira/hook.php new file mode 100644 index 0000000..bbfd2c1 --- /dev/null +++ b/zira/hook.php @@ -0,0 +1,26 @@ += $p) { + $_src_width = $src_height * $p; + $src_x = ($src_width - $_src_width) / 2; + $src_width = $_src_width; + } else { + $_src_height = $src_width / $p; + $src_y = ($src_height - $_src_height) / 2; + $src_height = $_src_height; + } + + $dst_image=imagecreatetruecolor($dst_width,$dst_height); + if (!$dst_image) return false; + + $bg_color=imagecolorallocate($dst_image, 255, 255, 255); + imagefill($dst_image, 0, 0, $bg_color); + + if (!imagecopyresampled($dst_image, $src_image, 0, 0, $src_x, $src_y, $dst_width, $dst_height, $src_width, $src_height)) return false; + + $result = self::_imagesave($dst_image, $dst_path, $type); + + imagedestroy($src_image); + imagedestroy($dst_image); + + return $result; + } + + public static function save(array $file, $dir = null, $create_thumb = false, $watermark = false) { + $savedir = IMAGES_DIR; + if (!empty($dir)) $savedir .= DIRECTORY_SEPARATOR . $dir; + $files = File::save($file, $savedir); + if (!$files) return false; + if ($create_thumb) { + $savedir = THUMBS_DIR; + if (!empty($dir)) $savedir .= DIRECTORY_SEPARATOR . $dir; + $save_path = File::getAbsolutePath($savedir); + foreach($files as $path=>$name) { + if (!self::createThumb($path, $save_path . DIRECTORY_SEPARATOR . $name, Config::get('thumbs_width'), Config::get('thumbs_height'))) return false; + } + } + if ($watermark) { + $savedir = IMAGES_DIR; + if (!empty($dir)) $savedir .= DIRECTORY_SEPARATOR . $dir; + $save_path = File::getAbsolutePath($savedir); + foreach($files as $name) { + if (!self::watermark($save_path . DIRECTORY_SEPARATOR . $name)) break; + } + } + return $files; + } + + public static function watermark($src_path, $margin = 10) { + $watermark_path = Config::get('watermark'); + if (empty($watermark_path)) return false; + else $watermark_path = ROOT_DIR . DIRECTORY_SEPARATOR . $watermark_path; + if (!file_exists($watermark_path)) return false; + + $type = false; + $src_image=null; + $size = false; + + if (!self::_imagecreate($src_path, $src_image, $type, $size)) return false; + + $src_width=$size[0]; + $src_height=$size[1]; + + $watermark_type = false; + $watermark_image=null; + $size = false; + + if (!self::_imagecreate($watermark_path, $watermark_image, $watermark_type, $size)) return false; + + $watermark_width=$size[0]; + $watermark_height=$size[1]; + + if (!imagecopy( + $src_image, + $watermark_image, + $src_width - $watermark_width - $margin, + $src_height - $watermark_height - $margin, + 0, + 0, + $watermark_width, + $watermark_height + )) return false; + + $result = self::_imagesave($src_image, $src_path, $type); + + imagedestroy($src_image); + imagedestroy($watermark_image); + + return $result; + } +} \ No newline at end of file diff --git a/zira/install/blacklist.php b/zira/install/blacklist.php new file mode 100644 index 0000000..4174df4 --- /dev/null +++ b/zira/install/blacklist.php @@ -0,0 +1,47 @@ +_table); + } + + public function getFields() { + return array( + 'id' => Field::primary(), + 'user_id' => Field::int(true, true), + 'blocked_user_id' => Field::int(true, true), + 'message' => Field::string(true), + 'creation_date' => Field::datetime(true) + ); + } + + public function getKeys() { + return array( + + ); + } + + public function getUnique() { + return array( + 'user' => array('user_id','blocked_user_id') + ); + } + + public function getDefaults() { + return array( + + ); + } +} \ No newline at end of file diff --git a/zira/install/block.php b/zira/install/block.php new file mode 100644 index 0000000..b5cd918 --- /dev/null +++ b/zira/install/block.php @@ -0,0 +1,47 @@ +_table); + } + + public function getFields() { + return array( + 'id' => Field::primary(), + 'name' => Field::string(true), + 'content' => Field::text(true), + 'placeholder' => Field::string(true), + 'tpl' => Field::tinyint(true, true, 0) + ); + } + + public function getKeys() { + return array( + + ); + } + + public function getUnique() { + return array( + + ); + } + + public function getDefaults() { + return array( + + ); + } +} \ No newline at end of file diff --git a/zira/install/captcha.php b/zira/install/captcha.php new file mode 100644 index 0000000..6fd0779 --- /dev/null +++ b/zira/install/captcha.php @@ -0,0 +1,37 @@ +_table); + } + + public function getFields() { + return array( + 'id' => Field::primary(), + 'form_id' => Field::string(true), + 'date_created' => Field::datetime(true) + ); + } + + public function getKeys() { + return array( + 'recent' => array('form_id', 'date_created') + ); + } + + public function getUnique() { + return array(); + } +} \ No newline at end of file diff --git a/zira/install/category.php b/zira/install/category.php new file mode 100644 index 0000000..d1794ce --- /dev/null +++ b/zira/install/category.php @@ -0,0 +1,60 @@ +_table); + } + + public function getFields() { + return array( + 'id' => Field::primary(), + 'name' => Field::string(true), + 'title' => Field::string(true), + 'description' => Field::string(), + 'layout' => Field::string(true), + 'meta_title' => Field::string(), + 'meta_keywords' => Field::string(), + 'meta_description' => Field::string(), + 'parent_id' => Field::int(true, true, 0), + 'access_check' => Field::tinyint(true, true, 0), + 'slider_enabled' => Field::tinyint(false, true), + 'gallery_enabled' => Field::tinyint(false, true), + 'comments_enabled' => Field::tinyint(false, true), + 'rating_enabled' => Field::tinyint(false, true), + 'display_author' => Field::tinyint(false, true), + 'display_date' => Field::tinyint(false, true), + 'records_list' => Field::tinyint(false, true), + 'tpl' => Field::string() + ); + } + + public function getKeys() { + return array( + 'parent_id' => array('parent_id') + ); + } + + public function getUnique() { + return array( + 'name' => array('name') + ); + } + + public function getDefaults() { + return array( + + ); + } +} \ No newline at end of file diff --git a/zira/install/comment.php b/zira/install/comment.php new file mode 100644 index 0000000..5910ce4 --- /dev/null +++ b/zira/install/comment.php @@ -0,0 +1,56 @@ +_table); + } + + public function getFields() { + return array( + 'id' => Field::primary(), + 'record_id' => Field::int(true, true), + 'author_id' => Field::int(true, true), + 'parent_id' => Field::int(true, true, 0), + 'sort_path' => Field::string(true), + 'path_offset' => Field::int(true, true), + 'content' => Field::text(), + 'sender_name' => Field::string(), + 'recipient_name' => Field::string(), + 'likes' => Field::int(true, true, 0), + 'dislikes' => Field::int(true, true, 0), + 'creation_date' => Field::datetime(true), + 'published' => Field::tinyint(true, true, 0) + ); + } + + public function getKeys() { + return array( + 'record' => array('record_id', 'published', 'sort_path'), + 'counter' => array('record_id', 'parent_id', 'path_offset') + ); + } + + public function getUnique() { + return array( + + ); + } + + public function getDefaults() { + return array( + + ); + } +} \ No newline at end of file diff --git a/zira/install/commentlike.php b/zira/install/commentlike.php new file mode 100644 index 0000000..f5095ec --- /dev/null +++ b/zira/install/commentlike.php @@ -0,0 +1,48 @@ +_table); + } + + public function getFields() { + return array( + 'id' => Field::primary(), + 'comment_id' => Field::int(true, true), + 'user_id' => Field::int(true, true), + 'anonymous_id' => Field::string(true), + 'rate' => Field::tinyint(true), + 'creation_date' => Field::datetime(true) + ); + } + + public function getKeys() { + return array( + 'like' => array('comment_id', 'user_id', 'anonymous_id') + ); + } + + public function getUnique() { + return array( + + ); + } + + public function getDefaults() { + return array( + + ); + } +} \ No newline at end of file diff --git a/zira/install/conversation.php b/zira/install/conversation.php new file mode 100644 index 0000000..57f3593 --- /dev/null +++ b/zira/install/conversation.php @@ -0,0 +1,50 @@ +_table); + } + + public function getFields() { + return array( + 'id' => Field::primary(), + 'conversation_id' => Field::int(true, true), + 'user_id' => Field::int(true, true), + 'subject' => Field::string(true), + 'highlight' => Field::tinyint(true, true, 1), + 'creation_date' => Field::datetime(true), + 'modified_date' => Field::datetime(true) + ); + } + + public function getKeys() { + return array( + 'user' => array('user_id', 'modified_date'), + 'conversation' => array('conversation_id') + ); + } + + public function getUnique() { + return array( + + ); + } + + public function getDefaults() { + return array( + + ); + } +} \ No newline at end of file diff --git a/zira/install/draft.php b/zira/install/draft.php new file mode 100644 index 0000000..73ef263 --- /dev/null +++ b/zira/install/draft.php @@ -0,0 +1,49 @@ +_table); + } + + public function getFields() { + return array( + 'id' => Field::primary(), + 'record_id' => Field::int(true, true), + 'author_id' => Field::int(true, true), + 'content' => Field::longtext(), + 'published' => Field::tinyint(true, true, 0), + 'creation_date' => Field::datetime(true), + 'modified_date' => Field::datetime(true) + ); + } + + public function getKeys() { + return array( + 'published' => array('published') + ); + } + + public function getUnique() { + return array( + 'record' => array('record_id', 'author_id') + ); + } + + public function getDefaults() { + return array( + + ); + } +} \ No newline at end of file diff --git a/zira/install/group.php b/zira/install/group.php new file mode 100644 index 0000000..7a1a3f6 --- /dev/null +++ b/zira/install/group.php @@ -0,0 +1,60 @@ +_table); + } + + public function getFields() { + return array( + 'id' => Field::primary(), + 'name' => Field::string(true), + 'active' => Field::tinyint(true, true, 0) + ); + } + + public function getKeys() { + return array( + 'active' => array('active') + ); + } + + public function getUnique() { + return array( + 'name' => array('name') + ); + } + + public function getDefaults() { + return array( + array( + 'id' => \Zira\User::GROUP_SUPERADMIN, + 'name' => 'Super-Administrators', + 'active' => Model::STATUS_ACTIVE + ), + array( + 'id' => \Zira\User::GROUP_ADMIN, + 'name' => 'Administrators', + 'active' => Model::STATUS_ACTIVE + ), + array( + 'id' => \Zira\User::GROUP_USER, + 'name' => 'Users', + 'active' => Model::STATUS_ACTIVE + ) + ); + } +} \ No newline at end of file diff --git a/zira/install/image.php b/zira/install/image.php new file mode 100644 index 0000000..7c3fe24 --- /dev/null +++ b/zira/install/image.php @@ -0,0 +1,47 @@ +_table); + } + + public function getFields() { + return array( + 'id' => Field::primary(), + 'record_id' => Field::int(true, true), + 'description' => Field::string(), + 'thumb' => Field::string(true), + 'image' => Field::string(true) + ); + } + + public function getKeys() { + return array( + 'record_id' => array('record_id') + ); + } + + public function getUnique() { + return array( + + ); + } + + public function getDefaults() { + return array( + + ); + } +} \ No newline at end of file diff --git a/zira/install/like.php b/zira/install/like.php new file mode 100644 index 0000000..13f7afd --- /dev/null +++ b/zira/install/like.php @@ -0,0 +1,47 @@ +_table); + } + + public function getFields() { + return array( + 'id' => Field::primary(), + 'record_id' => Field::int(true, true), + 'user_id' => Field::int(true, true), + 'anonymous_id' => Field::string(true), + 'creation_date' => Field::datetime(true) + ); + } + + public function getKeys() { + return array( + 'like' => array('record_id', 'user_id', 'anonymous_id') + ); + } + + public function getUnique() { + return array( + + ); + } + + public function getDefaults() { + return array( + + ); + } +} \ No newline at end of file diff --git a/zira/install/menu.php b/zira/install/menu.php new file mode 100644 index 0000000..9e75e15 --- /dev/null +++ b/zira/install/menu.php @@ -0,0 +1,52 @@ +_table); + } + + public function getFields() { + return array( + 'id' => Field::primary(), + 'menu_id' => Field::int(true, true), + 'parent_id' => Field::int(true, true, 0), + 'url' => Field::string(true), + 'title' => Field::string(true), + 'class' => Field::string(), + 'language' => Field::string(), + 'sort_order' => Field::int(true, false, 0), + 'external' => Field::tinyint(true, true, 0), + 'active' => Field::tinyint(true, true, 1) + ); + } + + public function getKeys() { + return array( + 'menu' => array('menu_id', 'parent_id', 'language', 'sort_order') + ); + } + + public function getUnique() { + return array( + + ); + } + + public function getDefaults() { + return array( + + ); + } +} \ No newline at end of file diff --git a/zira/install/message.php b/zira/install/message.php new file mode 100644 index 0000000..3df4969 --- /dev/null +++ b/zira/install/message.php @@ -0,0 +1,47 @@ +_table); + } + + public function getFields() { + return array( + 'id' => Field::primary(), + 'conversation_id' => Field::int(true, true), + 'user_id' => Field::int(true, true), + 'content' => Field::text(true), + 'creation_date' => Field::datetime(true) + ); + } + + public function getKeys() { + return array( + 'conversation' => array('conversation_id') + ); + } + + public function getUnique() { + return array( + + ); + } + + public function getDefaults() { + return array( + + ); + } +} \ No newline at end of file diff --git a/zira/install/option.php b/zira/install/option.php new file mode 100644 index 0000000..3205ce4 --- /dev/null +++ b/zira/install/option.php @@ -0,0 +1,34 @@ +_table); + } + + public function getFields() { + return array( + 'id' => Field::primary(), + 'module' => Field::string(true), + 'name' => Field::string(true), + 'value' => Field::string(true) + ); + } + + public function getUnique() { + return array( + 'name' => array('name') + ); + } +} \ No newline at end of file diff --git a/zira/install/permission.php b/zira/install/permission.php new file mode 100644 index 0000000..45c12f0 --- /dev/null +++ b/zira/install/permission.php @@ -0,0 +1,142 @@ +_table); + } + + public function getFields() { + return array( + 'id' => Field::primary(), + 'group_id' => Field::int(true, true), + 'module' => Field::string(true), + 'name' => Field::string(true), + 'allow' => Field::tinyint(true, true, 0) + ); + } + + public function getKeys() { + return array( + + ); + } + + public function getUnique() { + return array( + 'name_by_group' => array('group_id', 'name') + ); + } + + protected function getDefaultSuperAdminPermissions() { + return array( + \Zira\Permission::TO_ACCESS_DASHBOARD => 1, + \Zira\Permission::TO_EXECUTE_TASKS => 1, + \Zira\Permission::TO_CHANGE_OPTIONS => 1, + \Zira\Permission::TO_CHANGE_LAYOUT => 1, + \Zira\Permission::TO_CREATE_USERS => 1, + \Zira\Permission::TO_EDIT_USERS => 1, + \Zira\Permission::TO_DELETE_USERS => 1, + \Zira\Permission::TO_UPLOAD_FILES => 1, + \Zira\Permission::TO_DELETE_FILES => 1, + \Zira\Permission::TO_VIEW_FILES => 1, + \Zira\Permission::TO_UPLOAD_IMAGES => 1, + \Zira\Permission::TO_DELETE_IMAGES => 1, + \Zira\Permission::TO_VIEW_IMAGES => 1, + \Zira\Permission::TO_CREATE_RECORDS => 1, + \Zira\Permission::TO_EDIT_RECORDS => 1, + \Zira\Permission::TO_DELETE_RECORDS => 1, + \Zira\Permission::TO_VIEW_RECORDS => 1, + \Zira\Permission::TO_VIEW_RECORD => 1, + \Zira\Permission::TO_MODERATE_COMMENTS => 1 + ); + } + + protected function getDefaultAdminPermissions() { + return array( + \Zira\Permission::TO_ACCESS_DASHBOARD => 1, + \Zira\Permission::TO_EXECUTE_TASKS => 0, + \Zira\Permission::TO_CHANGE_OPTIONS => 0, + \Zira\Permission::TO_CHANGE_LAYOUT => 0, + \Zira\Permission::TO_CREATE_USERS => 0, + \Zira\Permission::TO_EDIT_USERS => 0, + \Zira\Permission::TO_DELETE_USERS => 0, + \Zira\Permission::TO_UPLOAD_FILES => 0, + \Zira\Permission::TO_DELETE_FILES => 0, + \Zira\Permission::TO_VIEW_FILES => 1, + \Zira\Permission::TO_UPLOAD_IMAGES => 1, + \Zira\Permission::TO_DELETE_IMAGES => 1, + \Zira\Permission::TO_VIEW_IMAGES => 1, + \Zira\Permission::TO_CREATE_RECORDS => 1, + \Zira\Permission::TO_EDIT_RECORDS => 1, + \Zira\Permission::TO_DELETE_RECORDS => 1, + \Zira\Permission::TO_VIEW_RECORDS => 1, + \Zira\Permission::TO_VIEW_RECORD => 1, + \Zira\Permission::TO_MODERATE_COMMENTS => 1 + ); + } + + protected function getDefaultUserPermissions() { + return array( + \Zira\Permission::TO_ACCESS_DASHBOARD => 0, + \Zira\Permission::TO_EXECUTE_TASKS => 0, + \Zira\Permission::TO_CHANGE_OPTIONS => 0, + \Zira\Permission::TO_CHANGE_LAYOUT => 0, + \Zira\Permission::TO_CREATE_USERS => 0, + \Zira\Permission::TO_EDIT_USERS => 0, + \Zira\Permission::TO_DELETE_USERS => 0, + \Zira\Permission::TO_UPLOAD_FILES => 0, + \Zira\Permission::TO_DELETE_FILES => 0, + \Zira\Permission::TO_VIEW_FILES => 0, + \Zira\Permission::TO_UPLOAD_IMAGES => 0, + \Zira\Permission::TO_DELETE_IMAGES => 0, + \Zira\Permission::TO_VIEW_IMAGES => 0, + \Zira\Permission::TO_CREATE_RECORDS => 0, + \Zira\Permission::TO_EDIT_RECORDS => 0, + \Zira\Permission::TO_DELETE_RECORDS => 0, + \Zira\Permission::TO_VIEW_RECORDS => 1, + \Zira\Permission::TO_VIEW_RECORD => 1, + \Zira\Permission::TO_MODERATE_COMMENTS => 0 + ); + } + + public function getDefaults() { + $permissionsArray = \Zira\Permission::getPermissionsArray(); + $groupsArray = \Zira\User::getDefaultGroupsArray(); + $inserts = array(); + foreach($groupsArray as $group_id) { + switch($group_id) { + case \Zira\User::GROUP_SUPERADMIN: + $permissions = self::getDefaultSuperAdminPermissions(); + break; + case \Zira\User::GROUP_ADMIN: + $permissions = self::getDefaultAdminPermissions(); + break; + default: + $permissions = self::getDefaultUserPermissions(); + break; + } + foreach($permissionsArray as $name) { + $inserts[]=array( + 'id' => null, + 'group_id' => $group_id, + 'module' => 'zira', + 'name' => $name, + 'allow' => array_key_exists($name, $permissions) ? $permissions[$name] : 0 + ); + } + } + return $inserts; + } +} \ No newline at end of file diff --git a/zira/install/record.php b/zira/install/record.php new file mode 100644 index 0000000..a9940fb --- /dev/null +++ b/zira/install/record.php @@ -0,0 +1,63 @@ +_table); + } + + public function getFields() { + return array( + 'id' => Field::primary(), + 'category_id' => Field::int(true, true), + 'author_id' => Field::int(true, true), + 'name' => Field::string(true), + 'title' => Field::string(true), + 'description' => Field::text(), + 'content' => Field::longtext(), + 'thumb' => Field::string(), + 'image' => Field::string(), + 'meta_title' => Field::string(), + 'meta_keywords' => Field::string(), + 'meta_description' => Field::text(), + 'language' => Field::string(true), + 'access_check' => Field::tinyint(true, true, 0), + 'creation_date' => Field::datetime(true), + 'modified_date' => Field::datetime(true), + 'published' => Field::tinyint(true, true, 0), + 'front_page' => Field::tinyint(true, true, 0), + 'rating' => Field::int(true, false, 0), + 'comments' => Field::int(true, true, 0), + 'tpl' => Field::string() + ); + } + + public function getKeys() { + return array( + 'record' => array('category_id', 'language', 'name','published','front_page') + ); + } + + public function getUnique() { + return array( + 'url' => array('category_id', 'language', 'name') + ); + } + + public function getDefaults() { + return array( + + ); + } +} \ No newline at end of file diff --git a/zira/install/search.php b/zira/install/search.php new file mode 100644 index 0000000..3f49388 --- /dev/null +++ b/zira/install/search.php @@ -0,0 +1,47 @@ +_table); + } + + public function getFields() { + return array( + 'id' => Field::primary(), + 'keyword' => Field::string(true), + 'record_id' => Field::int(true, true), + 'language' => Field::string(true), + ); + } + + public function getKeys() { + return array( + 'keyword' => array('language', 'keyword'), + 'record_id' => array('record_id') + ); + } + + public function getUnique() { + return array( + + ); + } + + public function getDefaults() { + return array( + + ); + } +} \ No newline at end of file diff --git a/zira/install/slide.php b/zira/install/slide.php new file mode 100644 index 0000000..4db8948 --- /dev/null +++ b/zira/install/slide.php @@ -0,0 +1,47 @@ +_table); + } + + public function getFields() { + return array( + 'id' => Field::primary(), + 'record_id' => Field::int(true, true), + 'description' => Field::string(), + 'thumb' => Field::string(true), + 'image' => Field::string(true) + ); + } + + public function getKeys() { + return array( + 'record_id' => array('record_id') + ); + } + + public function getUnique() { + return array( + + ); + } + + public function getDefaults() { + return array( + + ); + } +} \ No newline at end of file diff --git a/zira/install/translate.php b/zira/install/translate.php new file mode 100644 index 0000000..8b1a950 --- /dev/null +++ b/zira/install/translate.php @@ -0,0 +1,35 @@ +_table); + } + + public function getFields() { + return array( + 'id' => Field::primary(), + 'module' => Field::string(true), + 'name' => Field::string(true), + 'value' => Field::string(true), + 'language' => Field::string(true) + ); + } + + public function getUnique() { + return array( + 'name' => array('name','language') + ); + } +} \ No newline at end of file diff --git a/zira/install/user.php b/zira/install/user.php new file mode 100644 index 0000000..35df4a9 --- /dev/null +++ b/zira/install/user.php @@ -0,0 +1,63 @@ +_table); + } + + public function getFields() { + return array( + 'id' => Field::primary(), + 'email' => Field::string(true), + 'username' => Field::string(true), + 'password' => Field::string(true), + 'group_id' => Field::tinyint(true, true, 0), + 'image' => Field::string(false), + 'firstname' => Field::string(false), + 'secondname' => Field::string(false), + 'dob' => Field::date(false), + 'phone' => Field::string(false), + 'country' => Field::string(false), + 'city' => Field::string(false), + 'address' => Field::string(false), + 'date_created' => Field::datetime(true), + 'date_logged' => Field::datetime(true), + 'verified' => Field::tinyint(true, true, 0), + 'active' => Field::tinyint(true, true, 0), + 'messages' => Field::int(true, true, 0), + 'comments' => Field::int(true, true, 0), + 'posts' => Field::int(true, true, 0), + 'subscribed' => Field::tinyint(true, true, 1), + 'vcode' => Field::string(false), + 'code' => Field::string(true), + 'token' => Field::string(false) + ); + } + + public function getKeys() { + return array( + 'group_id' => array('group_id'), + 'enabled' => array('verified', 'active') + ); + } + + public function getUnique() { + return array( + 'email' => array('email'), + 'username' => array('username'), + 'code' => array('code') + ); + } +} \ No newline at end of file diff --git a/zira/install/widget.php b/zira/install/widget.php new file mode 100644 index 0000000..a34af48 --- /dev/null +++ b/zira/install/widget.php @@ -0,0 +1,124 @@ +_table); + } + + public function getFields() { + return array( + 'id' => Field::primary(), + 'name' => Field::string(true), + 'module' => Field::string(true), + 'placeholder' => Field::string(true), + 'params' => Field::string(), + 'language' => Field::string(), + 'category_id' => Field::int(false, true), + 'sort_order' => Field::int(true, false, 0), + 'active' => Field::tinyint(true, true, 0), + 'filter' => Field::string() + ); + } + + public function getKeys() { + return array( + 'search' => array('language','category_id','active'), + 'sort_order' => array('sort_order') + ); + } + + public function getUnique() { + return array( + + ); + } + + public function getDefaults() { + return array( + array( + 'id' => null, + 'name' => '\Zira\Widgets\Languages', + 'module' => 'zira', + 'placeholder' => 'header', + 'params' => null, + 'language' => null, + 'category_id' => null, + 'sort_order' => 1, + 'active' => 0, + 'filter' => null + ), + array( + 'id' => null, + 'name' => '\Zira\Widgets\Usermenu', + 'module' => 'zira', + 'placeholder' => 'header', + 'params' => null, + 'language' => null, + 'category_id' => null, + 'sort_order' => 2, + 'active' => 1, + 'filter' => null + ), + array( + 'id' => null, + 'name' => '\Zira\Widgets\Logo', + 'module' => 'zira', + 'placeholder' => 'header', + 'params' => null, + 'language' => null, + 'category_id' => null, + 'sort_order' => 3, + 'active' => 1, + 'filter' => null + ), + array( + 'id' => null, + 'name' => '\Zira\Widgets\Topmenu', + 'module' => 'zira', + 'placeholder' => 'header', + 'params' => null, + 'language' => null, + 'category_id' => null, + 'sort_order' => 4, + 'active' => 1, + 'filter' => null + ), + array( + 'id' => null, + 'name' => '\Zira\Widgets\Childmenu', + 'module' => 'zira', + 'placeholder' => 'sidebar_right', + 'params' => null, + 'language' => null, + 'category_id' => null, + 'sort_order' => 5, + 'active' => 1, + 'filter' => null + ), + array( + 'id' => null, + 'name' => '\Zira\Widgets\Footermenu', + 'module' => 'zira', + 'placeholder' => 'footer', + 'params' => null, + 'language' => null, + 'category_id' => null, + 'sort_order' => 6, + 'active' => 1, + 'filter' => null + ) + ); + } +} \ No newline at end of file diff --git a/zira/locale.php b/zira/locale.php new file mode 100644 index 0000000..5bfe542 --- /dev/null +++ b/zira/locale.php @@ -0,0 +1,255 @@ +1 && + empty($_SERVER['HTTP_REFERER']) && + !Request::isRedirected() && + !Router::getRequest() && + !Router::getLanguage() + ) { + if (self::isRemembered()) { + $locale = self::getRemembered(); + } else { + $locale = self::detect(); + } + if ($locale!=Config::get('language')) { + Helper::setAddingLanguageToUrl(false); + Response::redirect($locale); + } + } + } + + public static function detect() { + if (!isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) return false; + $locale = explode(';', $_SERVER['HTTP_ACCEPT_LANGUAGE']); + $locale = explode(',', $locale[0]); + $locale = explode('-', $locale[0]); + $locale = strtolower($locale[0]); + if (!in_array($locale, Config::get('languages'))) return false; + return $locale; + } + + public static function remember() { + if (Request::isAjax() || Router::getModule()=='dash') return; + if (count(Config::get('languages'))>1) { + Cookie::set(self::COOKIE_NAME, self::getLanguage(), self::COOKIE_TIME); + } + } + + public static function getRemembered() { + $language = Cookie::get(self::COOKIE_NAME); + if (!$language) return false; + if (!in_array($language, Config::get('languages'))) { + Cookie::remove(self::COOKIE_NAME); + return false; + } + return $language; + } + + public static function isRemembered() { + return (bool)self::getRemembered(); + } + + public static function load($language,$module=null) { + if (!$language) $language = self::$language; + if (!$language) return false; + if (!$module) $module = $language; + + if (self::import($language, $module) || $language == DEFAULT_LANGUAGE) { + self::$language = $language; + self::loadJsStrings($language, $module); + return true; + } + + return false; + } + + public static function getLanguageFileAbsPath($language,$prefix,$suffix='') { + if (!empty($suffix)) $suffix = '.'.$suffix; + + $file = ROOT_DIR . DIRECTORY_SEPARATOR . + LANGUAGES_DIR . DIRECTORY_SEPARATOR . + $language . DIRECTORY_SEPARATOR . + $prefix . $suffix . '.php'; + + return $file; + } + + public static function getStringsFromFile($file) { + if (!file_exists($file)) return false; + + $strings = include($file); + if (!is_array($strings)) return false; + + return $strings; + } + + public static function removeStrings() { + self::$_strings = array(); + } + + public static function addStrings(array $strings) { + self::$_strings = array_merge(self::$_strings, $strings); + } + + public static function import($language, $module) { + $lang_file = self::getLanguageFileAbsPath($language,$module); + return self::importTranslates($lang_file); + } + + protected static function importTranslates($lang_file) { + $strings = self::getStringsFromFile($lang_file); + if (!$strings) return false; + self::addStrings($strings); + self::$_loaded[] = $lang_file; + + return true; + } + + public static function loadJsStrings($language,$module) { + $lang_file = self::getLanguageFileAbsPath($language,$module,'js'); + + $strings = self::getStringsFromFile($lang_file); + if (!$strings) return false; + View::addJsStrings($strings); + + return true; + } + + public static function getDBRows($language) { + $rows = Cache::getArray(self::CACHE_KEY_PREFIX.'.'.$language); + if ($rows === false) { + $rows = Translate::getCollection() + ->where('language', '=', $language) + ->get(); + + Cache::setArray(self::CACHE_KEY_PREFIX.'.'.$language, $rows); + } + return $rows; + } + + public static function getStringsFromDb($language) { + $rows = self::getDBRows($language); + $strings = array(); + foreach($rows as $row) { + $strings[$row->name] = $row->value; + } + return $strings; + } + + public static function loadDBStrings($language=null) { + if (!$language) $language = self::$language; + if (!$language) return false; + + $strings = self::getStringsFromDb($language); + self::addStrings($strings); + } + + public static function isLoaded($language,$module=null) { + if (!$language) $language = self::$language; + if (!$language) return false; + if (!$module) $module = $language; + + $lang_file = ROOT_DIR . DIRECTORY_SEPARATOR . + LANGUAGES_DIR . DIRECTORY_SEPARATOR . + $language . DIRECTORY_SEPARATOR . + $module . '.php'; + + return in_array($lang_file, self::$_loaded); + } + + public static function t($str, $arg = null) { + if (array_key_exists($str, self::$_strings)) $str = self::$_strings[$str]; + if ($arg === null) { + if (is_array($str)) $str = end($str); + return $str; + } + if (!is_array($str) || !is_numeric($arg)) { + if (is_array($str)) $str = end($str); + return sprintf($str, $arg); + } else { + $index = self::getPluralIndex($arg, self::getLanguage()); + if (!array_key_exists($index, $str)) return sprintf(end($str), $arg); + return sprintf($str[$index], $arg); + } + } + + public static function tm($str, $module, $arg = null) { + if (array_key_exists($str, self::$_strings)) return self::t($str, $arg); + else if (!self::isLoaded(null,$module)) { + self::load(null, $module); + return self::t($str, $arg); + } else { + return self::t($str, $arg); + } + } + + public static function getLanguage() { + return self::$language; + } + + public static function getStrings() { + return self::$_strings; + } + + protected static function getPluralIndex($int, $language) { + if ($language == 'ru') { + return self::getPluralIndexLanguageRu($int); + } else { + return self::getPluralIndexLanguageDefault($int); + } + } + + protected static function getPluralIndexLanguageRu($int) { + $a = $int % 10; + $b = $int % 100; + if ($a == 0 || $a >= 5 || ($b >= 10 && $b <= 20)) return 2; + else if ($a >= 2 && $a <= 4) return 1; + else if ($a == 1) return 0; + else return -1; + } + + protected static function getPluralIndexLanguageDefault($int) { + if ($int>1) return 1; + else if ($int == 1) return 0; + else return -1; + } + + public static function getLanguagesArray() { + $active_languages = Config::get('languages'); + $languages = array(); + $d = opendir(ROOT_DIR . DIRECTORY_SEPARATOR . LANGUAGES_DIR); + while (($f=readdir($d))!==false) { + if ($f=='.' || $f=='..' || !is_dir(ROOT_DIR . DIRECTORY_SEPARATOR . LANGUAGES_DIR . DIRECTORY_SEPARATOR . $f)) continue; + if (!in_array($f, $active_languages)) continue; + $lang_file = ROOT_DIR . DIRECTORY_SEPARATOR . + LANGUAGES_DIR . DIRECTORY_SEPARATOR . + $f . DIRECTORY_SEPARATOR . + $f . '.php'; + if (!file_exists($lang_file) || !is_readable(($lang_file))) continue; + $strings = include($lang_file); + if (!is_array($strings)) continue; + $languages[$f]=array_key_exists($f,$strings) ? $strings[$f] : $f; + } + return $languages; + } +} \ No newline at end of file diff --git a/zira/log.php b/zira/log.php new file mode 100644 index 0000000..e1ce828 --- /dev/null +++ b/zira/log.php @@ -0,0 +1,78 @@ +getCode().': '.$e->getMessage().' in '.$e->getFile().':'.$e->getLine()); + } + } + + public static function write($str) { + if (!LOG_ERRORS || !self::$_file) return false; + + $log_file = REAL_PATH . DIRECTORY_SEPARATOR . + LOG_DIR . DIRECTORY_SEPARATOR . + self::$_file; + + $f=@fopen($log_file,'ab'); + if (!$f) return false; + fwrite($f, '['.date('Y-m-d H:i:s').'] URI='.Request::uri()."\r\n".$str."\r\n\r\n"); + fclose($f); + + return true; + } + + public static function getErrorType($type) + { + switch($type) + { + case E_ERROR: + return 'E_ERROR'; + case E_WARNING: + return 'E_WARNING'; + case E_PARSE: + return 'E_PARSE'; + case E_NOTICE: + return 'E_NOTICE'; + case E_CORE_ERROR: + return 'E_CORE_ERROR'; + case E_CORE_WARNING: + return 'E_CORE_WARNING'; + case E_COMPILE_ERROR: + return 'E_COMPILE_ERROR'; + case E_COMPILE_WARNING: + return 'E_COMPILE_WARNING'; + case E_USER_ERROR: + return 'E_USER_ERROR'; + case E_USER_WARNING: + return 'E_USER_WARNING'; + case E_USER_NOTICE: + return 'E_USER_NOTICE'; + case E_STRICT: + return 'E_STRICT'; + case E_RECOVERABLE_ERROR: + return 'E_RECOVERABLE_ERROR'; + case E_DEPRECATED: + return 'E_DEPRECATED'; + case E_USER_DEPRECATED: + return 'E_USER_DEPRECATED'; + } + return ''; + } +} \ No newline at end of file diff --git a/zira/mail.php b/zira/mail.php new file mode 100644 index 0000000..9189a65 --- /dev/null +++ b/zira/mail.php @@ -0,0 +1,65 @@ +isSMTP(); + self::$_mailer->Host = Config::get('smtp_host'); + self::$_mailer->SMTPAuth = true; + self::$_mailer->Username = Config::get('smtp_username'); + self::$_mailer->Password = Config::get('smtp_password'); + self::$_mailer->SMTPSecure = Config::get('smtp_secure'); + self::$_mailer->Port = Config::get('smtp_port'); + + self::sendMail($email, $subject, $body, $filename, $replyTo); + } + + protected static function sendMail($email, $subject, $body, $filename = null, $replyTo = null) { + self::$_mailer->CharSet = CHARSET; + + self::$_mailer->From = Config::get('email_from'); + self::$_mailer->FromName = Config::get('email_from_name'); + + if (!empty($replyTo)) { + self::$_mailer->addReplyTo($replyTo); + } + + self::$_mailer->addAddress($email); + + if (!empty($filename) && file_exists($filename)) { + self::$_mailer->addAttachment($filename); + } + + self::$_mailer->isHTML(self::$_is_html); + + self::$_mailer->Subject = $subject; + self::$_mailer->Body = $body; + + if(!self::$_mailer->send()) { + throw new \Exception(self::$_mailer->ErrorInfo); + } + } +} \ No newline at end of file diff --git a/zira/menu.php b/zira/menu.php new file mode 100644 index 0000000..de73879 --- /dev/null +++ b/zira/menu.php @@ -0,0 +1,275 @@ +open_query() + ->where('menu_id', '=', self::MENU_PRIMARY) + ->and_where('language', 'is', null) + ->order_by('sort_order', 'asc') + ->close_query() + ->union() + ->open_query() + ->where('menu_id', '=', self::MENU_PRIMARY) + ->and_where('language', '=', Locale::getLanguage()) + ->order_by('sort_order', 'asc') + ->close_query() + ->union() + ->open_query() + ->where('menu_id', '=', self::MENU_FOOTER) + ->and_where('language', 'is', null) + ->order_by('sort_order', 'asc') + ->close_query() + ->union() + ->open_query() + ->where('menu_id', '=', self::MENU_FOOTER) + ->and_where('language', '=', Locale::getLanguage()) + ->order_by('sort_order', 'asc') + ->close_query() + ->get(); + + usort($items, array(Models\Menu::getClass(), 'sortAsc')); + + Cache::setArray($cache_key, $items); + } + + foreach($items as $item) { + if ($item->menu_id == self::MENU_PRIMARY) { + if ($item->active == Models\Menu::STATUS_ACTIVE) { + if ($item->parent_id > 0) { + if (!array_key_exists($item->parent_id, self::$_primary_dropdowns)) { + self::$_primary_dropdowns[$item->parent_id] = array(); + } + self::$_primary_dropdowns[$item->parent_id][] = $item; + } else { + self::$_primary_items [] = $item; + } + } + + if (self::isURLActive($item->url) && ( + !self::$_primary_active_url || + mb_strlen($item->url, CHARSET)>mb_strlen(self::$_primary_active_url, CHARSET) + )) { + if ($item->active == Models\Menu::STATUS_ACTIVE) { + self::$_primary_active_url = $item->url; + } + self::$_secondary_parent_id = $item->id; + } + } else if ($item->menu_id == self::MENU_FOOTER && $item->active == Models\Menu::STATUS_ACTIVE) { + if ($item->parent_id > 0) { + if (!array_key_exists($item->parent_id, self::$_footer_dropdowns)) { + self::$_footer_dropdowns[$item->parent_id] = array(); + } + self::$_footer_dropdowns[$item->parent_id][] = $item; + } else { + self::$_footer_items [] = $item; + } + + if (self::isURLActive($item->url) && ( + !self::$_footer_active_url || + mb_strlen($item->url, CHARSET)>mb_strlen(self::$_footer_active_url, CHARSET) + )) { + self::$_footer_active_url = $item->url; + } + } + } + + self::$_initialized = true; + } + + public static function getPrimaryMenuItems() { + if (!self::$_initialized) self::init(); + return self::$_primary_items; + } + + public static function getPrimaryMenuItemDropdown($id) { + if (array_key_exists($id, self::$_primary_dropdowns)) { + return self::$_primary_dropdowns[$id]; + } else { + return array(); + } + } + + public static function getFooterMenuItems() { + if (!self::$_initialized) self::init(); + return self::$_footer_items; + } + + public static function getFooterMenuItemDropdown($id) { + if (array_key_exists($id, self::$_footer_dropdowns)) { + return self::$_footer_dropdowns[$id]; + } else { + return array(); + } + } + + public static function initSecondaryMenuItems($parent_id, $force = false) { + if (self::$_secondary_initialized && !$force) return; + self::$_secondary_initialized = true; + $items = Models\Menu::getCollection() + ->open_query() + ->where('menu_id', '=', self::MENU_SECONDARY) + ->and_where('parent_id','=',$parent_id) + ->and_where('language', 'is', null) + ->order_by('sort_order', 'asc') + ->close_query() + ->union() + ->open_query() + ->where('menu_id', '=', self::MENU_SECONDARY) + ->and_where('parent_id','=',$parent_id) + ->and_where('language', '=', Locale::getLanguage()) + ->order_by('sort_order', 'asc') + ->close_query() + ->get(); + + if (count($items)==0) return; + + usort($items, array(Models\Menu::getClass(), 'sortAsc')); + + $parents = array(); + foreach($items as $item) { + if ($item->active != Models\Menu::STATUS_ACTIVE) continue; + $parents []= $item->id; + self::$_secondary_items []= $item; + + if (self::isURLActive($item->url) && ( + !self::$_secondary_active_url || + mb_strlen($item->url, CHARSET)>mb_strlen(self::$_secondary_active_url, CHARSET) + )) { + self::$_secondary_active_url = $item->url; + } + } + + if (count($parents)==0) return; + + $items = Models\Menu::getCollection() + ->open_query() + ->where('menu_id', '=', self::MENU_SECONDARY) + ->and_where('parent_id','in',$parents) + ->and_where('language', 'is', null) + ->order_by('sort_order', 'asc') + ->close_query() + ->union() + ->open_query() + ->where('menu_id', '=', self::MENU_SECONDARY) + ->and_where('parent_id','in',$parents) + ->and_where('language', '=', Locale::getLanguage()) + ->order_by('sort_order', 'asc') + ->close_query() + ->get(); + + usort($items, array(Models\Menu::getClass(), 'sortAsc')); + + foreach($items as $item) { + if ($item->active != Models\Menu::STATUS_ACTIVE) continue; + if (!array_key_exists($item->parent_id, self::$_secondary_dropdowns)) { + self::$_secondary_dropdowns[$item->parent_id] = array(); + } + self::$_secondary_dropdowns[$item->parent_id][]=$item; + + if (self::isURLActive($item->url) && ( + !self::$_secondary_active_url || + mb_strlen($item->url, CHARSET)>mb_strlen(self::$_secondary_active_url, CHARSET) + )) { + self::$_secondary_active_url = $item->url; + } + } + } + + public static function getSecondaryMenuItems() { + return self::$_secondary_items; + } + + public static function getSecondaryMenuItemDropdown($id) { + if (array_key_exists($id, self::$_secondary_dropdowns)) { + return self::$_secondary_dropdowns[$id]; + } else { + return array(); + } + } + + public static function isSysURL($url) { + if (empty($url) || $url == '/') return true; + if ($url=='javascript:void(0)' || substr($url, 0, 1) == '#') return false; + if (strpos($url, 'http')===0 || substr($url, 0, 1) == '/') return false; + return true; + } + + public static function parseURL($url, $encode = true) { + if (!self::isSysURL($url)) { + return $url; + } else { + if ($encode) $url = Page::encodeURL($url); + return Helper::url($url); + } + } + + public static function isURLActive($url) { + if (!self::isSysURL($url)) return false; + if (Router::getModule()==DEFAULT_MODULE && + Router::getController()==DEFAULT_CONTROLLER && + Router::getAction()==DEFAULT_ACTION + ) { + if ($url == '/') return true; + else return false; + } + $record_url = Page::getRecordUrl(); + if ($record_url && $record_url == Page::encodeURL($url)) return true; + $categories = Category::chain(); + foreach($categories as $category) { + if ($category->name == $url) return true; + } + return false; + } + + public static function getPrimaryMenuActiveURL() { + if (!self::$_initialized) self::init(); + return self::$_primary_active_url; + } + + public static function getFooterMenuActiveURL() { + if (!self::$_initialized) self::init(); + return self::$_footer_active_url; + } + + public static function getSecondaryMenuActiveURL() { + return self::$_secondary_active_url; + } + + public static function getSecondaryParentId() { + if (!self::$_initialized) self::init(); + return self::$_secondary_parent_id; + } +} \ No newline at end of file diff --git a/zira/models/blacklist.php b/zira/models/blacklist.php new file mode 100644 index 0000000..80e1d8c --- /dev/null +++ b/zira/models/blacklist.php @@ -0,0 +1,36 @@ + 'user_id', + User::getClass() => 'blocked_user_id' + ); + } +} \ No newline at end of file diff --git a/zira/models/block.php b/zira/models/block.php new file mode 100644 index 0000000..9d3100e --- /dev/null +++ b/zira/models/block.php @@ -0,0 +1,37 @@ +form_id = $form_id; + $captcha->date_created = date('Y-m-d H:i:s'); + $captcha->save(); + } + + public static function isActive($form_id) { + $total = self::getCollection() + ->count() + ->where('form_id','=',$form_id) + ->and_where('date_created','>=',date('Y-m-d H:i:s',time()-CAPTCHA_SLEEP_TIME)) + ->get('co'); + + return ($total >= CAPTCHA_SLEEP_MAX_REQUESTS); + } + + public static function cleanUp() { + self::getCollection() + ->delete() + ->where('date_created','<',date('Y-m-d',time()-3600)) + ->execute() + ; + } +} \ No newline at end of file diff --git a/zira/models/category.php b/zira/models/category.php new file mode 100644 index 0000000..bf6e15c --- /dev/null +++ b/zira/models/category.php @@ -0,0 +1,67 @@ +order_by('name','asc')->get(); + + $categories = array(); + foreach($rows as $row) { + $prefix = ''; + if (!empty($_prefix) && strpos($row->name,'/')!==false) { + $prefix = str_repeat($_prefix, strlen(preg_replace('/[^\/]/','',$row->name))); + } + $categories[$row->id] = $prefix.Locale::t($row->title); + } + + return $categories; + } + + public static function getTopCategories($order_by = 'id', $sort = 'asc') { + return self::getCollection() + ->where('parent_id', '=', \Zira\Category::ROOT_CATEGORY_ID) + ->order_by($order_by, $sort) + ->get(); + } + + public static function getChildCategories($category) { + return self::getCollection() + ->where('name', 'like', $category->name . '/%') + ->get(); + } +} \ No newline at end of file diff --git a/zira/models/comment.php b/zira/models/comment.php new file mode 100644 index 0000000..1713e96 --- /dev/null +++ b/zira/models/comment.php @@ -0,0 +1,167 @@ + 'record_id', + User::getClass() => 'author_id' + ); + } + + public static function countComments($record_id, $published= true) { + $query = self::getCollection() + ->count() + ->where('record_id','=',$record_id); + if ($published) { + $query->and_where('published', '=', self::STATUS_PUBLISHED); + } + return $query->get('co'); + } + + public static function getComments($record_id, $limit = null, $offset = 0, $published= true) { + if ($limit===null) $limit = Config::get('comments_limit', 10); + + $query = self::getCollection() + ->select(self::getFields()) + ->left_join(User::getClass(), array('author_username'=>'username','author_firstname'=>'firstname','author_secondname'=>'secondname','author_image'=>'image')) + ->where('record_id','=',$record_id); + if ($published) { + $query->and_where('published', '=', self::STATUS_PUBLISHED); + } + $query->order_by('sort_path','asc'); + $query->limit($limit, $offset); + return $query->get(); + } + + public static function getPathOffset($record_id, $parent = null) { + $parent_id = 0; + if ($parent!==null) { + $parent_id = $parent->id; + $parts = explode(self::PATH_DELIMITER, $parent->sort_path); + if (count($parts)>=50) return $parent->sort_path; + } + + $offset= self::getCollection() + ->max('path_offset') + ->where('record_id','=',$record_id) + ->and_where('parent_id','=',$parent_id) + ->get('mx'); + + return intval($offset); + } + + public static function getSortPath($path_offset, $parent = null) { + if ($parent===null) { + $path = self::generatePath($path_offset, true); + } else { + $path = $parent->sort_path . self::PATH_DELIMITER . self::generatePath($path_offset, false); + } + + return $path; + } + + public static function generatePath($offset, $desc = false) { + if ($desc) $chars = range('z','a'); + else $chars = range('a','z'); + $count = count($chars); + $max = pow($count, 4); + if ($offset >= $max) $offset = $max - 1; + $offset1 = intval($offset / pow($count,3)); + $offset2 = intval(($offset % pow($count,3)) / pow($count,2)) % $count; + $offset3 = intval(($offset % pow($count,2)) / $count) % $count; + $offset4 = $offset % $count; + $path = ''; + if ($offset1<$count) $path .= $chars[$offset1]; + if ($offset2<$count) $path .= $chars[$offset2]; + if ($offset3<$count) $path .= $chars[$offset3]; + if ($offset4<$count) $path .= $chars[$offset4]; + return $path; + } + + public static function getDefaultNotifyMessage() { + $message = Locale::t('Hello %s !', Locale::t('moderator'))."\r\n\r\n"; + $message .= Locale::t('New comment was posted on: %s', '$page')."\r\n"; + $message .= Locale::t('Page URL address: %s','$url')."\r\n\r\n"; + $message .= Locale::t('Comment text').':'."\r\n"; + $message .= '$comment'."\r\n\r\n"; + $message .= Locale::t('You recieved this message, because your Email address is specified as a notification Email on %s','$site'); + return $message; + } + + public static function notify($record, $comment) { + $email = Config::get('comment_notify_email'); + if (empty($email)) return; + + if ($record->category_id != Zira\Category::ROOT_CATEGORY_ID) { + $category = new Zira\Models\Category($record->category_id); + if (!$category->loaded()) return; + $url = Zira\Page::generateRecordUrl($category->name, $record->name); + } else { + $url = Zira\Page::generateRecordUrl(null, $record->name); + } + + $message = Config::get('comment_notification_message'); + if (!$message || strlen(trim($message))==0) { + $message = self::getDefaultNotifyMessage(); + } else { + $message = Locale::t($message); + } + $message = str_replace('$page', $record->title, $message); + $message = str_replace('$url', Helper::url($url, true, true), $message); + $message = str_replace('$comment', $comment->content, $message); + $message = str_replace('$site', Helper::url('/',true, true), $message); + + Zira\Mail::send($email, Locale::t('New comment was posted'), Helper::html($message)); + } +} \ No newline at end of file diff --git a/zira/models/commentlike.php b/zira/models/commentlike.php new file mode 100644 index 0000000..5c8645e --- /dev/null +++ b/zira/models/commentlike.php @@ -0,0 +1,32 @@ + 'user_id' + ); + } + + public static function createConversation($sender_id, $recipient_id, $subject) { + //$max_id = self::getCollection()->max('conversation_id')->get('mx'); + $max_id = Message::getCollection()->max('conversation_id')->get('mx'); + $conversation_id = ++$max_id; + + $conversation = new self; + $conversation->conversation_id = $conversation_id; + $conversation->user_id = $sender_id; + $conversation->subject = $subject; + $conversation->creation_date = date('Y-m-d H:i:s'); + $conversation->modified_date = date('Y-m-d H:i:s'); + $conversation->highlight = 0; + $conversation->save(); + + $conversation = new self; + $conversation->conversation_id = $conversation_id; + $conversation->user_id = $recipient_id; + $conversation->subject = $subject; + $conversation->creation_date = date('Y-m-d H:i:s'); + $conversation->modified_date = date('Y-m-d H:i:s'); + $conversation->highlight = 1; + $conversation->save(); + + return $conversation_id; + } + + public static function createGroupConversation($sender_id, array $recipient_ids, $subject) { + //$max_id = self::getCollection()->max('conversation_id')->get('mx'); + $max_id = Message::getCollection()->max('conversation_id')->get('mx'); + $conversation_id = ++$max_id; + + $conversation = new self; + $conversation->conversation_id = $conversation_id; + $conversation->user_id = $sender_id; + $conversation->subject = $subject; + $conversation->creation_date = date('Y-m-d H:i:s'); + $conversation->modified_date = date('Y-m-d H:i:s'); + $conversation->highlight = 0; + $conversation->save(); + + foreach ($recipient_ids as $recipient_id) { + $conversation = new self; + $conversation->conversation_id = $conversation_id; + $conversation->user_id = $recipient_id; + $conversation->subject = $subject; + $conversation->creation_date = date('Y-m-d H:i:s'); + $conversation->modified_date = date('Y-m-d H:i:s'); + $conversation->highlight = 1; + $conversation->save(); + } + + return $conversation_id; + } +} \ No newline at end of file diff --git a/zira/models/draft.php b/zira/models/draft.php new file mode 100644 index 0000000..78caf36 --- /dev/null +++ b/zira/models/draft.php @@ -0,0 +1,46 @@ + 'record_id', + User::getClass() => 'author_id' + ); + } + + public static function cleanUp() { + self::getCollection() + ->delete() + ->where('published','=',self::STATUS_PUBLISHED) + ->and_where('modified_date','<',date('Y-m-d H:i:s',time()-2592000)) // 30 days + ->execute(); + } +} \ No newline at end of file diff --git a/zira/models/group.php b/zira/models/group.php new file mode 100644 index 0000000..be07780 --- /dev/null +++ b/zira/models/group.php @@ -0,0 +1,77 @@ +order_by(self::getPk(), 'ASC') + ->get(); + + Cache::setArray(self::CACHE_KEY, $rows); + } + return $rows; + } + + public static function getActiveList() { + $rows = Cache::getArray(self::CACHE_ACTIVE_KEY); + if ($rows === false) { + $rows = self::getCollection() + ->where('active', '=', self::STATUS_ACTIVE) + ->order_by(self::getPk(), 'ASC') + ->get(); + + Cache::setArray(self::CACHE_ACTIVE_KEY, $rows); + } + return $rows; + } + + public static function getArray($activeOnly=false) { + $groupsArr = array(); + if (!$activeOnly) { + $groups = self::getList(); + } else { + $groups = self::getActiveList(); + } + foreach($groups as $group) { + $groupsArr[$group->id] = Locale::t($group->name); + } + return $groupsArr; + } +} \ No newline at end of file diff --git a/zira/models/image.php b/zira/models/image.php new file mode 100644 index 0000000..5a09c9a --- /dev/null +++ b/zira/models/image.php @@ -0,0 +1,34 @@ + 'record_id' + ); + } +} \ No newline at end of file diff --git a/zira/models/like.php b/zira/models/like.php new file mode 100644 index 0000000..632b22c --- /dev/null +++ b/zira/models/like.php @@ -0,0 +1,32 @@ +sort_order == $b->sort_order) return 0; + else return ($a->sort_order < $b->sort_order) ? -1 : 1; + } + + public static function sortDesc($a, $b) { + if ($a->sort_order == $b->sort_order) return 0; + else return ($a->sort_order > $b->sort_order) ? -1 : 1; + } +} \ No newline at end of file diff --git a/zira/models/message.php b/zira/models/message.php new file mode 100644 index 0000000..d0df69a --- /dev/null +++ b/zira/models/message.php @@ -0,0 +1,64 @@ + 'conversation_id', + User::getClass() => 'user_id' + ); + } + + public static function getDefaultNotifyMessage() { + $message = Locale::t('Hello %s !', '$user')."\r\n\r\n"; + $message .= Locale::t('You have new message from %s.', '$sender')."\r\n"; + $message .= Locale::t('Log in %s to read it.','$url')."\r\n\r\n"; + $message .= Locale::t('You recieved this message, because you are subscribed to Email notifications on %s','$site'); + return $message; + } + + public static function notify($user, $sender) { + if (!$user->subscribed || !$user->email || !$user->verified || !$user->active) return; + + $message = Zira\Config::get('new_message_notification'); + if (!$message || strlen(trim($message))==0) { + $message = self::getDefaultNotifyMessage(); + } else { + $message = Locale::t($message); + } + $message = str_replace('$user', Zira\User::getProfileName($user), $message); + $message = str_replace('$sender', Zira\User::getProfileName($sender), $message); + $message = str_replace('$url', Zira\Helper::url('user/login',true, true), $message); + $message = str_replace('$site', Zira\Helper::url('/',true, true), $message); + + Zira\Mail::send($user->email, Locale::t('You have new message'), Zira\Helper::html($message)); + } +} \ No newline at end of file diff --git a/zira/models/option.php b/zira/models/option.php new file mode 100644 index 0000000..bcb8a3a --- /dev/null +++ b/zira/models/option.php @@ -0,0 +1,70 @@ +select('id') + ->where('name','=',$name) + ->get('id'); + if (empty($id)) { + $obj = new self(); + } else { + $obj = new self($id); + } + + $obj->module = 'zira'; + $obj->name = $name; + $obj->value = $value; + $obj->save(); + } + + public static function raiseVersion() { + self::write('config_version', Config::get('config_version')+1); + Cache::clear(true); + } +} \ No newline at end of file diff --git a/zira/models/permission.php b/zira/models/permission.php new file mode 100644 index 0000000..1a5cada --- /dev/null +++ b/zira/models/permission.php @@ -0,0 +1,46 @@ + 'group_id' + ); + } + + public static function getGroupPermissions($group_id) { + return self::getCollection() + ->select('name', 'allow') + ->join(Group::getClass(), array('group_name'=>'name')) + ->where('group_id','=',$group_id) + ->and_where('active','=',Group::STATUS_ACTIVE, Group::getAlias()) + ->get() + ; + } +} \ No newline at end of file diff --git a/zira/models/record.php b/zira/models/record.php new file mode 100644 index 0000000..96b931a --- /dev/null +++ b/zira/models/record.php @@ -0,0 +1,88 @@ + 'category_id', + User::getClass() => 'author_id' + ); + } + + public static function sortByRatingAsc($a, $b) { + if ($a->rating == $b->rating) return 0; + else return ($a->rating < $b->rating) ? -1 : 1; + } + + public static function sortByRatingDesc($a, $b) { + if ($a->rating == $b->rating) return 0; + else return ($a->rating > $b->rating) ? -1 : 1; + } + + public static function sortByCommentsAsc($a, $b) { + if ($a->comments == $b->comments) return 0; + else return ($a->comments < $b->comments) ? -1 : 1; + } + + public static function sortByCommentsDesc($a, $b) { + if ($a->comments == $b->comments) return 0; + else return ($a->comments > $b->comments) ? -1 : 1; + } +} \ No newline at end of file diff --git a/zira/models/search.php b/zira/models/search.php new file mode 100644 index 0000000..39c9728 --- /dev/null +++ b/zira/models/search.php @@ -0,0 +1,180 @@ + 'record_id' + ); + } + + public static function clearRecordIndex($record) { + self::getCollection() + ->delete() + ->where('record_id', '=', $record->id) + ->execute(); + } + + public static function indexRecord($record) { + self::clearRecordIndex($record); + + if ($record->published != Record::STATUS_PUBLISHED) return; + + $keywords_str = ''; + if ($record->meta_keywords) { + $keywords = explode(',', $record->meta_keywords); + foreach ($keywords as $keyword) { + $keywords_str .= ' ' . $keyword; + } + } + + $text = $record->title . ' ' . $record->meta_title . ' ' . $keywords_str; + $text = trim($text); + if (empty($text)) return; + $text = mb_strtolower($text, CHARSET); + $text = preg_replace('/[\x20]+/',' ', $text); + $keywords = explode(' ', $text); + + $added = array(); + foreach($keywords as $keyword) { + if (in_array($keyword, $added)) continue; + if (mb_strlen($keyword, CHARSET)keyword = $keyword; + $index->record_id = $record->id; + $index->language = $record->language; + $index->save(); + $added []= $keyword; + } + } + + public static function getRecords($text, $limit = 10, $offset = 0) { + $text = trim($text); + if (empty($text)) return array(); + $text = mb_strtolower($text, CHARSET); + $keywords = explode(' ', $text); + + $query = self::getCollection(); + + $added = array(); + foreach($keywords as $index=>$keyword) { + if (mb_strlen($keyword, CHARSET)0) $query->union(); + $query->open_query(); + $query->select('record_id'); + $query->where('language','=',Locale::getLanguage()); + $query->and_where('keyword','like',$keyword.'%'); + $query->limit($limit+$limit*$offset); + $query->close_query(); + $added []= $keyword; + if (count($added)>=5) break; + } + + if (empty($added)) return array(); + + $query->merge(); + $query->limit($limit, $offset); + $rows = $query->get(); + + $results = array(); + foreach($rows as $row) { + $results[]=$row->record_id; + } + + if (empty($results)) return array(); + + return Record::getCollection() + ->select('id', 'name','author_id','title','description','thumb','creation_date','rating','comments') + ->left_join(Category::getClass(), array('category_name'=>'name', 'category_title'=>'title')) + ->where('id','in',$results) + ->get(); + } + + public static function getRecordsSorted($text, $limit = 5) { + $text = trim($text); + if (empty($text)) return array(); + $text = mb_strtolower($text, CHARSET); + $keywords = explode(' ', $text); + + $query = self::getCollection(); + + $added = array(); + foreach($keywords as $index=>$keyword) { + if (mb_strlen($keyword, CHARSET)0) $query->union(); + $query->open_query(); + $query->where('language','=',Locale::getLanguage()); + $query->and_where('keyword','like',$keyword.'%'); + $query->limit($limit); + $query->close_query(); + $added []= $keyword; + if (count($added)>=5) break; + } + + if (empty($added)) return array(); + $rows = $query->get(); + + $results = array(); + foreach($rows as $row) { + if (!array_key_exists($row->record_id, $results)) { + $results[$row->record_id] = 0; + } + $results[$row->record_id]++; + } + + if (empty($results)) return array(); + + arsort($results); + + $rows = Record::getCollection() + ->select('id', 'name','author_id','title','description','thumb','creation_date','rating','comments') + ->left_join(Category::getClass(), array('category_name'=>'name', 'category_title'=>'title')) + ->where('id','in',array_keys($results)) + ->get(); + + if (empty($rows)) return array(); + + $_results = array(); + foreach($rows as $row) { + $_results[$row->id] = $row; + } + + $return = array(); + foreach($results as $id=>$co) { + if (!array_key_exists($id, $_results)) continue; + $return []= $_results[$id]; + } + + if (count($return)>$limit) return array_slice($return, 0, $limit); + else return $return; + } +} \ No newline at end of file diff --git a/zira/models/slide.php b/zira/models/slide.php new file mode 100644 index 0000000..192be15 --- /dev/null +++ b/zira/models/slide.php @@ -0,0 +1,34 @@ + 'record_id' + ); + } +} \ No newline at end of file diff --git a/zira/models/translate.php b/zira/models/translate.php new file mode 100644 index 0000000..5442d2b --- /dev/null +++ b/zira/models/translate.php @@ -0,0 +1,34 @@ + 'group_id' + ); + } + + protected static function getJoinedCollection() { + return self::getCollection() + ->join(Group::getClass(), array('group_name'=>'name')) + ; + } + + protected static function getActiveCollection() + { + $collection = self::getJoinedCollection(); + return $collection + ->where('verified', '=', self::STATUS_VERIFIED) + ->and_where('active', '=', self::STATUS_ACTIVE) + ->and_where('active', '=', Group::STATUS_ACTIVE, Group::getAlias()); + } + + public static function findUser($username_or_email_or_id) { + $collection = self::getJoinedCollection(); + $collection->select(self::getFields()); + + if (is_int($username_or_email_or_id)) { + $collection->where(self::getPk(),'=',$username_or_email_or_id); + } else if (strpos($username_or_email_or_id,'@')!==false) { + $collection->where('email','=',$username_or_email_or_id); + } else { + $collection->where('username','=',$username_or_email_or_id); + } + + return $collection->get(0); + } + + public static function findActiveUser($username_or_email_or_id) { + $collection = self::getActiveCollection(); + $collection->select(self::getFields()); + + if (is_int($username_or_email_or_id)) { + $collection->and_where(self::getPk(),'=',$username_or_email_or_id); + } else if (strpos($username_or_email_or_id,'@')!==false) { + $collection->and_where('email','=',$username_or_email_or_id); + } else { + $collection->and_where('username','=',$username_or_email_or_id); + } + + return $collection->get(0); + } + + public static function findAuthUser($username_or_email) { + $collection = self::getJoinedCollection(); + $collection->select(self::getFields()) + ->where('active','=',self::STATUS_ACTIVE) + ->and_where('active','=',Group::STATUS_ACTIVE, Group::getAlias()) + ; + + if (strpos($username_or_email,'@')!==false) { + $collection->and_where('email','=',$username_or_email); + } else { + $collection->and_where('username','=',$username_or_email); + } + + return $collection->get(0); + } + + public static function getActiveUsersCount() { + $collection = self::getActiveCollection(); + return $collection->count()->get('co'); + } + + public static function getActiveUsers($limit=10, $offset=0, $order='DESC') { + $collection = self::getActiveCollection(); + return $collection->select(self::getFields()) + ->order_by(self::getPk(), $order) + ->limit($limit,$offset) + ->get() + ; + } + + public static function getAllUsersCount() { + $collection = self::getJoinedCollection(); + return $collection->count()->get('co'); + } + + public static function getAllUsers($limit=10, $offset=0, $order='DESC') { + $collection = self::getJoinedCollection(); + return $collection->select(self::getFields()) + ->order_by(self::getPk(), $order) + ->limit($limit,$offset) + ->get() + ; + } + + public static function getGroupAllUsersCount($group_id) { + $collection = self::getJoinedCollection(); + return $collection->count() + ->where('group_id','=',$group_id) + ->get('co'); + } + + public static function getGroupAllUsers($group_id, $limit=10, $offset=0, $order='DESC') { + $collection = self::getJoinedCollection(); + return $collection->select(self::getFields()) + ->where('group_id','=',$group_id) + ->order_by(self::getPk(), $order) + ->limit($limit,$offset) + ->get() + ; + } + + public static function getSearchUsersCount($username_or_email_or_id, $group_id=null) { + $collection = self::getJoinedCollection(); + $collection->count(); + + $collection->open_where(); + if (is_numeric($username_or_email_or_id)) { + $collection->where(self::getPk(),'=',intval($username_or_email_or_id)); + } else if (strpos($username_or_email_or_id,'@')!==false) { + $collection->where('email','=',$username_or_email_or_id); + } else { + $collection->where('username','like','%'.$username_or_email_or_id.'%'); + $collection->or_where('firstname','like','%'.$username_or_email_or_id.'%'); + $collection->or_where('secondname','like','%'.$username_or_email_or_id.'%'); + } + $collection->close_where(); + + if (!empty($group_id)) { + $collection->and_where('group_id','=',$group_id); + } + + return $collection->get('co'); + } + + public static function searchUsers($username_or_email_or_id, $limit=10, $offset=0, $order='DESC', $group_id=null) { + $collection = self::getJoinedCollection(); + $collection->select(self::getFields()); + + $collection->open_where(); + if (is_numeric($username_or_email_or_id)) { + $collection->where(self::getPk(),'=',intval($username_or_email_or_id)); + } else if (strpos($username_or_email_or_id,'@')!==false) { + $collection->where('email','=',$username_or_email_or_id); + } else { + $collection->where('username','like','%'.$username_or_email_or_id.'%'); + $collection->or_where('firstname','like','%'.$username_or_email_or_id.'%'); + $collection->or_where('secondname','like','%'.$username_or_email_or_id.'%'); + } + $collection->close_where(); + + if (!empty($group_id)) { + $collection->and_where('group_id','=',$group_id); + } + + return $collection->order_by(self::getPk(), $order) + ->limit($limit,$offset) + ->get(); + } +} \ No newline at end of file diff --git a/zira/models/widget.php b/zira/models/widget.php new file mode 100644 index 0000000..2a09118 --- /dev/null +++ b/zira/models/widget.php @@ -0,0 +1,61 @@ + Locale::t('HEAD tag'), + View::VAR_BODY_TOP => Locale::t('BODY tag top'), + View::VAR_HEADER => Locale::t('Header'), + View::VAR_SIDEBAR_LEFT => Locale::t('Left sidebar'), + View::VAR_SIDEBAR_RIGHT => Locale::t('Right sidebar'), + View::VAR_CONTENT_TOP => Locale::t('Before content'), + View::VAR_CONTENT => Locale::t('Content'), + View::VAR_CONTENT_BOTTOM => Locale::t('After content'), + View::VAR_FOOTER => Locale::t('Footer'), + View::VAR_BODY_BOTTOM => Locale::t('BODY tag bottom') + ); + } + + public static function getFiltersArray() { + return array( + self::STATUS_FILTER_CATEGORY => Locale::t('Display on category page only'), + self::STATUS_FILTER_RECORD => Locale::t('Display on record page only') + ); + } +} \ No newline at end of file diff --git a/zira/orm.php b/zira/orm.php new file mode 100644 index 0000000..22c57d4 --- /dev/null +++ b/zira/orm.php @@ -0,0 +1,12 @@ +$title)); + } + + public static function setTitle($title) { + //$title = Helper::html($title); //converted in tag generation + View::setLayoutData(array(View::VAR_TITLE=>$title)); + } + + public static function setKeywords($keywords) { + //$keywords = Helper::html($keywords); //converted in addMeta + View::addMeta(array('name'=>'keywords','content'=>$keywords)); + View::setKeywordsAdded(true); + } + + public static function setDescription($description) { + //$description = Helper::html($description); //converted in addMeta + $description = str_replace("\r\n", ' ', $description); + View::addMeta(array('name'=>'description','content'=>$description)); + View::setDescriptionAdded(true); + } + + public static function addOpenGraphTags($title, $description, $url = '', $image = null) { + $description = str_replace("\r\n", ' ', $description); + if ($image === null) $image = Config::get('site_logo'); + $tags = array( + 'og:site_name' => Config::get('site_title') ? Locale::t(Config::get('site_title')) : Locale::t(Config::get('site_name')), + 'og:type' => 'website', + 'og:title' => $title, + 'og:description' => $description, + 'og:url' => Helper::url($url, true, true), + 'og:image' => Helper::baseUrl($image, true, true) + ); + foreach($tags as $property=>$content) { + View::addMeta(array('property'=>$property,'content'=>$content)); + } + } + + public static function addBreadcrumb($link, $title) { + self::$_breadcrumbs [] = array('link'=>$link, 'title'=>$title); + } + + public static function breadcrumbs() { + if (!View::renderBreadcrumbsEnabled()) return ''; + $added = array(); + $html = Helper::tag_open('ol',array('class'=>self::BREADCRUMBS_CLASS)); + foreach(self::$_breadcrumbs as $breadcrumb) { + if (!empty($breadcrumb['link'])) { + if (in_array($breadcrumb['link'], $added)) continue; + $added []= $breadcrumb['link']; + } + if (empty($breadcrumb['link']) || $breadcrumb['link'] == Router::getRequest()) { + $html .= Helper::tag('li', $breadcrumb['title'], array('class'=>'active')); + } else { + $html .= Helper::tag_open('li'); + $html .= Helper::tag('a', $breadcrumb['title'], array('href'=>Helper::url($breadcrumb['link']))); + $html .= Helper::tag_close('li'); + } + } + $html .= Helper::tag_close('ol'); + return $html; + } + + public static function allowPreview() { + return Dash::isFrame() && Permission::check(Permission::TO_ACCESS_DASHBOARD); + } + + public static function setSlider(array $images) { + View::addSlider('slider', array( + 'auto' => true, + 'speed' => 500, + 'pause' => 8000, + 'captions' => true, + 'slideMargin' => 0, + 'adaptiveHeight' => false + )); + View::addPlaceholderView(View::VAR_CONTENT_TOP, array('images'=>$images), 'zira/slider'); + } + + public static function setGallery(array $images) { + View::addLightbox(); + View::addPlaceholderView(View::VAR_CONTENT, array('images'=>$images), 'zira/gallery'); + } + + public static function setComments($record, $preview = false) { + $commenting_allowed = Config::get('comments_allowed',true); + if (!Config::get('comment_anonymous',true) && + !User::isAuthorized() + ) { + $commenting_allowed = false; + } + if ($commenting_allowed) { + $form = new Forms\Comment(); + $form->setValue('record_id', $record->id); + } else { + $form = null; + } + $limit = Config::get('comments_limit', 10); + $comments = Models\Comment::getComments($record->id, $limit, 0, !$preview); + View::addPlaceholderView(View::VAR_CONTENT, array( + 'record_id'=>$record->id, + 'form'=>$form, + 'comments'=>$comments, + 'limit'=>$limit, + 'page'=>0, + 'total'=>Models\Comment::countComments($record->id, !$preview) + ), 'zira/comments'); + View::preloadThemeLoader(); + View::addParser(); + } + + public static function encodeURL($url) { + $url = urlencode($url); + $url = str_replace('%2F','/',$url); + return $url; + } + + public static function generateCategoryUrl($category_name) { + return self::encodeURL($category_name); + } + + public static function generateRecordUrl($category_name, $record_name) { + if (empty($category_name)) return self::encodeURL($record_name); + else return self::encodeURL($category_name) . '/' . self::encodeURL($record_name); + } + + public static function getRecordId() { + return self::$_record_id; + } + + public static function getRecordUrl() { + return self::$_record_url; + } + + public static function setRecordId($record_id) { + self::$_record_id = (int)$record_id; + } + + public static function setRecordUrl($url) { + self::$_record_url = $url; + } + + public static function createRecordThumb($src_path, $category_id, $record_id, $gallery=false, $slider=false) { + if ($category_id==Category::ROOT_CATEGORY_ID) { + $savedir = THUMBS_DIR; + } else { + $savedir = THUMBS_DIR . DIRECTORY_SEPARATOR . 'cat'. $category_id; + } + if ($gallery) $savedir .= DIRECTORY_SEPARATOR . 'gal'.$record_id; + else if ($slider) $savedir .= DIRECTORY_SEPARATOR . 'sli'.$record_id; + $save_path = File::getAbsolutePath($savedir); + $ext = 'thumb'; + $p = strrpos($src_path, '.'); + if ($p!==false) $ext = substr($src_path, $p+1); + do { + if (!$gallery && !$slider) { + $name = 'rec' . $record_id . '.' . uniqid() . '.' . $ext; + } else { + $name = 'img' . uniqid() . '.' . $ext; + } + } while(file_exists($save_path . DIRECTORY_SEPARATOR . $name)); + if (file_exists($src_path) && Image::createThumb($src_path, $save_path . DIRECTORY_SEPARATOR . $name, Config::get('thumbs_width'), Config::get('thumbs_height'))) { + return UPLOADS_DIR . '/' . str_replace(DIRECTORY_SEPARATOR, '/', $savedir) . '/' . $name; + } else { + return false; + } + } + + public static function getRecords($category, $front_page = false, $limit = null, $last_id = null, $includeChilds = true, array $childs = null) { + if ($limit === null) $limit = Config::get('records_limit', 10); + + $category_ids = array($category->id); + if ($includeChilds) { + if ($childs === null) $childs = Category::getChilds($category); + foreach ($childs as $child) { + $category_ids [] = $child->id; + } + } + + if ($includeChilds && count($category_ids)>1) { + $records = self::getCategoriesRecordsList($category_ids, $front_page, $limit, $last_id); + } else { + $records = self::getCategoryRecordsList($category_ids[0], $front_page, $limit, $last_id); + } + + return $records; + } + + public static function getCategoryRecordsList($category_id, $front_page = false, $limit = null, $last_id = null) { + if ($limit === null) $limit = Config::get('records_limit', 10); + + $query = Record::getCollection() + ->select('id', 'name','author_id','title','description','thumb','creation_date','rating','comments') + ->join(Models\Category::getClass(), array('category_name'=>'name', 'category_title'=>'title')) + ->join(Models\User::getClass(), array('author_username'=>'username', 'author_firstname'=>'firstname', 'author_secondname'=>'secondname')) + ; + + $query->where('category_id', '=', $category_id); + $query->and_where('language', '=', Locale::getLanguage()); + $query->and_where('published', '=', Record::STATUS_PUBLISHED); + if ($front_page) { + $query->and_where('front_page','=',Record::STATUS_FRONT_PAGE); + } + if ($last_id!==null) { + $query->and_where('id', '<', $last_id); + } + $query->order_by('id', 'desc'); + $query->limit($limit); + + return $query->get(); + } + + public static function getCategoriesRecordsList(array $category_ids, $front_page = false, $limit = null, $last_id = null) { + if ($limit === null) $limit = Config::get('records_limit', 10); + + $query = Record::getCollection(); + foreach($category_ids as $index=>$category_id) { + if ($index>0) { + $query->union(); + } + $query->open_query(); + $query->select('id'); + $query->where('category_id', '=', $category_id); + $query->and_where('language', '=', Locale::getLanguage()); + $query->and_where('published', '=', Record::STATUS_PUBLISHED); + if ($front_page) { + $query->and_where('front_page','=',Record::STATUS_FRONT_PAGE); + } + if ($last_id!==null) { + $query->and_where('id', '<', $last_id); + } + $query->order_by('id', 'desc'); + $query->limit($limit); + $query->close_query(); + } + $query->merge(); + $query->order_by('id', 'desc'); + $query->limit($limit); + + $rows = $query->get(); + + if (!$rows) return array(); + + $query = Record::getCollection() + ->select('id', 'name','author_id','title','description','thumb','creation_date','rating','comments') + ->join(Models\Category::getClass(), array('category_name'=>'name', 'category_title'=>'title')) + ->join(Models\User::getClass(), array('author_username'=>'username', 'author_firstname'=>'firstname', 'author_secondname'=>'secondname')) + ; + + $record_ids = array(); + foreach($rows as $index=>$row) { + $record_ids []= $row->id; + } + $query->where('id','in',$record_ids); + + $query->order_by('id', 'desc'); + + return $query->get(); + } + + public static function render(array $data = null) { + if ($data === null) $data = array(); + if (View::isAjax()) { + if (!isset($data[self::VIEW_PLACEHOLDER_CONTENT]) || !($data[self::VIEW_PLACEHOLDER_CONTENT] instanceof Form\Factory)) { + echo json_encode($data); + } else { + echo json_encode(array( + 'message'=>$data[self::VIEW_PLACEHOLDER_CONTENT]->getMessage(), + 'error'=>$data[self::VIEW_PLACEHOLDER_CONTENT]->getError() + )); + } + return; + } + View::render($data, self::$_view, self::$_layout); + } +} \ No newline at end of file diff --git a/zira/pagination.php b/zira/pagination.php new file mode 100644 index 0000000..f8ee35d --- /dev/null +++ b/zira/pagination.php @@ -0,0 +1,228 @@ +_param = $param; + } + + public function setTotal($total) { + $this->_total = intval($total); + } + + public function setLimit($limit) { + $this->_limit = intval($limit); + } + + public function setPage($page) { + $this->_page = intval($page); + if ($this->_page<1) $this->_page = 1; + } + + public function setOffset($offset) { + $this->_offset = intval($offset); + if ($this->_offset<0) $this->_offset = 0; + } + + public function setPages($pages) { + $this->_pages = intval($pages); + } + + public function setUrl($url) { + $this->_url = $url; + } + + public function setUrlParams(array $url_params) { + $this->_url_params = $url_params; + } + + public function setClass($class) { + $this->_class = $class; + } + + public function setId($id) { + $this->_id = $id; + } + + public function getParam() { + return $this->_param; + } + + public function getTotal() { + return $this->_total; + } + + public function getLimit() { + return $this->_limit; + } + + public function getPage() { + if ($this->_page === null) { + $this->setPage(Request::get($this->getParam())); + } + return $this->_page; + } + + public function getOffset() { + if ($this->_offset === null) { + $limit = $this->getLimit(); + if ($limit === null) { + throw new \Exception('Limit is not set'); + } + $page = $this->getPage(); + $this->_offset = ($page-1)*$limit; + } + return $this->_offset; + } + + public function getPages() { + return $this->_pages; + } + + public function getUrl() { + return $this->_url; + } + + public function getUrlParams() { + return $this->_url_params; + } + + public function getClass() { + if ($this->_class === null) return ''; + return $this->_class; + } + + public function getId() { + if ($this->_id === null) return ''; + return $this->_id; + } + + protected function url($page) { + $url = $this->getUrl(); + $params = $this->getUrlParams(); + $url_params = ''; + if (!empty($params)) { + foreach($params as $k=>$v) { + if (empty($url_params)) $url_params .= '?'; + else $url_params .= '&'; + $url_params .= $k.'='.$v; + } + } + if ($url === null) { + if (empty($url_params)) { + $param = $this->getParam(); + foreach(Request::get() as $k=>$v) { + if ($k==$param) continue; + if (empty($url_params)) $url_params .= '?'; + else $url_params .= '&'; + $url_params .= $k.'='.$v; + } + } + $sign = '?'; + if (!empty($url_params)) $sign = '&'; + $url = Helper::url(Router::getRequest()).$url_params.$sign.$this->getParam().'='.$page; + } else { + $sign = '?'; + if (strpos($url, '?')!==false || !empty($url_params)) $sign = '&'; + $url = Helper::url($url).$url_params.$sign.$this->getParam().'='.$page; + } + return $url; + } + + public function __toString() { + $limit = $this->getLimit(); + $page = $this->getPage(); + $total = $this->getTotal(); + $pages = $this->getPages(); + + if ($total === null || $total<=0 || $limit === null || $limit<=0 || $total<=$limit) return ''; + + $total = ceil($total / $limit); + $pages_half = floor($pages/2); + $start = 1; + $end = $total>$pages ? $pages : $total; + if ($total>$pages && $page>$pages_half && $total-$page>$pages_half) { + $start = $page - $pages_half + 1; + $end = $start + $pages - 1; + } else if ($total>$pages && $page>$pages_half && $total-$page<=$pages_half) { + $end = $total; + $start = $end - $pages + 1; + } + + $class = $this->getClass(); + $id = $this->getId(); + if (!empty($class)) $class = ' '.$class; + + $html = Helper::tag_open('nav'); + if (!empty($id)) { + $html .= Helper::tag_open('ul',array('class'=>self::PAGINATION_CLASS.$class,'id'=>$id)); + } else { + $html .= Helper::tag_open('ul',array('class'=>self::PAGINATION_CLASS.$class)); + } + if ($page>1 && $page<=$total) { + $html .= Helper::tag_open('li'); + $html .= Helper::tag_open('a', array('href'=>$this->url($page-1))); + $html .= Helper::tag_open('span'); + $html .= '«'; + $html .= Helper::tag_close('span'); + $html .= Helper::tag_close('a'); + $html .= Helper::tag_close('li'); + } else { + $html .= Helper::tag_open('li',array('class'=>'disabled')); + $html .= Helper::tag_open('span'); + $html .= '«'; + $html .= Helper::tag_close('span'); + $html .= Helper::tag_close('li'); + } + for ($i=$start; $i<=$end; $i++) { + if ($i==$page) { + $html .= Helper::tag_open('li',array('class'=>'active')); + $html .= Helper::tag('span', $i); + } else { + $html .= Helper::tag_open('li'); + $html .= Helper::tag('a', $i, array('href'=>$this->url($i))); + } + $html .= Helper::tag_close('li'); + } + if ($page<$total) { + $html .= Helper::tag_open('li'); + $html .= Helper::tag_open('a', array('href'=>$this->url($page+1))); + $html .= Helper::tag_open('span'); + $html .= '»'; + $html .= Helper::tag_close('span'); + $html .= Helper::tag_close('a'); + $html .= Helper::tag_close('li'); + } else { + $html .= Helper::tag_open('li',array('class'=>'disabled')); + $html .= Helper::tag_open('span'); + $html .= '»'; + $html .= Helper::tag_close('span'); + $html .= Helper::tag_close('li'); + } + $html .= Helper::tag_close('ul'); + $html .= Helper::tag_close('nav'); + return $html; + } +} \ No newline at end of file diff --git a/zira/permission.php b/zira/permission.php new file mode 100644 index 0000000..b5d2571 --- /dev/null +++ b/zira/permission.php @@ -0,0 +1,75 @@ +name] = $row->allow; + } + self::$_loaded[$group_id] = $permissions; + } + + public static function check($permission, $user = null) { + if ($user===null && User::isAuthorized()) $user = User::getCurrent(); + if (!$user) return false; + self::loadOnceGroupPermissions($user->group_id); + if (!isset(self::$_loaded[$user->group_id])) return false; + if (!isset(self::$_loaded[$user->group_id][$permission])) return false; + return !empty(self::$_loaded[$user->group_id][$permission]); + } +} \ No newline at end of file diff --git a/zira/phpmailer/phpmailer.php b/zira/phpmailer/phpmailer.php new file mode 100644 index 0000000..9674f22 --- /dev/null +++ b/zira/phpmailer/phpmailer.php @@ -0,0 +1,3664 @@ + + * @author Jim Jagielski (jimjag) + * @author Andy Prevost (codeworxtech) + * @author Brent R. Matzelle (original founder) + * @copyright 2012 - 2014 Marcus Bointon + * @copyright 2010 - 2012 Jim Jagielski + * @copyright 2004 - 2009 Andy Prevost + * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License + * @note This program is distributed in the hope that it will be useful - WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + */ + +/** + * PHPMailer - PHP email creation and transport class. + * @package PHPMailer + * @author Marcus Bointon (Synchro/coolbru) + * @author Jim Jagielski (jimjag) + * @author Andy Prevost (codeworxtech) + * @author Brent R. Matzelle (original founder) + */ + +namespace Zira\Phpmailer; + +class Phpmailer +{ + /** + * The PHPMailer Version number. + * @type string + */ + public $Version = '5.2.12'; + + /** + * Email priority. + * Options: null (default), 1 = High, 3 = Normal, 5 = low. + * When null, the header is not set at all. + * @type integer + */ + public $Priority = null; + + /** + * The character set of the message. + * @type string + */ + public $CharSet = 'iso-8859-1'; + + /** + * The MIME Content-type of the message. + * @type string + */ + public $ContentType = 'text/plain'; + + /** + * The message encoding. + * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable". + * @type string + */ + public $Encoding = '8bit'; + + /** + * Holds the most recent mailer error message. + * @type string + */ + public $ErrorInfo = ''; + + /** + * The From email address for the message. + * @type string + */ + public $From = 'root@localhost'; + + /** + * The From name of the message. + * @type string + */ + public $FromName = 'Root User'; + + /** + * The Sender email (Return-Path) of the message. + * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode. + * @type string + */ + public $Sender = ''; + + /** + * The Return-Path of the message. + * If empty, it will be set to either From or Sender. + * @type string + * @deprecated Email senders should never set a return-path header; + * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything. + * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference + */ + public $ReturnPath = ''; + + /** + * The Subject of the message. + * @type string + */ + public $Subject = ''; + + /** + * An HTML or plain text message body. + * If HTML then call isHTML(true). + * @type string + */ + public $Body = ''; + + /** + * The plain-text message body. + * This body can be read by mail clients that do not have HTML email + * capability such as mutt & Eudora. + * Clients that can read HTML will view the normal Body. + * @type string + */ + public $AltBody = ''; + + /** + * The complete compiled MIME message body. + * @access protected + * @type string + */ + protected $MIMEBody = ''; + + /** + * The complete compiled MIME message headers. + * @type string + * @access protected + */ + protected $MIMEHeader = ''; + + /** + * Extra headers that createHeader() doesn't fold in. + * @type string + * @access protected + */ + protected $mailHeader = ''; + + /** + * Word-wrap the message body to this number of chars. + * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance. + * @type integer + */ + public $WordWrap = 0; + + /** + * Which method to use to send mail. + * Options: "mail", "sendmail", or "smtp". + * @type string + */ + public $Mailer = 'mail'; + + /** + * The path to the sendmail program. + * @type string + */ + public $Sendmail = '/usr/sbin/sendmail'; + + /** + * Whether mail() uses a fully sendmail-compatible MTA. + * One which supports sendmail's "-oi -f" options. + * @type boolean + */ + public $UseSendmailOptions = true; + + /** + * Path to PHPMailer plugins. + * Useful if the SMTP class is not in the PHP include path. + * @type string + * @deprecated Should not be needed now there is an autoloader. + */ + public $PluginDir = ''; + + /** + * The email address that a reading confirmation should be sent to. + * @type string + */ + public $ConfirmReadingTo = ''; + + /** + * The hostname to use in Message-Id and Received headers + * and as default HELO string. + * If empty, the value returned + * by SERVER_NAME is used or 'localhost.localdomain'. + * @type string + */ + public $Hostname = ''; + + /** + * An ID to be used in the Message-Id header. + * If empty, a unique id will be generated. + * @type string + */ + public $MessageID = ''; + + /** + * The message Date to be used in the Date header. + * If empty, the current date will be added. + * @type string + */ + public $MessageDate = ''; + + /** + * SMTP hosts. + * Either a single hostname or multiple semicolon-delimited hostnames. + * You can also specify a different port + * for each host by using this format: [hostname:port] + * (e.g. "smtp1.example.com:25;smtp2.example.com"). + * You can also specify encryption type, for example: + * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465"). + * Hosts will be tried in order. + * @type string + */ + public $Host = 'localhost'; + + /** + * The default SMTP server port. + * @type integer + * @TODO Why is this needed when the SMTP class takes care of it? + */ + public $Port = 25; + + /** + * The SMTP HELO of the message. + * Default is $Hostname. + * @type string + * @see PHPMailer::$Hostname + */ + public $Helo = ''; + + /** + * What kind of encryption to use on the SMTP connection. + * Options: '', 'ssl' or 'tls' + * @type string + */ + public $SMTPSecure = ''; + + /** + * Whether to enable TLS encryption automatically if a server supports it, + * even if `SMTPSecure` is not set to 'tls'. + * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid. + * @type boolean + */ + public $SMTPAutoTLS = true; + + /** + * Whether to use SMTP authentication. + * Uses the Username and Password properties. + * @type boolean + * @see PHPMailer::$Username + * @see PHPMailer::$Password + */ + public $SMTPAuth = false; + + /** + * Options array passed to stream_context_create when connecting via SMTP. + * @type array + */ + public $SMTPOptions = array(); + + /** + * SMTP username. + * @type string + */ + public $Username = ''; + + /** + * SMTP password. + * @type string + */ + public $Password = ''; + + /** + * SMTP auth type. + * Options are LOGIN (default), PLAIN, NTLM, CRAM-MD5 + * @type string + */ + public $AuthType = ''; + + /** + * SMTP realm. + * Used for NTLM auth + * @type string + */ + public $Realm = ''; + + /** + * SMTP workstation. + * Used for NTLM auth + * @type string + */ + public $Workstation = ''; + + /** + * The SMTP server timeout in seconds. + * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2 + * @type integer + */ + public $Timeout = 300; + + /** + * SMTP class debug output mode. + * Debug output level. + * Options: + * * `0` No output + * * `1` Commands + * * `2` Data and commands + * * `3` As 2 plus connection status + * * `4` Low-level data output + * @type integer + * @see SMTP::$do_debug + */ + public $SMTPDebug = 0; + + /** + * How to handle debug output. + * Options: + * * `echo` Output plain-text as-is, appropriate for CLI + * * `html` Output escaped, line breaks converted to `
    `, appropriate for browser output + * * `error_log` Output to error log as configured in php.ini + * + * Alternatively, you can provide a callable expecting two params: a message string and the debug level: + * + * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";}; + * + * @type string|callable + * @see SMTP::$Debugoutput + */ + public $Debugoutput = 'echo'; + + /** + * Whether to keep SMTP connection open after each message. + * If this is set to true then to close the connection + * requires an explicit call to smtpClose(). + * @type boolean + */ + public $SMTPKeepAlive = false; + + /** + * Whether to split multiple to addresses into multiple messages + * or send them all in one message. + * @type boolean + */ + public $SingleTo = false; + + /** + * Storage for addresses when SingleTo is enabled. + * @type array + * @TODO This should really not be public + */ + public $SingleToArray = array(); + + /** + * Whether to generate VERP addresses on send. + * Only applicable when sending via SMTP. + * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path + * @link http://www.postfix.org/VERP_README.html Postfix VERP info + * @type boolean + */ + public $do_verp = false; + + /** + * Whether to allow sending messages with an empty body. + * @type boolean + */ + public $AllowEmpty = false; + + /** + * The default line ending. + * @note The default remains "\n". We force CRLF where we know + * it must be used via self::CRLF. + * @type string + */ + public $LE = "\n"; + + /** + * DKIM selector. + * @type string + */ + public $DKIM_selector = ''; + + /** + * DKIM Identity. + * Usually the email address used as the source of the email + * @type string + */ + public $DKIM_identity = ''; + + /** + * DKIM passphrase. + * Used if your key is encrypted. + * @type string + */ + public $DKIM_passphrase = ''; + + /** + * DKIM signing domain name. + * @example 'example.com' + * @type string + */ + public $DKIM_domain = ''; + + /** + * DKIM private key file path. + * @type string + */ + public $DKIM_private = ''; + + /** + * Callback Action function name. + * + * The function that handles the result of the send email action. + * It is called out by send() for each email sent. + * + * Value can be any php callable: http://www.php.net/is_callable + * + * Parameters: + * boolean $result result of the send action + * string $to email address of the recipient + * string $cc cc email addresses + * string $bcc bcc email addresses + * string $subject the subject + * string $body the email body + * string $from email address of sender + * @type string + */ + public $action_function = ''; + + /** + * What to put in the X-Mailer header. + * Options: An empty string for PHPMailer default, whitespace for none, or a string to use + * @type string + */ + public $XMailer = ''; + + /** + * Only For XOAUTH - Google + * Options: An empty string for PHPMailer default, Enter the email used to get access token + * @type string + */ +// public $UserEmail = ''; +// public $RefreshToken = ''; +// public $ClientId = ''; +// public $ClientSecret = ''; + + + /** + * An instance of the SMTP sender class. + * @type SMTP + * @access protected + */ + protected $smtp = null; + + /** + * The array of 'to' addresses. + * @type array + * @access protected + */ + protected $to = array(); + + /** + * The array of 'cc' addresses. + * @type array + * @access protected + */ + protected $cc = array(); + + /** + * The array of 'bcc' addresses. + * @type array + * @access protected + */ + protected $bcc = array(); + + /** + * The array of reply-to names and addresses. + * @type array + * @access protected + */ + protected $ReplyTo = array(); + + /** + * An array of all kinds of addresses. + * Includes all of $to, $cc, $bcc + * @type array + * @access protected + */ + protected $all_recipients = array(); + + /** + * The array of attachments. + * @type array + * @access protected + */ + protected $attachment = array(); + + /** + * The array of custom headers. + * @type array + * @access protected + */ + protected $CustomHeader = array(); + + /** + * The most recent Message-ID (including angular brackets). + * @type string + * @access protected + */ + protected $lastMessageID = ''; + + /** + * The message's MIME type. + * @type string + * @access protected + */ + protected $message_type = ''; + + /** + * The array of MIME boundary strings. + * @type array + * @access protected + */ + protected $boundary = array(); + + /** + * The array of available languages. + * @type array + * @access protected + */ + protected $language = array(); + + /** + * The number of errors encountered. + * @type integer + * @access protected + */ + protected $error_count = 0; + + /** + * The S/MIME certificate file path. + * @type string + * @access protected + */ + protected $sign_cert_file = ''; + + /** + * The S/MIME key file path. + * @type string + * @access protected + */ + protected $sign_key_file = ''; + + /** + * The optional S/MIME extra certificates ("CA Chain") file path. + * @type string + * @access protected + */ + protected $sign_extracerts_file = ''; + + /** + * The S/MIME password for the key. + * Used only if the key is encrypted. + * @type string + * @access protected + */ + protected $sign_key_pass = ''; + + /** + * Whether to throw exceptions for errors. + * @type boolean + * @access protected + */ + protected $exceptions = false; + + /** + * Unique ID used for message ID and boundaries. + * @type string + * @access protected + */ + protected $uniqueid = ''; + + /** + * Error severity: message only, continue processing. + */ + const STOP_MESSAGE = 0; + + /** + * Error severity: message, likely ok to continue processing. + */ + const STOP_CONTINUE = 1; + + /** + * Error severity: message, plus full stop, critical error reached. + */ + const STOP_CRITICAL = 2; + + /** + * SMTP RFC standard line ending. + */ + const CRLF = "\r\n"; + + /** + * The maximum line length allowed by RFC 2822 section 2.1.1 + * @type integer + */ + const MAX_LINE_LENGTH = 998; + + /** + * Constructor. + * @param boolean $exceptions Should we throw external exceptions? + */ + public function __construct($exceptions = false) + { + $this->exceptions = (boolean)$exceptions; + } + + /** + * Destructor. + */ + public function __destruct() + { + //Close any open SMTP connection nicely + if ($this->Mailer == 'smtp') { + $this->smtpClose(); + } + } + + /** + * Call mail() in a safe_mode-aware fashion. + * Also, unless sendmail_path points to sendmail (or something that + * claims to be sendmail), don't pass params (not a perfect fix, + * but it will do) + * @param string $to To + * @param string $subject Subject + * @param string $body Message Body + * @param string $header Additional Header(s) + * @param string $params Params + * @access private + * @return boolean + */ + private function mailPassthru($to, $subject, $body, $header, $params) + { + //Check overloading of mail function to avoid double-encoding + if (ini_get('mbstring.func_overload') & 1) { + $subject = $this->secureHeader($subject); + } else { + $subject = $this->encodeHeader($this->secureHeader($subject)); + } + if (ini_get('safe_mode') || !($this->UseSendmailOptions)) { + $result = @mail($to, $subject, $body, $header); + } else { + $result = @mail($to, $subject, $body, $header, $params); + } + return $result; + } + + /** + * Output debugging info via user-defined method. + * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug). + * @see PHPMailer::$Debugoutput + * @see PHPMailer::$SMTPDebug + * @param string $str + */ + protected function edebug($str) + { + if ($this->SMTPDebug <= 0) { + return; + } + //Avoid clash with built-in function names + if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) { + call_user_func($this->Debugoutput, $str, $this->SMTPDebug); + return; + } + switch ($this->Debugoutput) { + case 'error_log': + //Don't output, just log + error_log($str); + break; + case 'html': + //Cleans up output a bit for a better looking, HTML-safe output + echo htmlentities( + preg_replace('/[\r\n]+/', '', $str), + ENT_QUOTES, + 'UTF-8' + ) + . "
    \n"; + break; + case 'echo': + default: + //Normalize line breaks + $str = preg_replace('/(\r\n|\r|\n)/ms', "\n", $str); + echo gmdate('Y-m-d H:i:s') . "\t" . str_replace( + "\n", + "\n \t ", + trim($str) + ) . "\n"; + } + } + + /** + * Sets message type to HTML or plain. + * @param boolean $isHtml True for HTML mode. + * @return void + */ + public function isHTML($isHtml = true) + { + if ($isHtml) { + $this->ContentType = 'text/html'; + } else { + $this->ContentType = 'text/plain'; + } + } + + /** + * Send messages using SMTP. + * @return void + */ + public function isSMTP() + { + $this->Mailer = 'smtp'; + } + + /** + * Send messages using PHP's mail() function. + * @return void + */ + public function isMail() + { + $this->Mailer = 'mail'; + } + + /** + * Send messages using $Sendmail. + * @return void + */ + public function isSendmail() + { + $ini_sendmail_path = ini_get('sendmail_path'); + + if (!stristr($ini_sendmail_path, 'sendmail')) { + $this->Sendmail = '/usr/sbin/sendmail'; + } else { + $this->Sendmail = $ini_sendmail_path; + } + $this->Mailer = 'sendmail'; + } + + /** + * Send messages using qmail. + * @return void + */ + public function isQmail() + { + $ini_sendmail_path = ini_get('sendmail_path'); + + if (!stristr($ini_sendmail_path, 'qmail')) { + $this->Sendmail = '/var/qmail/bin/qmail-inject'; + } else { + $this->Sendmail = $ini_sendmail_path; + } + $this->Mailer = 'qmail'; + } + + /** + * Add a "To" address. + * @param string $address + * @param string $name + * @return boolean true on success, false if address already used + */ + public function addAddress($address, $name = '') + { + return $this->addAnAddress('to', $address, $name); + } + + /** + * Add a "CC" address. + * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer. + * @param string $address + * @param string $name + * @return boolean true on success, false if address already used + */ + public function addCC($address, $name = '') + { + return $this->addAnAddress('cc', $address, $name); + } + + /** + * Add a "BCC" address. + * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer. + * @param string $address + * @param string $name + * @return boolean true on success, false if address already used + */ + public function addBCC($address, $name = '') + { + return $this->addAnAddress('bcc', $address, $name); + } + + /** + * Add a "Reply-to" address. + * @param string $address + * @param string $name + * @return boolean + */ + public function addReplyTo($address, $name = '') + { + return $this->addAnAddress('Reply-To', $address, $name); + } + + /** + * Add an address to one of the recipient arrays. + * Addresses that have been added already return false, but do not throw exceptions + * @param string $kind One of 'to', 'cc', 'bcc', 'ReplyTo' + * @param string $address The email address to send to + * @param string $name + * @throws phpmailerException + * @return boolean true on success, false if address already used or invalid in some way + * @access protected + */ + protected function addAnAddress($kind, $address, $name = '') + { + if (!preg_match('/^(to|cc|bcc|Reply-To)$/', $kind)) { + $this->setError($this->lang('Invalid recipient array') . ': ' . $kind); + $this->edebug($this->lang('Invalid recipient array') . ': ' . $kind); + if ($this->exceptions) { + throw new phpmailerException('Invalid recipient array: ' . $kind); + } + return false; + } + $address = trim($address); + $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim + if (!$this->validateAddress($address)) { + $this->setError($this->lang('invalid_address') . ': ' . $address); + $this->edebug($this->lang('invalid_address') . ': ' . $address); + if ($this->exceptions) { + throw new phpmailerException($this->lang('invalid_address') . ': ' . $address); + } + return false; + } + if ($kind != 'Reply-To') { + if (!isset($this->all_recipients[strtolower($address)])) { + array_push($this->$kind, array($address, $name)); + $this->all_recipients[strtolower($address)] = true; + return true; + } + } else { + if (!array_key_exists(strtolower($address), $this->ReplyTo)) { + $this->ReplyTo[strtolower($address)] = array($address, $name); + return true; + } + } + return false; + } + + /** + * Parse and validate a string containing one or more RFC822-style comma-separated email addresses + * of the form "display name
    " into an array of name/address pairs. + * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available. + * Note that quotes in the name part are removed. + * @param string $addrstr The address list string + * @param bool $useimap Whether to use the IMAP extension to parse the list + * @return array + * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation + */ + public function parseAddresses($addrstr, $useimap = true) + { + $addresses = array(); + if ($useimap and function_exists('imap_rfc822_parse_adrlist')) { + //Use this built-in parser if it's available + $list = imap_rfc822_parse_adrlist($addrstr, ''); + foreach ($list as $address) { + if ($address->host != '.SYNTAX-ERROR.') { + if ($this->validateAddress($address->mailbox . '@' . $address->host)) { + $addresses[] = array( + 'name' => (property_exists($address, 'personal') ? $address->personal : ''), + 'address' => $address->mailbox . '@' . $address->host + ); + } + } + } + } else { + //Use this simpler parser + $list = explode(',', $addrstr); + foreach ($list as $address) { + $address = trim($address); + //Is there a separate name part? + if (strpos($address, '<') === false) { + //No separate name, just use the whole thing + if ($this->validateAddress($address)) { + $addresses[] = array( + 'name' => '', + 'address' => $address + ); + } + } else { + list($name, $email) = explode('<', $address); + $email = trim(str_replace('>', '', $email)); + if ($this->validateAddress($email)) { + $addresses[] = array( + 'name' => trim(str_replace(array('"', "'"), '', $name)), + 'address' => $email + ); + } + } + } + } + return $addresses; + } + + /** + * Set the From and FromName properties. + * @param string $address + * @param string $name + * @param boolean $auto Whether to also set the Sender address, defaults to true + * @throws phpmailerException + * @return boolean + */ + public function setFrom($address, $name = '', $auto = true) + { + $address = trim($address); + $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim + if (!$this->validateAddress($address)) { + $this->setError($this->lang('invalid_address') . ': ' . $address); + $this->edebug($this->lang('invalid_address') . ': ' . $address); + if ($this->exceptions) { + throw new phpmailerException($this->lang('invalid_address') . ': ' . $address); + } + return false; + } + $this->From = $address; + $this->FromName = $name; + if ($auto) { + if (empty($this->Sender)) { + $this->Sender = $address; + } + } + return true; + } + + /** + * Return the Message-ID header of the last email. + * Technically this is the value from the last time the headers were created, + * but it's also the message ID of the last sent message except in + * pathological cases. + * @return string + */ + public function getLastMessageID() + { + return $this->lastMessageID; + } + + /** + * Check that a string looks like an email address. + * @param string $address The email address to check + * @param string $patternselect A selector for the validation pattern to use : + * * `auto` Pick strictest one automatically; + * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14; + * * `pcre` Use old PCRE implementation; + * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL; same as pcre8 but does not allow 'dotless' domains; + * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements. + * * `noregex` Don't use a regex: super fast, really dumb. + * @return boolean + * @static + * @access public + */ + public static function validateAddress($address, $patternselect = 'auto') + { + if (!$patternselect or $patternselect == 'auto') { + //Check this constant first so it works when extension_loaded() is disabled by safe mode + //Constant was added in PHP 5.2.4 + if (defined('PCRE_VERSION')) { + //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2 + if (version_compare(PCRE_VERSION, '8.0.3') >= 0) { + $patternselect = 'pcre8'; + } else { + $patternselect = 'pcre'; + } + } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) { + //Fall back to older PCRE + $patternselect = 'pcre'; + } else { + //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension + if (version_compare(PHP_VERSION, '5.2.0') >= 0) { + $patternselect = 'php'; + } else { + $patternselect = 'noregex'; + } + } + } + switch ($patternselect) { + case 'pcre8': + /** + * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains. + * @link http://squiloople.com/2009/12/20/email-address-validation/ + * @copyright 2009-2010 Michael Rushton + * Feel free to use and redistribute this code. But please keep this copyright notice. + */ + return (boolean)preg_match( + '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' . + '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' . + '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' . + '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' . + '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' . + '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' . + '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' . + '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' . + '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD', + $address + ); + case 'pcre': + //An older regex that doesn't need a recent PCRE + return (boolean)preg_match( + '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' . + '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' . + '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' . + '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' . + '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' . + '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' . + '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' . + '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' . + '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' . + '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD', + $address + ); + case 'html5': + /** + * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements. + * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email) + */ + return (boolean)preg_match( + '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' . + '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD', + $address + ); + case 'noregex': + //No PCRE! Do something _very_ approximate! + //Check the address is 3 chars or longer and contains an @ that's not the first or last char + return (strlen($address) >= 3 + and strpos($address, '@') >= 1 + and strpos($address, '@') != strlen($address) - 1); + case 'php': + default: + return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL); + } + } + + /** + * Create a message and send it. + * Uses the sending method specified by $Mailer. + * @throws phpmailerException + * @return boolean false on error - See the ErrorInfo property for details of the error. + */ + public function send() + { + try { + if (!$this->preSend()) { + return false; + } + return $this->postSend(); + } catch (phpmailerException $exc) { + $this->mailHeader = ''; + $this->setError($exc->getMessage()); + if ($this->exceptions) { + throw $exc; + } + return false; + } + } + + /** + * Prepare a message for sending. + * @throws phpmailerException + * @return boolean + */ + public function preSend() + { + try { + $this->mailHeader = ''; + if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) { + throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL); + } + + // Set whether the message is multipart/alternative + if (!empty($this->AltBody)) { + $this->ContentType = 'multipart/alternative'; + } + + $this->error_count = 0; // Reset errors + $this->setMessageType(); + // Refuse to send an empty message unless we are specifically allowing it + if (!$this->AllowEmpty and empty($this->Body)) { + throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL); + } + + // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding) + $this->MIMEHeader = ''; + $this->MIMEBody = $this->createBody(); + // createBody may have added some headers, so retain them + $tempheaders = $this->MIMEHeader; + $this->MIMEHeader = $this->createHeader(); + $this->MIMEHeader .= $tempheaders; + + // To capture the complete message when using mail(), create + // an extra header list which createHeader() doesn't fold in + if ($this->Mailer == 'mail') { + if (count($this->to) > 0) { + $this->mailHeader .= $this->addrAppend('To', $this->to); + } else { + $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;'); + } + $this->mailHeader .= $this->headerLine( + 'Subject', + $this->encodeHeader($this->secureHeader(trim($this->Subject))) + ); + } + + // Sign with DKIM if enabled + if (!empty($this->DKIM_domain) + && !empty($this->DKIM_private) + && !empty($this->DKIM_selector) + && file_exists($this->DKIM_private)) { + $header_dkim = $this->DKIM_Add( + $this->MIMEHeader . $this->mailHeader, + $this->encodeHeader($this->secureHeader($this->Subject)), + $this->MIMEBody + ); + $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF . + str_replace("\r\n", "\n", $header_dkim) . self::CRLF; + } + return true; + } catch (phpmailerException $exc) { + $this->setError($exc->getMessage()); + if ($this->exceptions) { + throw $exc; + } + return false; + } + } + + /** + * Actually send a message. + * Send the email via the selected mechanism + * @throws phpmailerException + * @return boolean + */ + public function postSend() + { + try { + // Choose the mailer and send through it + switch ($this->Mailer) { + case 'sendmail': + case 'qmail': + return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody); + case 'smtp': + return $this->smtpSend($this->MIMEHeader, $this->MIMEBody); + case 'mail': + return $this->mailSend($this->MIMEHeader, $this->MIMEBody); + default: + $sendMethod = $this->Mailer.'Send'; + if (method_exists($this, $sendMethod)) { + return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody); + } + + return $this->mailSend($this->MIMEHeader, $this->MIMEBody); + } + } catch (phpmailerException $exc) { + $this->setError($exc->getMessage()); + $this->edebug($exc->getMessage()); + if ($this->exceptions) { + throw $exc; + } + } + return false; + } + + /** + * Send mail using the $Sendmail program. + * @param string $header The message headers + * @param string $body The message body + * @see PHPMailer::$Sendmail + * @throws phpmailerException + * @access protected + * @return boolean + */ + protected function sendmailSend($header, $body) + { + if ($this->Sender != '') { + if ($this->Mailer == 'qmail') { + $sendmail = sprintf('%s -f%s', escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender)); + } else { + $sendmail = sprintf('%s -oi -f%s -t', escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender)); + } + } else { + if ($this->Mailer == 'qmail') { + $sendmail = sprintf('%s', escapeshellcmd($this->Sendmail)); + } else { + $sendmail = sprintf('%s -oi -t', escapeshellcmd($this->Sendmail)); + } + } + if ($this->SingleTo) { + foreach ($this->SingleToArray as $toAddr) { + if (!@$mail = popen($sendmail, 'w')) { + throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + fputs($mail, 'To: ' . $toAddr . "\n"); + fputs($mail, $header); + fputs($mail, $body); + $result = pclose($mail); + $this->doCallback( + ($result == 0), + array($toAddr), + $this->cc, + $this->bcc, + $this->Subject, + $body, + $this->From + ); + if ($result != 0) { + throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + } + } else { + if (!@$mail = popen($sendmail, 'w')) { + throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + fputs($mail, $header); + fputs($mail, $body); + $result = pclose($mail); + $this->doCallback(($result == 0), $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From); + if ($result != 0) { + throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + } + return true; + } + + /** + * Send mail using the PHP mail() function. + * @param string $header The message headers + * @param string $body The message body + * @link http://www.php.net/manual/en/book.mail.php + * @throws phpmailerException + * @access protected + * @return boolean + */ + protected function mailSend($header, $body) + { + $toArr = array(); + foreach ($this->to as $toaddr) { + $toArr[] = $this->addrFormat($toaddr); + } + $to = implode(', ', $toArr); + + if (empty($this->Sender)) { + $params = ' '; + } else { + $params = sprintf('-f%s', $this->Sender); + } + if ($this->Sender != '' and !ini_get('safe_mode')) { + $old_from = ini_get('sendmail_from'); + ini_set('sendmail_from', $this->Sender); + } + $result = false; + if ($this->SingleTo && count($toArr) > 1) { + foreach ($toArr as $toAddr) { + $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params); + $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From); + } + } else { + $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params); + $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From); + } + if (isset($old_from)) { + ini_set('sendmail_from', $old_from); + } + if (!$result) { + throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL); + } + return true; + } + + /** + * Get an instance to use for SMTP operations. + * Override this function to load your own SMTP implementation + * @return SMTP + */ + public function getSMTPInstance() + { + if (!is_object($this->smtp)) { + $this->smtp = new Smtp; + } + return $this->smtp; + } + + /** + * Send mail via SMTP. + * Returns false if there is a bad MAIL FROM, RCPT, or DATA input. + * Uses the PHPMailerSMTP class by default. + * @see PHPMailer::getSMTPInstance() to use a different class. + * @param string $header The message headers + * @param string $body The message body + * @throws phpmailerException + * @uses SMTP + * @access protected + * @return boolean + */ + protected function smtpSend($header, $body) + { + $bad_rcpt = array(); + if (!$this->smtpConnect($this->SMTPOptions)) { + throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL); + } + if ('' == $this->Sender) { + $smtp_from = $this->From; + } else { + $smtp_from = $this->Sender; + } + if (!$this->smtp->mail($smtp_from)) { + $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError())); + throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL); + } + + // Attempt to send to all recipients + foreach (array($this->to, $this->cc, $this->bcc) as $togroup) { + foreach ($togroup as $to) { + if (!$this->smtp->recipient($to[0])) { + $error = $this->smtp->getError(); + $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']); + $isSent = false; + } else { + $isSent = true; + } + $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From); + } + } + + // Only send the DATA command if we have viable recipients + if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) { + throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL); + } + if ($this->SMTPKeepAlive) { + $this->smtp->reset(); + } else { + $this->smtp->quit(); + $this->smtp->close(); + } + //Create error message for any bad addresses + if (count($bad_rcpt) > 0) { + $errstr = ''; + foreach ($bad_rcpt as $bad) { + $errstr .= $bad['to'] . ': ' . $bad['error']; + } + throw new phpmailerException( + $this->lang('recipients_failed') . $errstr, + self::STOP_CONTINUE + ); + } + return true; + } + + /** + * Initiate a connection to an SMTP server. + * Returns false if the operation failed. + * @param array $options An array of options compatible with stream_context_create() + * @uses SMTP + * @access public + * @throws phpmailerException + * @return boolean + */ + public function smtpConnect($options = array()) + { + if (is_null($this->smtp)) { + $this->smtp = $this->getSMTPInstance(); + } + + // Already connected? + if ($this->smtp->connected()) { + return true; + } + + $this->smtp->setTimeout($this->Timeout); + $this->smtp->setDebugLevel($this->SMTPDebug); + $this->smtp->setDebugOutput($this->Debugoutput); + $this->smtp->setVerp($this->do_verp); + $hosts = explode(';', $this->Host); + $lastexception = null; + + foreach ($hosts as $hostentry) { + $hostinfo = array(); + if (!preg_match('/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*):?([0-9]*)$/', trim($hostentry), $hostinfo)) { + // Not a valid host entry + continue; + } + // $hostinfo[2]: optional ssl or tls prefix + // $hostinfo[3]: the hostname + // $hostinfo[4]: optional port number + // The host string prefix can temporarily override the current setting for SMTPSecure + // If it's not specified, the default value is used + $prefix = ''; + $secure = $this->SMTPSecure; + $tls = ($this->SMTPSecure == 'tls'); + if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) { + $prefix = 'ssl://'; + $tls = false; // Can't have SSL and TLS at the same time + $secure = 'ssl'; + } elseif ($hostinfo[2] == 'tls') { + $tls = true; + // tls doesn't use a prefix + $secure = 'tls'; + } + //Do we need the OpenSSL extension? + $sslext = defined('OPENSSL_ALGO_SHA1'); + if ('tls' === $secure or 'ssl' === $secure) { + //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled + if (!$sslext) { + throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL); + } + } + $host = $hostinfo[3]; + $port = $this->Port; + $tport = (integer)$hostinfo[4]; + if ($tport > 0 and $tport < 65536) { + $port = $tport; + } + if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) { + try { + if ($this->Helo) { + $hello = $this->Helo; + } else { + $hello = $this->serverHostname(); + } + $this->smtp->hello($hello); + //Automatically enable TLS encryption if: + // * it's not disabled + // * we have openssl extension + // * we are not already using SSL + // * the server offers STARTTLS + if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) { + $tls = true; + } + if ($tls) { + if (!$this->smtp->startTLS()) { + throw new phpmailerException($this->lang('connect_host')); + } + // We must resend HELO after tls negotiation + $this->smtp->hello($hello); + } + if ($this->SMTPAuth) { + if (!$this->smtp->authenticate( + $this->Username, + $this->Password, + $this->AuthType, + $this->Realm, + $this->Workstation + ) + ) { + throw new phpmailerException($this->lang('authenticate')); + } + } + return true; + } catch (phpmailerException $exc) { + $lastexception = $exc; + $this->edebug($exc->getMessage()); + // We must have connected, but then failed TLS or Auth, so close connection nicely + $this->smtp->quit(); + } + } + } + // If we get here, all connection attempts have failed, so close connection hard + $this->smtp->close(); + // As we've caught all exceptions, just report whatever the last one was + if ($this->exceptions and !is_null($lastexception)) { + throw $lastexception; + } + return false; + } + + /** + * Close the active SMTP session if one exists. + * @return void + */ + public function smtpClose() + { + if ($this->smtp !== null) { + if ($this->smtp->connected()) { + $this->smtp->quit(); + $this->smtp->close(); + } + } + } + + /** + * Get the array of strings for the current language. + * @return array + */ + public function getTranslations() + { + return $this->language; + } + + /** + * Create recipient headers. + * @access public + * @param string $type + * @param array $addr An array of recipient, + * where each recipient is a 2-element indexed array with element 0 containing an address + * and element 1 containing a name, like: + * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User')) + * @return string + */ + public function addrAppend($type, $addr) + { + $addresses = array(); + foreach ($addr as $address) { + $addresses[] = $this->addrFormat($address); + } + return $type . ': ' . implode(', ', $addresses) . $this->LE; + } + + /** + * Format an address for use in a message header. + * @access public + * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name + * like array('joe@example.com', 'Joe User') + * @return string + */ + public function addrFormat($addr) + { + if (empty($addr[1])) { // No name provided + return $this->secureHeader($addr[0]); + } else { + return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader( + $addr[0] + ) . '>'; + } + } + + /** + * Word-wrap message. + * For use with mailers that do not automatically perform wrapping + * and for quoted-printable encoded messages. + * Original written by philippe. + * @param string $message The message to wrap + * @param integer $length The line length to wrap to + * @param boolean $qp_mode Whether to run in Quoted-Printable mode + * @access public + * @return string + */ + public function wrapText($message, $length, $qp_mode = false) + { + if ($qp_mode) { + $soft_break = sprintf(' =%s', $this->LE); + } else { + $soft_break = $this->LE; + } + // If utf-8 encoding is used, we will need to make sure we don't + // split multibyte characters when we wrap + $is_utf8 = (strtolower($this->CharSet) == 'utf-8'); + $lelen = strlen($this->LE); + $crlflen = strlen(self::CRLF); + + $message = $this->fixEOL($message); + //Remove a trailing line break + if (substr($message, -$lelen) == $this->LE) { + $message = substr($message, 0, -$lelen); + } + + //Split message into lines + $lines = explode($this->LE, $message); + //Message will be rebuilt in here + $message = ''; + foreach ($lines as $line) { + $words = explode(' ', $line); + $buf = ''; + $firstword = true; + foreach ($words as $word) { + if ($qp_mode and (strlen($word) > $length)) { + $space_left = $length - strlen($buf) - $crlflen; + if (!$firstword) { + if ($space_left > 20) { + $len = $space_left; + if ($is_utf8) { + $len = $this->utf8CharBoundary($word, $len); + } elseif (substr($word, $len - 1, 1) == '=') { + $len--; + } elseif (substr($word, $len - 2, 1) == '=') { + $len -= 2; + } + $part = substr($word, 0, $len); + $word = substr($word, $len); + $buf .= ' ' . $part; + $message .= $buf . sprintf('=%s', self::CRLF); + } else { + $message .= $buf . $soft_break; + } + $buf = ''; + } + while (strlen($word) > 0) { + if ($length <= 0) { + break; + } + $len = $length; + if ($is_utf8) { + $len = $this->utf8CharBoundary($word, $len); + } elseif (substr($word, $len - 1, 1) == '=') { + $len--; + } elseif (substr($word, $len - 2, 1) == '=') { + $len -= 2; + } + $part = substr($word, 0, $len); + $word = substr($word, $len); + + if (strlen($word) > 0) { + $message .= $part . sprintf('=%s', self::CRLF); + } else { + $buf = $part; + } + } + } else { + $buf_o = $buf; + if (!$firstword) { + $buf .= ' '; + } + $buf .= $word; + + if (strlen($buf) > $length and $buf_o != '') { + $message .= $buf_o . $soft_break; + $buf = $word; + } + } + $firstword = false; + } + $message .= $buf . self::CRLF; + } + + return $message; + } + + /** + * Find the last character boundary prior to $maxLength in a utf-8 + * quoted-printable encoded string. + * Original written by Colin Brown. + * @access public + * @param string $encodedText utf-8 QP text + * @param integer $maxLength Find the last character boundary prior to this length + * @return integer + */ + public function utf8CharBoundary($encodedText, $maxLength) + { + $foundSplitPos = false; + $lookBack = 3; + while (!$foundSplitPos) { + $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack); + $encodedCharPos = strpos($lastChunk, '='); + if (false !== $encodedCharPos) { + // Found start of encoded character byte within $lookBack block. + // Check the encoded byte value (the 2 chars after the '=') + $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2); + $dec = hexdec($hex); + if ($dec < 128) { + // Single byte character. + // If the encoded char was found at pos 0, it will fit + // otherwise reduce maxLength to start of the encoded char + if ($encodedCharPos > 0) { + $maxLength = $maxLength - ($lookBack - $encodedCharPos); + } + $foundSplitPos = true; + } elseif ($dec >= 192) { + // First byte of a multi byte character + // Reduce maxLength to split at start of character + $maxLength = $maxLength - ($lookBack - $encodedCharPos); + $foundSplitPos = true; + } elseif ($dec < 192) { + // Middle byte of a multi byte character, look further back + $lookBack += 3; + } + } else { + // No encoded character found + $foundSplitPos = true; + } + } + return $maxLength; + } + + /** + * Apply word wrapping to the message body. + * Wraps the message body to the number of chars set in the WordWrap property. + * You should only do this to plain-text bodies as wrapping HTML tags may break them. + * This is called automatically by createBody(), so you don't need to call it yourself. + * @access public + * @return void + */ + public function setWordWrap() + { + if ($this->WordWrap < 1) { + return; + } + + switch ($this->message_type) { + case 'alt': + case 'alt_inline': + case 'alt_attach': + case 'alt_inline_attach': + $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap); + break; + default: + $this->Body = $this->wrapText($this->Body, $this->WordWrap); + break; + } + } + + /** + * Assemble message headers. + * @access public + * @return string The assembled headers + */ + public function createHeader() + { + $result = ''; + + if ($this->MessageDate == '') { + $this->MessageDate = self::rfcDate(); + } + $result .= $this->headerLine('Date', $this->MessageDate); + + + // To be created automatically by mail() + if ($this->SingleTo) { + if ($this->Mailer != 'mail') { + foreach ($this->to as $toaddr) { + $this->SingleToArray[] = $this->addrFormat($toaddr); + } + } + } else { + if (count($this->to) > 0) { + if ($this->Mailer != 'mail') { + $result .= $this->addrAppend('To', $this->to); + } + } elseif (count($this->cc) == 0) { + $result .= $this->headerLine('To', 'undisclosed-recipients:;'); + } + } + + $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName))); + + // sendmail and mail() extract Cc from the header before sending + if (count($this->cc) > 0) { + $result .= $this->addrAppend('Cc', $this->cc); + } + + // sendmail and mail() extract Bcc from the header before sending + if (( + $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail' + ) + and count($this->bcc) > 0 + ) { + $result .= $this->addrAppend('Bcc', $this->bcc); + } + + if (count($this->ReplyTo) > 0) { + $result .= $this->addrAppend('Reply-To', $this->ReplyTo); + } + + // mail() sets the subject itself + if ($this->Mailer != 'mail') { + $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject))); + } + + if ($this->MessageID != '') { + $this->lastMessageID = $this->MessageID; + } else { + $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->ServerHostname()); + } + $result .= $this->headerLine('Message-ID', $this->lastMessageID); + if (!is_null($this->Priority)) { + $result .= $this->headerLine('X-Priority', $this->Priority); + } + if ($this->XMailer == '') { + $result .= $this->headerLine( + 'X-Mailer', + 'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer/)' + ); + } else { + $myXmailer = trim($this->XMailer); + if ($myXmailer) { + $result .= $this->headerLine('X-Mailer', $myXmailer); + } + } + + if ($this->ConfirmReadingTo != '') { + $result .= $this->headerLine('Disposition-Notification-To', '<' . trim($this->ConfirmReadingTo) . '>'); + } + + // Add custom headers + foreach ($this->CustomHeader as $header) { + $result .= $this->headerLine( + trim($header[0]), + $this->encodeHeader(trim($header[1])) + ); + } + if (!$this->sign_key_file) { + $result .= $this->headerLine('MIME-Version', '1.0'); + $result .= $this->getMailMIME(); + } + + return $result; + } + + /** + * Get the message MIME type headers. + * @access public + * @return string + */ + public function getMailMIME() + { + $result = ''; + $ismultipart = true; + switch ($this->message_type) { + case 'inline': + $result .= $this->headerLine('Content-Type', 'multipart/related;'); + $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"'); + break; + case 'attach': + case 'inline_attach': + case 'alt_attach': + case 'alt_inline_attach': + $result .= $this->headerLine('Content-Type', 'multipart/mixed;'); + $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"'); + break; + case 'alt': + case 'alt_inline': + $result .= $this->headerLine('Content-Type', 'multipart/alternative;'); + $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"'); + break; + default: + // Catches case 'plain': and case '': + $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet); + $ismultipart = false; + break; + } + // RFC1341 part 5 says 7bit is assumed if not specified + if ($this->Encoding != '7bit') { + // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE + if ($ismultipart) { + if ($this->Encoding == '8bit') { + $result .= $this->headerLine('Content-Transfer-Encoding', '8bit'); + } + // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible + } else { + $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding); + } + } + + if ($this->Mailer != 'mail') { + $result .= $this->LE; + } + + return $result; + } + + /** + * Returns the whole MIME message. + * Includes complete headers and body. + * Only valid post preSend(). + * @see PHPMailer::preSend() + * @access public + * @return string + */ + public function getSentMIMEMessage() + { + return $this->MIMEHeader . $this->mailHeader . self::CRLF . $this->MIMEBody; + } + + /** + * Assemble the message body. + * Returns an empty string on failure. + * @access public + * @throws phpmailerException + * @return string The assembled message body + */ + public function createBody() + { + $body = ''; + //Create unique IDs and preset boundaries + $this->uniqueid = md5(uniqid(time())); + $this->boundary[1] = 'b1_' . $this->uniqueid; + $this->boundary[2] = 'b2_' . $this->uniqueid; + $this->boundary[3] = 'b3_' . $this->uniqueid; + + if ($this->sign_key_file) { + $body .= $this->getMailMIME() . $this->LE; + } + + $this->setWordWrap(); + + $bodyEncoding = $this->Encoding; + $bodyCharSet = $this->CharSet; + //Can we do a 7-bit downgrade? + if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) { + $bodyEncoding = '7bit'; + $bodyCharSet = 'us-ascii'; + } + //If lines are too long, and we're not already using an encoding that will shorten them, + //change to quoted-printable transfer encoding + if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) { + $this->Encoding = 'quoted-printable'; + $bodyEncoding = 'quoted-printable'; + } + + $altBodyEncoding = $this->Encoding; + $altBodyCharSet = $this->CharSet; + //Can we do a 7-bit downgrade? + if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) { + $altBodyEncoding = '7bit'; + $altBodyCharSet = 'us-ascii'; + } + //If lines are too long, change to quoted-printable transfer encoding + if (self::hasLineLongerThanMax($this->AltBody)) { + $altBodyEncoding = 'quoted-printable'; + } + //Use this as a preamble in all multipart message types + $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE; + switch ($this->message_type) { + case 'inline': + $body .= $mimepre; + $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding); + $body .= $this->encodeString($this->Body, $bodyEncoding); + $body .= $this->LE . $this->LE; + $body .= $this->attachAll('inline', $this->boundary[1]); + break; + case 'attach': + $body .= $mimepre; + $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding); + $body .= $this->encodeString($this->Body, $bodyEncoding); + $body .= $this->LE . $this->LE; + $body .= $this->attachAll('attachment', $this->boundary[1]); + break; + case 'inline_attach': + $body .= $mimepre; + $body .= $this->textLine('--' . $this->boundary[1]); + $body .= $this->headerLine('Content-Type', 'multipart/related;'); + $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"'); + $body .= $this->LE; + $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding); + $body .= $this->encodeString($this->Body, $bodyEncoding); + $body .= $this->LE . $this->LE; + $body .= $this->attachAll('inline', $this->boundary[2]); + $body .= $this->LE; + $body .= $this->attachAll('attachment', $this->boundary[1]); + break; + case 'alt': + $body .= $mimepre; + $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding); + $body .= $this->encodeString($this->AltBody, $altBodyEncoding); + $body .= $this->LE . $this->LE; + $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding); + $body .= $this->encodeString($this->Body, $bodyEncoding); + $body .= $this->LE . $this->LE; + $body .= $this->endBoundary($this->boundary[1]); + break; + case 'alt_inline': + $body .= $mimepre; + $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding); + $body .= $this->encodeString($this->AltBody, $altBodyEncoding); + $body .= $this->LE . $this->LE; + $body .= $this->textLine('--' . $this->boundary[1]); + $body .= $this->headerLine('Content-Type', 'multipart/related;'); + $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"'); + $body .= $this->LE; + $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding); + $body .= $this->encodeString($this->Body, $bodyEncoding); + $body .= $this->LE . $this->LE; + $body .= $this->attachAll('inline', $this->boundary[2]); + $body .= $this->LE; + $body .= $this->endBoundary($this->boundary[1]); + break; + case 'alt_attach': + $body .= $mimepre; + $body .= $this->textLine('--' . $this->boundary[1]); + $body .= $this->headerLine('Content-Type', 'multipart/alternative;'); + $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"'); + $body .= $this->LE; + $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding); + $body .= $this->encodeString($this->AltBody, $altBodyEncoding); + $body .= $this->LE . $this->LE; + $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding); + $body .= $this->encodeString($this->Body, $bodyEncoding); + $body .= $this->LE . $this->LE; + $body .= $this->endBoundary($this->boundary[2]); + $body .= $this->LE; + $body .= $this->attachAll('attachment', $this->boundary[1]); + break; + case 'alt_inline_attach': + $body .= $mimepre; + $body .= $this->textLine('--' . $this->boundary[1]); + $body .= $this->headerLine('Content-Type', 'multipart/alternative;'); + $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"'); + $body .= $this->LE; + $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding); + $body .= $this->encodeString($this->AltBody, $altBodyEncoding); + $body .= $this->LE . $this->LE; + $body .= $this->textLine('--' . $this->boundary[2]); + $body .= $this->headerLine('Content-Type', 'multipart/related;'); + $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"'); + $body .= $this->LE; + $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding); + $body .= $this->encodeString($this->Body, $bodyEncoding); + $body .= $this->LE . $this->LE; + $body .= $this->attachAll('inline', $this->boundary[3]); + $body .= $this->LE; + $body .= $this->endBoundary($this->boundary[2]); + $body .= $this->LE; + $body .= $this->attachAll('attachment', $this->boundary[1]); + break; + default: + // catch case 'plain' and case '' + $body .= $this->encodeString($this->Body, $bodyEncoding); + break; + } + + if ($this->isError()) { + $body = ''; + } elseif ($this->sign_key_file) { + try { + if (!defined('PKCS7_TEXT')) { + throw new phpmailerException($this->lang('extension_missing') . 'openssl'); + } + // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1 + $file = tempnam(sys_get_temp_dir(), 'mail'); + if (false === file_put_contents($file, $body)) { + throw new phpmailerException($this->lang('signing') . ' Could not write temp file'); + } + $signed = tempnam(sys_get_temp_dir(), 'signed'); + //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197 + if (empty($this->sign_extracerts_file)) { + $sign = @openssl_pkcs7_sign( + $file, + $signed, + 'file://' . realpath($this->sign_cert_file), + array('file://' . realpath($this->sign_key_file), $this->sign_key_pass), + null + ); + } else { + $sign = @openssl_pkcs7_sign( + $file, + $signed, + 'file://' . realpath($this->sign_cert_file), + array('file://' . realpath($this->sign_key_file), $this->sign_key_pass), + null, + PKCS7_DETACHED, + $this->sign_extracerts_file + ); + } + if ($sign) { + @unlink($file); + $body = file_get_contents($signed); + @unlink($signed); + //The message returned by openssl contains both headers and body, so need to split them up + $parts = explode("\n\n", $body, 2); + $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE; + $body = $parts[1]; + } else { + @unlink($file); + @unlink($signed); + throw new phpmailerException($this->lang('signing') . openssl_error_string()); + } + } catch (phpmailerException $exc) { + $body = ''; + if ($this->exceptions) { + throw $exc; + } + } + } + return $body; + } + + /** + * Return the start of a message boundary. + * @access protected + * @param string $boundary + * @param string $charSet + * @param string $contentType + * @param string $encoding + * @return string + */ + protected function getBoundary($boundary, $charSet, $contentType, $encoding) + { + $result = ''; + if ($charSet == '') { + $charSet = $this->CharSet; + } + if ($contentType == '') { + $contentType = $this->ContentType; + } + if ($encoding == '') { + $encoding = $this->Encoding; + } + $result .= $this->textLine('--' . $boundary); + $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet); + $result .= $this->LE; + // RFC1341 part 5 says 7bit is assumed if not specified + if ($encoding != '7bit') { + $result .= $this->headerLine('Content-Transfer-Encoding', $encoding); + } + $result .= $this->LE; + + return $result; + } + + /** + * Return the end of a message boundary. + * @access protected + * @param string $boundary + * @return string + */ + protected function endBoundary($boundary) + { + return $this->LE . '--' . $boundary . '--' . $this->LE; + } + + /** + * Set the message type. + * PHPMailer only supports some preset message types, + * not arbitrary MIME structures. + * @access protected + * @return void + */ + protected function setMessageType() + { + $type = array(); + if ($this->alternativeExists()) { + $type[] = 'alt'; + } + if ($this->inlineImageExists()) { + $type[] = 'inline'; + } + if ($this->attachmentExists()) { + $type[] = 'attach'; + } + $this->message_type = implode('_', $type); + if ($this->message_type == '') { + $this->message_type = 'plain'; + } + } + + /** + * Format a header line. + * @access public + * @param string $name + * @param string $value + * @return string + */ + public function headerLine($name, $value) + { + return $name . ': ' . $value . $this->LE; + } + + /** + * Return a formatted mail line. + * @access public + * @param string $value + * @return string + */ + public function textLine($value) + { + return $value . $this->LE; + } + + /** + * Add an attachment from a path on the filesystem. + * Returns false if the file could not be found or read. + * @param string $path Path to the attachment. + * @param string $name Overrides the attachment name. + * @param string $encoding File encoding (see $Encoding). + * @param string $type File extension (MIME) type. + * @param string $disposition Disposition to use + * @throws phpmailerException + * @return boolean + */ + public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment') + { + try { + if (!@is_file($path)) { + throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE); + } + + // If a MIME type is not specified, try to work it out from the file name + if ($type == '') { + $type = self::filenameToType($path); + } + + $filename = basename($path); + if ($name == '') { + $name = $filename; + } + + $this->attachment[] = array( + 0 => $path, + 1 => $filename, + 2 => $name, + 3 => $encoding, + 4 => $type, + 5 => false, // isStringAttachment + 6 => $disposition, + 7 => 0 + ); + + } catch (phpmailerException $exc) { + $this->setError($exc->getMessage()); + $this->edebug($exc->getMessage()); + if ($this->exceptions) { + throw $exc; + } + return false; + } + return true; + } + + /** + * Return the array of attachments. + * @return array + */ + public function getAttachments() + { + return $this->attachment; + } + + /** + * Attach all file, string, and binary attachments to the message. + * Returns an empty string on failure. + * @access protected + * @param string $disposition_type + * @param string $boundary + * @return string + */ + protected function attachAll($disposition_type, $boundary) + { + // Return text of body + $mime = array(); + $cidUniq = array(); + $incl = array(); + + // Add all attachments + foreach ($this->attachment as $attachment) { + // Check if it is a valid disposition_filter + if ($attachment[6] == $disposition_type) { + // Check for string attachment + $string = ''; + $path = ''; + $bString = $attachment[5]; + if ($bString) { + $string = $attachment[0]; + } else { + $path = $attachment[0]; + } + + $inclhash = md5(serialize($attachment)); + if (in_array($inclhash, $incl)) { + continue; + } + $incl[] = $inclhash; + $name = $attachment[2]; + $encoding = $attachment[3]; + $type = $attachment[4]; + $disposition = $attachment[6]; + $cid = $attachment[7]; + if ($disposition == 'inline' && isset($cidUniq[$cid])) { + continue; + } + $cidUniq[$cid] = true; + + $mime[] = sprintf('--%s%s', $boundary, $this->LE); + //Only include a filename property if we have one + if (!empty($name)) { + $mime[] = sprintf( + 'Content-Type: %s; name="%s"%s', + $type, + $this->encodeHeader($this->secureHeader($name)), + $this->LE + ); + } else { + $mime[] = sprintf( + 'Content-Type: %s%s', + $type, + $this->LE + ); + } + // RFC1341 part 5 says 7bit is assumed if not specified + if ($encoding != '7bit') { + $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE); + } + + if ($disposition == 'inline') { + $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE); + } + + // If a filename contains any of these chars, it should be quoted, + // but not otherwise: RFC2183 & RFC2045 5.1 + // Fixes a warning in IETF's msglint MIME checker + // Allow for bypassing the Content-Disposition header totally + if (!(empty($disposition))) { + $encoded_name = $this->encodeHeader($this->secureHeader($name)); + if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) { + $mime[] = sprintf( + 'Content-Disposition: %s; filename="%s"%s', + $disposition, + $encoded_name, + $this->LE . $this->LE + ); + } else { + if (!empty($encoded_name)) { + $mime[] = sprintf( + 'Content-Disposition: %s; filename=%s%s', + $disposition, + $encoded_name, + $this->LE . $this->LE + ); + } else { + $mime[] = sprintf( + 'Content-Disposition: %s%s', + $disposition, + $this->LE . $this->LE + ); + } + } + } else { + $mime[] = $this->LE; + } + + // Encode as string attachment + if ($bString) { + $mime[] = $this->encodeString($string, $encoding); + if ($this->isError()) { + return ''; + } + $mime[] = $this->LE . $this->LE; + } else { + $mime[] = $this->encodeFile($path, $encoding); + if ($this->isError()) { + return ''; + } + $mime[] = $this->LE . $this->LE; + } + } + } + + $mime[] = sprintf('--%s--%s', $boundary, $this->LE); + + return implode('', $mime); + } + + /** + * Encode a file attachment in requested format. + * Returns an empty string on failure. + * @param string $path The full path to the file + * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable' + * @throws phpmailerException + * @see EncodeFile(encodeFile + * @access protected + * @return string + */ + protected function encodeFile($path, $encoding = 'base64') + { + try { + if (!is_readable($path)) { + throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE); + } + $magic_quotes = get_magic_quotes_runtime(); + if ($magic_quotes) { + //Doesn't exist in PHP 5.4, but we don't need to check because + //get_magic_quotes_runtime always returns false in 5.4+ + //so it will never get here + ini_set('magic_quotes_runtime', false); + } + $file_buffer = file_get_contents($path); + $file_buffer = $this->encodeString($file_buffer, $encoding); + if ($magic_quotes) { + ini_set('magic_quotes_runtime', $magic_quotes); + } + return $file_buffer; + } catch (\Exception $exc) { + $this->setError($exc->getMessage()); + return ''; + } + } + + /** + * Encode a string in requested format. + * Returns an empty string on failure. + * @param string $str The text to encode + * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable' + * @access public + * @return string + */ + public function encodeString($str, $encoding = 'base64') + { + $encoded = ''; + switch (strtolower($encoding)) { + case 'base64': + $encoded = chunk_split(base64_encode($str), 76, $this->LE); + break; + case '7bit': + case '8bit': + $encoded = $this->fixEOL($str); + // Make sure it ends with a line break + if (substr($encoded, -(strlen($this->LE))) != $this->LE) { + $encoded .= $this->LE; + } + break; + case 'binary': + $encoded = $str; + break; + case 'quoted-printable': + $encoded = $this->encodeQP($str); + break; + default: + $this->setError($this->lang('encoding') . $encoding); + break; + } + return $encoded; + } + + /** + * Encode a header string optimally. + * Picks shortest of Q, B, quoted-printable or none. + * @access public + * @param string $str + * @param string $position + * @return string + */ + public function encodeHeader($str, $position = 'text') + { + $matchcount = 0; + switch (strtolower($position)) { + case 'phrase': + if (!preg_match('/[\200-\377]/', $str)) { + // Can't use addslashes as we don't know the value of magic_quotes_sybase + $encoded = addcslashes($str, "\0..\37\177\\\""); + if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) { + return ($encoded); + } else { + return ("\"$encoded\""); + } + } + $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches); + break; + /** @noinspection PhpMissingBreakStatementInspection */ + case 'comment': + $matchcount = preg_match_all('/[()"]/', $str, $matches); + // Intentional fall-through + case 'text': + default: + $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches); + break; + } + + //There are no chars that need encoding + if ($matchcount == 0) { + return ($str); + } + + $maxlen = 75 - 7 - strlen($this->CharSet); + // Try to select the encoding which should produce the shortest output + if ($matchcount > strlen($str) / 3) { + // More than a third of the content will need encoding, so B encoding will be most efficient + $encoding = 'B'; + if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) { + // Use a custom function which correctly encodes and wraps long + // multibyte strings without breaking lines within a character + $encoded = $this->base64EncodeWrapMB($str, "\n"); + } else { + $encoded = base64_encode($str); + $maxlen -= $maxlen % 4; + $encoded = trim(chunk_split($encoded, $maxlen, "\n")); + } + } else { + $encoding = 'Q'; + $encoded = $this->encodeQ($str, $position); + $encoded = $this->wrapText($encoded, $maxlen, true); + $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded)); + } + + $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded); + $encoded = trim(str_replace("\n", $this->LE, $encoded)); + + return $encoded; + } + + /** + * Check if a string contains multi-byte characters. + * @access public + * @param string $str multi-byte text to wrap encode + * @return boolean + */ + public function hasMultiBytes($str) + { + if (function_exists('mb_strlen')) { + return (strlen($str) > mb_strlen($str, $this->CharSet)); + } else { // Assume no multibytes (we can't handle without mbstring functions anyway) + return false; + } + } + + /** + * Does a string contain any 8-bit chars (in any charset)? + * @param string $text + * @return boolean + */ + public function has8bitChars($text) + { + return (boolean)preg_match('/[\x80-\xFF]/', $text); + } + + /** + * Encode and wrap long multibyte strings for mail headers + * without breaking lines within a character. + * Adapted from a function by paravoid + * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283 + * @access public + * @param string $str multi-byte text to wrap encode + * @param string $linebreak string to use as linefeed/end-of-line + * @return string + */ + public function base64EncodeWrapMB($str, $linebreak = null) + { + $start = '=?' . $this->CharSet . '?B?'; + $end = '?='; + $encoded = ''; + if ($linebreak === null) { + $linebreak = $this->LE; + } + + $mb_length = mb_strlen($str, $this->CharSet); + // Each line must have length <= 75, including $start and $end + $length = 75 - strlen($start) - strlen($end); + // Average multi-byte ratio + $ratio = $mb_length / strlen($str); + // Base64 has a 4:3 ratio + $avgLength = floor($length * $ratio * .75); + + for ($i = 0; $i < $mb_length; $i += $offset) { + $lookBack = 0; + do { + $offset = $avgLength - $lookBack; + $chunk = mb_substr($str, $i, $offset, $this->CharSet); + $chunk = base64_encode($chunk); + $lookBack++; + } while (strlen($chunk) > $length); + $encoded .= $chunk . $linebreak; + } + + // Chomp the last linefeed + $encoded = substr($encoded, 0, -strlen($linebreak)); + return $encoded; + } + + /** + * Encode a string in quoted-printable format. + * According to RFC2045 section 6.7. + * @access public + * @param string $string The text to encode + * @param integer $line_max Number of chars allowed on a line before wrapping + * @return string + * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment + */ + public function encodeQP($string, $line_max = 76) + { + // Use native function if it's available (>= PHP5.3) + if (function_exists('quoted_printable_encode')) { + return quoted_printable_encode($string); + } + // Fall back to a pure PHP implementation + $string = str_replace( + array('%20', '%0D%0A.', '%0D%0A', '%'), + array(' ', "\r\n=2E", "\r\n", '='), + rawurlencode($string) + ); + return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string); + } + + /** + * Backward compatibility wrapper for an old QP encoding function that was removed. + * @see PHPMailer::encodeQP() + * @access public + * @param string $string + * @param integer $line_max + * @param boolean $space_conv + * @return string + * @deprecated Use encodeQP instead. + */ + public function encodeQPphp( + $string, + $line_max = 76, + /** @noinspection PhpUnusedParameterInspection */ $space_conv = false + ) { + return $this->encodeQP($string, $line_max); + } + + /** + * Encode a string using Q encoding. + * @link http://tools.ietf.org/html/rfc2047 + * @param string $str the text to encode + * @param string $position Where the text is going to be used, see the RFC for what that means + * @access public + * @return string + */ + public function encodeQ($str, $position = 'text') + { + // There should not be any EOL in the string + $pattern = ''; + $encoded = str_replace(array("\r", "\n"), '', $str); + switch (strtolower($position)) { + case 'phrase': + // RFC 2047 section 5.3 + $pattern = '^A-Za-z0-9!*+\/ -'; + break; + /** @noinspection PhpMissingBreakStatementInspection */ + case 'comment': + // RFC 2047 section 5.2 + $pattern = '\(\)"'; + // intentional fall-through + // for this reason we build the $pattern without including delimiters and [] + case 'text': + default: + // RFC 2047 section 5.1 + // Replace every high ascii, control, =, ? and _ characters + $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern; + break; + } + $matches = array(); + if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) { + // If the string contains an '=', make sure it's the first thing we replace + // so as to avoid double-encoding + $eqkey = array_search('=', $matches[0]); + if (false !== $eqkey) { + unset($matches[0][$eqkey]); + array_unshift($matches[0], '='); + } + foreach (array_unique($matches[0]) as $char) { + $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded); + } + } + // Replace every spaces to _ (more readable than =20) + return str_replace(' ', '_', $encoded); + } + + + /** + * Add a string or binary attachment (non-filesystem). + * This method can be used to attach ascii or binary data, + * such as a BLOB record from a database. + * @param string $string String attachment data. + * @param string $filename Name of the attachment. + * @param string $encoding File encoding (see $Encoding). + * @param string $type File extension (MIME) type. + * @param string $disposition Disposition to use + * @return void + */ + public function addStringAttachment( + $string, + $filename, + $encoding = 'base64', + $type = '', + $disposition = 'attachment' + ) { + // If a MIME type is not specified, try to work it out from the file name + if ($type == '') { + $type = self::filenameToType($filename); + } + // Append to $attachment array + $this->attachment[] = array( + 0 => $string, + 1 => $filename, + 2 => basename($filename), + 3 => $encoding, + 4 => $type, + 5 => true, // isStringAttachment + 6 => $disposition, + 7 => 0 + ); + } + + /** + * Add an embedded (inline) attachment from a file. + * This can include images, sounds, and just about any other document type. + * These differ from 'regular' attachments in that they are intended to be + * displayed inline with the message, not just attached for download. + * This is used in HTML messages that embed the images + * the HTML refers to using the $cid value. + * @param string $path Path to the attachment. + * @param string $cid Content ID of the attachment; Use this to reference + * the content when using an embedded image in HTML. + * @param string $name Overrides the attachment name. + * @param string $encoding File encoding (see $Encoding). + * @param string $type File MIME type. + * @param string $disposition Disposition to use + * @return boolean True on successfully adding an attachment + */ + public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline') + { + if (!@is_file($path)) { + $this->setError($this->lang('file_access') . $path); + return false; + } + + // If a MIME type is not specified, try to work it out from the file name + if ($type == '') { + $type = self::filenameToType($path); + } + + $filename = basename($path); + if ($name == '') { + $name = $filename; + } + + // Append to $attachment array + $this->attachment[] = array( + 0 => $path, + 1 => $filename, + 2 => $name, + 3 => $encoding, + 4 => $type, + 5 => false, // isStringAttachment + 6 => $disposition, + 7 => $cid + ); + return true; + } + + /** + * Add an embedded stringified attachment. + * This can include images, sounds, and just about any other document type. + * Be sure to set the $type to an image type for images: + * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'. + * @param string $string The attachment binary data. + * @param string $cid Content ID of the attachment; Use this to reference + * the content when using an embedded image in HTML. + * @param string $name + * @param string $encoding File encoding (see $Encoding). + * @param string $type MIME type. + * @param string $disposition Disposition to use + * @return boolean True on successfully adding an attachment + */ + public function addStringEmbeddedImage( + $string, + $cid, + $name = '', + $encoding = 'base64', + $type = '', + $disposition = 'inline' + ) { + // If a MIME type is not specified, try to work it out from the name + if ($type == '' and !empty($name)) { + $type = self::filenameToType($name); + } + + // Append to $attachment array + $this->attachment[] = array( + 0 => $string, + 1 => $name, + 2 => $name, + 3 => $encoding, + 4 => $type, + 5 => true, // isStringAttachment + 6 => $disposition, + 7 => $cid + ); + return true; + } + + /** + * Check if an inline attachment is present. + * @access public + * @return boolean + */ + public function inlineImageExists() + { + foreach ($this->attachment as $attachment) { + if ($attachment[6] == 'inline') { + return true; + } + } + return false; + } + + /** + * Check if an attachment (non-inline) is present. + * @return boolean + */ + public function attachmentExists() + { + foreach ($this->attachment as $attachment) { + if ($attachment[6] == 'attachment') { + return true; + } + } + return false; + } + + /** + * Check if this message has an alternative body set. + * @return boolean + */ + public function alternativeExists() + { + return !empty($this->AltBody); + } + + /** + * Clear all To recipients. + * @return void + */ + public function clearAddresses() + { + foreach ($this->to as $to) { + unset($this->all_recipients[strtolower($to[0])]); + } + $this->to = array(); + } + + /** + * Clear all CC recipients. + * @return void + */ + public function clearCCs() + { + foreach ($this->cc as $cc) { + unset($this->all_recipients[strtolower($cc[0])]); + } + $this->cc = array(); + } + + /** + * Clear all BCC recipients. + * @return void + */ + public function clearBCCs() + { + foreach ($this->bcc as $bcc) { + unset($this->all_recipients[strtolower($bcc[0])]); + } + $this->bcc = array(); + } + + /** + * Clear all ReplyTo recipients. + * @return void + */ + public function clearReplyTos() + { + $this->ReplyTo = array(); + } + + /** + * Clear all recipient types. + * @return void + */ + public function clearAllRecipients() + { + $this->to = array(); + $this->cc = array(); + $this->bcc = array(); + $this->all_recipients = array(); + } + + /** + * Clear all filesystem, string, and binary attachments. + * @return void + */ + public function clearAttachments() + { + $this->attachment = array(); + } + + /** + * Clear all custom headers. + * @return void + */ + public function clearCustomHeaders() + { + $this->CustomHeader = array(); + } + + /** + * Add an error message to the error container. + * @access protected + * @param string $msg + * @return void + */ + protected function setError($msg) + { + $this->error_count++; + if ($this->Mailer == 'smtp' and !is_null($this->smtp)) { + $lasterror = $this->smtp->getError(); + if (!empty($lasterror['error'])) { + $msg .= $this->lang('smtp_error') . $lasterror['error']; + if (!empty($lasterror['detail'])) { + $msg .= ' Detail: '. $lasterror['detail']; + } + if (!empty($lasterror['smtp_code'])) { + $msg .= ' SMTP code: ' . $lasterror['smtp_code']; + } + if (!empty($lasterror['smtp_code_ex'])) { + $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex']; + } + } + } + $this->ErrorInfo = $msg; + } + + /** + * Return an RFC 822 formatted date. + * @access public + * @return string + * @static + */ + public static function rfcDate() + { + // Set the time zone to whatever the default is to avoid 500 errors + // Will default to UTC if it's not set properly in php.ini + date_default_timezone_set(@date_default_timezone_get()); + return date('D, j M Y H:i:s O'); + } + + /** + * Get the server hostname. + * Returns 'localhost.localdomain' if unknown. + * @access protected + * @return string + */ + protected function serverHostname() + { + $result = 'localhost.localdomain'; + if (!empty($this->Hostname)) { + $result = $this->Hostname; + } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) { + $result = $_SERVER['SERVER_NAME']; + } elseif (function_exists('gethostname') && gethostname() !== false) { + $result = gethostname(); + } elseif (php_uname('n') !== false) { + $result = php_uname('n'); + } + return $result; + } + + /** + * Get an error message in the current language. + * @access protected + * @param string $key + * @return string + */ + protected function lang($key) + { + if (count($this->language) < 1) { + $this->language = array( + 'authenticate' => 'SMTP Error: Could not authenticate.', + 'connect_host' => 'SMTP Error: Could not connect to SMTP host.', + 'data_not_accepted' => 'SMTP Error: data not accepted.', + 'empty_message' => 'Message body empty', + 'encoding' => 'Unknown encoding: ', + 'execute' => 'Could not execute: ', + 'file_access' => 'Could not access file: ', + 'file_open' => 'File Error: Could not open file: ', + 'from_failed' => 'The following From address failed: ', + 'instantiate' => 'Could not instantiate mail function.', + 'invalid_address' => 'Invalid address', + 'mailer_not_supported' => ' mailer is not supported.', + 'provide_address' => 'You must provide at least one recipient email address.', + 'recipients_failed' => 'SMTP Error: The following recipients failed: ', + 'signing' => 'Signing Error: ', + 'smtp_connect_failed' => 'SMTP connect() failed.', + 'smtp_error' => 'SMTP server error: ', + 'variable_set' => 'Cannot set or reset variable: ', + 'extension_missing' => 'Extension missing: ' + ); + } + + if (array_key_exists($key, $this->language)) { + if ($key == 'smtp_connect_failed') { + //Include a link to troubleshooting docs on SMTP connection failure + //this is by far the biggest cause of support questions + //but it's usually not PHPMailer's fault. + return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting'; + } + return $this->language[$key]; + } else { + //Return the key as a fallback + return $key; + } + } + + /** + * Check if an error occurred. + * @access public + * @return boolean True if an error did occur. + */ + public function isError() + { + return ($this->error_count > 0); + } + + /** + * Ensure consistent line endings in a string. + * Changes every end of line from CRLF, CR or LF to $this->LE. + * @access public + * @param string $str String to fixEOL + * @return string + */ + public function fixEOL($str) + { + // Normalise to \n + $nstr = str_replace(array("\r\n", "\r"), "\n", $str); + // Now convert LE as needed + if ($this->LE !== "\n") { + $nstr = str_replace("\n", $this->LE, $nstr); + } + return $nstr; + } + + /** + * Add a custom header. + * $name value can be overloaded to contain + * both header name and value (name:value) + * @access public + * @param string $name Custom header name + * @param string $value Header value + * @return void + */ + public function addCustomHeader($name, $value = null) + { + if ($value === null) { + // Value passed in as name:value + $this->CustomHeader[] = explode(':', $name, 2); + } else { + $this->CustomHeader[] = array($name, $value); + } + } + + /** + * Returns all custom headers + * + * @return array + */ + public function getCustomHeaders() + { + return $this->CustomHeader; + } + + /** + * Create a message from an HTML string. + * Automatically makes modifications for inline images and backgrounds + * and creates a plain-text version by converting the HTML. + * Overwrites any existing values in $this->Body and $this->AltBody + * @access public + * @param string $message HTML message string + * @param string $basedir baseline directory for path + * @param boolean|callable $advanced Whether to use the internal HTML to text converter + * or your own custom converter @see html2text() + * @return string $message + */ + public function msgHTML($message, $basedir = '', $advanced = false) + { + preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images); + if (isset($images[2])) { + foreach ($images[2] as $imgindex => $url) { + // Convert data URIs into embedded images + if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) { + $data = substr($url, strpos($url, ',')); + if ($match[2]) { + $data = base64_decode($data); + } else { + $data = rawurldecode($data); + } + $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2 + if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) { + $message = str_replace( + $images[0][$imgindex], + $images[1][$imgindex] . '="cid:' . $cid . '"', + $message + ); + } + } elseif (substr($url, 0, 4) !== 'cid:' && !preg_match('#^[A-z]+://#', $url)) { + // Do not change urls for absolute images (thanks to corvuscorax) + // Do not change urls that are already inline images + $filename = basename($url); + $directory = dirname($url); + if ($directory == '.') { + $directory = ''; + } + $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2 + if (strlen($basedir) > 1 && substr($basedir, -1) != '/') { + $basedir .= '/'; + } + if (strlen($directory) > 1 && substr($directory, -1) != '/') { + $directory .= '/'; + } + if ($this->addEmbeddedImage( + $basedir . $directory . $filename, + $cid, + $filename, + 'base64', + self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION)) + ) + ) { + $message = preg_replace( + '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui', + $images[1][$imgindex] . '="cid:' . $cid . '"', + $message + ); + } + } + } + } + $this->isHTML(true); + // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better + $this->Body = $this->normalizeBreaks($message); + $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced)); + if (empty($this->AltBody)) { + $this->AltBody = 'To view this email message, open it in a program that understands HTML!' . + self::CRLF . self::CRLF; + } + return $this->Body; + } + + /** + * Convert an HTML string into plain text. + * This is used by msgHTML(). + * Note - older versions of this function used a bundled advanced converter + * which was been removed for license reasons in #232 + * Example usage: + * + * // Use default conversion + * $plain = $mail->html2text($html); + * // Use your own custom converter + * $plain = $mail->html2text($html, function($html) { + * $converter = new MyHtml2text($html); + * return $converter->get_text(); + * }); + * + * @param string $html The HTML text to convert + * @param boolean|callable $advanced Any boolean value to use the internal converter, + * or provide your own callable for custom conversion. + * @return string + */ + public function html2text($html, $advanced = false) + { + if (is_callable($advanced)) { + return call_user_func($advanced, $html); + } + return html_entity_decode( + trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))), + ENT_QUOTES, + $this->CharSet + ); + } + + /** + * Get the MIME type for a file extension. + * @param string $ext File extension + * @access public + * @return string MIME type of file. + * @static + */ + public static function _mime_types($ext = '') + { + $mimes = array( + 'xl' => 'application/excel', + 'js' => 'application/javascript', + 'hqx' => 'application/mac-binhex40', + 'cpt' => 'application/mac-compactpro', + 'bin' => 'application/macbinary', + 'doc' => 'application/msword', + 'word' => 'application/msword', + 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', + 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', + 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', + 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', + 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', + 'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12', + 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', + 'class' => 'application/octet-stream', + 'dll' => 'application/octet-stream', + 'dms' => 'application/octet-stream', + 'exe' => 'application/octet-stream', + 'lha' => 'application/octet-stream', + 'lzh' => 'application/octet-stream', + 'psd' => 'application/octet-stream', + 'sea' => 'application/octet-stream', + 'so' => 'application/octet-stream', + 'oda' => 'application/oda', + 'pdf' => 'application/pdf', + 'ai' => 'application/postscript', + 'eps' => 'application/postscript', + 'ps' => 'application/postscript', + 'smi' => 'application/smil', + 'smil' => 'application/smil', + 'mif' => 'application/vnd.mif', + 'xls' => 'application/vnd.ms-excel', + 'ppt' => 'application/vnd.ms-powerpoint', + 'wbxml' => 'application/vnd.wap.wbxml', + 'wmlc' => 'application/vnd.wap.wmlc', + 'dcr' => 'application/x-director', + 'dir' => 'application/x-director', + 'dxr' => 'application/x-director', + 'dvi' => 'application/x-dvi', + 'gtar' => 'application/x-gtar', + 'php3' => 'application/x-httpd-php', + 'php4' => 'application/x-httpd-php', + 'php' => 'application/x-httpd-php', + 'phtml' => 'application/x-httpd-php', + 'phps' => 'application/x-httpd-php-source', + 'swf' => 'application/x-shockwave-flash', + 'sit' => 'application/x-stuffit', + 'tar' => 'application/x-tar', + 'tgz' => 'application/x-tar', + 'xht' => 'application/xhtml+xml', + 'xhtml' => 'application/xhtml+xml', + 'zip' => 'application/zip', + 'mid' => 'audio/midi', + 'midi' => 'audio/midi', + 'mp2' => 'audio/mpeg', + 'mp3' => 'audio/mpeg', + 'mpga' => 'audio/mpeg', + 'aif' => 'audio/x-aiff', + 'aifc' => 'audio/x-aiff', + 'aiff' => 'audio/x-aiff', + 'ram' => 'audio/x-pn-realaudio', + 'rm' => 'audio/x-pn-realaudio', + 'rpm' => 'audio/x-pn-realaudio-plugin', + 'ra' => 'audio/x-realaudio', + 'wav' => 'audio/x-wav', + 'bmp' => 'image/bmp', + 'gif' => 'image/gif', + 'jpeg' => 'image/jpeg', + 'jpe' => 'image/jpeg', + 'jpg' => 'image/jpeg', + 'png' => 'image/png', + 'tiff' => 'image/tiff', + 'tif' => 'image/tiff', + 'eml' => 'message/rfc822', + 'css' => 'text/css', + 'html' => 'text/html', + 'htm' => 'text/html', + 'shtml' => 'text/html', + 'log' => 'text/plain', + 'text' => 'text/plain', + 'txt' => 'text/plain', + 'rtx' => 'text/richtext', + 'rtf' => 'text/rtf', + 'vcf' => 'text/vcard', + 'vcard' => 'text/vcard', + 'xml' => 'text/xml', + 'xsl' => 'text/xml', + 'mpeg' => 'video/mpeg', + 'mpe' => 'video/mpeg', + 'mpg' => 'video/mpeg', + 'mov' => 'video/quicktime', + 'qt' => 'video/quicktime', + 'rv' => 'video/vnd.rn-realvideo', + 'avi' => 'video/x-msvideo', + 'movie' => 'video/x-sgi-movie' + ); + if (array_key_exists(strtolower($ext), $mimes)) { + return $mimes[strtolower($ext)]; + } + return 'application/octet-stream'; + } + + /** + * Map a file name to a MIME type. + * Defaults to 'application/octet-stream', i.e.. arbitrary binary data. + * @param string $filename A file name or full path, does not need to exist as a file + * @return string + * @static + */ + public static function filenameToType($filename) + { + // In case the path is a URL, strip any query string before getting extension + $qpos = strpos($filename, '?'); + if (false !== $qpos) { + $filename = substr($filename, 0, $qpos); + } + $pathinfo = self::mb_pathinfo($filename); + return self::_mime_types($pathinfo['extension']); + } + + /** + * Multi-byte-safe pathinfo replacement. + * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe. + * Works similarly to the one in PHP >= 5.2.0 + * @link http://www.php.net/manual/en/function.pathinfo.php#107461 + * @param string $path A filename or path, does not need to exist as a file + * @param integer|string $options Either a PATHINFO_* constant, + * or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2 + * @return string|array + * @static + */ + public static function mb_pathinfo($path, $options = null) + { + $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => ''); + $pathinfo = array(); + if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) { + if (array_key_exists(1, $pathinfo)) { + $ret['dirname'] = $pathinfo[1]; + } + if (array_key_exists(2, $pathinfo)) { + $ret['basename'] = $pathinfo[2]; + } + if (array_key_exists(5, $pathinfo)) { + $ret['extension'] = $pathinfo[5]; + } + if (array_key_exists(3, $pathinfo)) { + $ret['filename'] = $pathinfo[3]; + } + } + switch ($options) { + case PATHINFO_DIRNAME: + case 'dirname': + return $ret['dirname']; + case PATHINFO_BASENAME: + case 'basename': + return $ret['basename']; + case PATHINFO_EXTENSION: + case 'extension': + return $ret['extension']; + case PATHINFO_FILENAME: + case 'filename': + return $ret['filename']; + default: + return $ret; + } + } + + /** + * Set or reset instance properties. + * You should avoid this function - it's more verbose, less efficient, more error-prone and + * harder to debug than setting properties directly. + * Usage Example: + * `$mail->set('SMTPSecure', 'tls');` + * is the same as: + * `$mail->SMTPSecure = 'tls';` + * @access public + * @param string $name The property name to set + * @param mixed $value The value to set the property to + * @return boolean + * @TODO Should this not be using the __set() magic function? + */ + public function set($name, $value = '') + { + if (property_exists($this, $name)) { + $this->$name = $value; + return true; + } else { + $this->setError($this->lang('variable_set') . $name); + return false; + } + } + + /** + * Strip newlines to prevent header injection. + * @access public + * @param string $str + * @return string + */ + public function secureHeader($str) + { + return trim(str_replace(array("\r", "\n"), '', $str)); + } + + /** + * Normalize line breaks in a string. + * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format. + * Defaults to CRLF (for message bodies) and preserves consecutive breaks. + * @param string $text + * @param string $breaktype What kind of line break to use, defaults to CRLF + * @return string + * @access public + * @static + */ + public static function normalizeBreaks($text, $breaktype = "\r\n") + { + return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text); + } + + + /** + * Set the public and private key files and password for S/MIME signing. + * @access public + * @param string $cert_filename + * @param string $key_filename + * @param string $key_pass Password for private key + * @param string $extracerts_filename Optional path to chain certificate + */ + public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '') + { + $this->sign_cert_file = $cert_filename; + $this->sign_key_file = $key_filename; + $this->sign_key_pass = $key_pass; + $this->sign_extracerts_file = $extracerts_filename; + } + + /** + * Quoted-Printable-encode a DKIM header. + * @access public + * @param string $txt + * @return string + */ + public function DKIM_QP($txt) + { + $line = ''; + for ($i = 0; $i < strlen($txt); $i++) { + $ord = ord($txt[$i]); + if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) { + $line .= $txt[$i]; + } else { + $line .= '=' . sprintf('%02X', $ord); + } + } + return $line; + } + + /** + * Generate a DKIM signature. + * @access public + * @param string $signHeader + * @throws phpmailerException + * @return string + */ + public function DKIM_Sign($signHeader) + { + if (!defined('PKCS7_TEXT')) { + if ($this->exceptions) { + throw new phpmailerException($this->lang('extension_missing') . 'openssl'); + } + return ''; + } + $privKeyStr = file_get_contents($this->DKIM_private); + if ($this->DKIM_passphrase != '') { + $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase); + } else { + $privKey = $privKeyStr; + } + if (openssl_sign($signHeader, $signature, $privKey)) { + return base64_encode($signature); + } + return ''; + } + + /** + * Generate a DKIM canonicalization header. + * @access public + * @param string $signHeader Header + * @return string + */ + public function DKIM_HeaderC($signHeader) + { + $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader); + $lines = explode("\r\n", $signHeader); + foreach ($lines as $key => $line) { + list($heading, $value) = explode(':', $line, 2); + $heading = strtolower($heading); + $value = preg_replace('/\s+/', ' ', $value); // Compress useless spaces + $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value + } + $signHeader = implode("\r\n", $lines); + return $signHeader; + } + + /** + * Generate a DKIM canonicalization body. + * @access public + * @param string $body Message Body + * @return string + */ + public function DKIM_BodyC($body) + { + if ($body == '') { + return "\r\n"; + } + // stabilize line endings + $body = str_replace("\r\n", "\n", $body); + $body = str_replace("\n", "\r\n", $body); + // END stabilize line endings + while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") { + $body = substr($body, 0, strlen($body) - 2); + } + return $body; + } + + /** + * Create the DKIM header and body in a new message header. + * @access public + * @param string $headers_line Header lines + * @param string $subject Subject + * @param string $body Body + * @return string + */ + public function DKIM_Add($headers_line, $subject, $body) + { + $DKIMsignatureType = 'rsa-sha1'; // Signature & hash algorithms + $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body + $DKIMquery = 'dns/txt'; // Query method + $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone) + $subject_header = "Subject: $subject"; + $headers = explode($this->LE, $headers_line); + $from_header = ''; + $to_header = ''; + $current = ''; + foreach ($headers as $header) { + if (strpos($header, 'From:') === 0) { + $from_header = $header; + $current = 'from_header'; + } elseif (strpos($header, 'To:') === 0) { + $to_header = $header; + $current = 'to_header'; + } else { + if (!empty($$current) && strpos($header, ' =?') === 0) { + $$current .= $header; + } else { + $current = ''; + } + } + } + $from = str_replace('|', '=7C', $this->DKIM_QP($from_header)); + $to = str_replace('|', '=7C', $this->DKIM_QP($to_header)); + $subject = str_replace( + '|', + '=7C', + $this->DKIM_QP($subject_header) + ); // Copied header fields (dkim-quoted-printable) + $body = $this->DKIM_BodyC($body); + $DKIMlen = strlen($body); // Length of body + $DKIMb64 = base64_encode(pack('H*', sha1($body))); // Base64 of packed binary SHA-1 hash of body + if ('' == $this->DKIM_identity) { + $ident = ''; + } else { + $ident = ' i=' . $this->DKIM_identity . ';'; + } + $dkimhdrs = 'DKIM-Signature: v=1; a=' . + $DKIMsignatureType . '; q=' . + $DKIMquery . '; l=' . + $DKIMlen . '; s=' . + $this->DKIM_selector . + ";\r\n" . + "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" . + "\th=From:To:Subject;\r\n" . + "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" . + "\tz=$from\r\n" . + "\t|$to\r\n" . + "\t|$subject;\r\n" . + "\tbh=" . $DKIMb64 . ";\r\n" . + "\tb="; + $toSign = $this->DKIM_HeaderC( + $from_header . "\r\n" . $to_header . "\r\n" . $subject_header . "\r\n" . $dkimhdrs + ); + $signed = $this->DKIM_Sign($toSign); + return $dkimhdrs . $signed . "\r\n"; + } + + /** + * Detect if a string contains a line longer than the maximum line length allowed. + * @param string $str + * @return boolean + * @static + */ + public static function hasLineLongerThanMax($str) + { + //+2 to include CRLF line break for a 1000 total + return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str); + } + + /** + * Allows for public read access to 'to' property. + * @access public + * @return array + */ + public function getToAddresses() + { + return $this->to; + } + + /** + * Allows for public read access to 'cc' property. + * @access public + * @return array + */ + public function getCcAddresses() + { + return $this->cc; + } + + /** + * Allows for public read access to 'bcc' property. + * @access public + * @return array + */ + public function getBccAddresses() + { + return $this->bcc; + } + + /** + * Allows for public read access to 'ReplyTo' property. + * @access public + * @return array + */ + public function getReplyToAddresses() + { + return $this->ReplyTo; + } + + /** + * Allows for public read access to 'all_recipients' property. + * @access public + * @return array + */ + public function getAllRecipientAddresses() + { + return $this->all_recipients; + } + + /** + * Perform a callback. + * @param boolean $isSent + * @param array $to + * @param array $cc + * @param array $bcc + * @param string $subject + * @param string $body + * @param string $from + */ + protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from) + { + if (!empty($this->action_function) && is_callable($this->action_function)) { + $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from); + call_user_func_array($this->action_function, $params); + } + } +} + +/** + * PHPMailer exception handler + * @package PHPMailer + */ +class phpmailerException extends \Exception +{ + /** + * Prettify error message output + * @return string + */ + public function errorMessage() + { + $errorMsg = '' . $this->getMessage() . "
    \n"; + return $errorMsg; + } +} diff --git a/zira/phpmailer/smtp.php b/zira/phpmailer/smtp.php new file mode 100644 index 0000000..8185a66 --- /dev/null +++ b/zira/phpmailer/smtp.php @@ -0,0 +1,1110 @@ + + * @author Jim Jagielski (jimjag) + * @author Andy Prevost (codeworxtech) + * @author Brent R. Matzelle (original founder) + * @copyright 2014 Marcus Bointon + * @copyright 2010 - 2012 Jim Jagielski + * @copyright 2004 - 2009 Andy Prevost + * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License + * @note This program is distributed in the hope that it will be useful - WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + */ + +/** + * PHPMailer RFC821 SMTP email transport class. + * Implements RFC 821 SMTP commands and provides some utility methods for sending mail to an SMTP server. + * @package PHPMailer + * @author Chris Ryan + * @author Marcus Bointon + */ + +namespace Zira\Phpmailer; + +class Smtp +{ + /** + * The PHPMailer SMTP version number. + * @type string + */ + const VERSION = '5.2.12'; + + /** + * SMTP line break constant. + * @type string + */ + const CRLF = "\r\n"; + + /** + * The SMTP port to use if one is not specified. + * @type integer + */ + const DEFAULT_SMTP_PORT = 25; + + /** + * The maximum line length allowed by RFC 2822 section 2.1.1 + * @type integer + */ + const MAX_LINE_LENGTH = 998; + + /** + * Debug level for no output + */ + const DEBUG_OFF = 0; + + /** + * Debug level to show client -> server messages + */ + const DEBUG_CLIENT = 1; + + /** + * Debug level to show client -> server and server -> client messages + */ + const DEBUG_SERVER = 2; + + /** + * Debug level to show connection status, client -> server and server -> client messages + */ + const DEBUG_CONNECTION = 3; + + /** + * Debug level to show all messages + */ + const DEBUG_LOWLEVEL = 4; + + /** + * The PHPMailer SMTP Version number. + * @type string + * @deprecated Use the `VERSION` constant instead + * @see SMTP::VERSION + */ + public $Version = '5.2.12'; + + /** + * SMTP server port number. + * @type integer + * @deprecated This is only ever used as a default value, so use the `DEFAULT_SMTP_PORT` constant instead + * @see SMTP::DEFAULT_SMTP_PORT + */ + public $SMTP_PORT = 25; + + /** + * SMTP reply line ending. + * @type string + * @deprecated Use the `CRLF` constant instead + * @see SMTP::CRLF + */ + public $CRLF = "\r\n"; + + /** + * Debug output level. + * Options: + * * self::DEBUG_OFF (`0`) No debug output, default + * * self::DEBUG_CLIENT (`1`) Client commands + * * self::DEBUG_SERVER (`2`) Client commands and server responses + * * self::DEBUG_CONNECTION (`3`) As DEBUG_SERVER plus connection status + * * self::DEBUG_LOWLEVEL (`4`) Low-level data output, all messages + * @type integer + */ + public $do_debug = self::DEBUG_OFF; + + /** + * How to handle debug output. + * Options: + * * `echo` Output plain-text as-is, appropriate for CLI + * * `html` Output escaped, line breaks converted to `
    `, appropriate for browser output + * * `error_log` Output to error log as configured in php.ini + * + * Alternatively, you can provide a callable expecting two params: a message string and the debug level: + * + * $smtp->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";}; + * + * @type string|callable + */ + public $Debugoutput = 'echo'; + + /** + * Whether to use VERP. + * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path + * @link http://www.postfix.org/VERP_README.html Info on VERP + * @type boolean + */ + public $do_verp = false; + + /** + * The timeout value for connection, in seconds. + * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2 + * This needs to be quite high to function correctly with hosts using greetdelay as an anti-spam measure. + * @link http://tools.ietf.org/html/rfc2821#section-4.5.3.2 + * @type integer + */ + public $Timeout = 300; + + /** + * How long to wait for commands to complete, in seconds. + * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2 + * @type integer + */ + public $Timelimit = 300; + + /** + * The socket for the server connection. + * @type resource + */ + protected $smtp_conn; + + /** + * Error information, if any, for the last SMTP command. + * @type array + */ + protected $error = array( + 'error' => '', + 'detail' => '', + 'smtp_code' => '', + 'smtp_code_ex' => '' + ); + + /** + * The reply the server sent to us for HELO. + * If null, no HELO string has yet been received. + * @type string|null + */ + protected $helo_rply = null; + + /** + * The set of SMTP extensions sent in reply to EHLO command. + * Indexes of the array are extension names. + * Value at index 'HELO' or 'EHLO' (according to command that was sent) + * represents the server name. In case of HELO it is the only element of the array. + * Other values can be boolean TRUE or an array containing extension options. + * If null, no HELO/EHLO string has yet been received. + * @type array|null + */ + protected $server_caps = null; + + /** + * The most recent reply received from the server. + * @type string + */ + protected $last_reply = ''; + + /** + * Output debugging info via a user-selected method. + * @see SMTP::$Debugoutput + * @see SMTP::$do_debug + * @param string $str Debug string to output + * @param integer $level The debug level of this message; see DEBUG_* constants + * @return void + */ + protected function edebug($str, $level = 0) + { + if ($level > $this->do_debug) { + return; + } + //Avoid clash with built-in function names + if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) { + call_user_func($this->Debugoutput, $str, $this->do_debug); + return; + } + switch ($this->Debugoutput) { + case 'error_log': + //Don't output, just log + error_log($str); + break; + case 'html': + //Cleans up output a bit for a better looking, HTML-safe output + echo htmlentities( + preg_replace('/[\r\n]+/', '', $str), + ENT_QUOTES, + 'UTF-8' + ) + . "
    \n"; + break; + case 'echo': + default: + //Normalize line breaks + $str = preg_replace('/(\r\n|\r|\n)/ms', "\n", $str); + echo gmdate('Y-m-d H:i:s') . "\t" . str_replace( + "\n", + "\n \t ", + trim($str) + )."\n"; + } + } + + /** + * Connect to an SMTP server. + * @param string $host SMTP server IP or host name + * @param integer $port The port number to connect to + * @param integer $timeout How long to wait for the connection to open + * @param array $options An array of options for stream_context_create() + * @access public + * @return boolean + */ + public function connect($host, $port = null, $timeout = 30, $options = array()) + { + static $streamok; + //This is enabled by default since 5.0.0 but some providers disable it + //Check this once and cache the result + if (is_null($streamok)) { + $streamok = function_exists('stream_socket_client'); + } + // Clear errors to avoid confusion + $this->setError(''); + // Make sure we are __not__ connected + if ($this->connected()) { + // Already connected, generate error + $this->setError('Already connected to a server'); + return false; + } + if (empty($port)) { + $port = self::DEFAULT_SMTP_PORT; + } + // Connect to the SMTP server + $this->edebug( + "Connection: opening to $host:$port, timeout=$timeout, options=".var_export($options, true), + self::DEBUG_CONNECTION + ); + $errno = 0; + $errstr = ''; + if ($streamok) { + $socket_context = stream_context_create($options); + //Suppress errors; connection failures are handled at a higher level + $this->smtp_conn = @stream_socket_client( + $host . ":" . $port, + $errno, + $errstr, + $timeout, + STREAM_CLIENT_CONNECT, + $socket_context + ); + } else { + //Fall back to fsockopen which should work in more places, but is missing some features + $this->edebug( + "Connection: stream_socket_client not available, falling back to fsockopen", + self::DEBUG_CONNECTION + ); + $this->smtp_conn = fsockopen( + $host, + $port, + $errno, + $errstr, + $timeout + ); + } + // Verify we connected properly + if (!is_resource($this->smtp_conn)) { + $this->setError( + 'Failed to connect to server', + $errno, + $errstr + ); + $this->edebug( + 'SMTP ERROR: ' . $this->error['error'] + . ": $errstr ($errno)", + self::DEBUG_CLIENT + ); + return false; + } + $this->edebug('Connection: opened', self::DEBUG_CONNECTION); + // SMTP server can take longer to respond, give longer timeout for first read + // Windows does not have support for this timeout function + if (substr(PHP_OS, 0, 3) != 'WIN') { + $max = ini_get('max_execution_time'); + // Don't bother if unlimited + if ($max != 0 && $timeout > $max) { + @set_time_limit($timeout); + } + stream_set_timeout($this->smtp_conn, $timeout, 0); + } + // Get any announcement + $announce = $this->get_lines(); + $this->edebug('SERVER -> CLIENT: ' . $announce, self::DEBUG_SERVER); + return true; + } + + /** + * Initiate a TLS (encrypted) session. + * @access public + * @return boolean + */ + public function startTLS() + { + if (!$this->sendCommand('STARTTLS', 'STARTTLS', 220)) { + return false; + } + // Begin encrypted connection + if (!stream_socket_enable_crypto( + $this->smtp_conn, + true, + STREAM_CRYPTO_METHOD_TLS_CLIENT + )) { + return false; + } + return true; + } + + /** + * Perform SMTP authentication. + * Must be run after hello(). + * @see hello() + * @param string $username The user name + * @param string $password The password + * @param string $authtype The auth type (PLAIN, LOGIN, CRAM-MD5) + * @return bool True if successfully authenticated.* @access public + */ + public function authenticate( + $username, + $password, + $authtype = null + ) { + if (!$this->server_caps) { + $this->setError('Authentication is not allowed before HELO/EHLO'); + return false; + } + + if (array_key_exists('EHLO', $this->server_caps)) { + // SMTP extensions are available. Let's try to find a proper authentication method + + if (!array_key_exists('AUTH', $this->server_caps)) { + $this->setError('Authentication is not allowed at this stage'); + // 'at this stage' means that auth may be allowed after the stage changes + // e.g. after STARTTLS + return false; + } + + self::edebug('Auth method requested: ' . ($authtype ? $authtype : 'UNKNOWN'), self::DEBUG_LOWLEVEL); + self::edebug( + 'Auth methods available on the server: ' . implode(',', $this->server_caps['AUTH']), + self::DEBUG_LOWLEVEL + ); + + if (empty($authtype)) { + foreach (array('LOGIN', 'CRAM-MD5', 'NTLM', 'PLAIN', 'XOAUTH2') as $method) { + if (in_array($method, $this->server_caps['AUTH'])) { + $authtype = $method; + break; + } + } + if (empty($authtype)) { + $this->setError('No supported authentication methods found'); + return false; + } + self::edebug('Auth method selected: '.$authtype, self::DEBUG_LOWLEVEL); + } + + if (!in_array($authtype, $this->server_caps['AUTH'])) { + $this->setError("The requested authentication method \"$authtype\" is not supported by the server"); + return false; + } + } elseif (empty($authtype)) { + $authtype = 'LOGIN'; + } + switch ($authtype) { + case 'PLAIN': + // Start authentication + if (!$this->sendCommand('AUTH', 'AUTH PLAIN', 334)) { + return false; + } + // Send encoded username and password + if (!$this->sendCommand( + 'User & Password', + base64_encode("\0" . $username . "\0" . $password), + 235 + ) + ) { + return false; + } + break; + case 'LOGIN': + // Start authentication + if (!$this->sendCommand('AUTH', 'AUTH LOGIN', 334)) { + return false; + } + if (!$this->sendCommand("Username", base64_encode($username), 334)) { + return false; + } + if (!$this->sendCommand("Password", base64_encode($password), 235)) { + return false; + } + break; + case 'CRAM-MD5': + // Start authentication + if (!$this->sendCommand('AUTH CRAM-MD5', 'AUTH CRAM-MD5', 334)) { + return false; + } + // Get the challenge + $challenge = base64_decode(substr($this->last_reply, 4)); + + // Build the response + $response = $username . ' ' . $this->hmac($challenge, $password); + + // send encoded credentials + return $this->sendCommand('Username', base64_encode($response), 235); + default: + $this->setError("Authentication method \"$authtype\" is not supported"); + return false; + } + return true; + } + + /** + * Calculate an MD5 HMAC hash. + * Works like hash_hmac('md5', $data, $key) + * in case that function is not available + * @param string $data The data to hash + * @param string $key The key to hash with + * @access protected + * @return string + */ + protected function hmac($data, $key) + { + if (function_exists('hash_hmac')) { + return hash_hmac('md5', $data, $key); + } + + // The following borrowed from + // http://php.net/manual/en/function.mhash.php#27225 + + // RFC 2104 HMAC implementation for php. + // Creates an md5 HMAC. + // Eliminates the need to install mhash to compute a HMAC + // by Lance Rushing + + $bytelen = 64; // byte length for md5 + if (strlen($key) > $bytelen) { + $key = pack('H*', md5($key)); + } + $key = str_pad($key, $bytelen, chr(0x00)); + $ipad = str_pad('', $bytelen, chr(0x36)); + $opad = str_pad('', $bytelen, chr(0x5c)); + $k_ipad = $key ^ $ipad; + $k_opad = $key ^ $opad; + + return md5($k_opad . pack('H*', md5($k_ipad . $data))); + } + + /** + * Check connection state. + * @access public + * @return boolean True if connected. + */ + public function connected() + { + if (is_resource($this->smtp_conn)) { + $sock_status = stream_get_meta_data($this->smtp_conn); + if ($sock_status['eof']) { + // The socket is valid but we are not connected + $this->edebug( + 'SMTP NOTICE: EOF caught while checking if connected', + self::DEBUG_CLIENT + ); + $this->close(); + return false; + } + return true; // everything looks good + } + return false; + } + + /** + * Close the socket and clean up the state of the class. + * Don't use this function without first trying to use QUIT. + * @see quit() + * @access public + * @return void + */ + public function close() + { + $this->setError(''); + $this->server_caps = null; + $this->helo_rply = null; + if (is_resource($this->smtp_conn)) { + // close the connection and cleanup + fclose($this->smtp_conn); + $this->smtp_conn = null; //Makes for cleaner serialization + $this->edebug('Connection: closed', self::DEBUG_CONNECTION); + } + } + + /** + * Send an SMTP DATA command. + * Issues a data command and sends the msg_data to the server, + * finializing the mail transaction. $msg_data is the message + * that is to be send with the headers. Each header needs to be + * on a single line followed by a with the message headers + * and the message body being separated by and additional . + * Implements rfc 821: DATA + * @param string $msg_data Message data to send + * @access public + * @return boolean + */ + public function data($msg_data) + { + //This will use the standard timelimit + if (!$this->sendCommand('DATA', 'DATA', 354)) { + return false; + } + + /* The server is ready to accept data! + * According to rfc821 we should not send more than 1000 characters on a single line (including the CRLF) + * so we will break the data up into lines by \r and/or \n then if needed we will break each of those into + * smaller lines to fit within the limit. + * We will also look for lines that start with a '.' and prepend an additional '.'. + * NOTE: this does not count towards line-length limit. + */ + + // Normalize line breaks before exploding + $lines = explode("\n", str_replace(array("\r\n", "\r"), "\n", $msg_data)); + + /* To distinguish between a complete RFC822 message and a plain message body, we check if the first field + * of the first line (':' separated) does not contain a space then it _should_ be a header and we will + * process all lines before a blank line as headers. + */ + + $field = substr($lines[0], 0, strpos($lines[0], ':')); + $in_headers = false; + if (!empty($field) && strpos($field, ' ') === false) { + $in_headers = true; + } + + foreach ($lines as $line) { + $lines_out = array(); + if ($in_headers and $line == '') { + $in_headers = false; + } + //Break this line up into several smaller lines if it's too long + //Micro-optimisation: isset($str[$len]) is faster than (strlen($str) > $len), + while (isset($line[self::MAX_LINE_LENGTH])) { + //Working backwards, try to find a space within the last MAX_LINE_LENGTH chars of the line to break on + //so as to avoid breaking in the middle of a word + $pos = strrpos(substr($line, 0, self::MAX_LINE_LENGTH), ' '); + //Deliberately matches both false and 0 + if (!$pos) { + //No nice break found, add a hard break + $pos = self::MAX_LINE_LENGTH - 1; + $lines_out[] = substr($line, 0, $pos); + $line = substr($line, $pos); + } else { + //Break at the found point + $lines_out[] = substr($line, 0, $pos); + //Move along by the amount we dealt with + $line = substr($line, $pos + 1); + } + //If processing headers add a LWSP-char to the front of new line RFC822 section 3.1.1 + if ($in_headers) { + $line = "\t" . $line; + } + } + $lines_out[] = $line; + + //Send the lines to the server + foreach ($lines_out as $line_out) { + //RFC2821 section 4.5.2 + if (!empty($line_out) and $line_out[0] == '.') { + $line_out = '.' . $line_out; + } + $this->client_send($line_out . self::CRLF); + } + } + + //Message data has been sent, complete the command + //Increase timelimit for end of DATA command + $savetimelimit = $this->Timelimit; + $this->Timelimit = $this->Timelimit * 2; + $result = $this->sendCommand('DATA END', '.', 250); + //Restore timelimit + $this->Timelimit = $savetimelimit; + return $result; + } + + /** + * Send an SMTP HELO or EHLO command. + * Used to identify the sending server to the receiving server. + * This makes sure that client and server are in a known state. + * Implements RFC 821: HELO + * and RFC 2821 EHLO. + * @param string $host The host name or IP to connect to + * @access public + * @return boolean + */ + public function hello($host = '') + { + //Try extended hello first (RFC 2821) + return (boolean)($this->sendHello('EHLO', $host) or $this->sendHello('HELO', $host)); + } + + /** + * Send an SMTP HELO or EHLO command. + * Low-level implementation used by hello() + * @see hello() + * @param string $hello The HELO string + * @param string $host The hostname to say we are + * @access protected + * @return boolean + */ + protected function sendHello($hello, $host) + { + $noerror = $this->sendCommand($hello, $hello . ' ' . $host, 250); + $this->helo_rply = $this->last_reply; + if ($noerror) { + $this->parseHelloFields($hello); + } else { + $this->server_caps = null; + } + return $noerror; + } + + /** + * Parse a reply to HELO/EHLO command to discover server extensions. + * In case of HELO, the only parameter that can be discovered is a server name. + * @access protected + * @param string $type - 'HELO' or 'EHLO' + */ + protected function parseHelloFields($type) + { + $this->server_caps = array(); + $lines = explode("\n", $this->last_reply); + + foreach ($lines as $n => $s) { + //First 4 chars contain response code followed by - or space + $s = trim(substr($s, 4)); + if (empty($s)) { + continue; + } + $fields = explode(' ', $s); + if (!empty($fields)) { + if (!$n) { + $name = $type; + $fields = $fields[0]; + } else { + $name = array_shift($fields); + switch ($name) { + case 'SIZE': + $fields = ($fields ? $fields[0] : 0); + break; + case 'AUTH': + if (!is_array($fields)) { + $fields = array(); + } + break; + default: + $fields = true; + } + } + $this->server_caps[$name] = $fields; + } + } + } + + /** + * Send an SMTP MAIL command. + * Starts a mail transaction from the email address specified in + * $from. Returns true if successful or false otherwise. If True + * the mail transaction is started and then one or more recipient + * commands may be called followed by a data command. + * Implements rfc 821: MAIL FROM: + * @param string $from Source address of this message + * @access public + * @return boolean + */ + public function mail($from) + { + $useVerp = ($this->do_verp ? ' XVERP' : ''); + return $this->sendCommand( + 'MAIL FROM', + 'MAIL FROM:<' . $from . '>' . $useVerp, + 250 + ); + } + + /** + * Send an SMTP QUIT command. + * Closes the socket if there is no error or the $close_on_error argument is true. + * Implements from rfc 821: QUIT + * @param boolean $close_on_error Should the connection close if an error occurs? + * @access public + * @return boolean + */ + public function quit($close_on_error = true) + { + $noerror = $this->sendCommand('QUIT', 'QUIT', 221); + $err = $this->error; //Save any error + if ($noerror or $close_on_error) { + $this->close(); + $this->error = $err; //Restore any error from the quit command + } + return $noerror; + } + + /** + * Send an SMTP RCPT command. + * Sets the TO argument to $toaddr. + * Returns true if the recipient was accepted false if it was rejected. + * Implements from rfc 821: RCPT TO: + * @param string $toaddr The address the message is being sent to + * @access public + * @return boolean + */ + public function recipient($toaddr) + { + return $this->sendCommand( + 'RCPT TO', + 'RCPT TO:<' . $toaddr . '>', + array(250, 251) + ); + } + + /** + * Send an SMTP RSET command. + * Abort any transaction that is currently in progress. + * Implements rfc 821: RSET + * @access public + * @return boolean True on success. + */ + public function reset() + { + return $this->sendCommand('RSET', 'RSET', 250); + } + + /** + * Send a command to an SMTP server and check its return code. + * @param string $command The command name - not sent to the server + * @param string $commandstring The actual command to send + * @param integer|array $expect One or more expected integer success codes + * @access protected + * @return boolean True on success. + */ + protected function sendCommand($command, $commandstring, $expect) + { + if (!$this->connected()) { + $this->setError("Called $command without being connected"); + return false; + } + $this->client_send($commandstring . self::CRLF); + + $this->last_reply = $this->get_lines(); + // Fetch SMTP code and possible error code explanation + $matches = array(); + if (preg_match("/^([0-9]{3})[ -](?:([0-9]\\.[0-9]\\.[0-9]) )?/", $this->last_reply, $matches)) { + $code = $matches[1]; + $code_ex = (count($matches) > 2 ? $matches[2] : null); + // Cut off error code from each response line + $detail = preg_replace( + "/{$code}[ -]".($code_ex ? str_replace('.', '\\.', $code_ex).' ' : '')."/m", + '', + $this->last_reply + ); + } else { + // Fall back to simple parsing if regex fails + $code = substr($this->last_reply, 0, 3); + $code_ex = null; + $detail = substr($this->last_reply, 4); + } + + $this->edebug('SERVER -> CLIENT: ' . $this->last_reply, self::DEBUG_SERVER); + + if (!in_array($code, (array)$expect)) { + $this->setError( + "$command command failed", + $detail, + $code, + $code_ex + ); + $this->edebug( + 'SMTP ERROR: ' . $this->error['error'] . ': ' . $this->last_reply, + self::DEBUG_CLIENT + ); + return false; + } + + $this->setError(''); + return true; + } + + /** + * Send an SMTP SAML command. + * Starts a mail transaction from the email address specified in $from. + * Returns true if successful or false otherwise. If True + * the mail transaction is started and then one or more recipient + * commands may be called followed by a data command. This command + * will send the message to the users terminal if they are logged + * in and send them an email. + * Implements rfc 821: SAML FROM: + * @param string $from The address the message is from + * @access public + * @return boolean + */ + public function sendAndMail($from) + { + return $this->sendCommand('SAML', "SAML FROM:$from", 250); + } + + /** + * Send an SMTP VRFY command. + * @param string $name The name to verify + * @access public + * @return boolean + */ + public function verify($name) + { + return $this->sendCommand('VRFY', "VRFY $name", array(250, 251)); + } + + /** + * Send an SMTP NOOP command. + * Used to keep keep-alives alive, doesn't actually do anything + * @access public + * @return boolean + */ + public function noop() + { + return $this->sendCommand('NOOP', 'NOOP', 250); + } + + /** + * Send an SMTP TURN command. + * This is an optional command for SMTP that this class does not support. + * This method is here to make the RFC821 Definition complete for this class + * and _may_ be implemented in future + * Implements from rfc 821: TURN + * @access public + * @return boolean + */ + public function turn() + { + $this->setError('The SMTP TURN command is not implemented'); + $this->edebug('SMTP NOTICE: ' . $this->error['error'], self::DEBUG_CLIENT); + return false; + } + + /** + * Send raw data to the server. + * @param string $data The data to send + * @access public + * @return integer|boolean The number of bytes sent to the server or false on error + */ + public function client_send($data) + { + $this->edebug("CLIENT -> SERVER: $data", self::DEBUG_CLIENT); + return fwrite($this->smtp_conn, $data); + } + + /** + * Get the latest error. + * @access public + * @return array + */ + public function getError() + { + return $this->error; + } + + /** + * Get SMTP extensions available on the server + * @access public + * @return array|null + */ + public function getServerExtList() + { + return $this->server_caps; + } + + /** + * A multipurpose method + * The method works in three ways, dependent on argument value and current state + * 1. HELO/EHLO was not sent - returns null and set up $this->error + * 2. HELO was sent + * $name = 'HELO': returns server name + * $name = 'EHLO': returns boolean false + * $name = any string: returns null and set up $this->error + * 3. EHLO was sent + * $name = 'HELO'|'EHLO': returns server name + * $name = any string: if extension $name exists, returns boolean True + * or its options. Otherwise returns boolean False + * In other words, one can use this method to detect 3 conditions: + * - null returned: handshake was not or we don't know about ext (refer to $this->error) + * - false returned: the requested feature exactly not exists + * - positive value returned: the requested feature exists + * @param string $name Name of SMTP extension or 'HELO'|'EHLO' + * @return mixed + */ + public function getServerExt($name) + { + if (!$this->server_caps) { + $this->setError('No HELO/EHLO was sent'); + return null; + } + + // the tight logic knot ;) + if (!array_key_exists($name, $this->server_caps)) { + if ($name == 'HELO') { + return $this->server_caps['EHLO']; + } + if ($name == 'EHLO' || array_key_exists('EHLO', $this->server_caps)) { + return false; + } + $this->setError('HELO handshake was used. Client knows nothing about server extensions'); + return null; + } + + return $this->server_caps[$name]; + } + + /** + * Get the last reply from the server. + * @access public + * @return string + */ + public function getLastReply() + { + return $this->last_reply; + } + + /** + * Read the SMTP server's response. + * Either before eof or socket timeout occurs on the operation. + * With SMTP we can tell if we have more lines to read if the + * 4th character is '-' symbol. If it is a space then we don't + * need to read anything else. + * @access protected + * @return string + */ + protected function get_lines() + { + // If the connection is bad, give up straight away + if (!is_resource($this->smtp_conn)) { + return ''; + } + $data = ''; + $endtime = 0; + stream_set_timeout($this->smtp_conn, $this->Timeout); + if ($this->Timelimit > 0) { + $endtime = time() + $this->Timelimit; + } + while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) { + $str = @fgets($this->smtp_conn, 515); + $this->edebug("SMTP -> get_lines(): \$data is \"$data\"", self::DEBUG_LOWLEVEL); + $this->edebug("SMTP -> get_lines(): \$str is \"$str\"", self::DEBUG_LOWLEVEL); + $data .= $str; + // If 4th character is a space, we are done reading, break the loop, micro-optimisation over strlen + if ((isset($str[3]) and $str[3] == ' ')) { + break; + } + // Timed-out? Log and break + $info = stream_get_meta_data($this->smtp_conn); + if ($info['timed_out']) { + $this->edebug( + 'SMTP -> get_lines(): timed-out (' . $this->Timeout . ' sec)', + self::DEBUG_LOWLEVEL + ); + break; + } + // Now check if reads took too long + if ($endtime and time() > $endtime) { + $this->edebug( + 'SMTP -> get_lines(): timelimit reached ('. + $this->Timelimit . ' sec)', + self::DEBUG_LOWLEVEL + ); + break; + } + } + return $data; + } + + /** + * Enable or disable VERP address generation. + * @param boolean $enabled + */ + public function setVerp($enabled = false) + { + $this->do_verp = $enabled; + } + + /** + * Get VERP address generation mode. + * @return boolean + */ + public function getVerp() + { + return $this->do_verp; + } + + /** + * Set error messages and codes. + * @param string $message The error message + * @param string $detail Further detail on the error + * @param string $smtp_code An associated SMTP error code + * @param string $smtp_code_ex Extended SMTP code + */ + protected function setError($message, $detail = '', $smtp_code = '', $smtp_code_ex = '') + { + $this->error = array( + 'error' => $message, + 'detail' => $detail, + 'smtp_code' => $smtp_code, + 'smtp_code_ex' => $smtp_code_ex + ); + } + + /** + * Set debug output method. + * @param string|callable $method The name of the mechanism to use for debugging output, or a callable to handle it. + */ + public function setDebugOutput($method = 'echo') + { + $this->Debugoutput = $method; + } + + /** + * Get debug output method. + * @return string + */ + public function getDebugOutput() + { + return $this->Debugoutput; + } + + /** + * Set debug output level. + * @param integer $level + */ + public function setDebugLevel($level = 0) + { + $this->do_debug = $level; + } + + /** + * Get debug output level. + * @return integer + */ + public function getDebugLevel() + { + return $this->do_debug; + } + + /** + * Set SMTP timeout. + * @param integer $timeout + */ + public function setTimeout($timeout = 0) + { + $this->Timeout = $timeout; + } + + /** + * Get SMTP timeout. + * @return integer + */ + public function getTimeout() + { + return $this->Timeout; + } +} diff --git a/zira/request.php b/zira/request.php new file mode 100644 index 0000000..43de635 --- /dev/null +++ b/zira/request.php @@ -0,0 +1,117 @@ +0) { + $part = array_pop($uri_parts); + if ($found || $part == $root_parts[count($root_parts)-1]) { + $_parts []= $part; + $found = true; + } + if ($found) { + array_pop($root_parts); + } + } + + $base_url = '/' . implode('/', array_reverse($_parts)); + + return $base_url; + } + + public static function isBaseRequestUri() { + $uri = '/' . trim($_SERVER['REQUEST_URI'],'/'); + return $uri == self::detectBaseUrl(); + } + + public static function isInstallRequestUri() { + $uri = '/' . trim($_SERVER['REQUEST_URI'],'/'); + return $uri == rtrim(self::detectBaseUrl() ,'/') . '/install'; + } +} diff --git a/zira/response.php b/zira/response.php new file mode 100644 index 0000000..9e1a55d --- /dev/null +++ b/zira/response.php @@ -0,0 +1,122 @@ +$value) { + if ($key == Dash::GET_FRAME_PARAM) continue; + if (!empty($params)) $params .= '&'; + $params .= $key .'='. $value; + } + if (!empty($params)) { + if (strpos($url, '?') === false) $url .= '?'; + else $url .= '&'; + $url .= $params; + } + } + header('Location: '.$url); + exit; + } + + public static function notFound() { + self::$status = self::STATUS_404; + http_response_code(self::$status); + if (View::isInitialized()) { + View::addDefaultAssets(); + View::addThemeAssets(); + if (Config::get('site_window_title') && Config::get('site_title')) { + $suffix = PAGE_TITLE_DELIMITER . Locale::t(Config::get('site_title')); + } else { + $suffix = ''; + } + View::setLayoutData(array(View::VAR_TITLE=>Locale::t('Page not found').$suffix)); + View::render(array('code'=>self::$status,'message'=>Locale::t('Page not found')), 'error', View::LAYOUT_NO_SIDEBARS); + } else { + echo Locale::t('Page not found'); + } + exit; + } + + public static function forbidden() { + self::$status = self::STATUS_403; + http_response_code(self::$status); + if (View::isInitialized()) { + View::addDefaultAssets(); + View::addThemeAssets(); + if (Config::get('site_window_title') && Config::get('site_title')) { + $suffix = PAGE_TITLE_DELIMITER . Locale::t(Config::get('site_title')); + } else { + $suffix = ''; + } + View::setLayoutData(array(View::VAR_TITLE=>Locale::t('Access denied').$suffix)); + View::render(array('code'=>self::$status,'message'=>Locale::t('Access denied')), 'error', View::LAYOUT_NO_SIDEBARS); + } else { + echo Locale::t('Access denied'); + } + exit; + } + + public static function error($message) { + self::$status = self::STATUS_500; + http_response_code(self::$status); + if (View::isInitialized()) { + if (defined('DEBUG') && DEBUG && !View::isRenderStarted()) { + View::addDefaultAssets(); + View::addThemeAssets(); + if (Config::get('site_window_title') && Config::get('site_title')) { + $suffix = PAGE_TITLE_DELIMITER . Locale::t(Config::get('site_title')); + } else { + $suffix = ''; + } + View::setLayoutData(array(View::VAR_TITLE=>Locale::t('An error occurred').$suffix)); + } + View::render(array('code'=>self::$status,'message'=>Locale::t('An error occurred'),'content'=>$message), 'error', View::LAYOUT_NO_SIDEBARS); + } else { + echo $message; + } + exit; + } + + public static function exception(\Exception $e) { + if (defined('DEBUG') && DEBUG) { + $str = Helper::tag('div', $e->getMessage().' in '.$e->getFile().':'.$e->getLine()); + $str .= Helper::tag_open('div'); + $str .= Helper::tag_open('code'); + $str .= nl2br($e->getTraceAsString()); + $str .= Helper::tag_close('code'); + $str .= Helper::tag_close('div'); + } else { + $str = Helper::tag('div', $e->getMessage()); + } + self:: error($str); + } +} \ No newline at end of file diff --git a/zira/router.php b/zira/router.php new file mode 100644 index 0000000..2e643a6 --- /dev/null +++ b/zira/router.php @@ -0,0 +1,215 @@ +1 + && preg_match('/^\/('.implode('|',Config::get('languages')).')(\/.*)$/iu',self::$request,$matches) + ) { + self::$language = $matches[1]; + self::$request = $matches[2]; + } + + self::$request = trim(self::$request,'/'); + + if ($redirect) { + if (self::$language) self::$request = self::$language.'/'.self::$request; + Response::redirect(self::$request, true); + } + + self::$param = ''; + $url_parts = array(); + if (preg_match('/^([a-z\/]+)\/(.*)/',self::$request.'/',$matches)) { + $url_parts = explode('/',$matches[1]); + $rewrite = ''; + $rewrite_match = ''; + if (array_key_exists($matches[1],self::$_map)) { + $rewrite_match = $matches[1]; + $rewrite = self::$_map[$matches[1]]; + } else { + $variants = array(); + if (count($url_parts) == 2) { + $variants[]='*/'.$url_parts[1]; + $variants[]=$url_parts[0].'/*'; + } else if (count($url_parts) == 3) { + $variants[]='*/'.$url_parts[1]; + $variants[]=$url_parts[0].'/*'; + $variants[]='*/*/'.$url_parts[2]; + $variants[]='*/'.$url_parts[1].'/*'; + $variants[]=$url_parts[0].'/*/*'; + $variants[]='*/'.$url_parts[1].'/'.$url_parts[2]; + $variants[]=$url_parts[0].'/*/'.$url_parts[2]; + $variants[]=$url_parts[0].'/'.$url_parts[1].'/*'; + } + + foreach($variants as $variant) { + if (array_key_exists($variant, self::$_map)) { + $rewrite = self::$_map[$variant]; + $rewrite_match = $variant; + break; + } + } + } + if (!empty($rewrite)) { + for ($i=0; $i<3; $i++) { + if (strpos($rewrite, '$'.($i+1))!==false) { + if (isset($url_parts[$i])) { + $rewrite = str_replace('$'.($i+1), $url_parts[$i], $rewrite); + } else { + if ($i==0) $part = DEFAULT_MODULE; + else if ($i==1) $part = DEFAULT_CONTROLLER; + else $part = DEFAULT_ACTION; + $rewrite = str_replace('$'.($i+1), $part, $rewrite); + } + } + } + $_url_parts = explode('/', $rewrite); + if (!empty($rewrite_match)) { + $_match_parts = explode('/', $rewrite_match); + if (count($_match_parts) < count($url_parts)) { + $_add_params = array_slice($url_parts, count($_match_parts)); + $_url_parts = array_merge($_url_parts, $_add_params); + } + } + $url_parts = $_url_parts; + } + self::$param = trim($matches[2],'/'); + } else { + self::$param = self::$request; + } + + if (count($url_parts)==0) { + self::$module = DEFAULT_MODULE; + self::$controller = DEFAULT_CONTROLLER; + self::$action = DEFAULT_ACTION; + } else if (count($url_parts)==1) { + self::$module = $url_parts[0]; + self::$controller = DEFAULT_CONTROLLER; + self::$action = DEFAULT_ACTION; + } else if (count($url_parts)==2) { + self::$module = $url_parts[0]; + self::$controller = $url_parts[1]; + self::$action = DEFAULT_ACTION; + } else { + self::$module = array_shift($url_parts); + self::$controller = array_shift($url_parts); + self::$action = array_shift($url_parts); + + if (count($url_parts)>0) { + $_param = implode('/',$url_parts); + if (!empty(self::$param)) $_param .= '/'; + self::$param = $_param . self::$param; + } + } + + if (!self::$language && count(Config::get('languages'))>1 && + !empty(self::$request) && + self::$request!='cron' && + self::$request!='sitemap.xml' && + self::$module!='dash' + ) { + self::$language = Config::get('language'); + Response::redirect(self::$language.'/'.self::$request, true); + } else if (self::$language && self::$language==Config::get('language') && empty(self::$request)) { + Response::redirect(self::$request, true); + } + } +} \ No newline at end of file diff --git a/zira/session.php b/zira/session.php new file mode 100644 index 0000000..144095e --- /dev/null +++ b/zira/session.php @@ -0,0 +1,43 @@ +id) return false; + if (!self::isAuthorized()) return false; + return (self::$_current->id == $user->id); + } + + public static function generatePasswordHash($password) { + return password_hash($password, PASSWORD_DEFAULT); + } + + public static function verifyPassword($password, $hash) { + return password_verify($password, $hash); + } + + public static function generateEmailConfirmationCode() { + return Zira::randomSecureString(16); + } + + public static function getHashedConfirmationCode($code) { + return self::generatePasswordHash($code); + } + + public static function verifyConfirmationCode($code, $hash) { + return self::verifyPassword($code, $hash); + } + + public static function generatePasswordRecoveryCode() { + return Zira::randomSecureString(24); + } + + public static function getHashedPasswordRecoveryCode($code) { + return self::generatePasswordHash($code); + } + + public static function verifyPasswordRecoveryCode($code, $hash) { + return self::verifyPassword($code, $hash); + } + + public static function generateRememberCode($login,$email) { + do { + $random = Zira::randomSecureString(16); + $code = md5($random.$login.$email); + $co = Models\User::getCollection() + ->count() + ->where('code','=',$code) + ->get('co'); + } while($co>0); + + return $code; + } + + public static function generateUserToken() { + return Zira::randomSecureString(32); + } + + public static function getHashedUserToken($code) { + return self::generatePasswordHash($code); + } + + public static function verifyUserToken($token, $hash) { + return password_verify($token, $hash); + } + + public static function isVerificationCodeCorrect($login_or_email, $code) { + if (empty($code)) return false; + $user = Models\User::findAuthUser($login_or_email); + if (!$user) return false; + $hash = $user->vcode; + if (empty($hash)) return false; + if ($user->verified == \Zira\Models\User::STATUS_VERIFIED) return false; + if (self::verifyConfirmationCode($code, $hash)) { + self::setCurrent($user); + return true; + } else { + return false; + } + } + + public static function isRecoveryCodeCorrect($login_or_email, $code) { + if (empty($code)) return false; + $user = Models\User::findAuthUser($login_or_email); + if (!$user) return false; + $hash = $user->vcode; + if (empty($hash)) return false; + if ($user->verified != \Zira\Models\User::STATUS_VERIFIED) return false; + if (self::verifyPasswordRecoveryCode($code, $hash)) { + self::setCurrent($user); + return true; + } else { + return false; + } + } + + public static function getDefaultConfirmMessage() { + $message = Locale::t('Hello %s !', '$user')."\r\n\r\n"; + $message .= Locale::t('Please confirm your Email address.')."\r\n"; + $message .= Locale::t('Your verification code: %s', '$code')."\r\n"; + $message .= Locale::t('Enter code on the following page %s','$url')."\r\n\r\n"; + $message .= Locale::t('You recieved this message, because your Email address was specified during registration process on %s','$site'); + return $message; + } + + public static function sendConfirmEmail($email, $login, $code) { + $message = Config::get(self::CONFIG_CONFIRMATION_MESSAGE); + if (!$message || strlen(trim($message))==0) { + $message = self::getDefaultConfirmMessage(); + } else { + $message = Locale::t($message); + } + $message = str_replace('$user', $login, $message); + $message = str_replace('$code', $code, $message); + $message = str_replace('$url', Helper::url('user/confirm', true, true), $message); + $message = str_replace('$site', Helper::url('/',true, true), $message); + + Mail::send($email, Locale::t('Email confirmation'), Helper::html($message)); + } + + public static function getDefaultRecoveryMessage() { + $message = Locale::t('Hello %s !', '$user')."\r\n\r\n"; + $message .= Locale::t('We recieved password recovery request for your account.')."\r\n"; + $message .= Locale::t('Your verification code: %s', '$code')."\r\n"; + $message .= Locale::t('Enter code on the following page %s','$url')."\r\n\r\n"; + $message .= Locale::t('You recieved this message, because your Email address or login was specified during password recovery process on %s. If it was not you, ignore this message','$site'); + return $message; + } + + public static function sendRecoverEmail($email, $login, $code) { + $message = Config::get(self::CONFIG_RECOVERY_MESSAGE); + if (!$message || strlen(trim($message))==0) { + $message = self::getDefaultRecoveryMessage(); + } else { + $message = Locale::t($message); + } + $message = str_replace('$user', $login, $message); + $message = str_replace('$code', $code, $message); + $message = str_replace('$url', Helper::url('user/password', true, true), $message); + $message = str_replace('$site', Helper::url('/',true, true), $message); + + Mail::send($email, Locale::t('Password recovery'), Helper::html($message)); + } + + public static function getDefaultPasswordMessage() { + $message = Locale::t('Hello %s !', '$user')."\r\n\r\n"; + $message .= Locale::t('Your new password: %s', '$code')."\r\n"; + $message .= Locale::t('You can now sign in on the following page %s','$url')."\r\n\r\n"; + $message .= Locale::t('You recieved this message, because your Email address or login was specified during password recovery process on %s','$site'); + return $message; + } + + public static function sendPasswordEmail($email, $login, $password) { + $message = Config::get(self::CONFIG_PASSWORD_MESSAGE); + if (!$message || strlen(trim($message))==0) { + $message = self::getDefaultPasswordMessage(); + } else { + $message = Locale::t($message); + } + $message = str_replace('$user', $login, $message); + $message = str_replace('$code', $password, $message); + $message = str_replace('$url', Helper::url('user/login', true, true), $message); + $message = str_replace('$site', Helper::url('/',true, true), $message); + + Mail::send($email, Locale::t('Your new password'), Helper::html($message)); + } + + public static function isPasswordCorrect($login, $password) { + if (empty($login) || empty($password)) return false; + $user = Models\User::findAuthUser($login); + if (!$user) return false; + if (!$user->username || !$user->password) return false; + if (self::verifyPassword($password, $user->password)) { + self::setCurrent($user); + return true; + } else { + return false; + } + } + + public static function isAllowedToLogin() { + $user = self::getCurrent(); + if (!$user) return false; + if (!Config::get(self::CONFIG_VERIFY_EMAIL, true)) return true; + return $user->verified == Models\User::STATUS_VERIFIED; + } + + public static function rememberConfirmEmail($email) { + Session::set(self::SESSION_CONFIRM_EMAIL, $email); + } + + public static function getRememberedConfirmEmail() { + return Session::get(self::SESSION_CONFIRM_EMAIL); + } + + public static function rememberAuthorizedUserId($user_id) { + Session::set(self::SESSION_AUTHORIZED_USER_ID, $user_id); + $ua = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''; + Session::set(self::SESSION_UA, $ua); + } + + public static function forgetAuthorizedUserId() { + Session::remove(self::SESSION_AUTHORIZED_USER_ID); + Session::remove(self::SESSION_UA); + self::unsetUserPasswordChecked(); + } + + public static function load() { + User::initAnonymousUser(); + $user_id = intval(Session::get(self::SESSION_AUTHORIZED_USER_ID)); + if (!$user_id) { + $user_id = self::loadRememberedUser(); + if (!$user_id) return; + } else { + $ua = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''; + if (Config::get(self::CONFIG_CHECK_UA, true) && Session::get(self::SESSION_UA) != $ua) { + self::forgetAuthorizedUserId(); + return; + } + } + $user = self::getCurrent(); + if (!$user || !($user instanceof Models\User)) { + $user = new Models\User($user_id); + if (!$user->loaded()) $user = null; + } + if (!$user || !$user->active) { + self::forgetAuthorizedUserId(); + self::forgetUser(); + if ($user) { + $user->token = ''; + $user->save(); + } + return; + } + self::setCurrent($user); + } + + public static function isAuthorized() { + $user = self::getCurrent(); + if (!$user) return false; + if (!($user instanceof Models\User)) return false; + return true; + } + + public static function isVerified() { + if (!self::isAuthorized()) return false; + return self::$_current->verified == Models\User::STATUS_VERIFIED; + } + + public static function onUserLogin($remember = false) { + Session::regenerate(); + $user = self::getCurrent(); + if (!$user) return; + if (!($user instanceof Models\User)) { + $user = new Models\User($user->id); + if (!$user) return; + } + $user->date_logged = date('Y-m-d H:i:s'); + if ($remember) { + $token = self::generateUserToken(); + $ua=isset($_SERVER['HTTP_USER_AGENT']) && Config::get(self::CONFIG_CHECK_UA, true) ? $_SERVER['HTTP_USER_AGENT'] : ''; + $user->token = self::getHashedUserToken($token.$ua); + self::rememberUser($user->code, $token); + } else { + $user->token = ''; + } + $user->save(); + self::setCurrent($user); + self::rememberAuthorizedUserId($user->id); + } + + public static function onUserLogout() { + self::clearToken(); + Dash::clearToken(); + Session::regenerate(); + } + + public static function rememberUser($code, $token) { + Cookie::set(self::COOKIE_REMEMBER_ME, $code.';'.$token, self::REMEMBER_ME_LIFETIME); + } + + public static function forgetUser() { + Cookie::remove(self::COOKIE_REMEMBER_ME); + } + + public static function loadRememberedUser() { + $cookie = Cookie::get(self::COOKIE_REMEMBER_ME); + if (empty($cookie)) return null; + $data = explode(';',$cookie); + if (count($data)!=2 || empty($data[0]) || empty($data[1])) { + self::forgetUser(); + return null; + } + $user = Models\User::getCollection() + ->select(Models\User::getFields()) + ->join(Models\Group::getClass(), array('group_name'=>'name')) + ->where('code','=',$data[0]) + ->and_where('active','=',Models\User::STATUS_ACTIVE) + ->and_where('active','=',Models\Group::STATUS_ACTIVE, Models\Group::getAlias()) + ->get(0); + if (!$user || !$user->token) { + self::forgetUser(); + return null; + } + if (Config::get(self::CONFIG_VERIFY_EMAIL, true) && $user->verified != Models\User::STATUS_VERIFIED) { + self::forgetUser(); + return null; + } + $ua=isset($_SERVER['HTTP_USER_AGENT']) && Config::get(self::CONFIG_CHECK_UA, true) ? $_SERVER['HTTP_USER_AGENT'] : ''; + if (!self::verifyUserToken($data[1].$ua, $user->token)) { + $user = new Models\User($user->id); + if ($user) { + $user->token = ''; + $user->save(); + } + self::forgetUser(); + return null; + } + $user = new Models\User($user->id); + if (!$user) { + return null; + } else { + self::setCurrent($user); + self::onUserLogin(true); + return $user->id; + } + } + + public static function setUserPasswordChecked() { + Session::set(self::SESSION_PASSWORD_CHECKED, 1); + } + + public static function unsetUserPasswordChecked() { + Session::remove(self::SESSION_PASSWORD_CHECKED); + } + + public static function isUserPasswordChecked() { + return (bool)Session::get(self::SESSION_PASSWORD_CHECKED); + } + + public static function generateUserPhotoName($user_id) { + $random = Zira::randomSecureString(16); + return md5($random.$user_id); + } + + public static function generateAnonymousId() { + $ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : ''; + $ua = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''; + return self::getToken().md5($ip.microtime().$ua); + } + + public static function getAnonymousUserId() { + $anonymous_id = Cookie::get(self::COOKIE_ANONYMOUS_USER); + if (empty($anonymous_id)) { + $anonymous_id = self::generateAnonymousId(); + } + return $anonymous_id; + } + + public static function initAnonymousUser() { + $anonymous_id = self::getAnonymousUserId(); + Cookie::set(self::COOKIE_ANONYMOUS_USER, $anonymous_id, self::REMEMBER_ANONYMOUS_ID); + } + + protected static function generateToken() { + return Zira::randomSecureString(8); + } + + public static function getToken() { + $exist = Session::get(self::SESSION_TOKEN); + if ($exist) return $exist; + + $token = self::generateToken(); + Session::set(self::SESSION_TOKEN,$token); + + return $token; + } + + public static function checkToken($token) { + if (!$token) return false; + $exist = Session::get(self::SESSION_TOKEN); + if (!$exist) return false; + + return ($token == $exist); + } + + public static function clearToken() { + Session::remove(self::SESSION_TOKEN); + } + + public static function getUserPhotoFilename($image) { + return $image.'.'.self::PHOTO_EXT; + } + + public static function getUserThumbFilename($image) { + return $image.'.thumb.'.self::PHOTO_EXT; + } + + public static function deletePhoto($user) { + if (!$user->image) return; + $name = self::getUserPhotoFilename($user->image); + $thumb_name = self::getUserThumbFilename($user->image); + + $dir = ROOT_DIR . DIRECTORY_SEPARATOR . UPLOADS_DIR . DIRECTORY_SEPARATOR . USERS_DIR . DIRECTORY_SEPARATOR; + if (file_exists($dir.$name)) unlink($dir.$name); + if (file_exists($dir.$thumb_name)) unlink($dir.$thumb_name); + } + + public static function savePhoto($user, array $file) { + if ($user->image) self::deletePhoto($user); + $save_path = USERS_DIR; + $max_width = Config::get('user_photo_max_width'); + $max_height = Config::get('user_photo_max_height'); + $thumb_width = Config::get('user_thumb_width'); + $thumb_height = Config::get('user_thumb_height'); + do { + $image = self::generateUserPhotoName($user->id); + $name = self::getUserPhotoFilename($image); + $thumb_name = self::getUserThumbFilename($image); + } while(file_exists(File::getAbsolutePath($save_path). DIRECTORY_SEPARATOR . $name) || file_exists(File::getAbsolutePath($save_path). DIRECTORY_SEPARATOR . $thumb_name)); + $files = File::save($file, $save_path); + if (!$files) return false; + foreach($files as $path=>$_name) { + $size = @getimagesize($path); + if ($size[0]>$size[1]) { + if ($size[0]<$max_width) $max_width = $size[0]; + if (!Image::resize($path, File::getAbsolutePath($save_path). DIRECTORY_SEPARATOR . $name, $max_width, null, self::PHOTO_EXT)) return false; + } else if ($size[0]<=$size[1]) { + if ($size[1]<$max_height) $max_height = $size[1]; + if (!Image::resize($path, File::getAbsolutePath($save_path). DIRECTORY_SEPARATOR . $name, null, $max_height, self::PHOTO_EXT)) return false; + } + if (!Image::createThumb($path, File::getAbsolutePath($save_path). DIRECTORY_SEPARATOR . $thumb_name, $thumb_width, $thumb_height, self::PHOTO_EXT)) return false; + unlink($path); + } + return $image; + } + + public static function saveAvatar($user, $width_percent, $height_percent, $left_percent, $top_percent) { + if (!$user->image) return false; + $thumb_width = Config::get('user_thumb_width'); + $thumb_height = Config::get('user_thumb_height'); + $name = self::getUserPhotoFilename($user->image); + $thumb_name = self::getUserThumbFilename($user->image); + $save_path = USERS_DIR; + if (!Image::crop(File::getAbsolutePath($save_path). DIRECTORY_SEPARATOR . $name, File::getAbsolutePath($save_path). DIRECTORY_SEPARATOR . $thumb_name, $width_percent, $height_percent, $left_percent, $top_percent, self::PHOTO_EXT)) return false; + if (!Image::resize(File::getAbsolutePath($save_path). DIRECTORY_SEPARATOR . $thumb_name, File::getAbsolutePath($save_path). DIRECTORY_SEPARATOR . $thumb_name, $thumb_width, $thumb_height, self::PHOTO_EXT)) return false; + do { + $image = self::generateUserPhotoName($user->id); + $new_name = self::getUserPhotoFilename($image); + $new_thumb_name = self::getUserThumbFilename($image); + } while(file_exists(File::getAbsolutePath($save_path). DIRECTORY_SEPARATOR . $new_name) || file_exists(File::getAbsolutePath($save_path). DIRECTORY_SEPARATOR . $new_thumb_name)); + if ( + !rename(File::getAbsolutePath($save_path). DIRECTORY_SEPARATOR . $thumb_name, File::getAbsolutePath($save_path). DIRECTORY_SEPARATOR . $new_thumb_name) || + !rename(File::getAbsolutePath($save_path). DIRECTORY_SEPARATOR . $name, File::getAbsolutePath($save_path). DIRECTORY_SEPARATOR . $new_name) + ) return false; + return $image; + } + + public static function isProfileVerified($user=null) { + if($user===null) $user = self::getCurrent(); + if (!$user) return false; + return $user->verified == Models\User::STATUS_VERIFIED; + } + + public static function getProfileName($user=null) { + if($user===null) $user = self::getCurrent(); + if (!$user) return ''; + $name = trim($user->firstname.' '.$user->secondname); + if (!empty($name)) return $name; + return $user->username; + } + + public static function getProfileLocation($user=null, $default = null) { + if ($default === null) $default = Locale::t('not specified'); + if($user===null) $user = self::getCurrent(); + if (!$user) return ''; + $country = trim($user->country); + $city = trim($user->city); + $address = trim($user->address); + $loc = array(); + if (!empty($country)) $loc []= $country; + if (!empty($city)) $loc []= $city; + if (!empty($address)) $loc []= $address; + $loc = implode(', ',$loc); + if (empty($loc)) $loc = $default; + return $loc; + } + + public static function getProfileDob($user=null, $default = null) { + if ($default === null) $default = Locale::t('not specified'); + if($user===null) $user = self::getCurrent(); + if (!$user) return ''; + $dob = $user->dob; + if (!empty($dob)) return date(Config::get('date_format'), strtotime($dob)); + return $default; + } + + public static function getProfileSignupDate($user=null) { + if($user===null) $user = self::getCurrent(); + if (!$user) return ''; + return date(Config::get('date_format'), strtotime($user->date_created)); + } + + public static function getProfileLoginDate($user=null) { + if($user===null) $user = self::getCurrent(); + if (!$user) return ''; + return date(Config::get('date_format'), strtotime($user->date_logged)); + } + + public static function getProfileGroup($user=null, $default = null) { + if ($default === null) $default = Locale::t('unknown'); + if($user===null) $user = self::getCurrent(); + if (!$user) return $default; + $groups = Models\Group::getArray(); + if (!array_key_exists($user->group_id, $groups)) return $default; + return $groups[$user->group_id]; + } + + public static function getProfileNoPhotoUrl() { + return Helper::imgUrl(self::USER_NOPHOTO); + } + + public static function getProfilePhoto($user=null, $default = '') { + if($user===null) $user = self::getCurrent(); + if (!$user || !$user->image) return $default; + + $name = self::getUserPhotoFilename($user->image); + + return Helper::baseUrl(UPLOADS_DIR . '/' . USERS_DIR . '/' . $name); + } + + public static function getProfilePhotoThumb($user=null, $default = '') { + if($user===null) $user = self::getCurrent(); + if (!$user || !$user->image) return $default; + + $name = self::getUserThumbFilename($user->image); + + return Helper::baseUrl(UPLOADS_DIR . '/' . USERS_DIR . '/' . $name); + } + + public static function getProfileEmail($user=null, $default = '') { + if($user===null) $user = self::getCurrent(); + if (!$user) return $default; + if (!self::isSelf($user)) return $default; + return $user->email; + } + + public static function getProfilePhone($user=null, $default = '') { + if($user===null) $user = self::getCurrent(); + if (!$user || !$user->phone) return $default; + if (!self::isSelf($user)) return $default; + return $user->phone; + } + + public static function getProfileUrlPath($user=null) { + if($user===null) $user = self::getCurrent(); + if (!$user) return ''; + return 'user/'.$user->id; + } + + public static function getProfileUrl($user=null) { + if($user===null) $user = self::getCurrent(); + if (!$user) return ''; + return Helper::url('user/'.$user->id); + } + + public static function getProfileComments($user=null) { + if($user===null) $user = self::getCurrent(); + if (!$user) return ''; + return (int)$user->comments; + } + + public static function getDefaultGroupsArray() { + return array( + self::GROUP_SUPERADMIN, + self::GROUP_ADMIN, + self::GROUP_USER + ); + } + + public static function generateUserProfileLink($id, $firstname, $secondname, $username, $rel = null, $icon_class = '') { + $name = $firstname && $secondname ? trim($firstname . ' ' . $secondname) : $username; + $attr = array('href'=>Helper::url('user/'.$id)); + if ($rel !== null) $attr['rel'] = $rel; + if (empty($icon_class)) return Helper::tag('a', $name, $attr); + else { + $html = Helper::tag_open('a', $attr); + $html .= Helper::tag('span', null, array('class'=>$icon_class)).' '; + $html .= Helper::html($name); + $html .= Helper::tag_close('a'); + return $html; + } + } + + public static function generateUserProfileThumb($image, $default = null, array $attributes = array()) { + $url = Helper::imgUrl('nophoto.jpg'); + if (!$image && $default!==null) $url = $default; + else if ($image) { + $name = self::getUserThumbFilename($image); + $url = Helper::baseUrl(UPLOADS_DIR . '/' . USERS_DIR . '/' . $name); + } + $attributes['src'] = $url; + $attributes['width'] = Config::get('user_thumb_width'); + $attributes['height'] = Config::get('user_thumb_height'); + return Helper::tag_short('img', $attributes); + } + + public static function generateUserProfileThumbLink($id, $firstname, $secondname, $username, $rel = null, $image, $default_image = null, array $attributes = array()) { + $name = $firstname && $secondname ? trim($firstname . ' ' . $secondname) : $username; + $attr = array('href'=>Helper::url('user/'.$id),'title'=>$name); + if ($rel !== null) $attr['rel'] = $rel; + $html = Helper::tag_open('a', $attr); + $html .= self::generateUserProfileThumb($image, $default_image, $attributes); + $html .= Helper::tag_close('a'); + return $html; + } + + public static function getProfileEditLinks() { + $user = self::getCurrent(); + if (!$user) return array(); + $links = array(); + $links []= array( + 'url' => 'user/messages', + 'icon' => 'glyphicon glyphicon-envelope', + 'title' => Locale::t('Messages') + ); + $links []= array( + 'type' => 'separator' + ); + $links []= array( + 'url' => 'user/photo', + 'icon' => 'glyphicon glyphicon-picture', + 'title' => Locale::t('Edit photo') + ); + if ($user->image) { + $links [] = array( + 'url' => 'user/avatar', + 'icon' => 'glyphicon glyphicon-scissors', + 'title' => Locale::t('Edit avatar') + ); + $links []= array( + 'url' => 'user/nophoto', + 'icon' => 'glyphicon glyphicon-ban-circle', + 'title' => Locale::t('Delete photo') + ); + } + $links []= array( + 'type' => 'separator' + ); + $links []= array( + 'url' => 'user/edit', + 'icon' => 'glyphicon glyphicon-list-alt', + 'title' => Locale::t('Edit profile') + ); + $links []= array( + 'url' => 'user/email', + 'icon' => 'glyphicon glyphicon-envelope', + 'title' => Locale::t('Edit email') + ); + if (Config::get(self::CONFIG_ALLOW_LOGIN_CHANGE, true)) { + $links [] = array( + 'url' => 'user/name', + 'icon' => 'glyphicon glyphicon-user', + 'title' => Locale::t('Edit username') + ); + } + $links []= array( + 'url' => 'user/pwd', + 'icon' => 'glyphicon glyphicon-lock', + 'title' => Locale::t('Edit password') + ); + $extra_links = Hook::run(self::PROFILE_LINKS_HOOK); + if (!empty($extra_links)) { + $links = array_merge($links, $extra_links); + } + return $links; + } + + public static function getProfileExtraInfo() { + return Hook::run(self::PROFILE_INFO_HOOK); + } + + public static function increaseMessagesCount($user = null) { + if($user===null) $user = self::getCurrent(); + if (!$user) return ''; + $user->messages++; + $user->save(); + } + + public static function decreaseMessagesCount($user = null) { + if($user===null) $user = self::getCurrent(); + if (!$user) return ''; + $user->messages--; + if ($user->messages<0) $user->messages=0; + $user->save(); + } + + public static function increaseCommentsCount($user = null) { + if($user===null) $user = self::getCurrent(); + if (!$user) return ''; + $user->comments++; + $user->save(); + } + + public static function decreaseCommentsCount($user = null) { + if($user===null) $user = self::getCurrent(); + if (!$user) return ''; + $user->comments--; + if ($user->comments<0) $user->comments=0; + $user->save(); + } + + public static function increasePostsCount($user = null) { + if($user===null) $user = self::getCurrent(); + if (!$user) return ''; + $user->posts++; + $user->save(); + } + + public static function decreasePostsCount($user = null) { + if($user===null) $user = self::getCurrent(); + if (!$user) return ''; + $user->posts--; + if ($user->posts<0) $user->posts=0; + $user->save(); + } + + public static function isUserBlocked($user_id, $return_found_row = false) { + if (!self::isAuthorized()) return false; + + $row=Models\Blacklist::getCollection() + ->where('user_id','=',self::getCurrent()->id) + ->and_where('blocked_user_id','=',$user_id) + ->get(0); + + if (!$row) return false; + if (!$return_found_row) return true; + else return $row; + } + + public static function isCurrentBlocked($user_id, $return_found_row = false) { + if (!self::isAuthorized()) return false; + + $row=Models\Blacklist::getCollection() + ->where('user_id','=',$user_id) + ->and_where('blocked_user_id','=',self::getCurrent()->id) + ->get(0); + + if (!$row) return false; + if (!$return_found_row) return true; + else return $row; + } +} \ No newline at end of file diff --git a/zira/view.php b/zira/view.php new file mode 100644 index 0000000..62238a3 --- /dev/null +++ b/zira/view.php @@ -0,0 +1,824 @@ +$v) { + $html .= Helper::html($k) . '="' . Helper::html($v) . '" '; + } + $html .= '/>'; + + self::addHTML($html,self::VAR_META); + } + + public static function addStyle($url, $theme = false, array $attributes = null) { + if (Assets::isActive() && Assets::isMergedCSS($url)) return; + if (!$attributes) $attributes = array(); + if (!isset($attributes['rel'])) $attributes['rel'] = 'stylesheet'; + if (!isset($attributes['type'])) $attributes['type'] = 'text/css'; + if (!$theme) { + $attributes['href'] = Helper::cssUrl($url); + } else { + $attributes['href'] = Helper::cssThemeUrl($url); + } + self::addHTML(Helper::tag_short('link', $attributes),self::VAR_STYLES); + } + + public static function addThemeStyle($url, array $attributes = null) { + self::addStyle($url, true, $attributes); + } + + public static function addScript($url, $theme = false, array $attributes = null) { + if (Assets::isActive() && Assets::isMergedJS($url)) return; + if (!$attributes) $attributes = array(); + if (!$theme) { + $attributes['src'] = Helper::jsUrl($url); + } else { + $attributes['src'] = Helper::jsThemeUrl($url); + } + self::addHTML(Helper::tag('script', null, $attributes),self::VAR_SCRIPTS); + } + + public static function addThemeScript($url, array $attributes = null) { + self::addScript($url, true, $attributes); + } + + public static function addHTML($html,$var) { + if (!isset(self::$_layout_data[$var])) self::$_layout_data[$var] = $html . "\r\n"; + else self::$_layout_data[$var] .= $html . "\r\n"; + } + + public static function isRenderStarted() { + return self::$_render_started; + } + + public static function setKeywordsAdded($value) { + self::$_keywords_added = (bool)$value; + } + + public static function setDescriptionAdded($value) { + self::$_description_added = (bool)$value; + } + + public static function render(array $data, $view=null, $layout=null) { + require_once(ROOT_DIR . DIRECTORY_SEPARATOR . 'zira' . DIRECTORY_SEPARATOR . 'tpl.php'); + + if (!$view) { + $view = Router::getModule() . DIRECTORY_SEPARATOR . + Router::getController() . DIRECTORY_SEPARATOR . + Router::getAction(); + } else { + $view = str_replace('/', DIRECTORY_SEPARATOR, $view); + } + + $view_file = ROOT_DIR . DIRECTORY_SEPARATOR . + THEMES_DIR . DIRECTORY_SEPARATOR . + self::$_theme . DIRECTORY_SEPARATOR . + $view . '.php'; + + if (self::$_theme!=DEFAULT_THEME && !file_exists($view_file)) { + $view_file = ROOT_DIR . DIRECTORY_SEPARATOR . + THEMES_DIR . DIRECTORY_SEPARATOR . + DEFAULT_THEME . DIRECTORY_SEPARATOR . + $view . '.php'; + } + + if (self::$_render_layout && !self::$_render_started) { + if (!$layout) { + $layout = Config::get('layout'); + } + + $layout = str_replace('/', DIRECTORY_SEPARATOR, $layout); + + $layout_file = ROOT_DIR . DIRECTORY_SEPARATOR . + THEMES_DIR . DIRECTORY_SEPARATOR . + self::$_theme . DIRECTORY_SEPARATOR . + $layout . '.php'; + + $default_layouts = self::getDefaultLayouts(); + if (!file_exists($layout_file) && !array_key_exists($layout, $default_layouts)) { + $layout_file = ROOT_DIR . DIRECTORY_SEPARATOR . + THEMES_DIR . DIRECTORY_SEPARATOR . + self::$_theme . DIRECTORY_SEPARATOR . + self::LAYOUT_ALL_SIDEBARS . '.php'; + } + + if (self::$_theme!=DEFAULT_THEME && !file_exists($layout_file)) { + $layout_file = ROOT_DIR . DIRECTORY_SEPARATOR . + THEMES_DIR . DIRECTORY_SEPARATOR . + DEFAULT_THEME . DIRECTORY_SEPARATOR . + $layout . '.php'; + } + + self::renderLayout($data, $view_file, $layout_file); + + if (defined('DEBUG') && DEBUG && defined('START_TIME')) { + echo "\r\n".''; + echo "\r\n".''; + if (defined('START_TIME')) { + echo "\r\n".''; + } + echo "\r\n".''; + } + } else { + self::renderContent($data, $view_file); + } + } + + public static function renderView(array $data, $view) { + require_once(ROOT_DIR . DIRECTORY_SEPARATOR . 'zira' . DIRECTORY_SEPARATOR . 'tpl.php'); + + $view = str_replace('/', DIRECTORY_SEPARATOR, $view); + + $view_file = ROOT_DIR . DIRECTORY_SEPARATOR . + THEMES_DIR . DIRECTORY_SEPARATOR . + self::$_theme . DIRECTORY_SEPARATOR . + $view . '.php'; + + if (self::$_theme!=DEFAULT_THEME && !file_exists($view_file)) { + $view_file = ROOT_DIR . DIRECTORY_SEPARATOR . + THEMES_DIR . DIRECTORY_SEPARATOR . + DEFAULT_THEME . DIRECTORY_SEPARATOR . + $view . '.php'; + } + + self::renderContent($data, $view_file); + } + + public static function isViewExists($view=null) { + if (!$view) { + $view = Router::getModule() . DIRECTORY_SEPARATOR . + Router::getController() . DIRECTORY_SEPARATOR . + Router::getAction(); + } else { + $view = str_replace('/', DIRECTORY_SEPARATOR, $view); + } + + $view_file = ROOT_DIR . DIRECTORY_SEPARATOR . + THEMES_DIR . DIRECTORY_SEPARATOR . + self::$_theme . DIRECTORY_SEPARATOR . + $view . '.php'; + + return file_exists($view_file); + } + + public static function renderContent(array $data, $view_file) { + self::$_render_started = true; + extract($data); + include($view_file); + echo "\r\n"; + } + + public static function renderLayout($data, $view_file, $layout_file) { + require_once(ROOT_DIR . DIRECTORY_SEPARATOR . 'zira' . DIRECTORY_SEPARATOR . 'tpl.php'); + + self::$_content_data = $data; + self::$_content_view = $view_file; + + if (self::$_render_js_strings) { + if (!isset(self::$_layout_data[self::VAR_HEAD_BOTTOM])) self::$_layout_data[self::VAR_HEAD_BOTTOM] = ''; + self::$_layout_data[self::VAR_HEAD_BOTTOM] .= Helper::tag_open('script', array('type'=>'text/javascript')); + self::$_layout_data[self::VAR_HEAD_BOTTOM] .= 'var zira_strings = { '; + $co = 0; + foreach(self::$_js_strings as $string => $translate) { + if ($co>0) self::$_layout_data[self::VAR_HEAD_BOTTOM] .= ', '; + self::$_layout_data[self::VAR_HEAD_BOTTOM] .= "'".Helper::html($string)."': ".json_encode(Helper::html(Locale::t($translate))); + $co++; + } + self::$_layout_data[self::VAR_HEAD_BOTTOM] .= ' };'; + self::$_layout_data[self::VAR_HEAD_BOTTOM] .= Helper::tag_close('script')."\r\n"; + + $body_bottom_scripts = self::getBodyBottomScripts(); + if (!empty($body_bottom_scripts)) self::addHTML($body_bottom_scripts, self::VAR_BODY_BOTTOM); + + self::$_layout_data[self::VAR_HEAD_BOTTOM] .= Helper::tag_open('script', array('type'=>'text/javascript')); + self::$_layout_data[self::VAR_HEAD_BOTTOM] .= 'zira_base = \''.Helper::baseUrl('').'\';'; + self::$_layout_data[self::VAR_HEAD_BOTTOM] .= Helper::tag_close('script')."\r\n"; + } + + if (!isset(self::$_layout_data[self::VAR_CHARSET])) self::$_layout_data[self::VAR_CHARSET] = CHARSET; + self::$_layout_data[self::VAR_CHARSET] = Helper::tag_short('meta',array('charset'=>self::$_layout_data[self::VAR_CHARSET]))."\r\n"; + + if (!isset(self::$_layout_data[self::VAR_TITLE])) { + if (Config::get('site_title')) { + self::$_layout_data[self::VAR_TITLE] = Locale::t(Config::get('site_title')); + } else if (Config::get('site_name')) { + self::$_layout_data[self::VAR_TITLE] = Locale::t(Config::get('site_name')); + } else { + self::$_layout_data[self::VAR_TITLE] = Locale::t(DEFAULT_TITLE); + } + } + self::$_layout_data[self::VAR_TITLE] = Helper::tag('title',self::$_layout_data[self::VAR_TITLE])."\r\n"; + + if (!self::$_keywords_added) { + self::addMeta(array('name'=>'keywords','content'=>Locale::t(Config::get('site_keywords')))); + } + if (!self::$_description_added) { + self::addMeta(array('name'=>'description','content'=>Locale::t(Config::get('site_description')))); + } + + self::addCR(); + self::$_render_started = true; + + include($layout_file); + } + + public static function renderContentData() { + if (self::$_content_data === null || self::$_content_view === null) return; + self::renderContent(self::$_content_data, self::$_content_view); + } + + public static function setRenderLayout($render_layout) { + self::$_render_layout = (bool) $render_layout; + } + + public static function setLayoutData(array $layout_data) { + self::$_layout_data = array_merge(self::$_layout_data, $layout_data); + } + + public static function addLayoutContent($placeholder, $content) { + if (!isset(self::$_layout_data[$placeholder])) { + self::$_layout_data[$placeholder] = $content."\r\n"; + } else { + self::$_layout_data[$placeholder] .= $content."\r\n"; + } + } + + public static function getLayoutData($var=null) { + if ($var === null) return self::$_layout_data; + if (!isset(self::$_layout_data[$var])) return null; + return self::$_layout_data[$var]; + } + + public static function addPlaceholderView($placeholder,$data,$view) { + if (!isset(self::$_placeholder_views[$placeholder])) self::$_placeholder_views[$placeholder] = array(); + self::$_placeholder_views[$placeholder][$view] = $data; + } + + public static function includePlaceholderViews($placeholder) { + if (!isset(self::$_placeholder_views[$placeholder]) || !is_array(self::$_placeholder_views[$placeholder])) return; + + foreach(self::$_placeholder_views[$placeholder] as $view=>$data) { + self::renderView($data, $view); + } + } + + public static function addBodyBottomScript($script) { + self::$_body_bottom_scripts []= $script; + } + + public static function getBodyBottomScripts() { + if (empty(self::$_body_bottom_scripts)) return ''; + return implode("\r\n", self::$_body_bottom_scripts); + } + + public static function getTheme() { + return self::$_theme; + } + + public static function setTheme($theme) { + self::$_theme = $theme; + } + + public static function getDefaultLayouts() { + return array( + self::LAYOUT_ALL_SIDEBARS => Locale::t('Layout with both left and right sidebars'), + self::LAYOUT_LEFT_SIDEBAR => Locale::t('Layout with left sidebar'), + self::LAYOUT_RIGHT_SIDEBAR => Locale::t('Layout with right sidebar'), + self::LAYOUT_NO_SIDEBARS => Locale::t('Layout without sidebars') + ); + } + + public static function getLayouts() { + $layouts = self::getDefaultLayouts(); + + $custom_layouts_dir = ROOT_DIR . DIRECTORY_SEPARATOR . + THEMES_DIR . DIRECTORY_SEPARATOR . + self::$_theme . DIRECTORY_SEPARATOR . + self::CUSTOM_LAYOUTS_FOLDER; + + if (file_exists($custom_layouts_dir) && is_dir($custom_layouts_dir) && is_readable($custom_layouts_dir)) { + $d = opendir($custom_layouts_dir); + while(($f=readdir($d))!==false) { + if ($f=='.' || $f=='..' || is_dir($custom_layouts_dir . DIRECTORY_SEPARATOR . $f)) continue; + if (substr($f, -4)!='.php') continue; + $name = substr($f, 0, strlen($f)-4); + $title = str_replace('-',' ', $name); + $layouts[self::CUSTOM_LAYOUTS_FOLDER . '/' . $name] = Locale::t(ucfirst($title)); + } + closedir($d); + } + + return $layouts; + } + + public static function addCR() { + $c = Locale::t(Config::get('s'.'i'. 't'.'e'.'_' .'c'.'o'."p" .'y'.'r'.'i' .'g'.'h'.'t')); + if (!self::checkLK()) { + self::addMeta(array('name'=>'gene'. "rator",'content'=>'Zir'. 'a C'."MS")); + if (!empty($c)) $c .= ' '; + $s = 'P' . 'o' . "w" . 'e' . 'r' . 'e' . 'd' . ' ' . "b" . 'y' . ' ' . '%s'; + $t = Helper::tag('a', 'Z' . "i" . 'r' . 'a' . ' ' . "C" . 'M' . 'S', array('href' => 'h'."t".'t' .'p'.':'.'/' .'/'.'d'."r" .'o'.'1'.'d' .'.' .'r'."u")); + $_t = '%tag%'; + $_c = Locale::t($s, $_t); + if (strpos($_c, $_t)!==false) { + $_c = str_replace($_t, $t, $_c); + } else { + $_c = str_replace('%s', $t, $s); + } + $c .= $_c; + } + self::addHTML(Helper::tag_open('p').$c.Helper::tag_close('p'), self::VAR_FOOTER); + } + + public static function checkLK() { + $l = 'l'.'i'."c" .'e'.'n'. 's'.'e'; + $k = 'k'.'e'. "y".'.'.'p' .'u'.'b'; + if (!file_exists(ROOT_DIR . DIRECTORY_SEPARATOR . $l) || !is_readable(ROOT_DIR . DIRECTORY_SEPARATOR . $l)) return false; + if (!file_exists(ROOT_DIR . DIRECTORY_SEPARATOR . $k) || !is_readable(ROOT_DIR . DIRECTORY_SEPARATOR . $k)) return false; + $lc = file_get_contents(ROOT_DIR . DIRECTORY_SEPARATOR . $l); + if (empty($lc)) return false; + $kc = file_get_contents(ROOT_DIR . DIRECTORY_SEPARATOR . $k); + if (empty($kc)) return false; + $pk = @call_user_func('o'.'p'.'e' ."n".'s'.'s' .'l'.'_'.'g'.'e' .'t'.'_'.'p'.'u' .'b'.'l'.'i'.'c'.'k' .'e'.'y', $kc); + if (!$pk) return false; + $lcb = @call_user_func('b'.'a'."s". 'e'.'6'.'4'. '_'.'d'.'e' .'c'.'o'. 'd'.'e',$lc); + if (!$lcb) return false; + $lcd = null; + $od = @call_user_func_array('o'."p".'e' .'n'.'s'.'s' .'l'.'_'.'p' .'u'.'b'.'l' .'i'.'c'.'_'. 'd'.'e'.'c'. 'r'.'y'.'p' .'t', + array($lcb, &$lcd, $pk) + ); + if (!$od) return false; + $h = 'H'.'T'. 'T'."P". '_'.'H'.'O' .'S'.'T'; + if (!isset($_SERVER[$h])) return false; + if ($lcd != $_SERVER[$h] && '.'.$lcd != substr($_SERVER[$h], -(strlen($lcd)+1))) return false; + return true; + } + + public static function addBootstrap() { + if (self::$_bootstrap_added) return; + self::addStyle('bootstrap.min.css'); + self::addStyle('bootstrap-theme.min.css'); + self::addScript('bootstrap.min.js'); + + $ie = ''; + + self::addHTML($ie, self::VAR_HEAD_BOTTOM); + + self::$_bootstrap_added = true; + } + + public static function addJquery() { + if (self::$_jquery_added) return; + self::addScript('jquery.min.js'); + self::$_jquery_added = true; + } + + public static function addLightbox() { + if (self::$_lightbox_added) return; + self::addStyle('lightbox.css'); + //self::addHTML(Helper::tag('script', null, array('src'=>Helper::jsUrl('lightbox.min.js'))), self::VAR_BODY_BOTTOM); + self::addBodyBottomScript(Helper::tag('script', null, array('src'=>Helper::jsUrl('lightbox.min.js')))); + self::$_lightbox_added = true; + } + + public static function addSliderAssets() { + if (self::$_slider_added) return; + self::addStyle('bxslider.css'); + self::addScript('bxslider.min.js'); + self::$_slider_added = true; + } + + public static function addSlider($id, array $options=null) { + self::addSliderAssets(); + $script = Helper::tag_open('script',array('type'=>'text/javascript')); + $script .= 'jQuery(document).ready(function(){ '; + $script .= '$(\'#'.Helper::html($id).'\').bxSlider({'; + if ($options) { + $_options = array(); + foreach($options as $k=>$v) { + if (is_bool($v)) { + $_options[]="'".Helper::html($k)."': ".($v ? 'true' : 'false'); + } else if (is_int($v)) { + $_options[]="'".Helper::html($k)."': ".Helper::html($v); + } else { + $_options[]="'".Helper::html($k)."': '".Helper::html($v)."'"; + } + } + $script .= implode(', ',$_options); + } + $script .= '});'; + $script .= ' });'; + $script .= Helper::tag_close('script'); + self::addHTML($script, self::VAR_HEAD_BOTTOM); + } + + public static function addCropperAssets() { + if (self::$_cropper_assets_added) return; + self::addStyle('cropper.css'); + self::addScript('cropper.js'); + self::$_cropper_assets_added = true; + } + + public static function addCropper($id, array $options=null) { + self::addCropperAssets(); + $script = Helper::tag_open('script',array('type'=>'text/javascript')); + $script .= 'jQuery(document).ready(function(){ '; + $script .= '$(\'img#'.Helper::html($id).'\').cropper({'; + if ($options) { + $_options = array(); + foreach($options as $k=>$v) { + if (is_bool($v)) { + $_options[]="'".Helper::html($k)."': ".($v ? 'true' : 'false'); + } else if (is_int($v)) { + $_options[]="'".Helper::html($k)."': ".Helper::html($v); + } else { + $_options[]="'".Helper::html($k)."': '".Helper::html($v)."'"; + } + } + $script .= implode(', ',$_options); + } + $script .= '});'; + $script .= ' });'; + $script .= Helper::tag_close('script'); + self::addHTML($script, self::VAR_HEAD_BOTTOM); + } + + public static function addTinyMCEAssets() { + if (self::$_tinymce_assets_added) return; + if (Config::get('gzip')) { + self::addScript('tinymce/tinymce.gzip.js'); + } else { + self::addScript('tinymce/tinymce.min.js'); + } + self::$_tinymce_assets_added = true; + } + + public static function addTinyMCE($id) { + self::addTinyMCEAssets(); + $script = Helper::tag_open('script',array('type'=>'text/javascript')); + $script .= 'jQuery(document).ready(function(){ '; + $script .= 'tinymce.init({'. + 'selector:\'#'.$id.'\' ,'. + 'plugins: \'paste, advlist, link, image, media, table, hr, pagebreak, code, contextmenu\','. + 'toolbar: [\'undo redo | table | bullist numlist | image media link | outdent indent | hr pagebreak | code\', \'styleselect | bold italic underline removeformat | aligncenter alignleft alignright alignjustify \'],'. + 'menubar: false,'. + 'language: \''.Locale::getLanguage().'\','. + 'convert_urls: false,'. + 'paste_word_valid_elements: \'b,strong,i,em,h1,h2,h3,h4,h5,h6,p,ul,ol,li,hr,br,table,tr,td\','. + 'paste_filter_drop: false,'. + 'init_instance_callback: function (editor) {'. + '$(editor.getDoc()).unbind(\'drop\').bind(\'drop\',function(e){e.stopPropagation();e.preventDefault();});'. + '},'. + 'inline: true'. + '});'; + $script .= ' });'; + $script .= Helper::tag_close('script'); + self::addHTML($script, self::VAR_HEAD_BOTTOM); + } + + public static function addDatepickerAssets() { + if (self::$_datepicker_assets_added) return; + self::addStyle('bootstrap-datetimepicker.min.css'); + self::addScript('moment.min.js'); + if (Locale::getLanguage()=='ru') self::addScript('moment-locale-ru.js'); + else if (Locale::getLanguage()!='en' && file_exists(ROOT_DIR . DIRECTORY_SEPARATOR . ASSETS_DIR . DIRECTORY_SEPARATOR . JS_DIR . DIRECTORY_SEPARATOR . 'moment-locale-' . Locale::getLanguage() . '.js')) { + self::addScript('moment-locale-'.Locale::getLanguage().'.js'); + } + self::addScript('bootstrap-datetimepicker.min.js'); + self::$_datepicker_assets_added = true; + } + + /** + * @param string $viewMode - accepts 'decades','years','months','days' + * @param null $maxDate - format 'Y-m-d' + */ + public static function addDatepicker($viewMode = null, $maxDate = null) { + if (self::$_datepicker_added) return; + self::addDatepickerAssets(); + $script = Helper::tag_open('script',array('type'=>'text/javascript')); + $script .= "zira_datepicker = function(element){"; + $script .= "jQuery(element).datetimepicker({"; + $options = array(); + if ($viewMode!==null) $options[]="viewMode: '".$viewMode."'"; + if (Locale::getLanguage()=='ru') $options[]="locale: 'ru'"; + $options[]="allowInputToggle: true"; + $options[]="format: '".Config::get('datepicker_date_format')."'"; + if ($maxDate!==null) $options[]="maxDate: '".$maxDate."'"; + $script .= implode(', ', $options); + $script .= "});"; + $script .= "};"; + $script .= Helper::tag_close('script'); + //self::addHTML($script, self::VAR_BODY_BOTTOM); + self::addBodyBottomScript($script); + self::$_datepicker_added = true; + } + + public static function addAutoCompleter() { + if (self::$_autocomplete_added) return; + self::addScript('autocomplete.js'); + self::$_autocomplete_added = true; + } + + public static function addParser() { + if (self::$_parser_added) return; + self::addScript('parse.js'); + self::$_parser_added = true; + self::addLightbox(); + } + + public static function addCoreStyles() { + self::addStyle('zira.css'); + } + + public static function addCoreScripts() { + self::addScript('zira.js'); + } + + public static function addThemeStyles() { + $css = 'main.css'; + if (file_exists(ROOT_DIR . DIRECTORY_SEPARATOR . THEMES_DIR . DIRECTORY_SEPARATOR . View::getTheme() . DIRECTORY_SEPARATOR . ASSETS_DIR . DIRECTORY_SEPARATOR . CSS_DIR . DIRECTORY_SEPARATOR .$css)) { + self::addThemeStyle($css); + } + } + + public static function addThemeScripts() { + $script = 'main.js'; + if (file_exists(ROOT_DIR . DIRECTORY_SEPARATOR . THEMES_DIR . DIRECTORY_SEPARATOR . View::getTheme() . DIRECTORY_SEPARATOR . ASSETS_DIR . DIRECTORY_SEPARATOR . JS_DIR . DIRECTORY_SEPARATOR .$script)) { + self::addThemeScript($script); + } + } + + public static function addCoreAssets() { + if (self::$_core_assets_added) return; + self::addCoreStyles(); + self::addCoreScripts(); + self::$_core_assets_added = true; + } + + public static function addThemeAssets() { + if (self::$_theme_assets_added) return; + self::addThemeStyles(); + self::addThemeScripts(); + self::$_theme_assets_added = true; + } + + public static function addDefaultAssets() { + self::addJquery(); + self::addBootstrap(); + self::addCoreAssets(); + } + + public static function preloadLoader() { + if (self::$_loader_preloaded) return; + $script = Helper::tag_open('script', array('type'=>'text/javascript')); + $script .= 'jQuery(document).ready(function(){ '; + $script .= 'var loader = new Image();'; + $script .= 'loader.src = \''.Helper::imgUrl('loader.gif').'\';'; + $script .= ' });'; + $script .= Helper::tag_close('script'); + View::addHTML($script, View::VAR_HEAD_BOTTOM); + self::$_loader_preloaded = true; + } + + public static function preloadThemeLoader() { + if (self::$_theme_loader_preloaded) return; + $script = Helper::tag_open('script', array('type'=>'text/javascript')); + $script .= 'jQuery(document).ready(function(){ '; + $script .= 'var loader = new Image();'; + $script .= 'loader.src = \''.Helper::imgThemeUrl('zira-loader.gif').'\';'; + $script .= ' });'; + $script .= Helper::tag_close('script'); + View::addHTML($script, View::VAR_HEAD_BOTTOM); + self::$_theme_loader_preloaded = true; + } + + public static function addWidget($class) { + self::$_widgets[]=$class; + } + + public static function addDbWidget($row, $placeholder) { + if (!isset(self::$_db_widgets[$placeholder])) self::$_db_widgets[$placeholder] = array(); + self::$_db_widgets[$placeholder][]=$row; + } + + public static function setWidgets(array $widgets) { + self::$_widgets=$widgets; + } + + public static function setRenderWidgets($render_widgets) { + self::$_render_widgets = (bool) $render_widgets; + } + + public static function prepareWidgets() { + self::$_widget_objects = array(); + $objects = array(); + $placeholders = array(); + $orders = array(); + $i=0; + foreach(self::$_widgets as $class) { + try { + $widget = new $class; + if (!($widget instanceof Widget)) continue; + $orders[$i] = $widget->getOrder(); + $placeholders[$i] = $widget->getPlaceholder(); + $objects[$i] = $widget; + $i++; + } catch(\Exception $e) { + if (defined('DEBUG') && DEBUG) throw $e; + else Log::exception($e); + } + } + asort($orders); + foreach($orders as $i=>$order) { + if (!isset($objects[$i]) || !isset($placeholders[$i])) continue; + if (!isset(self::$_widget_objects[$placeholders[$i]])) { + self::$_widget_objects[$placeholders[$i]] = array(); + } + self::$_widget_objects[$placeholders[$i]][]=$objects[$i]; + } + } + + public static function prepareDbWidgets($placeholder) { + if (empty(self::$_db_widgets[$placeholder])) return; + self::$_db_widget_objects = array(); + foreach(self::$_db_widgets[$placeholder] as $_widget) { + try { + if ($_widget->filter && (( + $_widget->filter == Models\Widget::STATUS_FILTER_RECORD && + Page::getRecordId()===null + ) || ( + $_widget->filter == Models\Widget::STATUS_FILTER_CATEGORY && + (!Category::current() || Category::param() || Page::getRecordId()!==null) + ))) { + continue; + } + $widget = new $_widget->name; + if (!($widget instanceof Widget)) continue; + $widget->setData($_widget->params); + $widget->setPlaceholder($_widget->placeholder); + $widget->setOrder($_widget->sort_order); + if (!isset(self::$_db_widget_objects[$_widget->placeholder])) { + self::$_db_widget_objects[$_widget->placeholder] = array(); + } + self::$_db_widget_objects[$_widget->placeholder][]=$widget; + } catch(\Exception $e) { + if (defined('DEBUG') && DEBUG) throw $e; + else Log::exception($e); + } + } + } + + public static function renderWidgets($placeholder) { + if (!self::$_render_widgets) return; + self::renderCoreWidgets($placeholder); + self::renderDbWidgets($placeholder); + } + + public static function renderCoreWidgets($placeholder) { + if (self::$_widget_objects === null) { + self::prepareWidgets(); + } + if (!isset(self::$_widget_objects[$placeholder]) || + !is_array(self::$_widget_objects[$placeholder])) return; + + foreach(self::$_widget_objects[$placeholder] as $widget) { + try { + if (!($widget instanceof Widget)) continue; + $widget->render(); + } catch(\Exception $e) { + if (defined('DEBUG') && DEBUG) throw $e; + else Log::exception($e); + } + } + unset(self::$_widget_objects[$placeholder]); + } + + public static function renderDbWidgets($placeholder) { + if (self::$_db_widget_objects === null || !isset(self::$_db_widget_objects[$placeholder])) { + self::prepareDbWidgets($placeholder); + } + if (!isset(self::$_db_widget_objects[$placeholder]) || + !is_array(self::$_db_widget_objects[$placeholder])) return; + + foreach(self::$_db_widget_objects[$placeholder] as $widget) { + try { + if (!($widget instanceof Widget)) continue; + $widget->render(); + } catch(\Exception $e) { + if (defined('DEBUG') && DEBUG) throw $e; + else Log::exception($e); + } + } + unset(self::$_db_widget_objects[$placeholder]); + } +} diff --git a/zira/widget.php b/zira/widget.php new file mode 100644 index 0000000..f31d14c --- /dev/null +++ b/zira/widget.php @@ -0,0 +1,109 @@ +_init(); + } + + abstract protected function _init(); + abstract protected function _render(); + + public static function getClass() { + return get_called_class(); + } + + public function getPlaceholder() { + return $this->_placeholder; + } + + public function setPlaceholder($placeholder) { + $this->_placeholder = $placeholder; + } + + public function getOrder() { + return $this->_order; + } + + public function setOrder($order) { + $this->_order = $order; + } + + public function getCaching() { + return $this->_caching; + } + + public function setCaching($caching) { + $this->_caching = $caching; + } + + public function setEditable($editable) { + $this->_editable = $editable; + } + + public function isEditable() { + return $this->_editable; + } + + public function setDynamic($dynamic) { + $this->_dynamic = $dynamic; + } + + public function isDynamic() { + return $this->_dynamic; + } + + public function setData($data) { + $this->_data = $data; + } + + public function getData() { + return $this->_data; + } + + public function getTitle() { + return $this->_title!==null ? $this->_title : $this->getClass(); + } + + public function setTitle($title) { + $this->_title = $title; + } + + protected function getKey() { + return self::CACHE_PREFIX.'.'.strtolower(str_replace('\\','.',get_class($this))).'.'.Locale::getLanguage(); + } + + public function render() { + if ($this->_caching && ($cache=Cache::get($this->getKey()))) { + echo $cache; + return; + } + $ob_started = false; + if ($this->_caching && Config::get('caching')) { + ob_start(); + $ob_started = true; + } + $this->_render(); + if ($ob_started) { + $output = ob_get_clean(); + Cache::set($this->getKey(), $output); + echo $output; + } + } +} \ No newline at end of file diff --git a/zira/widgets.php b/zira/widgets.php new file mode 100644 index 0000000..c15277b --- /dev/null +++ b/zira/widgets.php @@ -0,0 +1,170 @@ +1) { + View::addWidget('\Zira\Widgets\Languages'); + } + if (Config::get('user_signup_allow') || User::isAuthorized()) { + View::addWidget('\Zira\Widgets\Usermenu'); + } + } + + public static function load($category_id=null) { + if (!Config::get('db_widgets_enabled', true)) { + self::addDefaultDbWidgets(); + return; + } + if (CACHE_WIDGETS_LIST) { + $rows = self::loadAll($category_id); + } else { + $rows = self::loadPartial($category_id); + } + + $modules = array_merge(array('zira'),Config::get('modules')); + foreach ($rows as $row) { + if (!in_array($row->module, $modules)) continue; + View::addDbWidget($row, $row->placeholder); + } + } + + protected static function loadPartial($category_id) { + if ($category_id===null) { + $rows = Models\Widget::getCollection() + ->open_query() + ->where('language','is',null) + ->and_where('category_id','is',null) + ->and_where('active','=',Models\Widget::STATUS_ACTIVE) + ->order_by('sort_order','asc') + ->close_query() + ->union() + ->open_query() + ->where('language','=',Locale::getLanguage()) + ->and_where('category_id','is',null) + ->and_where('active','=',Models\Widget::STATUS_ACTIVE) + ->order_by('sort_order','asc') + ->close_query() + ->merge() + ->order_by('sort_order','asc') + ->get(); + } else if (!is_array($category_id)) { + $rows = Models\Widget::getCollection() + ->open_query() + ->where('language','is',null) + ->and_where('category_id','is',null) + ->and_where('active','=',Models\Widget::STATUS_ACTIVE) + ->order_by('sort_order','asc') + ->close_query() + ->union() + ->open_query() + ->where('language','is',null) + ->and_where('category_id','=',$category_id) + ->and_where('active','=',Models\Widget::STATUS_ACTIVE) + ->order_by('sort_order','asc') + ->close_query() + ->union() + ->open_query() + ->where('language','=',Locale::getLanguage()) + ->and_where('category_id','is',null) + ->and_where('active','=',Models\Widget::STATUS_ACTIVE) + ->order_by('sort_order','asc') + ->close_query() + ->union() + ->open_query() + ->where('language','=',Locale::getLanguage()) + ->and_where('category_id','=',$category_id) + ->and_where('active','=',Models\Widget::STATUS_ACTIVE) + ->order_by('sort_order','asc') + ->close_query() + ->merge() + ->order_by('sort_order','asc') + ->get(); + } else { + $query = Models\Widget::getCollection() + ->open_query() + ->where('language','is',null) + ->and_where('category_id','is',null) + ->and_where('active','=',Models\Widget::STATUS_ACTIVE) + ->order_by('sort_order','asc') + ->close_query() + ->union() + ->open_query() + ->where('language','=',Locale::getLanguage()) + ->and_where('category_id','is',null) + ->and_where('active','=',Models\Widget::STATUS_ACTIVE) + ->order_by('sort_order','asc') + ->close_query() + ; + + foreach($category_id as $_category_id) { + $query->union() + ->open_query() + ->where('language','is',null) + ->and_where('category_id', '=', $_category_id) + ->and_where('active', '=', Models\Widget::STATUS_ACTIVE) + ->order_by('sort_order','asc') + ->close_query() + ->union() + ->open_query() + ->where('language','=',Locale::getLanguage()) + ->and_where('category_id', '=', $_category_id) + ->and_where('active', '=', Models\Widget::STATUS_ACTIVE) + ->order_by('sort_order','asc') + ->close_query() + ; + } + + $rows = $query->merge() + ->order_by('sort_order', 'asc') + ->get(); + } + + return $rows; + } + + protected static function loadAll($category_id) { + $cache_key = self::CACHE_KEY . '.' . Locale::getLanguage(); + $rows=Cache::getArray($cache_key); + if ($rows===false) { + $rows = Models\Widget::getCollection() + ->open_query() + ->where('language','is',null) + ->order_by('sort_order', 'asc') + ->close_query() + ->union() + ->open_query() + ->where('language','=',Locale::getLanguage()) + ->order_by('sort_order', 'asc') + ->close_query() + ->merge() + ->order_by('sort_order', 'asc') + ->get(); + Cache::setArray($cache_key, $rows); + } + + $_rows = array(); + foreach($rows as $row) { + if ($row->active!=Models\Widget::STATUS_ACTIVE) continue; + if ($row->category_id!==null) { + if (!is_array($category_id) && $row->category_id!=$category_id) continue; + else if (is_array($category_id) && !in_array($row->category_id,$category_id)) continue; + } + $_rows []= $row; + } + + return $_rows; + } +} \ No newline at end of file diff --git a/zira/widgets/block.php b/zira/widgets/block.php new file mode 100644 index 0000000..1bad761 --- /dev/null +++ b/zira/widgets/block.php @@ -0,0 +1,109 @@ +setDynamic(true); + $this->setCaching(true); + $this->setOrder(0); + $this->setPlaceholder(Zira\View::VAR_BODY_BOTTOM); + } + + protected function getTitles() { + if (self::$_titles===null) { + self::$_titles = array(); + $rows = Zira\Models\Block::getCollection()->get(); + foreach($rows as $row) { + self::$_titles[$row->id] = $row->name; + } + } + return self::$_titles; + } + + public function getTitle() { + $id = $this->getData(); + if (is_numeric($id)) { + $titles = $this->getTitles(); + if (empty($titles) || !array_key_exists($this->getData(), $titles)) return parent::getTitle(); + return Zira\Locale::t('Block') . ' - ' . $titles[$id]; + } else if (preg_match('/^\[file=(.+)\]$/',$id, $m) && file_exists(ROOT_DIR . DIRECTORY_SEPARATOR . $m[1])) { + return Zira\Locale::t('File') . ' - [' . $m[1] . ']'; + } else { + return parent::getTitle(); + } + } + + protected function getKey() { + $id = $this->getData(); + $suffix = ''; + if (!empty($id) && is_numeric($id)) $suffix = '.'.$id; + else if (!empty($id)) $suffix = '.'.md5($id); + return parent::getKey().$suffix; + } + + protected function _render() { + $id = $this->getData(); + if (!is_numeric($id)) { + if (strpos($id, '..')!==false || !preg_match('/^\[file=(.+)\]$/',$id, $m) || !file_exists(ROOT_DIR . DIRECTORY_SEPARATOR . $m[1])) return; + $p = strrpos($m[1], '.'); + $ext = strtolower(substr($m[1],$p+1)); + + if ($ext == 'txt' || $ext=='html') { + echo file_get_contents(ROOT_DIR . DIRECTORY_SEPARATOR . $m[1]); + } else if ($ext=='jpg' || $ext=='jpeg' || $ext=='png' || $ext=='gif') { + $size = getimagesize(ROOT_DIR . DIRECTORY_SEPARATOR . $m[1]); + if (!$size) return; + echo ''; + } + } else { + $block = new Zira\Models\Block($id); + if (!$block->loaded()) return; + + if (strpos($block->content, '[str]')===false || strpos($block->content, '[/str]')===false) { + $block->content = Zira\Locale::t($block->content); + } else if (preg_match_all('/\[str\](.+?)\[\/str\]/', $block->content, $matches)) { + foreach($matches[1] as $index=>$match) { + $block->content = str_replace($matches[0][$index],Zira\Locale::t($match), $block->content); + } + } + + if (strpos($block->content, '[url]')!==false && + strpos($block->content, '[/url]')!==false && + preg_match_all('/\[url\](.+?)\[\/url\]/', $block->content, $matches) + ) { + foreach($matches[1] as $index=>$match) { + $block->content = str_replace($matches[0][$index],Zira\Helper::url($match), $block->content); + } + } + + if (strpos($block->content, '<') === false || + strpos($block->content, '>') === false || + (strpos($block->content, 'content, '/>') === false) + ) { + $block->content = Zira\Helper::html($block->content); + $parts = explode("\n", $block->content); + $block->content = '

    ' . implode('

    ', $parts) . '

    '; + } + + if (!$block->tpl) { + echo $block->content; + } else { + Zira\View::renderView(array( + 'title' => Zira\Locale::t($block->name), + 'content' => $block->content + ), 'zira/widgets/block'); + } + } + } +} \ No newline at end of file diff --git a/zira/widgets/category.php b/zira/widgets/category.php new file mode 100644 index 0000000..74c7aae --- /dev/null +++ b/zira/widgets/category.php @@ -0,0 +1,97 @@ +setDynamic(true); + $this->setCaching(true); + $this->setOrder(0); + $this->setPlaceholder(Zira\View::VAR_SIDEBAR_LEFT); + } + + protected function getTitles() { + if (self::$_titles===null) { + self::$_titles = array(); + $rows = Zira\Models\Category::getCollection()->get(); + foreach($rows as $row) { + self::$_titles[$row->id] = Zira\Locale::t($row->title) . ' ('.$row->name.')'; + } + } + return self::$_titles; + } + + public function getTitle() { + $id = $this->getData(); + if (is_numeric($id)) { + $titles = $this->getTitles(); + if (empty($titles) || !array_key_exists($this->getData(), $titles)) return parent::getTitle(); + return Zira\Locale::t('Records') . ' - ' . $titles[$id]; + } else { + return parent::getTitle(); + } + } + + protected function getKey() { + $id = $this->getData(); + $suffix = ''; + if (!empty($id) && is_numeric($id)) $suffix = '.'.$id; + + $layout = Zira\Page::getLayout(); + if (!$layout) $layout = Zira\Config::get('layout'); + + $is_sidebar = $this->getPlaceholder() == Zira\View::VAR_SIDEBAR_LEFT || $this->getPlaceholder() == Zira\View::VAR_SIDEBAR_RIGHT; + $is_grid = $layout && $layout != Zira\View::LAYOUT_ALL_SIDEBARS && !$is_sidebar; + + $suffix .= '.side'.intval($is_sidebar).'.grid'.intval($is_grid); + + return parent::getKey().$suffix; + } + + protected function _render() { + $id = $this->getData(); + if (!is_numeric($id)) return; + + $limit = Zira\Config::get('records_limit', 10); + + $category = new Zira\Models\Category(intval($id)); + if (!$category->loaded()) return; + + $comments_enabled = $category->comments_enabled !== null ? $category->comments_enabled : Zira\Config::get('comments_enabled', 1); + $rating_enabled = $category->rating_enabled !== null ? $category->rating_enabled : Zira\Config::get('rating_enabled', 0); + $display_author = $category->display_author !== null ? $category->display_author : Zira\Config::get('display_author', 0); + $display_date = $category->display_date !== null ? $category->display_date : Zira\Config::get('display_date', 0); + + $layout = Zira\Page::getLayout(); + if (!$layout) $layout = Zira\Config::get('layout'); + + $is_sidebar = $this->getPlaceholder() == Zira\View::VAR_SIDEBAR_LEFT || $this->getPlaceholder() == Zira\View::VAR_SIDEBAR_RIGHT; + $is_grid = $layout && $layout != Zira\View::LAYOUT_ALL_SIDEBARS && !$is_sidebar; + + $data = array( + 'title' => Zira\Locale::t($category->title), + 'url' => Zira\Page::generateCategoryUrl($category->name), + 'records' => Zira\Page::getRecords($category, false, $limit, null, Zira\Config::get('category_childs_list', true)), + 'grid' => $is_grid, + 'settings' => array( + 'comments_enabled' => $comments_enabled, + 'rating_enabled' => $rating_enabled, + 'display_author' => $display_author && !$is_grid, + 'display_date' => $display_date, + 'sidebar' => $is_sidebar + ) + ); + + Zira\View::renderView($data, 'zira/widgets/category'); + } +} \ No newline at end of file diff --git a/zira/widgets/childmenu.php b/zira/widgets/childmenu.php new file mode 100644 index 0000000..f39f91a --- /dev/null +++ b/zira/widgets/childmenu.php @@ -0,0 +1,49 @@ +setCaching(false); + $this->setOrder(0); + $this->setPlaceholder(Zira\View::VAR_SIDEBAR_RIGHT); + } + + protected function _render() { + $parent_id = Zira\Menu::getSecondaryParentId(); + if (!$parent_id) return; + Zira\Menu::initSecondaryMenuItems($parent_id); + $items = Zira\Menu::getSecondaryMenuItems(); + if (count($items)==0) return; + $active = Zira\Menu::getSecondaryMenuActiveURL(); + foreach($items as $item) { + if ($active!==null && $item->url == $active) { + $item->active = true; + } else { + $item->active = false; + } + $item->dropdown = Zira\Menu::getSecondaryMenuItemDropdown($item->id); + if (count($item->dropdown)>0) { + foreach($item->dropdown as $_item) { + if ($active!==null && $_item->url == $active) { + $_item->active = true; + } else { + $_item->active = false; + } + } + } + } + Zira\View::renderView(array( + 'items' => $items + ), 'zira/widgets/childmenu'); + } +} \ No newline at end of file diff --git a/zira/widgets/discussed.php b/zira/widgets/discussed.php new file mode 100644 index 0000000..3c9dcf2 --- /dev/null +++ b/zira/widgets/discussed.php @@ -0,0 +1,110 @@ +setCaching(true); + $this->setOrder(0); + $this->setPlaceholder(Zira\View::VAR_SIDEBAR_LEFT); + } + + protected function getKey() { + $layout = Zira\Page::getLayout(); + if (!$layout) $layout = Zira\Config::get('layout'); + + $is_sidebar = $this->getPlaceholder() == Zira\View::VAR_SIDEBAR_LEFT || $this->getPlaceholder() == Zira\View::VAR_SIDEBAR_RIGHT; + $is_grid = $layout && $layout != Zira\View::LAYOUT_ALL_SIDEBARS && !$is_sidebar; + + return self::CACHE_PREFIX.'.'.strtolower(str_replace('\\','.',get_class($this))).'.side'.intval($is_sidebar).'.grid'.intval($is_grid).'.'.Zira\Locale::getLanguage(); + } + + public static function getMostDiscussedRecordsList($limit = null, $last_id = null) { + if ($limit === null) $limit = Zira\Config::get('records_limit', 10); + + $category_ids = array(Zira\Category::ROOT_CATEGORY_ID); + $categories = Zira\Models\Category::getCollection()->get(); + foreach($categories as $category) { + $category_ids []= $category->id; + } + + $query = Zira\Models\Record::getCollection(); + foreach($category_ids as $index=>$category_id) { + if ($index>0) { + $query->union(); + } + $query->open_query(); + $query->select('id', 'comments'); + $query->where('category_id', '=', $category_id); + $query->and_where('language', '=', Zira\Locale::getLanguage()); + $query->and_where('published', '=', Zira\Models\Record::STATUS_PUBLISHED); + if ($last_id!==null) { + $query->and_where('id', '<', $last_id); + } + $query->order_by('comments', 'desc'); + $query->limit($limit); + $query->close_query(); + } + $query->merge(); + $query->order_by('comments', 'desc'); + $query->limit($limit); + + $rows = $query->get(); + + if (!$rows) return array(); + + $query = Zira\Models\Record::getCollection() + ->select('id', 'name','author_id','title','description','thumb','creation_date','rating','comments') + ->left_join(Zira\Models\Category::getClass(), array('category_name'=>'name', 'category_title'=>'title')) + ; + + $record_ids = array(); + foreach($rows as $index=>$row) { + $record_ids []= $row->id; + } + $query->where('id','in',$record_ids); + + $_rows = $query->get(); + foreach($_rows as $_row) { + $records[] = $_row; + } + + usort($records, array(Zira\Models\Record::getClass(), 'sortByCommentsDesc')); + + return $records; + } + + protected function _render() { + $limit = Zira\Config::get('records_limit', 10); + + $layout = Zira\Page::getLayout(); + if (!$layout) $layout = Zira\Config::get('layout'); + + $is_sidebar = $this->getPlaceholder() == Zira\View::VAR_SIDEBAR_LEFT || $this->getPlaceholder() == Zira\View::VAR_SIDEBAR_RIGHT; + $is_grid = $layout && $layout != Zira\View::LAYOUT_ALL_SIDEBARS && !$is_sidebar; + + $data = array( + 'title' => Zira\Locale::t('Most discussed'), + 'url' => '', + 'records' => self::getMostDiscussedRecordsList($limit), + 'grid' => $is_grid, + 'settings' => array( + 'comments_enabled' => true, + 'rating_enabled' => true, + 'display_date' => true, + 'sidebar' => $is_sidebar + ) + ); + + Zira\View::renderView($data, 'zira/widgets/discussed'); + } +} \ No newline at end of file diff --git a/zira/widgets/footermenu.php b/zira/widgets/footermenu.php new file mode 100644 index 0000000..a006aa9 --- /dev/null +++ b/zira/widgets/footermenu.php @@ -0,0 +1,37 @@ +setCaching(false); + $this->setOrder(0); + $this->setPlaceholder(Zira\View::VAR_FOOTER); + } + + protected function _render() { + $items = Zira\Menu::getFooterMenuItems(); + if (count($items)==0) return; + $active = Zira\Menu::getFooterMenuActiveURL(); + foreach($items as $item) { + if ($active!==null && $item->url == $active) { + $item->active = true; + } else { + $item->active = false; + } + $item->dropdown = Zira\Menu::getFooterMenuItemDropdown($item->id); + } + Zira\View::renderView(array( + 'items' => $items + ), 'zira/widgets/footermenu'); + } +} \ No newline at end of file diff --git a/zira/widgets/languages.php b/zira/widgets/languages.php new file mode 100644 index 0000000..d740721 --- /dev/null +++ b/zira/widgets/languages.php @@ -0,0 +1,25 @@ +setCaching(false); + $this->setOrder(0); + $this->setPlaceholder(Zira\View::VAR_HEADER); + } + + protected function _render() { + if (count(Zira\Config::get('languages'))<2) return; + Zira\View::renderView(array(), 'zira/widgets/languages'); + } +} \ No newline at end of file diff --git a/zira/widgets/logo.php b/zira/widgets/logo.php new file mode 100644 index 0000000..80a5497 --- /dev/null +++ b/zira/widgets/logo.php @@ -0,0 +1,36 @@ +setCaching(false); + $this->setOrder(1); + $this->setPlaceholder(Zira\View::VAR_HEADER); + } + + protected function _render() { + $logo_width = (int)Zira\Config::get('site_logo_width'); + $logo_height = (int)Zira\Config::get('site_logo_height'); + if ($logo_width && $logo_height) { + $logo_size = array($logo_width, $logo_height); + } else { + $logo_size = null; + } + Zira\View::renderView(array( + 'logo' => Zira\Config::get('site_logo'), + 'logo_size' => $logo_size, + 'title' => Zira\Locale::t(Zira\Config::get('site_name')), + 'slogan' => Zira\Locale::t(Zira\Config::get('site_slogan')) + ), 'zira/widgets/logo'); + } +} \ No newline at end of file diff --git a/zira/widgets/previous.php b/zira/widgets/previous.php new file mode 100644 index 0000000..bb75461 --- /dev/null +++ b/zira/widgets/previous.php @@ -0,0 +1,60 @@ +setCaching(false); + $this->setOrder(0); + $this->setPlaceholder(Zira\View::VAR_CONTENT_BOTTOM); + } + + protected function _render() { + $record_id = Zira\Page::getRecordId(); + if (!$record_id) return; + + $category = Zira\Category::current(); + if (!$category) return; + + $limit = Zira\Config::get('records_limit', 10); + + $comments_enabled = $category->comments_enabled !== null ? $category->comments_enabled : Zira\Config::get('comments_enabled', 1); + $rating_enabled = $category->rating_enabled !== null ? $category->rating_enabled : Zira\Config::get('rating_enabled', 0); + $display_author = $category->display_author !== null ? $category->display_author : Zira\Config::get('display_author', 0); + $display_date = $category->display_date !== null ? $category->display_date : Zira\Config::get('display_date', 0); + + $layout = Zira\Page::getLayout(); + if (!$layout) $layout = Zira\Config::get('layout'); + + $is_sidebar = $this->getPlaceholder() == Zira\View::VAR_SIDEBAR_LEFT || $this->getPlaceholder() == Zira\View::VAR_SIDEBAR_RIGHT; + $is_grid = $layout && $layout != Zira\View::LAYOUT_ALL_SIDEBARS && !$is_sidebar; + + $records = Zira\Page::getRecords($category, false, $limit, $record_id, false); + if (!count($records)) return; + + $data = array( + 'title' => Zira\Locale::t('View also'), + 'url' => '', + 'records' => $records, + 'grid' => $is_grid, + 'settings' => array( + 'comments_enabled' => $comments_enabled, + 'rating_enabled' => $rating_enabled, + 'display_author' => $display_author && !$is_grid, + 'display_date' => $display_date, + 'sidebar' => $is_sidebar + ) + ); + + Zira\View::renderView($data, 'zira/widgets/category'); + } +} \ No newline at end of file diff --git a/zira/widgets/rated.php b/zira/widgets/rated.php new file mode 100644 index 0000000..4bfd0b2 --- /dev/null +++ b/zira/widgets/rated.php @@ -0,0 +1,110 @@ +setCaching(true); + $this->setOrder(0); + $this->setPlaceholder(Zira\View::VAR_SIDEBAR_RIGHT); + } + + protected function getKey() { + $layout = Zira\Page::getLayout(); + if (!$layout) $layout = Zira\Config::get('layout'); + + $is_sidebar = $this->getPlaceholder() == Zira\View::VAR_SIDEBAR_LEFT || $this->getPlaceholder() == Zira\View::VAR_SIDEBAR_RIGHT; + $is_grid = $layout && $layout != Zira\View::LAYOUT_ALL_SIDEBARS && !$is_sidebar; + + return self::CACHE_PREFIX.'.'.strtolower(str_replace('\\','.',get_class($this))).'.side'.intval($is_sidebar).'.grid'.intval($is_grid).'.'.Zira\Locale::getLanguage(); + } + + public static function getTopRatedRecordsList($limit = null, $last_id = null) { + if ($limit === null) $limit = Zira\Config::get('records_limit', 10); + + $category_ids = array(Zira\Category::ROOT_CATEGORY_ID); + $categories = Zira\Models\Category::getCollection()->get(); + foreach($categories as $category) { + $category_ids []= $category->id; + } + + $query = Zira\Models\Record::getCollection(); + foreach($category_ids as $index=>$category_id) { + if ($index>0) { + $query->union(); + } + $query->open_query(); + $query->select('id', 'rating'); + $query->where('category_id', '=', $category_id); + $query->and_where('language', '=', Zira\Locale::getLanguage()); + $query->and_where('published', '=', Zira\Models\Record::STATUS_PUBLISHED); + if ($last_id!==null) { + $query->and_where('id', '<', $last_id); + } + $query->order_by('rating', 'desc'); + $query->limit($limit); + $query->close_query(); + } + $query->merge(); + $query->order_by('rating', 'desc'); + $query->limit($limit); + + $rows = $query->get(); + + if (!$rows) return array(); + + $query = Zira\Models\Record::getCollection() + ->select('id', 'name','author_id','title','description','thumb','creation_date','rating','comments') + ->left_join(Zira\Models\Category::getClass(), array('category_name'=>'name', 'category_title'=>'title')) + ; + + $record_ids = array(); + foreach($rows as $index=>$row) { + $record_ids []= $row->id; + } + $query->where('id','in',$record_ids); + + $_rows = $query->get(); + foreach($_rows as $_row) { + $records[] = $_row; + } + + usort($records, array(Zira\Models\Record::getClass(), 'sortByRatingDesc')); + + return $records; + } + + protected function _render() { + $limit = Zira\Config::get('records_limit', 10); + + $layout = Zira\Page::getLayout(); + if (!$layout) $layout = Zira\Config::get('layout'); + + $is_sidebar = $this->getPlaceholder() == Zira\View::VAR_SIDEBAR_LEFT || $this->getPlaceholder() == Zira\View::VAR_SIDEBAR_RIGHT; + $is_grid = $layout && $layout != Zira\View::LAYOUT_ALL_SIDEBARS && !$is_sidebar; + + $data = array( + 'title' => Zira\Locale::t('Top rated'), + 'url' => '', + 'records' => self::getTopRatedRecordsList($limit), + 'grid' => $is_grid, + 'settings' => array( + 'comments_enabled' => true, + 'rating_enabled' => true, + 'display_date' => true, + 'sidebar' => $is_sidebar + ) + ); + + Zira\View::renderView($data, 'zira/widgets/rated'); + } +} \ No newline at end of file diff --git a/zira/widgets/share.php b/zira/widgets/share.php new file mode 100644 index 0000000..6fd411d --- /dev/null +++ b/zira/widgets/share.php @@ -0,0 +1,27 @@ +setCaching(false); + $this->setOrder(0); + $this->setPlaceholder(Zira\View::VAR_CONTENT_BOTTOM); + } + + protected function _render() { + Zira\View::renderView(array( + 'url' => Zira\Helper::url(Zira\Router::getRequest(), true, true), + 'title' => strip_tags(Zira\View::getLayoutData(Zira\View::VAR_TITLE)) + ), 'zira/widgets/share'); + } +} \ No newline at end of file diff --git a/zira/widgets/topmenu.php b/zira/widgets/topmenu.php new file mode 100644 index 0000000..c8efb4e --- /dev/null +++ b/zira/widgets/topmenu.php @@ -0,0 +1,38 @@ +setCaching(false); + $this->setOrder(2); + $this->setPlaceholder(Zira\View::VAR_HEADER); + } + + protected function _render() { + $items = Zira\Menu::getPrimaryMenuItems(); + if (count($items)==0) return; + $active = Zira\Menu::getPrimaryMenuActiveURL(); + foreach($items as $item) { + if ($active!==null && $item->url == $active) { + $item->active = true; + } else { + $item->active = false; + } + $item->dropdown = Zira\Menu::getPrimaryMenuItemDropdown($item->id); + } + Zira\View::renderView(array( + 'items' => $items, + 'search' => new Zira\Forms\Search() + ), 'zira/widgets/topmenu'); + } +} \ No newline at end of file diff --git a/zira/widgets/usermenu.php b/zira/widgets/usermenu.php new file mode 100644 index 0000000..018fcd2 --- /dev/null +++ b/zira/widgets/usermenu.php @@ -0,0 +1,102 @@ +setCaching(false); + $this->setOrder(0); + $this->setPlaceholder(Zira\View::VAR_HEADER); + } + + protected function _render() { + if (Zira\User::isAuthorized()) { + $class='authorized'; + $items = array( + array( + 'url' => 'user/profile', + 'icon' => 'glyphicon glyphicon-log-in', + 'title' => Zira\User::getProfileName(), + 'dropdown' => array( + array( + 'url' => 'user/profile', + 'icon' => 'glyphicon glyphicon-user', + 'title' => Zira\Locale::t('Profile') + ), + array( + 'type' => 'separator' + ), + array( + 'url' => 'user/messages', + 'icon' => 'glyphicon glyphicon-envelope', + 'title' => Zira\Locale::t('Messages') . (Zira\User::getCurrent()->messages>0 ? '('.Zira\User::getCurrent()->messages.')' : '') + ), + array( + 'type' => 'separator' + ), + array( + 'url' => 'user/logout', + 'icon' => 'glyphicon glyphicon-log-out', + 'title' => Zira\Locale::t('Logout') + ) + ) + ) + ); + if (Zira\User::getCurrent()->messages>0) { + $items = array_merge(array( + array( + 'url' => 'user/messages', + 'icon' => 'glyphicon glyphicon-envelope', + 'title' => Zira\User::getCurrent()->messages, + ) + ), $items); + } + } else { + $redirect_url = Zira\Page::getRecordUrl(); + if ($redirect_url && $redirect_url==Zira\Config::get('home_record_name')) $redirect_url = null; + if (!$redirect_url && Zira\Category::current()) $redirect_url = Zira\Category::current()->name; + $class='not-authorized'; + if (Zira\Config::get('user_signup_allow')) { + $items = array( + array( + 'url' => 'user/login'.($redirect_url ? '?redirect='.$redirect_url : ''), + 'icon' => '', + 'title' => Zira\Locale::t('Log In') + ) + ); + $items []= array( + 'url' => 'user/signup', + 'icon' => '', + 'title' => Zira\Locale::t('Sign Up') + ); + } else { + $items = array( + array( + 'url' => 'user/login'.($redirect_url ? '?redirect='.$redirect_url : ''), + 'icon' => 'glyphicon glyphicon-log-in', + 'title' => Zira\Locale::t('Authorization') + ) + ); + } + } + + $extra_items = Zira\Hook::run(Zira\Menu::USER_MENU_HOOK_NAME); + if (!empty($extra_items)) { + $items = array_merge($extra_items, $items); + } + + Zira\View::renderView(array( + 'class' => $class, + 'items' => $items + ),'zira/user/menu'); + } +} \ No newline at end of file diff --git a/zira/zira.php b/zira/zira.php new file mode 100644 index 0000000..9e5b7ba --- /dev/null +++ b/zira/zira.php @@ -0,0 +1,254 @@ +process(); + } + + protected function registerDbWidgets() { + if (Request::isAjax()) return; + $category_id = null; + if (!Router::getRequest()) { + $category_id = Category::ROOT_CATEGORY_ID; + } else if (Category::current()) { + $chain = Category::chain(); + $category_id = array(); + foreach($chain as $row) { + $category_id[]=$row->id; + } + } + Widgets::load($category_id); + } + + public function beforeDispatch() { + $this->registerRoutes(); + + Dash::getInstance()->beforeDispatch(); + + foreach(Config::get('modules') as $module) { + if ($module == 'zira' || $module == 'dash') continue; + $class = '\\'.ucfirst($module).'\\'.ucfirst($module); + try { + if (method_exists($class, 'getInstance')) { + $obj = call_user_func($class . '::getInstance'); + } else { + $obj = new $class; + } + } catch(\Exception $e) { + continue; + } + if (method_exists($obj,'beforeDispatch')) { + call_user_func(array($obj,'beforeDispatch')); + } + } + } + + protected function registerRoutes() { + Router::addRoute('captcha','zira/index/captcha'); + Router::addRoute('cron','zira/cron/index'); + Router::addRoute('forbidden','zira/index/forbidden'); + Router::addRoute('notfound','zira/index/notfound'); + Router::addRoute('user','zira/user'); + Router::addRoute('user/*','zira/user/$2'); + Router::addRoute('poll','zira/poll/index'); + Router::addRoute('records','zira/records/index'); + Router::addRoute('comment','zira/comments/comment'); + Router::addRoute('comments','zira/comments/index'); + Router::addRoute('search','zira/search/index'); + Router::addRoute('sitemap','zira/index/map'); + Router::addRoute('rss','zira/xml/rss'); + Router::addRoute('contact','zira/contact/index'); + } + + public function bootstrapModules() { + Dash::getInstance()->bootstrap(); + + foreach(Config::get('modules') as $module) { + if ($module == 'zira' || $module == 'dash') continue; + $class = '\\'.ucfirst($module).'\\'.ucfirst($module); + try { + if (method_exists($class, 'getInstance')) { + $obj = call_user_func($class . '::getInstance'); + } else { + $obj = new $class; + } + } catch(\Exception $e) { + continue; + } + if (method_exists($obj,'bootstrap')) { + call_user_func(array($obj,'bootstrap')); + } + } + } + + public function process() { + $controller_class = '\\'.ucfirst(Router::getModule()). + '\\'.ucfirst(CONTROLLERS_DIR). + '\\'.ucfirst(Router::getController()); + + try { + if (!class_exists($controller_class)) throw new \Exception('Controller class not found'); + $controller_obj = new $controller_class; + if (!($controller_obj instanceof Controller)) throw new \Exception('Invalid controller class'); + if (!method_exists($controller_obj, Router::getAction())) throw new \Exception('Action not found'); + $param = Router::getParam(); + // only numeric params allowed + if ((count(explode('/',Router::getRequest()))!=1 || Router::getModule()!=DEFAULT_MODULE || Router::getController()!=DEFAULT_CONTROLLER || Router::getAction()!=DEFAULT_ACTION) && + !empty($param) && (!is_numeric($param) || intval($param)<=0) + ) { + throw new \Exception('Bad request'); + } + // checking if param is accepted + if (strlen($param)>0 && (Router::getModule()!=DEFAULT_MODULE || Router::getController()!=DEFAULT_CONTROLLER || Router::getAction()!=DEFAULT_ACTION)) { + $reflectionMethod = new \ReflectionMethod($controller_obj, Router::getAction()); + if ($reflectionMethod->getNumberOfParameters() == 0) { + throw new \Exception('Bad request'); + } + } + // catch and process pages + if (Router::getRequest() && Router::getModule()==DEFAULT_MODULE && Router::getController()==DEFAULT_CONTROLLER && Router::getAction()==DEFAULT_ACTION) { + throw new \Exception('Bad request'); + } else { + $param = intval($param); + } + } catch (\Exception $e) { + $controller_obj = null; + $param = null; + if (Category::current()) { + $controller_obj = new Controllers\Index(); + Router::setAction('page'); + Router::setController(DEFAULT_CONTROLLER); + Router::setModule(DEFAULT_MODULE); + $param = Category::param(); + } else if (count(explode('/',Router::getRequest()))==1) { + Router::setModule(DEFAULT_MODULE); + $param = Router::getRequest(); + if ($param == 'sitemap.xml') { + $controller_obj = new Controllers\Xml(); + Router::setController('xml'); + Router::setAction('sitemap'); + } else { + $controller_obj = new Controllers\Index(); + Router::setController(DEFAULT_CONTROLLER); + Router::setAction('page'); + } + } else { + Response::notFound(); + } + } + + if ( + Router::getModule()!='zira' && Router::getModule()!='dash' + && !in_array(Router::getModule(), Config::get('modules') + )) { + Response::notFound(); + } + + call_user_func(array($controller_obj, '_before')); + call_user_func_array(array($controller_obj, Router::getAction()), array($param)); + call_user_func(array($controller_obj, '_after')); + } + + public static function getModuleCronTasks($module) { + $dir = ROOT_DIR . DIRECTORY_SEPARATOR . $module . DIRECTORY_SEPARATOR . 'cron'; + if (!file_exists($dir) || !is_dir($dir)) return array(); + $objects = array(); + $d = opendir($dir); + while(($f=readdir($d))!==false) { + if ($f=='.' || $f=='..' || is_dir($dir. DIRECTORY_SEPARATOR . $f)) continue; + if (!preg_match('/^([a-zA-Z0-9]+)\.php$/', $f, $matches)) continue; + $class = '\\'.ucfirst($module).'\\Cron\\'.ucfirst($matches[1]); + try { + if (class_exists($class)) { + $obj = new $class; + if ($obj instanceof Cron) { + $objects []= $obj; + } else { + unset($obj); + } + } + } catch(\Exception $e) { + Log::exception($e); + } + } + closedir($d); + return $objects; + } + + public function exception(\Exception $e) { + if (defined('DEBUG') && DEBUG) throw $e; + else Log::exception($e);; + } + + public function shutdown() { + Session::close(); + Db\Db::close(); + } + + public static function randomSecureString($bytes) { + return bin2hex(openssl_random_pseudo_bytes($bytes)); + } +} \ No newline at end of file